# HG changeset patch # User unc0rr # Date 1513465764 -3600 # Node ID 1b2b84315d2790477246e4fe8966f934356f6f03 # Parent 01f88c3b7b66a6e38b9a75c886361449c94223ac# Parent 28cb18c5e7120d7afdc1530749a948aa114c1982 Merge default. This branch is up-to-date and code is working. diff -r 01f88c3b7b66 -r 1b2b84315d27 .gitignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.gitignore Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,83 @@ +CMakeCache.txt +CMakeFiles +moc_*.cxx +qrc_*.cxx +*.o +*.a +*.qm +Makefile +bin +*.hi +*.ppu +*.*~ +*.core +hedgewars.pro.user +config.inc +cmake_install.cmake +QTfrontend/hwconsts.cpp +QTfrontend/servermessages.h +CPackConfig.cmake +CPackSourceConfig.cmake +tools/cmake_uninstall.cmake +install_manifest.txt +.DS_Store +*.swp +*.orig +*.diff +vittorio.* +project_files/HedgewarsMobile/Data/ +project_files/HedgewarsMobile/Build/ +gameServer/dist/ +misc/liblua/Xcode/build/ +misc/libphysfs/Xcode/build/ +misc/libphyslayer/Xcode/build/ +moc_*.cxx_parameters +relre:^release\/ +*.log +*.cmd +*.diff +*.patch +*.orig +*.bak +*.rej +project_files/hwc/*.c +project_files/hwc/*.h +project_files/Android-build/SDL-android-project/jni/** +project_files/Android-build/SDL-android-project/obj +project_files/Android-build/SDL-android-project/libs/armeabi* +project_files/Android-build/SDL-android-project/bin +project_files/Android-build/SDL-android-project/gen +project_files/Android-build/SDL-android-project/local.properties +project_files/Android-build/SDL-android-project/project.properties +project_files/Android-build/SDL-android-project/default.properties +project_files/Android-build/SDL-android-project/proguard.cfg +project_files/Android-build/SDL-android-project/.* +project_files/Android-build/out +project_files/Android-build/Makefile.android +hedgewars-build-desktop-Qt* +hedgewars-build-desktop-Qt* +*.depends +tools/build_windows_koda.bat +share/hedgewars/Data/misc/hwengine.desktop +*.exe +_CPack_Packages/ +version_info.txt +*.tar.* +*.or +*.res +Hedgewars.app/* +tools/CreateMacBundle.cmake +share/Info.plist +CTestTestfile.cmake +arch.c +*.swp +*~.nib +*.pbxuser +*.perspective +*.perspectivev3 +*.project.xcworkspace +*.xcuserdata +xcuserdata +*.mode1v3 +*.mode2v3 +Testing/* diff -r 01f88c3b7b66 -r 1b2b84315d27 .hgignore --- a/.hgignore Thu Aug 11 23:05:14 2016 +0300 +++ b/.hgignore Sun Dec 17 00:09:24 2017 +0100 @@ -1,83 +1,89 @@ -glob:CMakeCache.txt -glob:CMakeFiles -glob:moc_*.cxx -glob:qrc_*.cxx -glob:*.o -glob:*.a -glob:*.qm -glob:Makefile -glob:bin -glob:*.hi -glob:*.ppu -glob:*.*~ -glob:*.core -glob:hedgewars.pro.user -glob:config.inc -glob:cmake_install.cmake -glob:QTfrontend/hwconsts.cpp -glob:QTfrontend/servermessages.h -glob:CPackConfig.cmake -glob:CPackSourceConfig.cmake -glob:tools/cmake_uninstall.cmake -glob:install_manifest.txt -glob:.DS_Store -glob:*.swp -glob:*.orig -glob:vittorio.* -glob:project_files/HedgewarsMobile/Data/ -glob:project_files/HedgewarsMobile/Build/ -glob:gameServer/dist/ -glob:misc/liblua/Xcode/build/ -glob:misc/libphysfs/Xcode/build/ -glob:misc/libphyslayer/Xcode/build/ -glob:moc_*.cxx_parameters -relre:^release\/ -glob:*.log -glob:*.cmd -glob:*.patch -glob:*.orig -glob:*.bak -glob:*.rej -glob:project_files/hwc/*.c -glob:project_files/hwc/*.h -glob:project_files/Android-build/SDL-android-project/jni/** -glob:project_files/Android-build/SDL-android-project/obj -glob:project_files/Android-build/SDL-android-project/libs/armeabi* -glob:project_files/Android-build/SDL-android-project/bin -glob:project_files/Android-build/SDL-android-project/gen -glob:project_files/Android-build/SDL-android-project/local.properties -glob:project_files/Android-build/SDL-android-project/project.properties -glob:project_files/Android-build/SDL-android-project/default.properties -glob:project_files/Android-build/SDL-android-project/proguard.cfg -glob:project_files/Android-build/SDL-android-project/.* -glob:project_files/Android-build/out -glob:project_files/Android-build/Makefile.android -glob:hedgewars-build-desktop-Qt* -glob:*.depends -glob:tools/build_windows_koda.bat -glob:share/hedgewars/Data/misc/hwengine.desktop -glob:*.exe -glob:_CPack_Packages/ -glob:version_info.txt -glob:*.tar.* -glob:*.or -glob:*.res -glob:build-* -glob:hedgewars-build-* -glob:*.pro.user -glob:Hedgewars.app/* -glob:tools/CreateMacBundle.cmake -glob:share/Info.plist -glob:CTestTestfile.cmake -glob:arch.c -glob:*.swp -glob:*~.nib -glob:*.pbxuser -glob:*.perspective -glob:*.perspectivev3 -glob:*.project.xcworkspace -glob:*.xcuserdata -glob:xcuserdata -glob:*.mode1v3 -glob:*.mode2v3 +syntax: regexp +^release\/ +syntax: glob +.git +CMakeCache.txt +CMakeFiles +moc_*.cxx +qrc_*.cxx +*.o +*.a +*.qm +Makefile +bin +*.hi +*.ppu +*.*~ +*.core +hedgewars.pro.user +config.inc +cmake_install.cmake +QTfrontend/hwconsts.cpp +QTfrontend/servermessages.h +CPackConfig.cmake +CPackSourceConfig.cmake +tools/cmake_uninstall.cmake +install_manifest.txt +.DS_Store +*.swp +*.orig +vittorio.* +project_files/HedgewarsMobile/Data/ +project_files/HedgewarsMobile/Build/ +gameServer/dist/ +misc/liblua/Xcode/build/ +misc/libphysfs/Xcode/build/ +misc/libphyslayer/Xcode/build/ +moc_*.cxx_parameters +*.log +*.cmd +*.patch +*.orig +*.bak +*.rej +project_files/hwc/*.c +project_files/hwc/*.h +project_files/Android-build/SDL-android-project/jni/** +project_files/Android-build/SDL-android-project/obj +project_files/Android-build/SDL-android-project/libs/armeabi* +project_files/Android-build/SDL-android-project/bin +project_files/Android-build/SDL-android-project/gen +project_files/Android-build/SDL-android-project/local.properties +project_files/Android-build/SDL-android-project/project.properties +project_files/Android-build/SDL-android-project/default.properties +project_files/Android-build/SDL-android-project/proguard.cfg +project_files/Android-build/SDL-android-project/.* +project_files/Android-build/out +project_files/Android-build/Makefile.android +hedgewars-build-desktop-Qt* +hedgewars-build-desktop-Qt* +*.depends +tools/build_windows_koda.bat +share/hedgewars/Data/misc/hwengine.desktop +*.exe +_CPack_Packages/ +version_info.txt +*.tar.* +*.or +*.res +Hedgewars.app/* +tools/CreateMacBundle.cmake +share/Info.plist +CTestTestfile.cmake +arch.c +*.swp +*~.nib +*.pbxuser +*.perspective +*.perspectivev3 +*.project.xcworkspace +*.xcuserdata +xcuserdata +*.mode1v3 +*.mode2v3 +gameServer2/target +gameServer2/Cargo.lock +gameServer2/gameServer2.iml +.idea +Testing/ diff -r 01f88c3b7b66 -r 1b2b84315d27 .hgtags --- a/.hgtags Thu Aug 11 23:05:14 2016 +0300 +++ b/.hgtags Sun Dec 17 00:09:24 2017 +0100 @@ -75,3 +75,5 @@ 0000000000000000000000000000000000000000 fab746a3597e d9622394ec9c2974a84b9b4d9e6c0ac26c4060ff 0.9.22-RC 0000000000000000000000000000000000000000 0.9.22-RC +8cc070640fd1f4affb3c5dd5652b4d75a075c200 0.9.23-alpha +8610462e3d336e112bffcd7c1530d271242216f1 0.9.23-release diff -r 01f88c3b7b66 -r 1b2b84315d27 .travis.yml --- a/.travis.yml Thu Aug 11 23:05:14 2016 +0300 +++ b/.travis.yml Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,5 @@ +sudo: required +dist: trusty language: c sudo: true os: @@ -12,6 +14,11 @@ - gcc - clang +matrix: + exclude: + - os: osx + compiler: gcc + env: - BUILD_ARGS="-DCMAKE_BUILD_TYPE=Release" - BUILD_ARGS="-DCMAKE_BUILD_TYPE=Debug" @@ -59,9 +66,12 @@ install: | if [ "$TRAVIS_OS_NAME" == "linux" ]; then - sudo apt-get install debhelper cmake dpkg-dev libqt4-dev qt4-qmake libphysfs-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev libsdl2-net-dev bzip2 ghc libghc-mtl-dev libghc-parsec3-dev libghc-vector-dev libghc-zlib-dev libghc-random-dev libghc-stm-dev libghc-network-dev libghc-dataenc-dev libghc-hslogger-dev libghc-utf8-string-dev libghc-sha-dev libghc-entropy-dev liblua5.1-0-dev imagemagick 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 libqt4-dev qt4-qmake libphysfs-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev libsdl2-net-dev bzip2 ghc libghc-mtl-dev libghc-parsec3-dev libghc-vector-dev libghc-zlib-dev libghc-random-dev libghc-stm-dev libghc-network-dev libghc-sandi-dev libghc-hslogger-dev libghc-utf8-string-dev libghc-sha-dev libghc-entropy-dev libghc-regex-tdfa-dev liblua5.1-0-dev imagemagick fpc fp-compiler fp-units-misc libpng-dev fp-units-gfx libavcodec-dev libavformat-dev libglew1.6-dev elif [ "$TRAVIS_OS_NAME" == "osx" ]; then - brew install fpc glew qt physfs lua51 sdl2 sdl2_image sdl2_net sdl2_ttf ffmpeg ghc cabal-install + brew tap cartr/qt4 + brew tap-pin cartr/qt4 + brew install qt@4 + brew install fpc glew physfs lua51 sdl2 sdl2_image sdl2_net sdl2_ttf ffmpeg ghc cabal-install brew install sdl2_mixer --with-libvorbis # use cabal install haskell deps, pas2c ones are covered by server if [[ "$BUILD_ARGS" != *"NOSERVER"* ]]; then @@ -76,8 +86,8 @@ export BUILD_ARGS="$BUILD_ARGS -DNOAUTOUPDATE=1" elif [ "$TRAVIS_OS_NAME" == "ios" ]; then # FPC 3.0.0 required for using FPC 3.0.1 which contains rtl for ios - sudo bash tools/dmg_pkg_install.sh ftp://freepascal.stack.nl/pub/fpc/dist/3.0.0/i386-macosx/fpc-3.0.0.intel-macosx.dmg - sudo bash tools/dmg_pkg_install.sh ftp://freepascal.stack.nl/pub/fpc/dist/3.0.0/i386-macosx/fpc-3.0.1.intel-macosx.cross.ios.dmg + sudo bash tools/dmg_pkg_install.sh ftp://freepascal.stack.nl/pub/mirrors/fpc/dist/3.0.0/i386-macosx/fpc-3.0.0.intel-macosx.dmg + sudo bash tools/dmg_pkg_install.sh ftp://freepascal.stack.nl/pub/mirrors/fpc/dist/3.0.0/i386-macosx/fpc-3.0.1.intel-macosx.cross.ios.dmg fi before_script: | diff -r 01f88c3b7b66 -r 1b2b84315d27 CMakeLists.txt --- a/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,5 +1,6 @@ project(hedgewars) + #initialise cmake environment cmake_minimum_required(VERSION 2.6.4) foreach(hwpolicy CMP0003 CMP0012 CMP0017 CMP0018) @@ -79,8 +80,8 @@ #versioning set(CPACK_PACKAGE_VERSION_MAJOR 0) set(CPACK_PACKAGE_VERSION_MINOR 9) -set(CPACK_PACKAGE_VERSION_PATCH 23) -set(HEDGEWARS_PROTO_VER 52) +set(CPACK_PACKAGE_VERSION_PATCH 24) +set(HEDGEWARS_PROTO_VER 54) set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") include(${CMAKE_MODULE_PATH}/revinfo.cmake) diff -r 01f88c3b7b66 -r 1b2b84315d27 CREDITS --- a/CREDITS Thu Aug 11 23:05:14 2016 +0300 +++ b/CREDITS Sun Dec 17 00:09:24 2017 +0100 @@ -1,36 +1,63 @@ -EXTENDED CREDITS LIST +============================= +=== EXTENDED CREDITS LIST === +============================= + +IF NOT OTHERWISE SPECIFIED, ALL OTHER CONTENT IS PROPERTY OF Andrey Korotaev . +IF NO LICENSE IS SPECIFIED, THE LICENSE IS THE SAME AS MENTIONED IN README.md. + +Note: The asterisk is a placeholder which stands for any sequence of characters. ========== = FONTS ========== - 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 ========== -- Robinator -> Terminator (2010) -- shingo666 -> Samus (2010) +- Robinator -> Terminator_Glasses (2010) +- shingo666 -> ntd_Samus (2010) - MeinCookie95 -> InfernalHorns (2010), Mummy (2010), war_* (2010-2011) - thuban -> Elvis (2010) - Miphica -> Disguise (2010) -- Blayde -> Deer (2010), Moose (2010) +- Blayde -> zoo_Deer (2010), zoo_Moose (2010) - hillis -> AkuAku (2010) -- Lortinak -> OldMan (2010), ShortHair (2010) -- chujoii -> BrainSlug (2010), Dragon (2010), Ladle (2010), Laminaria (2010), Pantsu (2010), Pig (2010), Plunger (2010), SauceBoat (2010), ShaggyYeti (2010), SleepWalker (2010), SunWukong (2010), Teapot (2010), Teacup (2010), Zombi (2010) -- Randy Broda -> Cyclops (2011), Soldier (2011) -- Wohlstand -> PoliceGirl [based on policecap and sm_daisy] (2014) +- Lortinak -> OldMan (2010), ShortHair_* (2010) +- chujoii -> scif_BrainSlug (2010), scif_BrainSlug2 (2010), Dragon (2010), dish_Ladle (2010), Laminaria (2010), Pantsu (2010), zoo_Pig (2010), Plunger (2010), dish_SauceBoatSilver (2010), ShaggyYeti (2010), Sleepwalker (2010), SunWukong (2010), dish_Teapot (2010), dish_Teacup (2010), Zombi (2010) +- Randy Broda -> cyclops (2011), TeamSoldier (2011) +- Zav -> zoo_octopus (2009) +- Star and Moon -> bishop (2011) +- Gimo -> leprechaun [based on tophats] (2011) +- Terrington_Snyde -> pirate_eyepatch (2013), jester (2013) +- Wohlstand -> policegirl [based on policecap and sm_daisy] (2014) +- TheMadCharles -> barrelhider (CC BY 3.0) (2015) ========== = GRAVESTONES ========== -- Randy Broda -> Dragonball (2012) +- Randy Broda -> dragonball (2012) +- CheezeMonkey -> pi (2011) +- rosenholz -> Whisky (2013) ========== = MAPS @@ -49,6 +76,7 @@ - Jonatan Nilsson -> 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 ========== = THEMES @@ -66,6 +94,12 @@ - Stephen Alexander ========== += MISSIONS +========== +- Arkhnen -> Teamwork 2 (2012) +- Wuzzy -> Big Armory (2016) + +========== = SOUNDS ========== - Mine impact sound from http://www.freesound.org/people/adcbicycle/sounds/13947/ @@ -77,9 +111,28 @@ http://www.freesound.org/people/Jovica/sounds/38317/ - Cleaver impact sound remixed from http://www.freesound.org/people/sethlind/sounds/265021/ -- Extra Time sound originally by uair01 (CC-BY), remixed from +- Extra Time sound originally by uair01 (CC-BY 3.0), remixed from http://www.freesound.org/people/uair01/sounds/65291/ -- Air mine impact sound by Wuzzy (WTFPL), based on +- Air mine impact sound by Wuzzy (CC-0), based on http://www.freesound.org/people/batchku/sounds/10479/ +- Rubber duck sounds are in the Public Domain. +- Countdown sounds by Wuzzy (CC-0) +- Laser Sight sound originally from drzhn (CC-0), remixed from + https://www.freesound.org/people/drzhnn/sounds/199938/ +- Flying Saucer boost sound originally by Jagadamba (CC-BY 3.0), remixed from + https://www.freesound.org/people/Jagadamba/sounds/257057/ +- Blowtorch sound originally by rombard (CC-0), remixed from + https://www.freesound.org/people/rombart/sounds/197800/ +- Portable Portal Device color switching sound by Wuzzy (CC-0) +- Portable Portal Device shot sound originally by bubaproducer (CC-BY 3.0), remixed from + https://www.freesound.org/people/bubaproducer/sounds/151026/ +- Portal opening sound by Wuzzy (CC-0) +- Invulnerable sound: remix based on a sound by pepingrillin (CC-0) + https://www.freesound.org/people/pepingrillin/sounds/252079/ -ALL OTHER CONTENT IS PROPERTY OF Andrey Korotaev UNLESS OTHERWISE SPECIFIED +====================== += LICENSE REFERENCES = +====================== + +- CC-BY 3.0: https://creativecommons.org/licenses/by/3.0/ +- CC-0: https://creativecommons.org/publicdomain/zero/1.0/ diff -r 01f88c3b7b66 -r 1b2b84315d27 ChangeLog.txt --- a/ChangeLog.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/ChangeLog.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,61 +1,403 @@ + features * bugfixes -0.9.22 -> 0.9.23 +====================== 0.9.23 ====================== +HIGHLIGHTS: + + Battalion style + + Fort mode is now a map type instead of a scheme setting + + Fort mode now works with more than 2 teams + + New weapon: rubber duck + + New theme, map, 3 forts, 3 missions, some hats and graves + + WxW style allows you to select one of many wall sets + + Complete HedgeEditor overhaul + + Greatly improved script parameter support for many styles + + Improves stats screen of most styles and missions + + Various improvements for almost all styles + + AI hedgehogs can now use Bee, Vamprism, and Time Box + + Campaign page now shows your progress + + Improved turn timer + + Improved randomization options in team and multiplayer pages + + Improved theme customization support + + Various Lua API additions + * Fix cursor often jumping around after clicking + * A huge amount of bugfixes for both campaigns, the missions and styles + * Video recording functionality is restored + Content: - + New hat: "tf_scout" (this time for real) + + New game-style/mode: Battalion (see https://hedgewars.org/wiki/Battalion ) + + New theme: Beach + + New theme music for Jungle and Fruit themes + + Change SD theme music for Halloween and Hoggywood (old tracks) + + Completely new Cheese map; replaces the old one + + New forts: Lonely_Island, Octopus, Olympic, Snail + + Many new random hedgehog and team names + + Add hats: barrelhider, bishop, jester, leprechaun, pirate_eyepatch, tf_scout, zoo_octopus + + Add hair-less variants of old hats: beefeaterhat, lambdahat, nursehat, pirate_bandana, pirate_hat, poke_ash_hat, RamboClean, sf_vega_hat, sf_guile_hat, simple_red, simple_yellow, simple_green, thugclean + * Remove hat: tf_scount (this was a duplicate of tf_demoman) + * Add graves: Clover, Old_Apple, pi, Simple_reversed, TV, Whisky, Ying_and_Yang + * Redo flags: cm_pentagram, cm_soviet, armenia, ireland, nepal, suisse, sweden, turkey -Game engine: +Game engine (weapons): + + New weapon: rubber duck + + Freezer can now freeze sticky mines (they get disabled and fall into the water) + + Keep rope / parachute / flying saucer selected when destroyed and secondary ammo selected + * Gameplay fix: Hammer damage is now rounded down. This means it will cause NO DAMAGE to a hedgehog with less than 3 hp. + * Fixed air strikes drops being off-center + * Fixed hedgehogs getting hurt while firing deagle / sniper rifle bullet in certain situations + * Fixed mine, sticky mine, seduction, resurrector not working correctly across wrap world edge + * Fixed teleportation being able to teleport in land if you clicked across the wrap or bounce world edge + * Fixed turn not ending when sticky mine was trapped on rubberband + * Rope is now destroyed when attempting to shoot it through wrap or bouncy world edge + * Fixed possible to move rope angle below 0° while having secondary weapon selected + * Fixed molotov cocktails bouncing vertically off rubber + * Fixed sniper rifle disabling laser sight utility after using + * Fixed RC planes being able to collect frozen crates + * Fixed cake taking over 200 seconds to explode when its stuck and can't move + * Fixed Birdy descending into water when hog took damage or died before it got picked up + * Fixed player being able to switch to dying hog + * Various other fixes + +Game engine (gameplay): + + Fort Mode will now work with more than 2 teams + + Divided Teams mode will now work with more than 2 teams (Hint: you probably want to set world edges to "wrap" in such games) + + Frozen hedgehogs can no longer be poisoned + + AI hedgehogs can now use Bee, Vampirism and Time Box + Improved hedgehog spawns on maps that lack land mass or free space - + Highlander mode displays game scheme specifics (mines timer, etc.) in ESC info - + AI hedgehogs can now use Bee and Vampirism - + Divided Teams mode will now work with more than 2 teams (Hint: you probably want to set world edges to "wrap" in such games) - + Fort Mode will now work with more than 2 teams - + Added "Forts" to map type selection. This makes the mode easier selectable/discoverable. Also the slider can be used to adjust the distance between forts. - + Render graves behind everything else, so that they can't hide mines etc. + + Hogs no longer spawn on icy terrain + + Temporarily suspend Heavy Wind mode while turn timer is not running + + Engine supports now really gigantic maps + * Fixed cursor often jumping back to screen center when putting target location while moving cursor + * Fixed team getting infinite ammo when stockpiling >= 100 ammo (max. finite ammo is now limited to 99) + * Fixed failure to collect crate across wrap world edge + * Remove buggy “/finish” chat command + * Fix key controls not working in ammo menu: ammo menu, placement, camera/cursor movement keys + * Various other fixes + +Game engine (graphics, sounds and texts): + + Show indicator symbols at bottom right while extra damage or low gravity are active + + Color coding for the turn timer: green = ready timer, yellow = turn in progress, red = retreat timer, gray = timer paused + + Play countdown sounds at 1-4 seconds turn time + Several new sound effects for weapons and utilities - + Small visual effects enhancements - + Briefly show theme and music authors in chat at start of game - * Fixed air-strikes drops being off-center - * Gameplay fix: Hammer damage is now rounded down. This means it will cause NO DAMAGE to a hedgehog with less than 3 hp. - * Fixed screenshots being too bright if taken in quick succession + + More ticker messages: Hog gets sick, king died, hog was resurrected, hog time travels (and returns), timeout, kamikaze + + Small visual effects enhancements: Baseball bat, dynamite and more + + Render graves behind everything else, so that they can't hide mines etc. * Video recording functionality is restored - * Fixed bee not being affected by wrap world edge while still being thrown - * Fixed turn not ending when sticky mine was trapped on rubberband - * Fixed hedgehog-voices missing a response type (Justyouwait/"You're gonna pay for that") on some platforms (e.g. Linux) - * Fixed SD-flakes of themes not working if regular flakes were disabled - * Fixed RC planes being able to collect frozen crates + * Fixed screenshots being too bright if taken in quick succession + * Fixed hedgehog voices missing a response type (Justyouwait/"You're gonna pay for that") on some platforms (e.g. GNU/Linux) + * Fixed SD flakes of themes not working if regular flakes were disabled * Fixed Seduction's "Yoohoo!" sound not playing - * Fixed Hedgehogs getting hurt while firing deagle / sniper rifle bullet in certains situations - * Various other fixes + * Fixed hedgehogs saying “Missed” when drowning enemy without dealing damage + * Fixed enemy saying "Missed” when giving poison without direct damage + * Fixed hedgehogs not saying “Stupid” and not displaying announcer message for inflicting self-harm + * Fixed incorrect time box tooltip when in Sudden Death + * Fixed short sound effect breakdown right after using a time box + * Fixed sticky mine sound sometimes playing when shooting portable portal device when a sticky mine is placed on terrain + * Fixed hedgehog holding nothing in hand when napalm or piano strike got selected + * Fixed excessive water splashes sometimes caused by mines + +Highlander: + + Show collected weapons after kill and play sound + + Mission panel now shows all game modifiers (e.g. mines time, vampirism, etc.) + + Loyal Highlander (optional): With “loyal=true” in script param, you only get weapons for enemy kills (clan kills don't count) + * Removed "Freezer"/IceGun from the default Highlander weaponset Construction Mode: + Added script parameter support: + initialenergy: Amount of energy at start + energyperround: New energy per round - + maxenergy: Maximum allowed + + maxenergy: Maximum allowed energy + + cratesperround: Maximum placable crates per round + + Completely reworked all in-game texts and descriptions + * Fix rubber being placable inside land + * Fix invalid girder placement costing energy + * Special tools like structure placer now have their own proper descriptions (instead of Air Attack description, etc.) * Costs for weapon and utility crates were all equal + * Remove airplane cursor + * Fix Lua errors when hog goes to time travel while any filter is in map * Many other fixes and tweaks -Missions and Game Styles: - + Added Basic Flying Saucer Training +Racer and TechRacer: + + Allow to only place 2 waypoints in Racer + + Allow to remove Racer waypoints with precise key + + New script parameters for Racer: + + rounds: Number of rounds to play + + waypointradius: Size of waypoints + + maxwaypoints: Maximum allowed number of waypoints + + Show correct ranking and times in stats screen of Racer and TechRacer + * Fix description and icon of waypoint placement tool in Racer + * Remove airplane cursor in Racer + * Fixed waypoint message in TechRacer and Racer overwriting current weapon selection message + * Fixed TechRacer not recording finish if time was >= 100s + +WxW: + + Support for multiple sets of walls per map + + Add optional “Crate Before Attack” rule + + Add optional “All But Last” rule + + Add optional “Kill The Leader” rule + + Script parameter support (see Lua file comment for documentation) + + Possible to set max. number of weapons in game (script parameter only) + + Menu can be disabled (with script parameter “menu=false”) for insant game start + + Possible to set number of crates per turn + + Ropes, ShoppaKing, ShoppaHell and ShoppaNeon can now be played with the classic left and right walls + + Allows almost all game modifiers to be changed, the only exception is crate probabilities + + New wall sets for Ropes, ShoppaNeon, ShoppaDesert, ShoppaWild, ShoppaKing and ShoppaHell. + + Basic support for a bunch of Shoppa maps + + Fully functional even without a map border + + More sound effects + + More helpful mission display after configuration has been accepted + + Hide “Surf Before Crate” setting if surfing is disabled for this map, or the bottom is active and water never rises + + Hide walls setting if script does not provide walls for map yet + + Freeze crates at turn start if Walls Before Crate or Surf Before Crate is enabled (they unfreeze if you met requirements) + + Allow toggling the radar with Switch Hog key while roping or rope selected + * No smoke when hog is near near a WxW wall but walls need not to be touched + * Fix other player being able to change the menu config in the short period before the first turn + +Tumbler: + + Script parameter support: + + spawnbarrels: New barrels per turn + + spawnmines: New mines per turn + + ammoflamer: Initial Flamer fuel + + ammobarrel: Initial Barrel Launcher ammo + + ammomine: Initial Mine Deployer ammo + + minetimerplaced: Mine timer (ms) of mines dropped from Mine Deployer + + bonustime: Bonus time (s) in utility crates + + bonusflames: Bonus Flamer fuel in ammo crates + + chanceammo: Per-turn % chance of an ammo crate drop + + chancetime: Per-turn % chance of an utility crate (extra time) drop + + Alternative weapon selection with slot keys (F1, F2, F3) + + Add mine/barrel launch sounds + + Add countdown sounds + + Rewrote mission description and captions + + Sound and message when trying to fire empty weapon + * Permanently disable some game modifiers which won't work together with this + +Space Invasion: + + Show actual scores in stats screen, and a proper graph + + Show a couple of “awards” (snarky comments) in stats screen + + Remove bonuses “Boom!”, “BOOM!” and “BOOM!! BOOM!! BOOM!!” for balancing reasons + + Script parameter support: + + rounds: Number of rounds + + shield: Initial shield + + barrels: Initial barrel ammo + + pings: Available radar pings + + timebonus: Time bonus for red drones + + barrelbonus: Ammo bonus for green invaders + + shieldbonus: Shield bonus for purple invaders + + forcetheme: Set to “true” to use the selected theme instead of EarthRise + + Complete rewrite of almost all messages and the mission panel + + More event messages + + Show current score in HUD (white number) + + Stop overwriting most game scheme’s parameters + + Disable weapon scheme + + More sounds: Empty ammo, countdown, throw, kamikaze, radar ping, explosion + * Fix explosion being drawn twice when colliding with invader + +HedgeEditor: + + Dud mine placement mode + + Allow to select frames in sprite placement mode + + New placable sprite: sprTargetBee + + Complete rewrite of all help texts + + Allow to add and subtract health + + Add more convenient start values (e.g. for health) + + Allow to set timer of sticky mines + + Health crates can now have 0 health + + Hog and team names (from identity modes) are now translatable + + Show health/timer above health crates, barrels, mines, sticky mines and air mines + + Allow to toggle health/timer display with Precise+3 + + Allow to toggle main help at any time with Precise+1 + * Add proper description and name for the gear placement tool (no more fake air attack) + * Fix many issues with exported files + * Fix placement mode being changable when gear placement tool is not selected + * Make land gun spawn in utility crates instead of weapon crates + * Stop aggressively showing the mission panel after any button press + * Fix placement modes sometimes showing “nil” in caption + * Fix girder sprite being displayed at top left for no reason + * Ammo names are not hardcoded anymore (no more double work for translators) + * Fix many missing or poor-quality texts for translation + * Fix error when trying to set ShoppaBalance rank without anything selected + * Don't show misleading circle when placing girder/rubber + * Disable timer keys 2-4 in rubber placement mode + * Fix incorrect weapon crate preview of air attack, drill strike and napalm + +Other styles and schemes: + + The Specialists: Saints get low gravity + + Capture The Flag: Setting number of captures with script parameter “captures=” + + Mutant: Show appropriate ranking and graph in stats screen + + Shoppa: Don't place air mines + * Capture the Flag: Fix flag of first team spawning at second hog instead of first + * Gravity: Using the low gravity *utility* had no effect. Now it halves the base gravity of the style + * Disable Sudden Death for good in Shoppa game scheme, some game styles and mission maps + +A Classic Fairytale: + + Mission 4: Add infinite skip + + Mission 5: Spare traitor's life with Skip instead of Precise + + Mission 6: Add alternate dialogues when killing cyborgs before collecting the crates + + Mission 6: Give hero only a portal gun at the final portal seqment, remove the large amount of crate drops + + All missions: Clarify mine timers + * Mission 1: Leap of faith: Hog was able to walk to the right and get stuck + * Mission 1: Leap of faith: Teleport player back to mole when failing + * Mission 2: Fix crash when trying to open ammo menu in opening sequence + * Mission 2: Fix game sometimes getting stuck after walking back to Leaks A Lot + * Mission 2: Fix breakages when heroes died before a new sequence, or together with enemies + * Mission 2: Remove restart option when cooperating with cyborg; it messed up things too much + * Mission 3: Fix various Lua errors when playing with 2 hogs and one of them dies + * Mission 3: Fix broken end sequence after killing cyborg or princess + * Mission 3: Fix broken sequence of princess being caged + * Mission 3: All girder crates now have 3 girders each + * Mission 5: Fix crash when skipping animation while the cyborg talks before the 3rd wave of cannibals starts + * Mission 5: Make sure the player can only play with one hog after the cyborg imprisoned the other natives + * Mission 5: Fix final animation being stuck if cyborg's way to the left is blocked + * Mission 6: Block off left cave entrance to stop player to just rope all the way around + * Mission 6: Fix mines not being able to get triggered in first turn + * Mission 8: Fix Lua error message at the very beginning and error spam in intro sequence + * Mission 10: Fix mission becoming unplayable when all hogs except the traitor died + * All missions: Add missing texts for translation + * All missions: Fix incorrect crate types + * All missions: Rewrite mission texts to state missions more clearly + * Fix swapped mission preview images of missions 2 and 3 + +A Space Adventure: + + Side missions save and show your personal best successes (e.g. fastest finish in Hard Flying) + + Spacetrip: Show 2 flowers over fully completed planets (with side missions) + + All missions: Add skip where it doesn't hurt + + All missions: Clarify mine timers + + All missions: Improve displaying behaviour of mission panel + + All missions: Change team colors + + Side missions: Remove or shorten intro sequences + + Side missions: Generous ready time to give more time to read the mission panel + + Getting to the device: Put device part in a real crate, improve some dialogues + + Final mission: Add outro sequence instead of instantly quitting + + Bad timing: Improve messaging and choice dialog + * Spacetrip: Fix various bugs and logic flaws in the initial mission + * A frozen adventure: Fix bazooka and excess freezers (>6) not retained over checkpoints + * A frozen adventure: Fix and improve poorly written messages + * Getting to the device: Add real crate and correct message for collecting device part + * Getting to the device: Remove checkpoints. There was a good chance for these missions to become unwinnable + * Searching in the dust: Remove checkpoints. See above. + * Searching in the dust: Fix Hog Solo dropping straight down when roping near smuggler + * Searching in the dust: Fix incorrect messages after collecting device part + * Precise flying: Fix victory not being recognized, also wait for flames to settle before losing + * Hard Flying: Fix ending in a Lua error + * The First Stop: Fix stats screen showing teams twice + * Fruit planet: Fix “Precise shooting” disappearing directly after completing “Bad timing” + * Fruit planet: Fix “Getting to the device” not visible when landing on fruit planet with first main mission completed only + * Killing The Specialists: Fix killing hog with Deagle gave you chance to use another weapon in same turn + * Fix weird behaviour when walking right before the first animation in most missions + * Fix a couple of texts being untranslatable + * Fix a variety of minor logic flaws in the story + * Fix typos + * All missions: Fix incorrect crate types + +Missions: + + New scenario: Teamwork 2 + + New scenario: Big Armory + + New training: Basic Flying Saucer Training + Rope-Knocking Challenge was improved (now awards score based on kills and time; taunts for knocking out hedgehogs) + + Rewrote some help texts in basic rope training + + Graphical effect (black bars) while in cut scenes + + Change description and icon for baseball bat in Knockball mission map + + Sniper rifle target practice: Dynamite blows up quicker, can also skip with precise key + * Fixed mistakes and bad wording of strings in several missions, scripts and campaigns + * TrophyRace: Fix hedgehogs not being eliminated anymore after one hog skipped or ran out of time * Portal Mind Challenge was cleaned up and reworked (especially less awful wording) - * Fixed TechRacer not recording finish if time was >= 100s * Fixed Target Practice missions getting stuck when a target dropped into water - * Fixed mistakes and bad wording of strings in several missions, scripts and campaigns + * Climb Home: Fix game getting stuck when a player reached home in multiplayer + * Climb Home: Fix Lua error messages and broken stats screen + * Sniper rifle target practice: Fix targets spawning twice in dynamite scenes + * Sniper rifle target practice: Fix auto-camera generally behaving weird Frontend: - + Menu screens got few new icons and other tweaks, e.g. larger dropdown lists for easier access - + Clicking on "New" in weapon scheme editor now creates empty weapon scheme instead of default + + Campaign screen shows which campaigns and missions you've completed so far + + Training screen now has 3 mission categories: Training (tutorials), Challenge (get a high score), Scenario (complete a task) + + Replaced the Fort Mode game modifier by adding "Forts" to the map type selection. This makes the mode easier selectable/discoverable. Also the slider can be used to adjust the distance between forts. + + Menu screens got few new icons and many other tweaks, e.g. larger dropdown lists for easier access + + Additional button for just randomizing theme that will not change your selected map + + Randomizing map/theme in online mode will not include DLC content + + New teams start with a random grave and fort + + Hedgewars creates 4 human teams and 2 computer teams on its first launch + + Allow to randomize hog names, hats, team name, flag, grave, voice and fort separately + + “Random team” button is now able to randomly select from all available hats + + Creating new game/weapon schemes guarantees unique names + + Custom maps and styles are now marked with an icon instead of an asterisk + + Mark custom forts in team editor + + Room host can delegate room control to other player by rightclick + + Switch from HTTP to HTTPS where possible + * Fix flag being selectable for computer players although it had no effect + * Campaign screen does no longer show AI-controlled teams + * Campaign names and campaign mission names can now be translated + * Creating randomized teams now randomizes (almost) every aspect + * Fixed mostly broken descriptions for multiplayer mission maps + * Clicking on "New" in weapon scheme editor now creates empty weapon scheme instead of default + * Fix language names in language list being always in English + * Prevent starting game with >48 hogs (because engine doesn't support it yet) + * Fix the key for toggling team bars being incorrectly described + * Fix caption of stats screen showing only one winner if multiple teams have won + * Remove broken “Play again” button appearing in stats page after an online game + * Weapons scheme editor: When leaving, it no longer flickers and the selection is not reset to Default + * Team editor: Fix old team being retained when renaming a team + * Team editor: Automatically rename team when leaving team editor page with an already used team name + * Fix broken cancel button in the login window + +Content Creation: + + Theme objects can now have more than 1 in-land rect specified. You can specify the amount in theme.cfg by adding another number (and a comma) before the first rect + + Theme objects can now be placed on water (by setting first in-land rectangle to 0,0,0,0) + + Themes can now use flakes with negative falling speed (rising flakes) + + Themes can now contain custom sound files: splash.ogg Droplet1.ogg Droplet2.ogg Droplet3.ogg skip.ogg + + Themes can now have mirrored clouds and flakes: CloudsL.png, SDCloudsL.png, FlakeL.png, SDFlakeL.png + + Water in themes supports custom animation and flow speed with water-animation and sd-water-animation in theme.cfg + + Simplified hat format for unanimated hats; a single 32×32 image is enough. For clan hats, use size 64×32, with the color overlay at the right + + Ammos.png and Ammos_bw.png in HWPs are now overlayed over the base images; use transparent icons to keep them unchanged from the original + + Custom Sudden Death background tint for themes with sd-tint + * Default water color was black instead of blue -Lua-API: +Translations: + + Complete translations: German, Polish + + Major translation updates: Scottish Gaelic, Italian + + Loading screen can now be translated + + A few window titles can be translated + + Campaign names and campaign mission names can be translated + + A Classic Fairytale, missions 8 and 10 can now be translated + * Built-in texts from Qt (e.g. “cut”, “paste”, “copy”) in frontend weren't translated + * Remove text from mission images to make them language-neutral + * Fix English-only language/country names in language selection + * Fix very, very broken mission map descriptions + +Lua API: + New call: SetCinematicMode(enable) -- e.g. for cutscenes etc. + + New call: GetAmmoName(ammoType [, ignoreOverwrite]) -- returns the localized name for the specified ammoType + + New call: GetVisualGearType(vgUid) -- returns the visual gear type + + New call: SetAmmoTexts(ammoType, name, caption, description) -- Overwrite displayed name and description of an ammo type + + New call: SetAmmoDescriptionAppendix(ammoType, descAppend) -- Append a custom text to the description of an ammo type without overwriting it + + New call: GetHogFort(gearUid) -- Returns the name of the fort of the hog's team + + New call: PlaceRubber(x, y, frameIdx) -- Places a rubber + + New call: SendGameResultOff() -- Disable the game automatically setting a game result in the stats screen + + New call: SendRankingStatsOff() -- Disable the game automatically filling the team rankings in the stats screen + + New call: SendAchievementsStatsOff() -- Disable the game automatically populating the bullet point list in the “Details” section on the stats screen + + New call: GetTeamStats(teamname) -- Returns a table of team stats + + New call: EndTurn([noTaunts]) -- Ends the current turn + + New hook: onVisualGearAdd(vgUid) -- called when a visual gear is added + + New hook: onVisualGearDelete(vgUid) -- called when a visual gear is deleted + + New hook: onUsedAmmo(ammoType) -- called when ammo has been finished using (e.g. after both shotgun shots) + + New variable: AirMinesNum -- Number of air mines being placed on a medium-sized map + + New variable: WorldEdge -- World edge type (weNone, weWrap, weBounce, weSea) + + New variable: AmmoTypeMax -- Maximum ammo type ID (useful to iterate through all ammo types, starting by 0) + + New variable: ReadyTimeLeft -- Remaining ready time, 0 if turn in progress. Can be set in onNewTurn + + Locale library: loc_noop -- Mark string for translation but don't translate it + + Animate library: AnimInit([startAnimating]) -- New parameter startAnimating: if true, will start game in cinematic mode with most controls disabled. Must play an animation after that + + Animate library: AnimSetInputMask(extraInputMask) -- Set input mask in a manner comptible with the Animate library + + Animate library: AnimMove(gear, dir, posx, posy, [maxMoveTime]) -- new optional parameter maxMoveTime. If hog did not reach its destination within maxMoveTime milliseconds, animation stops and hog is just teleported there + + Gear values: “Boom” -- used to modify explosion size and/or damage for most gears + + 8 overridable custom sprites/sounds: sprCustom1-sprCustom8, sndCustom1-sndCustom8 + * Fixed call: HideHog(gear) -- Fix crash when gear is invalid. Returns true on success or false otherwise + * Fixed call: SwitchHog(gear) -- Fix new hog being unable to open ammo menu + * Removed call: SetAmmoStore -- Old undocumented function of questional use, has never been used + * Fixed variable: Goals -- Fix Goals text being cut off at ca. 255 characters + * Fix huge numbers having sign errors on 64-bit architectures -0.9.21 -> 0.9.22 +====================== 0.9.22 ====================== + New Weapon / Map object: AirMine (floating mine that will follow nearby hedgehogs) + Extensive changes to TechRacer: Variable terrain types, enhanced parameters, hwmap interpreter, fuel limiter, etc. - + HedgeEditor - create missions/etc. in-game! see http://hedgewars.org/HedgeEditor + + HedgeEditor - create missions/etc. in-game! see https://hedgewars.org/HedgeEditor + Map previews can now take script parameters into account and preview waypoints in TechRacer + Added a couple new flags + Various tweaks to the interface and in-game chat @@ -84,7 +426,7 @@ * Previously missing gear states are now available (gstSubmersible, gstFrozen and gstNoGravity) * Fixed OnHogAttack giving the incorrect AmmoType (amNothing) under certain conditions -0.9.20 -> 0.9.21: +====================== 0.9.21 ====================== + New type of randomly generated maps: Perlin Maps. + Old Random generated maps are more diverse now. + Slider for adjusting land generation detail. @@ -148,7 +490,7 @@ * Fixes: gfResetHealth is now a available like the other GameFlags -0.9.19 -> 0.9.20: +====================== 0.9.20 ====================== + New campaign, A Space Adventure! + Password protected rooms + Shapes on drawn maps (ellipses, rectangles) - constrain dimensions with ctrl, as with straight line tool. @@ -177,7 +519,7 @@ * Fixed context menu/cursor in text areas * Many bugfixes. Keypad enter in chat, hog sliding freezing game, team name flaws in Windows, localisation of tips, crasher in slots with no weapons, frontend holiday css. -0.9.18 -> 0.9.19: +====================== 0.9.19 ====================== + New Freezer weapon - freezes terrain, water, hedgehogs, mines, cases, explosives + Saucer can aim weapons and fire underwater + Main graphical user interface overhaul @@ -212,7 +554,7 @@ * ParseCommand should be safe to use in Lua now, at any time * Fixes to many weapons. Mudball, blowtorch, explosives, cluster bomb spread, portal. -0.9.17 -> 0.9.18: +====================== 0.9.18 ====================== + 'A Classic Fairytale' Campaign + Video recorder (requires ffmpeg/libav) @@ -241,7 +583,7 @@ * Fix drill strike bug when drill's timer gets ridiculously high value instead of explosion * Fix some crashes, freezes and memory leaks in frontend and engine -0.9.16 -> 0.9.17: +====================== 0.9.17 ====================== + New theme, Cave + New voicepack, Hillbilly + More attractive mission screen with previews @@ -274,7 +616,7 @@ * Many frontend bugfixes, code cleanup. Crash in game abort, flake clipping, invalid state on room close * Many other engine bugfixes. SDL event crasher, timebox crasher, birdy hang, desync on quits, crash in birdy eggshell, hammer + vamp + invuln, clouds on Deep Space theme, etc -0.9.15 -> 0.9.16: +====================== 0.9.16 ====================== + In-game chat now supports backspace-repeat and Escape to close the text input area + Team status bars shrunk/made translucent if they take up a significant portion of the screen + Background music change on sudden death mode @@ -338,7 +680,7 @@ * Fix invisible icons in popup menus * Various fixes and adjustments -0.9.14 -> 0.9.15: +====================== 0.9.15 ====================== + Ability to create, save and load hand drawn maps + New maps: Capture the Flag (Blizzard) Map + New themes: Christmas @@ -365,7 +707,7 @@ + Variable rope length in scheme + Allow hog speech when not your turn -0.9.13 -> 0.9.14: +====================== 0.9.14 ====================== + New audio tracks + New forts: EvilChicken, Tank + New game modes: AI Survival Mode, Per Hedgehog Ammo, Reset Health, Reset Weapons, Unlimited Attacks @@ -403,7 +745,7 @@ * Fixed bug that allowed charging a weapon while on rope, leading to frozen timer * Various bug fixes -0.9.12 -> 0.9.13: +====================== 0.9.13 ====================== + Speed optimizations + New weapon: Birdy (carries your hog and lets you throw poisonous eggs at your foes) + Hats are visible while using rope and blowtorch @@ -464,7 +806,7 @@ + PowerPC architecture supported * Reduced memory footprint and leakage -0.9.11 -> 0.9.12: +====================== 0.9.12 ====================== + Zoom + New weapons: flying saucer, molotov cocktail + More sounds @@ -482,7 +824,7 @@ * Fix rope bugs * Fix bugs in weapon selection code -0.9.10 -> 0.9.11: +====================== 0.9.11 ====================== + Speech bubbles + Many new hats, new graves + New taunts @@ -502,7 +844,7 @@ * Fix crash in parachute/rope if drowning with active girder/teleport * Fix rope disappearing bug -0.9.9 -> 0.9.10: +====================== 0.9.10 ====================== + Many new hats, maps, themes, updates on existing ones + Remove small pixels left by fire + Double possible land dimensions, allow up to 48 hedgehogs in game @@ -527,7 +869,7 @@ * Fix bug with not working toggles 'rectrict joins' and 'restrict team adding' + Fix engine slowdown when trying to switch ammo while firing bazooka -0.9.8 -> 0.9.9: +====================== 0.9.9 ====================== + Voicepacks + Teams health graphic on statistics page + Colorize join/quit messages in chat @@ -542,7 +884,7 @@ * Fix autogenerated demos/saves filenames problems * Fix engine freeze when switching hedgehog in certain conditions -0.9.7 -> 0.9.8: +====================== 0.9.8 ====================== + Many net server fixes + Lobby on net server + Napalm weapon @@ -558,7 +900,7 @@ * Fix a bug leading to engine silent crash when using whip, bat or firepunch (and probably flame) * Limit chat history to 250 entries to avoid DoS attack with its use -0.9.6 -> 0.9.7: +====================== 0.9.7 ====================== + Completely redesign the frontend, no longer looks like an ugly program launcher + New art + Add fullscreen mode to frontend @@ -582,7 +924,7 @@ * Fixed grenade sound * AI uses the mortar better -0.9.5 -> 0.9.6: +====================== 0.9.6 ====================== + New Cake weapon + New maps: EarthRise, Bamboo, Bath, BambooPlinko + New theme EarthRise @@ -593,7 +935,7 @@ * Fix clouds shaking up * Repair screenshots capturing -0.9.4 -> 0.9.5: +====================== 0.9.5 ====================== + Taunts + Exit confirmation dialog + Sudden death @@ -603,7 +945,7 @@ + More impressive exposions * Fix bad sprite when you jump and get hit -0.9.3 -> 0.9.4: +====================== 0.9.4 ====================== + In game chat is now implemented, chat (and taunt!) your buddies during network play + Mortar, whip and Kamikaze weapon additions + Two new themes, desert island and city @@ -617,7 +959,7 @@ + Lots of new graphics * Many network/gameplay bug fixes -0.9.2 -> 0.9.3: +====================== 0.9.3 ====================== + Switch to OpenGL rendering + Massive graphics update + New animations, weapon sprites @@ -633,7 +975,7 @@ * Fix hedgehog moving direction after been shot by shotgun * Fix bug with handling keys while it is enemy's turn -0.9 -> 0.9.2: +====================== 0.9.2 ====================== + Add registration of net game in web + Introduce weapons sets support diff -r 01f88c3b7b66 -r 1b2b84315d27 INSTALL --- a/INSTALL Thu Aug 11 23:05:14 2016 +0300 +++ b/INSTALL Sun Dec 17 00:09:24 2017 +0100 @@ -1,47 +1,1 @@ -To compile and install you need: - - CMake >= 2.6.0 - - FreePascal >= 2.2.4 - - Qt >= 4.7.0 - - SDL >= 2.0 - - SDL_net >= 2.0 - - SDL_mixer >= 2.0 - - SDL_image >= 2.0 - - SDL_ttf >= 2.0 - - Lua = 5.1.0 - - Physfs >= 2.0.0 -For server: - - Glasgow Haskell Compiler >= 6.10 - - dataenc package - - hslogger package -For videorecording: - - FFmpeg or LibAV -For compressed screenshots: - - libpng - -Lua will be automatically built if not found. - -PhysFS will internally built unless -DPHYSFS_SYSTEM=on is passed to cmake -(also allows to set PHYSFS_LIBRARY and PHYSFS_INCLUDE_DIR if needed). - -1. Configure: -$ cmake . -or -$ cmake -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="install_prefix" \ --DDATA_INSTALL_DIR="data_dir" -DNOSERVER=1 . - -Add -DNOSERVER=0 to compile net server (remember to check out the additional -dependencies with the hedgewars-server.cabal configuration file. If you have -Qt installed but it is not found, you can set it up with --DQT_QMAKE_EXECUTABLE="path_to_qmake". -To get a glimpse of the main configuration options, you may use this command -`cat CMakeLists.txt | grep option` - -2. Compile: -$ make - -3. Install: -# make install - - -That's all! Enjoy! - +INSTALL.md \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 INSTALL.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/INSTALL.md Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,203 @@ +Building and installing Hedgewars +================================= + +This file explains to you how to build/compile Hedgewars and how to install it. + +See also: + +Dependencies +------------ + +### Core dependencies + +To compile and install Hedgewars, you need at least: + +- A C++ compiler (e.g. GCC) +- CMake >= 2.6.0 +- A make program (e.g. GNU Make) +- Free Pascal Compiler (FPC) >= 2.2.4 +- Qt = 4.7.0 +- SDL >= 2.0 +- SDL\_net >= 2.0 +- SDL\_mixer >= 2.0 +- SDL\_image >= 2.0 +- SDL\_ttf >= 2.0 + +### Optional dependencies + +For some additional features, you can optionally install these dependencies: + +- For Hedgewars: + - PhysFS >= 2.0.0 (recommended) + - Lua = 5.1.0 (recommended) +- For PNG screenshots: + - libpng >= 1.2 (recommended) +- For video recording: + - FFmpeg or Libav +- For the Hedgewars Server: + - GHC >= 6.10 + - Various Haskell packages (see below) + +PhysFS will be internally built if `-DPHYSFS_SYSTEM=OFF` is passed to `cmake` +(also allows to set `PHYSFS_LIBRARY` and `PHYSFS_INCLUDE_DIR` if needed). + +Lua will be automatically built if not found. + +### Hedgewars Server dependencies + +The Hedgewars Server is an **optional** separate application. +It provides the online lobby and allows players to create rooms. +You will also be able to launch the server from the frontend +(network play → local network → start server). + +**Most players do not need this!** + +To compile it, you need: + +- Glasgow Haskell Compiler (GHC) >= 6.10 +- These Haskell packages: + - `containers` + - `vector` + - `bytestring` + - `network` >= 2.3 + - `random` + - `time` + - `mtl` >= 2 + - `sandi` + - `hslogger` + - `process` + - `deepseq` + - `utf8-string` + - `SHA` + - `entropy` + - `zlib` >= 0.5.3 and < 0.6 + - `regex-tdfa` + + +Building +-------- + +### Summary + +To build and install Hedgewars, obtain all dependencies, then run: + + $ cmake . + $ make + # make install + +### Step 1: Configure + +For a default install with all dependencis, use this command: + + $ cmake . + +To build with a custom install directory, instead run: + + $ cmake -DCMAKE_INSTALL_PREFIX="" . + +(Replace `` with the directoy in which you +want Hedgewars to be installed.) + +Add the `-DNOSERVER=ON` switch if you do not want to build +the server. + +#### CMake options + +For more detailed build settings, change some CMake options. +Run `ccmake` for an interactive way to edit them. + +Important CMake options: + +- `CMAKE_INSTALL_PREFIX`: Installation directory +- `NOSERVER`: Set to `ON` to *not* build the server +- `NOVIDEOREC`: Set to `ON` to *not* build the video recorder +- `SYSTEM_PHYSFS`: Set to `OFF` to use Hedgewars-bundled PhysFS + +### Step 2: Make + +Run: + + $ make + +This creates the following files: + +- `bin/hedgewars`: Hedgewars +- `bin/hwengine`: Game engine, can be used to play demos and saved games +- `bin/hedgewars-server`: Hedgewars Server (optional) + +### Step 3: Installation + +To install Hedgewars to the install directory run: + + # make install + +That's all! Enjoy! + +Troubleshooting +--------------- + +### Qt is installed but it can't be found + +If this happens, set the following CMake option: + + QT_QMAKE_EXECUTABLE="" + +(Replace `` with the path to the `qmake` application.) + +If this didn't work, make sure you have the correct Qt version +(see above). + +### Hedgewars compiles successfully, but games instantly crash the map preview fails + +This is likely to be a problem with PhysFS. Try to build Hedgewars +with the Hedgewars-bundled PhysFS by setting the CMake option +`SYSTEM_PHYSFS=OFF`, then try to run `make` again. + +If the _bundled_ PhysFS fails, too, this is likely to be a bug in +Hedgewars, please report at . + +### Broken/missing Haskell dependencies + +First, try to obtain the missing Haskell packages and make sure GHC +is up-to date, then try again. Read the error messages carefully +to figure out missing package names. + +If everything fails and you don't need the server, set the CMake +option `NOSERVER=ON` so the server isn't built at all. + +### Error messages related to libavcodec / libavformat + +Update Libav or FFmpeg (whatever is present on your system) to +the latest version or install one of them if you haven't already. +Then try to build again. + +If this still doesn't work and you give up, set the CMake option +`NOVIDEOREC=ON`, but then the video recording functionality will +not be available. + +### Error messages related to Lua, “undefined reference to `lua_tonumber'”, and so on +If you get error messages like these: + +* /home/username/hw/hedgewars//uScript.pas:226: undefined reference to `lua_tonumber' +* /home/username/hw/hedgewars/CMakeFiles/hwengine.dir/uScript.o: In function `LUATOVISUALGEARTYPEORD': + +There might be something wrong with your Lua installation. Try to install Lua 5.1. +If this doesn't work, or you don't want to install Lua 5.1, try to build Hedgewars +with the bundled Lua version. + +To build with the bundled Lua version, adding the CMake option `SYSTEM_LUA=OFF`, then +repeat the building process. + +### Cleaning up + +In case you want to start over and start with a clean build, +run `make clean`, then go back to step 2. + +If things got seriously out of hand, you may want to reset +*everything* (even your configuration). If you use the +Mercural repository, you can run `hg purge --all`. Proceed with +step 1. + +### Still can't build Hedgewars? + +Visit us in the forums or IRC (see `README.md`) and ask for help. diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/CMakeLists.txt --- a/QTfrontend/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -21,9 +21,9 @@ endif() find_package(SDL2 REQUIRED) -find_package(SDL2_mixer REQUIRED) #audio in SDLInteraction +find_package(SDL2_mixer 2 REQUIRED) #audio in SDLInteraction include_directories(${SDL2_INCLUDE_DIR}) -include_directories(${SDL2MIXER_INCLUDE_DIR}) +include_directories(${SDL2_MIXER_INCLUDE_DIRS}) if(LIBAV_FOUND) add_definitions(-DVIDEOREC -D__STDC_CONSTANT_MACROS) @@ -103,11 +103,6 @@ ${CMAKE_CURRENT_BINARY_DIR}/hwconsts.cpp ) -#xfire integration -if(WIN32) - list(APPEND hwfr_src util/platform/xfire.cpp util/platform/xfiregameclient.cpp) -endif(WIN32) - if(MINGW) # resource compilation for mingw add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/hedgewars_rc.o @@ -208,7 +203,7 @@ list(APPEND HW_LINK_LIBS ${SDL2_LIBRARY} - ${SDL2MIXER_LIBRARY} + ${SDL2_MIXER_LIBRARIES} ) if(WIN32 AND NOT UNIX) diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/binds.cpp --- a/QTfrontend/binds.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/binds.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -66,7 +66,8 @@ {"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:")}, - {"rotmask", "delete", QT_TRANSLATE_NOOP("binds", "hedgehog info"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle labels above hedgehogs:")}, + //: 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, QT_TRANSLATE_NOOP("binds (descriptions)", "Heads-up display:")}, #ifdef VIDEOREC {"record", "r", QT_TRANSLATE_NOOP("binds", "record"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Record video:")} #endif diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/campaign.cpp --- a/QTfrontend/campaign.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/campaign.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -23,68 +23,128 @@ #include #include -QList getCampMissionList(QString & campaignName, QString & teamName) +QSettings* getCampTeamFile(QString & campaignName, QString & teamName) { - QList missionInfoList; - QSettings teamfile(cfgdir->absolutePath() + "/Teams/" + teamName + ".hwt", QSettings::IniFormat, 0); - teamfile.setIniCodec("UTF-8"); - + QSettings* teamfile = new QSettings(cfgdir->absolutePath() + "/Teams/" + teamName + ".hwt", QSettings::IniFormat, 0); + teamfile->setIniCodec("UTF-8"); // if entry not found check if there is written without _ // if then is found rename it to use _ QString spaceCampName = campaignName; spaceCampName = spaceCampName.replace(QString("_"),QString(" ")); - if (!teamfile.childGroups().contains("Campaign " + campaignName) and - teamfile.childGroups().contains("Campaign " + spaceCampName)){ - teamfile.beginGroup("Campaign " + spaceCampName); - QStringList keys = teamfile.childKeys(); - teamfile.endGroup(); + if (!teamfile->childGroups().contains("Campaign " + campaignName) and + teamfile->childGroups().contains("Campaign " + spaceCampName)){ + teamfile->beginGroup("Campaign " + spaceCampName); + QStringList keys = teamfile->childKeys(); + teamfile->endGroup(); for (int i=0;ivalue("Campaign " + spaceCampName + "/" + keys[i]); + teamfile->setValue("Campaign " + campaignName + "/" + keys[i], value); } - teamfile.remove("Campaign " + spaceCampName); + teamfile->remove("Campaign " + spaceCampName); } - int progress = teamfile.value("Campaign " + campaignName + "/Progress", 0).toInt(); - int unlockedMissions = teamfile.value("Campaign " + campaignName + "/UnlockedMissions", 0).toInt(); + return teamfile; +} + +/** + Returns true if the specified mission has been completed + campaignName: Name of the campaign in question + 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) +{ + 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 and unlockedMissions==0) + { + QSettings campfile("physfs://Missions/Campaign/" + campaignName + "/campaign.ini", QSettings::IniFormat, 0); + campfile.setIniCodec("UTF-8"); + int totalMissions = campfile.value("MissionNum", 1).toInt(); + return (progress > (progress - missionInList)) || (progress >= totalMissions); + } + else if(unlockedMissions>0) + { + int fileMissionId = missionInList + 1; + int actualMissionId = teamfile->value(QString("Campaign %1/Mission%2").arg(campaignName, QString::number(fileMissionId)), false).toInt(); + return teamfile->value(QString("Campaign %1/Mission%2Won").arg(campaignName, QString::number(actualMissionId)), false).toBool(); + } + else + return false; +} + +/** Returns true if the campaign has been won by the team */ +bool isCampWon(QString & campaignName, QString & teamName) +{ + QSettings* teamfile = getCampTeamFile(campaignName, teamName); + bool won = teamfile->value("Campaign " + campaignName + "/Won", false).toBool(); + return won; +} + +QSettings* getCampMetaInfo() +{ + DataManager & dataMgr = DataManager::instance(); + // get locale + QSettings settings(dataMgr.settingsFileName(), + QSettings::IniFormat); + QString loc = settings.value("misc/locale", "").toString(); + if (loc.isEmpty()) + loc = QLocale::system().name(); + QString campaignDescFile = QString("physfs://Locale/campaigns_" + loc + ".txt"); + // if file is non-existant try with language only + if (!QFile::exists(campaignDescFile)) + campaignDescFile = QString("physfs://Locale/campaigns_" + loc.remove(QRegExp("_.*$")) + ".txt"); + + // fallback if file for current locale is non-existant + if (!QFile::exists(campaignDescFile)) + campaignDescFile = QString("physfs://Locale/campaigns_en.txt"); + + QSettings* m_info = new QSettings(campaignDescFile, QSettings::IniFormat, 0); + m_info->setIniCodec("UTF-8"); + + return m_info; +} + +/** Returns the localized campaign name */ +QString getRealCampName(const QString & campaignName) +{ + QString campaignNameSpaces = QString(campaignName).replace(QString("_"), QString(" ")); + return getCampMetaInfo()->value(campaignName+".name", campaignNameSpaces).toString(); +} + +QList getCampMissionList(QString & campaignName, QString & teamName) +{ + QList missionInfoList; + QSettings* teamfile = getCampTeamFile(campaignName, teamName); + + int progress = teamfile->value("Campaign " + campaignName + "/Progress", 0).toInt(); + int unlockedMissions = teamfile->value("Campaign " + campaignName + "/UnlockedMissions", 0).toInt(); QSettings campfile("physfs://Missions/Campaign/" + campaignName + "/campaign.ini", QSettings::IniFormat, 0); campfile.setIniCodec("UTF-8"); - DataManager & dataMgr = DataManager::instance(); - // get locale - QSettings settings(dataMgr.settingsFileName(), - QSettings::IniFormat); - QString loc = settings.value("misc/locale", "").toString(); - if (loc.isEmpty()) - loc = QLocale::system().name(); - QString campaignDescFile = QString("physfs://Locale/campaigns_" + loc + ".txt"); - // if file is non-existant try with language only - if (!QFile::exists(campaignDescFile)) - campaignDescFile = QString("physfs://Locale/campaigns_" + loc.remove(QRegExp("_.*$")) + ".txt"); - - // fallback if file for current locale is non-existant - if (!QFile::exists(campaignDescFile)) - campaignDescFile = QString("physfs://Locale/campaigns_en.txt"); - - QSettings m_info(campaignDescFile, QSettings::IniFormat, 0); - m_info.setIniCodec("UTF-8"); + QSettings* m_info = getCampMetaInfo(); if(progress>=0 and unlockedMissions==0) { for(unsigned int i=progress+1;i>0;i--) { MissionInfo missionInfo; - missionInfo.name = campfile.value(QString("Mission %1/Name").arg(i)).toString(); QString script = campfile.value(QString("Mission %1/Script").arg(i)).toString(); - missionInfo.script = script; - missionInfo.description = m_info.value(campaignName+"-"+ script.replace(QString(".lua"),QString("")) + ".desc", + if(!script.isNull()) { + missionInfo.script = script; + missionInfo.name = campfile.value(QString("Mission %1/Name").arg(i)).toString(); + QString scriptPrefix = campaignName+"-"+ script.replace(QString(".lua"),QString("")); + missionInfo.realName = m_info->value(scriptPrefix+".name", missionInfo.name).toString(); + missionInfo.description = m_info->value(scriptPrefix + ".desc", QObject::tr("No description available")).toString(); - QString image = campfile.value(QString("Mission %1/Script").arg(i)).toString().replace(QString(".lua"),QString(".png")); - missionInfo.image = ":/res/campaign/"+campaignName+"/"+image; - if (!QFile::exists(missionInfo.image)) - missionInfo.image = ":/res/CampaignDefault.png"; - missionInfoList.append(missionInfo); + QString image = campfile.value(QString("Mission %1/Script").arg(i)).toString().replace(QString(".lua"),QString(".png")); + missionInfo.image = ":/res/campaign/"+campaignName+"/"+image; + if (!QFile::exists(missionInfo.image)) + missionInfo.image = ":/res/CampaignDefault.png"; + missionInfoList.append(missionInfo); + } } } else if(unlockedMissions>0) @@ -92,12 +152,14 @@ for(int i=1;i<=unlockedMissions;i++) { QString missionNum = QString("%1").arg(i); - int missionNumber = teamfile.value("Campaign " + campaignName + "/Mission"+missionNum, -1).toInt(); + int missionNumber = teamfile->value("Campaign " + campaignName + "/Mission"+missionNum, -1).toInt(); MissionInfo missionInfo; - missionInfo.name = campfile.value(QString("Mission %1/Name").arg(missionNumber)).toString(); QString script = campfile.value(QString("Mission %1/Script").arg(missionNumber)).toString(); missionInfo.script = script; - missionInfo.description = m_info.value(campaignName+"-"+ script.replace(QString(".lua"),QString("")) + ".desc", + missionInfo.name = campfile.value(QString("Mission %1/Name").arg(missionNumber)).toString(); + QString scriptPrefix = campaignName+"-"+ script.replace(QString(".lua"),QString("")); + missionInfo.realName = m_info->value(scriptPrefix+".name", missionInfo.name).toString(); + missionInfo.description = m_info->value(scriptPrefix + ".desc", QObject::tr("No description available")).toString(); QString image = campfile.value(QString("Mission %1/Script").arg(missionNumber)).toString().replace(QString(".lua"),QString(".png")); missionInfo.image = ":/res/campaign/"+campaignName+"/"+image; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/campaign.h --- a/QTfrontend/campaign.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/campaign.h Sun Dec 17 00:09:24 2017 +0100 @@ -20,16 +20,24 @@ #define CAMPAIGN_H #include +#include class MissionInfo { public: QString name; + QString realName; QString description; QString script; QString image; }; + +QSettings* getCampTeamFile(QString & campaignName, QString & teamName); +QSettings* getCampMetaInfo(); +bool isCampWon(QString & campaignName, QString & teamName); +bool isMissionWon(QString & campaignName, int missionInList, QString & teamName); +QString getRealCampName(const QString & campaignName); QList getCampMissionList(QString & campaignName, QString & teamName); #endif diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/game.cpp --- a/QTfrontend/game.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/game.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -44,6 +44,7 @@ // last game info QList lastGameStartArgs = QList(); GameType lastGameType = gtNone; +QString lastTrainingSubFolder = NULL; GameCFGWidget * lastGameCfg = NULL; QString lastGameAmmo = NULL; TeamSelWidget * lastGameTeamSel = NULL; @@ -153,7 +154,8 @@ team1.setDifficulty(0); team1.setColor(0); team1.setNumHedgehogs(4); - HWNamegen::teamRandomNames(team1,true); + HWNamegen::teamRandomEverything(team1); + team1.setVoicepack("Default"); HWProto::addStringListToBuffer(teamscfg, team1.teamGameConfig(100)); @@ -162,8 +164,9 @@ team2.setColor(1); team2.setNumHedgehogs(4); do - HWNamegen::teamRandomNames(team2,true); + 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)); @@ -383,6 +386,8 @@ arguments << "--user-prefix"; arguments << cfgdir->absolutePath(); arguments << "--locale"; + // TODO: Don't bother translators with this nonsense and detect this file automatically. + //: 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. arguments << tr("en.txt"); arguments << "--frame-interval"; arguments << QString::number(config->timerInterval()); @@ -430,6 +435,7 @@ void HWGame::PlayDemo(const QString & demofilename, bool isSave) { gameType = isSave ? gtSave : gtDemo; + lastGameType = gameType; QFile demofile(demofilename); if (!demofile.open(QIODevice::ReadOnly)) { @@ -448,6 +454,9 @@ void HWGame::StartNet() { + lastGameStartArgs.clear(); + lastGameType = gtNet; + gameType = gtNet; demo.clear(); Start(false); @@ -476,14 +485,16 @@ SetGameState(gsStarted); } -void HWGame::StartTraining(const QString & file) +void HWGame::StartTraining(const QString & file, const QString & subFolder) { lastGameStartArgs.clear(); lastGameStartArgs.append(file); lastGameType = gtTraining; + lastTrainingSubFolder = subFolder; gameType = gtTraining; - training = "Missions/Training/" + file + ".lua"; + + training = "Missions/" + subFolder + "/" + file + ".lua"; demo.clear(); Start(false); SetGameState(gsStarted); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/game.h --- a/QTfrontend/game.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/game.h Sun Dec 17 00:09:24 2017 +0100 @@ -64,6 +64,7 @@ // last game info extern QList lastGameStartArgs; extern GameType lastGameType; +extern QString lastTrainingSubFolder; extern GameCFGWidget * lastGameCfg; extern QString lastGameAmmo; extern TeamSelWidget * lastGameTeamSel; @@ -79,7 +80,7 @@ void StartLocal(); void StartQuick(); void StartNet(); - void StartTraining(const QString & file); + void StartTraining(const QString & file, const QString & subFolder); void StartCampaign(const QString & camp, const QString & campScript, const QString & campTeam); void abort(); GameState gameState; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/gameuiconfig.cpp --- a/QTfrontend/gameuiconfig.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/gameuiconfig.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -183,10 +183,9 @@ Form->ui.pageOptions->setDefaultOptions(); // then load user configuration - Form->ui.pageOptions->framerateBox->setCurrentIndex( - Form->ui.pageOptions->framerateBox->findData( - value("videorec/framerate", rec_Framerate()).toString() + " fps", - Qt::MatchExactly) ); + int framerateBoxIndex = Form->ui.pageOptions->framerateBox->findData(value("videorec/framerate", rec_Framerate()).toUInt()); + if(framerateBoxIndex != -1) + Form->ui.pageOptions->framerateBox->setCurrentIndex(framerateBoxIndex); Form->ui.pageOptions->bitrateBox->setValue(value("videorec/bitrate", rec_Bitrate()).toUInt()); bool useGameRes = value("videorec/usegameres",Form->ui.pageOptions->checkUseGameRes->isChecked()).toBool(); if (useGameRes) @@ -625,10 +624,7 @@ int GameUIConfig::rec_Framerate() { - // remove the "fps" label - QString fpsText = Form->ui.pageOptions->framerateBox->currentText(); - QStringList fpsList = fpsText.split(" "); - return fpsList.first().toInt(); + return Form->ui.pageOptions->framerateBox->itemData(Form->ui.pageOptions->framerateBox->currentIndex()).toInt(); } int GameUIConfig::rec_Bitrate() diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/hedgewars.qrc --- a/QTfrontend/hedgewars.qrc Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/hedgewars.qrc Sun Dec 17 00:09:24 2017 +0100 @@ -1,6 +1,6 @@ - ../share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png + ../share/hedgewars/Data/Graphics/AmmoMenu/Ammos_base.png res/css/qt.css res/css/chat.css res/css/christmas.css @@ -85,12 +85,20 @@ res/delete.png res/checked.png res/unchecked.png + res/missionFinished.png + res/missionFinishedSelected.png + res/dlcMarker.png + res/dlcMarkerSelected.png res/graphicsicon.png + res/frontendicon.png + res/folder.png res/miscicon.png res/Load.png res/Save.png res/Record.png res/Videos.png + res/Palette.png + res/schemeicon.png res/weaponsicon.png res/teamicon.png res/panelbg.png @@ -101,7 +109,6 @@ res/PlaySound.png res/hh_small.png res/btnDisabled.png - res/btnForts@2x.png res/btnBorder@2x.png res/btnInvulnerable@2x.png res/btnLaserSight@2x.png @@ -127,6 +134,7 @@ res/btnTagTeam@2x.png res/btnBottomBorder@2x.png res/iconBox.png + res/iconInitHealth.png res/iconHealth.png res/iconHealthPercent.png res/iconSuddenDeath.png @@ -148,6 +156,7 @@ res/iconScript.png res/dice.png res/Star.png + res/home.png res/inverse-corner-bl.png res/Flake.png res/Egg.png diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/hwconsts.cpp.in --- a/QTfrontend/hwconsts.cpp.in Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/hwconsts.cpp.in Sun Dec 17 00:09:24 2017 +0100 @@ -72,12 +72,15 @@ << qMakePair(QString("Highlander"), QString( AMMOLINE_HIGHLANDER_QT AMMOLINE_HIGHLANDER_PROB AMMOLINE_HIGHLANDER_DELAY AMMOLINE_HIGHLANDER_CRATE )) - << qMakePair(QString("Construction Mode"), QString( + << qMakePair(QString("Construction Mode"), QString( AMMOLINE_CONSTRUCTION_QT AMMOLINE_CONSTRUCTION_PROB AMMOLINE_CONSTRUCTION_DELAY AMMOLINE_CONSTRUCTION_CRATE )) - << qMakePair(QString("Shoppa Pro"), QString( + << qMakePair(QString("Shoppa Pro"), QString( AMMOLINE_SHOPPAPRO_QT AMMOLINE_SHOPPAPRO_PROB AMMOLINE_SHOPPAPRO_DELAY AMMOLINE_SHOPPAPRO_CRATE )) + << qMakePair(QString("HedgeEditor"), QString( + AMMOLINE_HEDGEEDITOR_QT AMMOLINE_HEDGEEDITOR_PROB + AMMOLINE_HEDGEEDITOR_DELAY AMMOLINE_HEDGEEDITOR_CRATE )) ; unsigned int colors[] = HW_TEAMCOLOR_ARRAY; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/hwconsts.h --- a/QTfrontend/hwconsts.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/hwconsts.h Sun Dec 17 00:09:24 2017 +0100 @@ -73,7 +73,7 @@ #define HEDGEHOGS_PER_TEAM 8 -// see http://en.wikipedia.org/wiki/List_of_colors +// see https://en.wikipedia.org/wiki/List_of_colors /*define HW_TEAMCOLOR_ARRAY {0xff007fff, /. azure ./ \ 0xffdd0000, /. classic red ./ \ 0xff3e9321, /. classic green ./ \ diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/hwform.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -46,6 +46,8 @@ #include #include #include +#include +#include #if (QT_VERSION >= 0x040600) #include @@ -90,7 +92,6 @@ #include "input_password.h" #include "ammoSchemeModel.h" #include "bgwidget.h" -#include "xfire.h" #include "drawmapwidget.h" #include "mouseoverfilter.h" #include "roomslistmodel.h" @@ -129,6 +130,8 @@ bool frontendEffects = true; QString playerHash; +QIcon finishedIcon; +QIcon notFinishedIcon; GameUIConfig* HWForm::config = NULL; HWForm::HWForm(QWidget *parent, QString styleSheet) @@ -142,10 +145,19 @@ // set music track SDLInteraction::instance().setMusicTrack("/Music/main_theme.ogg"); -#ifdef USE_XFIRE - xfire_init(); -#endif this->setStyleSheet(styleSheet); + + + QIcon * hwIcon = new QIcon(); + hwIcon->addFile(":/res/hh_small.png"); + //hwIcon->addFile(":/res/hh25x25.png"); + // crop-workaround for the fact that hh25x25.png is actually 25x35 + QPixmap pm(":/res/hh25x25.png"); + hwIcon->addPixmap(pm.copy(0,(pm.height()-25)/2,25,25)); + hwIcon->addFile(":/res/teamicon.png"); + hwIcon->addFile(":/res/teamicon2.png"); + + this->setWindowIcon(*hwIcon); ui.setupUi(this); setMinimumSize(760, 580); //setFocusPolicy(Qt::StrongFocus); @@ -157,6 +169,15 @@ 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()); + // Icons for finished missions + finishedIcon.addFile(":/res/missionFinished.png", QSize(), QIcon::Normal, QIcon::On); + finishedIcon.addFile(":/res/missionFinishedSelected.png", QSize(), QIcon::Selected, QIcon::On); + + // A transparent icon, used to nicely align the unfinished missions with the finished ones + QPixmap emptySpace = QPixmap(15, 15); + emptySpace.fill(QColor(0, 0, 0, 0)); + notFinishedIcon = QIcon(emptySpace); + ui.pageRoomsList->setSettings(config); ui.pageNetGame->setSettings(config); ui.pageNetGame->chatWidget->setSettings(config); @@ -198,6 +219,7 @@ UpdateTeamsLists(); InitCampaignPage(); UpdateCampaignPage(0); + UpdateCampaignPageTeam(0); UpdateCampaignPageMission(0); UpdateWeapons(); @@ -243,7 +265,7 @@ ui.pageMultiplayer->BtnStartMPGame, SLOT(setEnabled(bool))); connect(ui.pageMultiplayer, SIGNAL(SetupClicked()), this, SLOT(IntermediateSetup())); connect(ui.pageMultiplayer->gameCFG, SIGNAL(goToSchemes(int)), this, SLOT(GoToScheme(int))); - connect(ui.pageMultiplayer->gameCFG, SIGNAL(goToWeapons(int)), this, SLOT(GoToSelectWeaponSet(int))); + connect(ui.pageMultiplayer->gameCFG, SIGNAL(goToWeapons(int)), this, SLOT(GoToWeapons(int))); connect(ui.pageMultiplayer->gameCFG, SIGNAL(goToDrawMap()), pageSwitchMapper, SLOT(map())); pageSwitchMapper->setMapping(ui.pageMultiplayer->gameCFG, ID_PAGE_DRAWMAP); @@ -257,14 +279,13 @@ connect(ui.pageOptions, SIGNAL(goBack()), config, SLOT(SaveOptions())); connect(ui.pageOptions->BtnAssociateFiles, SIGNAL(clicked()), this, SLOT(AssociateFiles())); - connect(ui.pageOptions->WeaponEdit, SIGNAL(clicked()), this, SLOT(GoToSelectWeapon())); - connect(ui.pageOptions->WeaponNew, SIGNAL(clicked()), this, SLOT(GoToSelectNewWeapon())); + connect(ui.pageOptions->WeaponEdit, SIGNAL(clicked()), this, SLOT(GoToEditWeapons())); + connect(ui.pageOptions->WeaponNew, SIGNAL(clicked()), this, SLOT(GoToNewWeapons())); connect(ui.pageOptions->WeaponDelete, SIGNAL(clicked()), this, SLOT(DeleteWeaponSet())); connect(ui.pageOptions->SchemeEdit, SIGNAL(clicked()), this, SLOT(GoToEditScheme())); 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.pageSelectWeapon->pWeapons, SIGNAL(weaponsChanged()), this, SLOT(UpdateWeapons())); connect(ui.pageNet->BtnSpecifyServer, SIGNAL(clicked()), this, SLOT(NetConnect())); connect(ui.pageNet->BtnNetSvrStart, SIGNAL(clicked()), pageSwitchMapper, SLOT(map())); @@ -278,7 +299,7 @@ ui.pageNetGame->BtnStart, SLOT(setEnabled(bool))); connect(ui.pageNetGame, SIGNAL(SetupClicked()), this, SLOT(IntermediateSetup())); connect(ui.pageNetGame->pGameCFG, SIGNAL(goToSchemes(int)), this, SLOT(GoToScheme(int))); - connect(ui.pageNetGame->pGameCFG, SIGNAL(goToWeapons(int)), this, SLOT(GoToSelectWeaponSet(int))); + connect(ui.pageNetGame->pGameCFG, SIGNAL(goToWeapons(int)), this, SLOT(GoToWeapons(int))); connect(ui.pageNetGame->pGameCFG, SIGNAL(goToDrawMap()), pageSwitchMapper, SLOT(map())); pageSwitchMapper->setMapping(ui.pageNetGame->pGameCFG, ID_PAGE_DRAWMAP); @@ -303,21 +324,23 @@ connect(ui.pageSinglePlayer->BtnLoad, SIGNAL(clicked()), this, SLOT(GoToSaves())); connect(ui.pageSinglePlayer->BtnDemos, SIGNAL(clicked()), this, SLOT(GoToDemos())); - connect(ui.pageTraining, SIGNAL(startMission(const QString&)), this, SLOT(startTraining(const QString&))); + connect(ui.pageTraining, SIGNAL(startMission(const QString&, const QString&)), this, SLOT(startTraining(const QString&, const QString&))); connect(ui.pageCampaign->BtnStartCampaign, SIGNAL(clicked()), this, SLOT(StartCampaign())); connect(ui.pageCampaign->btnPreview, SIGNAL(clicked()), this, SLOT(StartCampaign())); connect(ui.pageCampaign->CBTeam, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPage(int))); + 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.pageSelectWeapon->BtnDelete, SIGNAL(clicked()), - ui.pageSelectWeapon->pWeapons, SLOT(deleteWeaponsName())); // executed first - connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsDeleted()), - this, SLOT(UpdateWeapons())); // executed second - //connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsDeleted()), - // this, SLOT(GoBack())); // executed third - + connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsDeleted(QString)), + this, SLOT(DeleteWeapons(QString))); + connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsAdded(QString, QString)), + this, SLOT(AddWeapons(QString, QString))); + connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsEdited(QString, QString, QString)), + this, SLOT(EditWeapons(QString, QString, QString))); + connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsEdited(QString, QString, QString)), + ui.pageNetGame->pGameCFG, SLOT(resendAmmoData())); connect(ui.pageMain->BtnNetLocal, SIGNAL(clicked()), this, SLOT(GoToNet())); connect(ui.pageMain->BtnNetOfficial, SIGNAL(clicked()), this, SLOT(NetConnectOfficialServer())); @@ -359,56 +382,13 @@ GoBack(); } -#ifdef USE_XFIRE -void HWForm::updateXfire(void) -{ - if(hwnet && (hwnet->clientState() != HWNewNet::Disconnected)) - { - xfire_setvalue(XFIRE_SERVER, !hwnet->getHost().compare(QString("%1:%2").arg(NETGAME_DEFAULT_SERVER).arg(NETGAME_DEFAULT_PORT)) ? "Official server" : hwnet->getHost().toAscii()); - switch(hwnet->clientState()) - { - case HWNewNet::Connecting: // Connecting - case HWNewNet::Connected: - xfire_setvalue(XFIRE_STATUS, "Connecting"); - xfire_setvalue(XFIRE_NICKNAME, "-"); - xfire_setvalue(XFIRE_ROOM, "-"); - case HWNewNet::InLobby: // In lobby - xfire_setvalue(XFIRE_STATUS, "Online"); - xfire_setvalue(XFIRE_NICKNAME, hwnet->getNick().toAscii()); - xfire_setvalue(XFIRE_ROOM, "In game lobby"); - break; - case HWNewNet::InRoom: // In room - xfire_setvalue(XFIRE_STATUS, "Online"); - xfire_setvalue(XFIRE_NICKNAME, hwnet->getNick().toAscii()); - xfire_setvalue(XFIRE_ROOM, (hwnet->getRoom() + " (waiting for players)").toAscii()); - break; - case HWNewNet::InGame: // In game - xfire_setvalue(XFIRE_STATUS, "Online"); - xfire_setvalue(XFIRE_NICKNAME, hwnet->getNick().toAscii()); - xfire_setvalue(XFIRE_ROOM, (hwnet->getRoom() + " (playing or spectating)").toAscii()); - break; - default: - break; - } - } - else - { - xfire_setvalue(XFIRE_STATUS, "Offline"); - xfire_setvalue(XFIRE_NICKNAME, "-"); - xfire_setvalue(XFIRE_ROOM, "-"); - xfire_setvalue(XFIRE_SERVER, "-"); - } - xfire_update(); -} -#endif - void HWForm::onFrontendFullscreen(bool value) { if (value) setWindowState(windowState() | Qt::WindowFullScreen); else { - setWindowState(windowState() & static_cast(!Qt::WindowFullScreen)); + setWindowState(windowState() & ~Qt::WindowFullScreen); } } @@ -431,6 +411,7 @@ void HWForm::CustomizePalettes() { + // Scroll bar widget palette QList allSBars = findChildren(); QPalette pal = palette(); pal.setColor(QPalette::WindowText, QColor(0xff, 0xcc, 0x00)); @@ -440,6 +421,11 @@ for (int i = 0; i < allSBars.size(); ++i) allSBars.at(i)->setPalette(pal); + + // Set default hyperlink color + QPalette appPal = qApp->palette(); + appPal.setColor(QPalette::Link, QColor(0xff, 0xff, 0x6e)); + qApp->setPalette(appPal); } void HWForm::UpdateWeapons() @@ -467,53 +453,155 @@ } } +void HWForm::AddWeapons(QString weaponsName, QString ammo) +{ + QVector combos; + combos.push_back(ui.pageOptions->WeaponsName); + combos.push_back(ui.pageMultiplayer->gameCFG->WeaponsName); + combos.push_back(ui.pageNetGame->pGameCFG->WeaponsName); + combos.push_back(ui.pageSelectWeapon->selectWeaponSet); + + QStringList names = ui.pageSelectWeapon->pWeapons->getWeaponNames(); + + for(QVector::iterator it = combos.begin(); it != combos.end(); ++it) + { + (*it)->addItem(weaponsName, QVariant(ammo)); + } + ui.pageSelectWeapon->selectWeaponSet->setCurrentIndex(ui.pageSelectWeapon->selectWeaponSet->count()-1); +} + +void HWForm::DeleteWeapons(QString weaponsName) +{ + QVector combos; + combos.push_back(ui.pageOptions->WeaponsName); + combos.push_back(ui.pageMultiplayer->gameCFG->WeaponsName); + combos.push_back(ui.pageNetGame->pGameCFG->WeaponsName); + combos.push_back(ui.pageSelectWeapon->selectWeaponSet); + + QStringList names = ui.pageSelectWeapon->pWeapons->getWeaponNames(); + + for(QVector::iterator it = combos.begin(); it != combos.end(); ++it) + { + int pos = (*it)->findText(weaponsName); + if (pos != -1) + { + (*it)->removeItem(pos); + } + } + ui.pageSelectWeapon->pWeapons->deletionDone(); +} + +void HWForm::EditWeapons(QString oldWeaponsName, QString newWeaponsName, QString ammo) +{ + QVector combos; + combos.push_back(ui.pageOptions->WeaponsName); + combos.push_back(ui.pageMultiplayer->gameCFG->WeaponsName); + combos.push_back(ui.pageNetGame->pGameCFG->WeaponsName); + combos.push_back(ui.pageSelectWeapon->selectWeaponSet); + + QStringList names = ui.pageSelectWeapon->pWeapons->getWeaponNames(); + + for(QVector::iterator it = combos.begin(); it != combos.end(); ++it) + { + int pos = (*it)->findText(oldWeaponsName); + (*it)->setItemText(pos, newWeaponsName); + (*it)->setItemData(pos, ammo); + } +} + void HWForm::UpdateTeamsLists() { QStringList teamslist = config->GetTeamsList(); if(teamslist.empty()) { - QString currentNickName = config->value("net/nick",tr("Guest")+QString("%1").arg(rand())).toString().toUtf8(); + QString currentNickName = config->value("net/nick",tr("Guest")+QString("%1").arg(rand())).toString(); QString teamName; + int firstHumanTeam = 1; + int lastHumanTeam = 2; + // Default team if (currentNickName.isEmpty()) { - teamName = tr("DefaultTeam"); + teamName = tr("Team 1"); + firstHumanTeam++; } else { teamName = tr("%1's Team").arg(currentNickName); + lastHumanTeam--; } HWTeam defaultTeam(teamName); + // Randomize fort and grave for greater variety by default. + // But we exclude DLC graves and forts to not have desyncing teams by default + // TODO: Remove DLC filtering when it isn't neccessary anymore + HWNamegen::teamRandomGrave(defaultTeam, false); + HWNamegen::teamRandomFort(defaultTeam, false); defaultTeam.saveToFile(); teamslist.push_back(teamName); + + // Add additional default teams + + // More human teams to allow local multiplayer instantly + for(int i=firstHumanTeam; i<=lastHumanTeam; i++) + { + //: Default team name + teamName = tr("Team %1").arg(i); + HWTeam numberTeam(teamName); + HWNamegen::teamRandomGrave(numberTeam, false); + HWNamegen::teamRandomFort(numberTeam, false); + numberTeam.saveToFile(); + teamslist.push_back(teamName); + } + // Add 2 default CPU teams + for(int i=1; i<=5; i=i+2) + { + //: Default computer team name + teamName = tr("Computer %1").arg(i); + HWTeam numberTeam(teamName); + HWNamegen::teamRandomGrave(numberTeam, false); + HWNamegen::teamRandomFort(numberTeam, false); + numberTeam.setDifficulty(6-i); + numberTeam.saveToFile(); + teamslist.push_back(teamName); + } } ui.pageOptions->CBTeamName->clear(); ui.pageOptions->CBTeamName->addItems(teamslist); ui.pageCampaign->CBTeam->clear(); - ui.pageCampaign->CBTeam->addItems(teamslist); + /* Only show human teams in campaign page */ + for(int i=0; iCBTeam->addItem(teamslist[i]); + } + } } -void HWForm::GoToSelectNewWeapon() +void HWForm::GoToNewWeapons() { ui.pageSelectWeapon->pWeapons->newWeaponsName(); GoToPage(ID_PAGE_SELECTWEAPON); } -void HWForm::GoToSelectWeapon() +void HWForm::GoToEditWeapons() { ui.pageSelectWeapon->selectWeaponSet->setCurrentIndex(ui.pageOptions->WeaponsName->currentIndex()); GoToPage(ID_PAGE_SELECTWEAPON); } -void HWForm::GoToSelectWeaponSet(int index) +void HWForm::GoToWeapons(int index) { ui.pageSelectWeapon->selectWeaponSet->setCurrentIndex(index); GoToPage(ID_PAGE_SELECTWEAPON); } + void HWForm::GoToSaves() { ui.pagePlayDemo->FillFromDir(PagePlayDemo::RT_Save); @@ -594,10 +682,6 @@ void HWForm::OnPageShown(quint8 id, quint8 lastid) { -#ifdef USE_XFIRE - updateXfire(); -#endif - #ifdef QT_DEBUG qDebug("Leaving %s, entering %s", qPrintable(stringifyPageId(lastid)), qPrintable(stringifyPageId(id))); #endif @@ -954,7 +1038,16 @@ void HWForm::NewTeam() { - ui.pageEditTeam->createTeam(QLineEdit::tr("unnamed"), playerHash); + QString teamName = QLineEdit::tr("unnamed"); + QStringList teamslist = config->GetTeamsList(); + if(teamslist.contains(teamName)) + { + //name already used -> look for an appropriate name: + int i=2; + while(teamslist.contains(teamName = QLineEdit::tr("unnamed (%1)").arg(i++))); + } + + ui.pageEditTeam->createTeam(teamName, playerHash); UpdateTeamsLists(); GoToPage(ID_PAGE_SETUP_TEAM); } @@ -1205,7 +1298,7 @@ { case ID_PAGE_INGAME: MessageDialog::ShowErrorMessage(errmsg, this); - // no break + /* fallthrough */ case ID_PAGE_NETGAME: ui.pageNetGame->displayError(errmsg); break; @@ -1300,6 +1393,8 @@ // chat widget actions connect(ui.pageNetGame->chatWidget, SIGNAL(kick(const QString&)), hwnet, SLOT(kickPlayer(const QString&))); + connect(ui.pageNetGame->chatWidget, SIGNAL(delegate(const QString&)), + hwnet, SLOT(delegateToPlayer(const QString&))); connect(ui.pageNetGame->chatWidget, SIGNAL(ban(const QString&)), hwnet, SLOT(banPlayer(const QString&))); connect(ui.pageNetGame->chatWidget, SIGNAL(info(const QString&)), @@ -1433,11 +1528,11 @@ pwDialog->lePassword->setFocus(); } - //if dialog close, create an error message + //if dialog aborted, return failure if (pwDialog->exec() != QDialog::Accepted) { delete pwDialog; GoBack(); - break; + return 1; } //set nick and pass from the dialog @@ -1607,6 +1702,14 @@ void HWForm::StartMPGame() { + int numHogs = ui.pageMultiplayer->teamsSelect->getNumHedgehogs(); + /* Don't allow to start game with >48 hogs. + TODO: Remove this as soon the engine supports more hogs. */ + if(numHogs > 48) + { + MessageDialog::ShowErrorMessage(QMessageBox::tr("Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs.\n\nCurrent number of hedgehogs: %1").arg(numHogs), this); + return; + } QString ammo; ammo = ui.pageMultiplayer->gameCFG->WeaponsName->itemData( ui.pageMultiplayer->gameCFG->WeaponsName->currentIndex() @@ -1721,17 +1824,17 @@ ui.pageVideos->startEncoding(record); } -void HWForm::startTraining(const QString & scriptName) +void HWForm::startTraining(const QString & scriptName, const QString & subFolder) { CreateGame(0, 0, 0); - game->StartTraining(scriptName); + game->StartTraining(scriptName, subFolder); } void HWForm::StartCampaign() { CreateGame(0, 0, 0); - QString camp = ui.pageCampaign->CBCampaign->currentText().replace(QString(" "),QString("_")); + QString camp = ui.pageCampaign->CBCampaign->itemData(ui.pageCampaign->CBCampaign->currentIndex()).toString(); QString miss = campaignMissionInfo[ui.pageCampaign->CBMission->currentIndex()].script; QString campTeam = ui.pageCampaign->CBTeam->currentText(); game->StartCampaign(camp, miss, campTeam); @@ -1762,11 +1865,8 @@ void HWForm::closeEvent(QCloseEvent *event) { -#ifdef USE_XFIRE - xfire_free(); -#endif config->SaveOptions(); -#if VIDEOREC +#ifdef VIDEOREC config->SaveVideosOptions(); #endif event->accept(); @@ -1893,9 +1993,12 @@ ); unsigned int n = entries.count(); + for(unsigned int i = 0; i < n; i++) { - ui.pageCampaign->CBCampaign->addItem(QString(entries[i]).replace(QString("_"),QString(" ")), QString(entries[i]).replace(QString("_"),QString(" "))); + const QString & campaignName = entries[i]; + QString tName = team.name(); + ui.pageCampaign->CBCampaign->addItem(getRealCampName(campaignName), campaignName); } } @@ -1903,7 +2006,7 @@ { Q_UNUSED(index); HWTeam team(ui.pageCampaign->CBTeam->currentText()); - QString campaignName = ui.pageCampaign->CBCampaign->currentText().replace(QString(" "),QString("_")); + QString campaignName = ui.pageCampaign->CBCampaign->itemData(ui.pageCampaign->CBCampaign->currentIndex()).toString(); QString tName = team.name(); campaignMissionInfo = getCampMissionList(campaignName,tName); @@ -1911,14 +2014,42 @@ for(int i=0;iCBMission->addItem(QString(campaignMissionInfo[i].name), QString(campaignMissionInfo[i].name)); + ui.pageCampaign->CBMission->addItem(QString(campaignMissionInfo[i].realName), QString(campaignMissionInfo[i].name)); + if(isMissionWon(campaignName, i, tName)) + ui.pageCampaign->CBMission->setItemIcon(i, finishedIcon); + else + ui.pageCampaign->CBMission->setItemIcon(i, notFinishedIcon); + } +} + +void HWForm::UpdateCampaignPageTeam(int index) +{ + Q_UNUSED(index); + HWTeam team(ui.pageCampaign->CBTeam->currentText()); + QString tName = team.name(); + + QStringList entries = DataManager::instance().entryList( + "Missions/Campaign", + QDir::Dirs, + QStringList("[^\\.]*") + ); + + unsigned int n = entries.count(); + + for(unsigned int i = 0; i < n; i++) + { + QString campaignName = QString(entries[i]).replace(QString(" "),QString("_")); + if(isCampWon(campaignName, tName)) + ui.pageCampaign->CBCampaign->setItemIcon(i, finishedIcon); + else + ui.pageCampaign->CBCampaign->setItemIcon(i, notFinishedIcon); } } void HWForm::UpdateCampaignPageMission(int index) { // update thumbnail and description - QString campaignName = ui.pageCampaign->CBCampaign->currentText().replace(QString(" "),QString("_")); + QString campaignName = ui.pageCampaign->CBCampaign->itemData(ui.pageCampaign->CBCampaign->currentIndex()).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()) { @@ -1936,12 +2067,20 @@ UpdateCampaignPage(0); for(int i=0;iCBMission->count();i++) { - if (ui.pageCampaign->CBMission->itemText(i)==missionTitle) + if (ui.pageCampaign->CBMission->itemData(i)==missionTitle) { ui.pageCampaign->CBMission->setCurrentIndex(i); break; } } + int i = ui.pageCampaign->CBCampaign->currentIndex(); + QString campaignName = ui.pageCampaign->CBCampaign->itemData(i).toString(); + HWTeam team(ui.pageCampaign->CBTeam->currentText()); + QString tName = team.name(); + if(isCampWon(campaignName, tName)) + ui.pageCampaign->CBCampaign->setItemIcon(i, finishedIcon); + else + ui.pageCampaign->CBCampaign->setItemIcon(i, 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] @@ -2079,7 +2218,7 @@ switch(lastGameType) { case gtTraining: - game->StartTraining(lastGameStartArgs.at(0).toString()); + game->StartTraining(lastGameStartArgs.at(0).toString(), lastTrainingSubFolder); break; case gtQLocal: game->StartQuick(); @@ -2113,11 +2252,27 @@ { QNetworkReply *reply = qobject_cast(sender()); - if (reply && (reply->error() == QNetworkReply::NoError)) { - FeedbackDialog dialog(this); - dialog.exec(); - } else - MessageDialog::ShowErrorMessage(tr("This page requires an internet connection."), this); + if (reply) { + switch (reply->error()) { + case QNetworkReply::NoError: + { + FeedbackDialog dialog(this); + dialog.exec(); + } + break; + case QNetworkReply::UnknownNetworkError: + MessageDialog::ShowFatalMessage( + tr("Unknown network error (possibly missing SSL library)."), this); + break; + default: + MessageDialog::ShowFatalMessage( + QString(tr("This feature requires an Internet connection, but you don't appear to be online (error code: %1).")).arg(reply->error()), this); + break; + } + } + else { + MessageDialog::ShowFatalMessage(tr("Internal error: Reply object is invalid."), this); + } } void HWForm::startGame() diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/hwform.h --- a/QTfrontend/hwform.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/hwform.h Sun Dec 17 00:09:24 2017 +0100 @@ -62,7 +62,6 @@ HWForm(QWidget *parent = 0, QString styleSheet = ""); Ui_HWForm ui; static GameUIConfig * config; - void updateXfire(); void exit(); void setButtonDescription(QString desc); void backDescription(); @@ -75,9 +74,9 @@ void GoToSaves(); void GoToDemos(); void GoToNet(); - void GoToSelectWeapon(); - void GoToSelectWeaponSet(int index); - void GoToSelectNewWeapon(); + void GoToEditWeapons(); + void GoToNewWeapons(); + void GoToWeapons(int index); void GoToScheme(int index); void GoToEditScheme(); void GoToNewScheme(); @@ -96,7 +95,7 @@ void DeleteWeaponSet(); void SimpleGame(); void PlayDemo(); - void startTraining(const QString&); + void startTraining(const QString&, const QString&); void StartCampaign(); void NetConnect(); void NetConnectServer(const QString & host, quint16 port); @@ -124,10 +123,14 @@ void GetRecord(RecordType type, const QByteArray & record); void CreateNetGame(); 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 Music(bool checked); void UpdateCampaignPage(int index); + void UpdateCampaignPageTeam(int index); void UpdateCampaignPageProgress(int index); void UpdateCampaignPageMission(int index); void InitCampaignPage(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/main.cpp --- a/QTfrontend/main.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/main.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -44,6 +44,11 @@ #include #elif defined __APPLE__ #include "CocoaInitializer.h" + +#endif + +#ifdef Q_OS_WIN +#include #endif // Program resources @@ -162,9 +167,8 @@ HWApplication app(argc, argv); app.setAttribute(Qt::AA_DontShowIconsInMenus,false); - // file engine and splash. to be initialized later + // file engine, to be initialized later engine = NULL; - QLabel *splash = NULL; // parse arguments @@ -241,17 +245,13 @@ // end of parameter parsing -#if defined Q_OS_WIN - QPixmap pixmap(":res/splash.png"); - splash = new QLabel(0, Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); - splash->setAttribute(Qt::WA_TranslucentBackground); - const QRect deskSize = HWApplication::desktop()->screenGeometry(-1); - QPoint splashCenter = QPoint( (deskSize.width() - pixmap.width())/2, - (deskSize.height() - pixmap.height())/2 ); - splash->move(splashCenter); - splash->setPixmap(pixmap); - splash->show(); + +#ifdef Q_OS_WIN + QPixmap pixmap(":/res/splash.png"); + QSplashScreen splash(pixmap); + splash.show(); #endif + app.setStyle(new QPlastiqueStyle()); QDateTime now = QDateTime::currentDateTime(); @@ -346,7 +346,8 @@ } #ifdef _WIN32 - // Win32 registry setup (used for xfire detection etc. - don't set it if we're running in "portable" mode with a custom config dir) + // Win32 registry setup (used for external software detection etc. + // don't set it if running in "portable" mode with a custom config dir) if(!custom_config) { QSettings registry_hklm("HKEY_LOCAL_MACHINE", QSettings::NativeFormat); @@ -392,9 +393,11 @@ qWarning("Starting Hedgewars %s-r%d (%s)", qPrintable(*cVersionString), cRevisionString->toInt(), qPrintable(*cHashString)); app.form = new HWForm(NULL, style); +#ifdef Q_OS_WIN + splash.finish(app.form); +#endif app.form->show(); - if(splash) - splash->close(); + if (app.urlString) app.fakeEvent(); return app.exec(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/model/GameStyleModel.cpp --- a/QTfrontend/model/GameStyleModel.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/model/GameStyleModel.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -32,11 +32,18 @@ { beginResetModel(); + QIcon dlcIcon; + dlcIcon.addFile(":/res/dlcMarker.png", QSize(), QIcon::Normal, QIcon::On); + dlcIcon.addFile(":/res/dlcMarkerSelected.png", QSize(), QIcon::Selected, QIcon::On); + QPixmap emptySpace = QPixmap(7, 15); + emptySpace.fill(QColor(0, 0, 0, 0)); + QIcon notDlcIcon = QIcon(emptySpace); + // empty list, so that we can (re)fill it QStandardItemModel::clear(); QList items; - items.append(new QStandardItem("Normal")); + items.append(new QStandardItem(notDlcIcon, "Normal")); // define a separator item QStandardItem * separator = new QStandardItem("---"); @@ -82,7 +89,11 @@ QString scriptPath = PHYSFS_getRealDir(QString("Scripts/Multiplayer/%1.lua").arg(script).toLocal8Bit().data()); bool isDLC = !scriptPath.startsWith(datadir->absolutePath()); - QStandardItem * item = new QStandardItem((isDLC ? "*" : "") + name); + QStandardItem * item; + if (isDLC) + item = new QStandardItem(dlcIcon, name); + else + item = new QStandardItem(notDlcIcon, name); item->setData(script, ScriptRole); item->setData(scheme, SchemeRole); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/model/MapModel.cpp --- a/QTfrontend/model/MapModel.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/model/MapModel.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -80,6 +80,14 @@ //QList missionMaps; QList mapList; + + QIcon dlcIcon; + dlcIcon.addFile(":/res/dlcMarker.png", QSize(), QIcon::Normal, QIcon::On); + dlcIcon.addFile(":/res/dlcMarkerSelected.png", QSize(), QIcon::Selected, QIcon::On); + QPixmap emptySpace = QPixmap(7, 15); + emptySpace.fill(QColor(0, 0, 0, 0)); + QIcon notDlcIcon = QIcon(emptySpace); + // add mission/static maps to lists foreach (QString map, maps) { @@ -119,10 +127,22 @@ // load description (if applicable) if (isMission) { - QString locale = HWApplication::keyboardInputLocale().name(); + // get locale + QSettings settings(datamgr.settingsFileName(), QSettings::IniFormat); + QString locale = settings.value("misc/locale", "").toString(); + if (locale.isEmpty()) + locale = QLocale::system().name(); QSettings descSettings(QString("physfs://Maps/%1/desc.txt").arg(map), QSettings::IniFormat); - desc = descSettings.value(locale, QString()).toString().replace("|", "\n").replace("\\,", ","); + descSettings.setIniCodec("UTF-8"); + desc = descSettings.value(locale, QString()).toString(); + // If not found, try with lanague-only code + if (desc.isEmpty()) + { + QString localeSimple = locale.remove(QRegExp("_.*$")); + desc = descSettings.value(localeSimple, QString()).toString(); + } + desc = desc.replace("_n", "\n").replace("_c", ",").replace("__", "_"); } // detect if map is dlc @@ -151,9 +171,15 @@ // caption caption = map; + QIcon icon; + if (dlc) + icon = dlcIcon; + else + icon = notDlcIcon; + // we know everything there is about the map, let's get am item for it QStandardItem * item = MapModel::infoToItem( - QIcon(), caption, type, map, theme, limit, scheme, weapons, desc, dlc); + icon, caption, type, map, theme, limit, scheme, weapons, desc, dlc); // append item to the list mapList.append(item); @@ -213,7 +239,7 @@ QString desc, bool dlc) { - QStandardItem * item = new QStandardItem(icon, (dlc ? "*" : "") + caption); + QStandardItem * item = new QStandardItem(icon, caption); MapInfo mapInfo; QVariant qvar(QVariant::UserType); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/model/ammoSchemeModel.cpp --- a/QTfrontend/model/ammoSchemeModel.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/model/ammoSchemeModel.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -81,11 +81,11 @@ << "Minefield" << "Barrel Mayhem" << "Tunnel Hogs" - << "Fort Mode" << "Timeless" << "Thinking with Portals" << "King Mode" - << "Construction Mode" + << "Construction Mode" + << "HedgeEditor" ; numberOfDefaultSchemes = predefSchemesNames.size(); @@ -222,11 +222,11 @@ << QVariant(0) // mines number 32 << QVariant(0) // mine dud pct 33 << QVariant(0) // explosives 34 - << QVariant(8) // air mines 35 + << QVariant(0) // air mines 35 << QVariant(0) // health case pct 36 << QVariant(25) // health case amt 37 - << QVariant(47) // water rise amt 38 - << QVariant(5) // health dec amt 39 + << QVariant(0) // water rise amt 38 + << QVariant(0) // health dec amt 39 << QVariant(100) // rope modfier 40 << QVariant(100) // get away time 41 << QVariant(0) // world edge 42 @@ -425,57 +425,9 @@ << QVariant() // scriptparam 43 ; - QList forts; - forts - << predefSchemesNames[7] // name 0 - << QVariant(true) // fortsmode 1 - << QVariant(true) // 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(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // 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(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // 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(35) // 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 - << QVariant() // scriptparam 43 - ; - QList timeless; timeless - << predefSchemesNames[8] // name 0 + << predefSchemesNames[7] // name 0 << QVariant(false) // fortsmode 1 << QVariant(false) // team divide 2 << QVariant(false) // solid land 3 @@ -523,7 +475,7 @@ QList thinkingportals; thinkingportals - << predefSchemesNames[9] // name 0 + << predefSchemesNames[8] // name 0 << QVariant(false) // fortsmode 1 << QVariant(false) // team divide 2 << QVariant(false) // solid land 3 @@ -571,7 +523,7 @@ QList kingmode; kingmode - << predefSchemesNames[10] // name 0 + << predefSchemesNames[9] // name 0 << QVariant(false) // fortsmode 1 << QVariant(false) // team divide 2 << QVariant(false) // solid land 3 @@ -619,7 +571,7 @@ QList construction; construction - << predefSchemesNames[11] // name 0 + << predefSchemesNames[10] // name 0 << QVariant(false) // fortsmode 1 << QVariant(false) // team divide 2 << QVariant(false) // solid land 3 @@ -664,6 +616,56 @@ << QVariant(0) // world edge 42 << QVariant() // scriptparam 43 ; + + QList hedgeeditor; + hedgeeditor + << predefSchemesNames[11] // name 0 + << QVariant(false) // fortsmode 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(false) // 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(false) // inf. attack 19 + << QVariant(false) // 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(9999) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(50) // 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(35) // health case pct 36 + << QVariant(25) // health case amt 37 + << QVariant(0) // water rise amt 38 + << QVariant(0) // health dec amt 39 + << QVariant(100) // rope modfier 40 + << QVariant(100) // get away time 41 + << QVariant(0) // world edge 42 + << QVariant() // scriptparam 43 + ; + + schemes.append(defaultScheme); schemes.append(proMode); @@ -672,11 +674,11 @@ schemes.append(minefield); schemes.append(barrelmayhem); schemes.append(tunnelhogs); - schemes.append(forts); schemes.append(timeless); schemes.append(thinkingportals); schemes.append(kingmode); - schemes.append(construction); + schemes.append(construction); + schemes.append(hedgeeditor); int size = fileConfig.beginReadArray("schemes"); @@ -722,6 +724,18 @@ return defaultScheme.size(); } +bool AmmoSchemeModel::hasScheme(QString name) +{ + for(int i=0; i newScheme = defaultScheme; - newScheme[0] = QVariant(tr("New")); + + QString newName = tr("New"); + if(hasScheme(newName)) + { + //name already used -> look for an appropriate name: + int i=2; + while(hasScheme(newName = tr("New (%1)").arg(i++))) ; + } + newScheme[0] = QVariant(newName); schemes.insert(schemes.size(), newScheme); } else { QList newScheme = schemes[row]; - newScheme[0] = QVariant(tr("Copy of %1").arg(newScheme[0].toString())); + QString oldName = newScheme[0].toString(); + QString newName = tr("Copy of %1").arg(oldName); + if(hasScheme(newName)) + { + //name already used -> look for an appropriate name: + int i=2; + while(hasScheme(newName = tr("Copy of %1 (%2)").arg(oldName).arg(i++))); + } + newScheme[0] = QVariant(newName); schemes.insert(schemes.size(), newScheme); } diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/model/ammoSchemeModel.h --- a/QTfrontend/model/ammoSchemeModel.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/model/ammoSchemeModel.h Sun Dec 17 00:09:24 2017 +0100 @@ -34,6 +34,7 @@ QVariant headerData(int section, Qt::Orientation orientation, int role) const; int rowCount(const QModelIndex & parent) const; int columnCount(const QModelIndex & parent) const; + bool hasScheme(QString name); Qt::ItemFlags flags(const QModelIndex & index) const; bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex()); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/model/roomslistmodel.cpp --- a/QTfrontend/model/roomslistmodel.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/model/roomslistmodel.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -32,17 +32,18 @@ QAbstractTableModel(parent), c_nColumns(9) { - m_headerData = - QStringList() - << tr("In progress") - << tr("Room Name") - << tr("C") - << tr("T") - << tr("Owner") - << tr("Map") - << tr("Script") - << tr("Rules") - << tr("Weapons"); + 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(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/net/newnetclient.cpp --- a/QTfrontend/net/newnetclient.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/net/newnetclient.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -1012,6 +1012,11 @@ RawSendNet(QString("KICK%1%2").arg(delimiter).arg(nick)); } +void HWNewNet::delegateToPlayer(const QString & nick) +{ + RawSendNet(QString("DELEGATE%1%2").arg(delimiter).arg(nick)); +} + void HWNewNet::infoPlayer(const QString & nick) { RawSendNet(QString("INFO%1%2").arg(delimiter).arg(nick)); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/net/newnetclient.h --- a/QTfrontend/net/newnetclient.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/net/newnetclient.h Sun Dec 17 00:09:24 2017 +0100 @@ -167,6 +167,7 @@ void gameFinished(bool correcly); void banPlayer(const QString &); void kickPlayer(const QString &); + void delegateToPlayer(const QString &); void infoPlayer(const QString &); void followPlayer(const QString &); void consoleCommand(const QString &); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/net/tcpBase.cpp --- a/QTfrontend/net/tcpBase.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/net/tcpBase.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -188,7 +188,6 @@ void TCPBase::ClientDisconnect() { - disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); onClientDisconnect(); if(!simultaneousRun()) @@ -200,8 +199,11 @@ emit isReadyNow(); } - IPCSocket->deleteLater(); - IPCSocket = NULL; + if(IPCSocket) { + disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); + IPCSocket->deleteLater(); + IPCSocket = NULL; + } deleteLater(); } @@ -224,7 +226,8 @@ { Q_UNUSED(exitStatus); - ClientDisconnect(); + if(!m_connected) + ClientDisconnect(); // show error message if there was an error that was not an engine's // fatal error - because that one already sent a info via IPC @@ -240,16 +243,6 @@ .arg("Feedback")); } - - // cleanup up - if (IPCSocket) - { - IPCSocket->close(); - IPCSocket->deleteLater(); - } - - // plot suicide - deleteLater(); } void TCPBase::tcpServerReady() diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/Multiplayer.png Binary file QTfrontend/res/Multiplayer.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/NetworkPlay.png Binary file QTfrontend/res/NetworkPlay.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/Palette.png Binary file QTfrontend/res/Palette.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/Palette.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/res/Palette.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/PlaySound.png Binary file QTfrontend/res/PlaySound.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/SimpleGame.png Binary file QTfrontend/res/SimpleGame.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/StatsMedal1@2x.png Binary file QTfrontend/res/StatsMedal1@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/StatsMedal2@2x.png Binary file QTfrontend/res/StatsMedal2@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/StatsMedal3@2x.png Binary file QTfrontend/res/StatsMedal3@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/StatsMedal4@2x.png Binary file QTfrontend/res/StatsMedal4@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/Videos.png Binary file QTfrontend/res/Videos.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/Videos.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/res/Videos.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,429 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + + 2010-02-12T23:23:34 + A movie reel, seen in perspective + https://openclipart.org/detail/29273/movie-reel-by-abustany + + + abustany + + + + + cinema + colour + film + movie + reel + video + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/audio.png Binary file QTfrontend/res/audio.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/audio.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/res/audio.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + + 2010-04-03T15:19:58 + An icon from Tango Project. Since version 0.8.90 Tango Project icons are Public Domain. + https://openclipart.org/detail/36601/tango-audio-volume-high-by-warszawianka + + + warszawianka + + + + + externalsource + icon + tango + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/botlevels/net0.png Binary file QTfrontend/res/botlevels/net0.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/botlevels/net0.xcf Binary file QTfrontend/res/botlevels/net0.xcf has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/botlevels/net1.png Binary file QTfrontend/res/botlevels/net1.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/botlevels/net2.png Binary file QTfrontend/res/botlevels/net2.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/botlevels/net3.png Binary file QTfrontend/res/botlevels/net3.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/botlevels/net4.png Binary file QTfrontend/res/botlevels/net4.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/botlevels/net5.png Binary file QTfrontend/res/botlevels/net5.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnAISurvival.png Binary file QTfrontend/res/btnAISurvival.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnAISurvival.xcf Binary file QTfrontend/res/btnAISurvival.xcf has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnAISurvival@2x.png Binary file QTfrontend/res/btnAISurvival@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnAISurvival@2x.xcf Binary file QTfrontend/res/btnAISurvival@2x.xcf has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnBorder.png Binary file QTfrontend/res/btnBorder.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnBorder@2x.png Binary file QTfrontend/res/btnBorder@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnBottomBorder.png Binary file QTfrontend/res/btnBottomBorder.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnBottomBorder@2x.png Binary file QTfrontend/res/btnBottomBorder@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnForts.png Binary file QTfrontend/res/btnForts.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnForts@2x.png Binary file QTfrontend/res/btnForts@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnLowGravity.png Binary file QTfrontend/res/btnLowGravity.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnLowGravity@2x.png Binary file QTfrontend/res/btnLowGravity@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnMoreWind.png Binary file QTfrontend/res/btnMoreWind.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnMoreWind@2x.png Binary file QTfrontend/res/btnMoreWind@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnNoWind.png Binary file QTfrontend/res/btnNoWind.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnNoWind@2x.png Binary file QTfrontend/res/btnNoWind@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnPlaceHog.png Binary file QTfrontend/res/btnPlaceHog.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnPlaceHog@2x.png Binary file QTfrontend/res/btnPlaceHog@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/btnRandomOrder@2x.png Binary file QTfrontend/res/btnRandomOrder@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Classic_Fairytale/epil.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/epil.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Classic_Fairytale/family.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/family.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Classic_Fairytale/journey.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/journey.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Classic_Fairytale/shadow.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/shadow.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Classic_Fairytale/united.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/united.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Space_Adventure/cosmos.png Binary file QTfrontend/res/campaign/A_Space_Adventure/cosmos.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Space_Adventure/death01.png Binary file QTfrontend/res/campaign/A_Space_Adventure/death01.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Space_Adventure/death02.png Binary file QTfrontend/res/campaign/A_Space_Adventure/death02.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Space_Adventure/fruit03.png Binary file QTfrontend/res/campaign/A_Space_Adventure/fruit03.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Space_Adventure/ice01.png Binary file QTfrontend/res/campaign/A_Space_Adventure/ice01.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Space_Adventure/ice02.png Binary file QTfrontend/res/campaign/A_Space_Adventure/ice02.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/campaign/A_Space_Adventure/moon02.png Binary file QTfrontend/res/campaign/A_Space_Adventure/moon02.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/css/qt.css --- a/QTfrontend/res/css/qt.css Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/res/css/qt.css Sun Dec 17 00:09:24 2017 +0100 @@ -94,6 +94,7 @@ border-radius: 16px; background-color: rgba(13, 5, 68, 70%); padding: 6px; +margin-top: 4px; } /* Experimenting with PaintOnScreen and border-radius on IconedGroupBox children didn't work out well IconedGroupBox QComboBox, IconedGroupBox QPushButton, IconedGroupBox QLineEdit, @@ -207,7 +208,6 @@ subcontrol-position: top left; text-align: left; left: 15px; -top: -4px; } QCheckBox::indicator:checked{ diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/dlcMarker.png Binary file QTfrontend/res/dlcMarker.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/dlcMarkerSelected.png Binary file QTfrontend/res/dlcMarkerSelected.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/folder.png Binary file QTfrontend/res/folder.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/folder.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/res/folder.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,97 @@ + +image/svg+xmlOpenclipart \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/frontendicon.png Binary file QTfrontend/res/frontendicon.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/home.png Binary file QTfrontend/res/home.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/home.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/res/home.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,201 @@ + +image/svg+xmlOpenclipart2010-03-10T10:25:42Home icon from <A href="http://tango.freedesktop.org/Tango_Desktop_Project"> Tango Project </A> \n<BR><BR>\nSince version 0.8.90 Tango Project icons are Public Domain: <A href="http://tango.freedesktop.org/Frequently_Asked_Questions#Terms_of_Use.3F"> Tango Project FAQ </A>https://openclipart.org/detail/30805/tango-go-home-by-warszawiankawarszawiankaarchitecturebuildingexternalsourcehomehouseicontango \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/html/about.html --- a/QTfrontend/res/html/about.html Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/res/html/about.html Sun Dec 17 00:09:24 2017 +0100 @@ -12,88 +12,94 @@

Developers:

- Engine, frontend, net server: Andrey Korotaev <unC0Rr@gmail.com>
- Many frontend improvements: Igor Ulyanov <disinbox@gmail.com>
- Many engine and frontend improvements: Derek Pomery <nemo@m8y.org>
- Drill rocket, Ballgun, RC Plane weapons: Martin Boze <afffect@gmail.com>
- Mine number and time game settings: David A. Cuadrado <krawek@gmail.com>
- Frontend improvements: Martin Minarik <ttsmj@pokec.sk>
- Frontend improvements: Kristian Lehmann <email@thexception.net>
- Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara <vittorio.giovara@gmail.com>
- Many engine and frontend improvements (and bugs): Richard Karolyi <sheepluva@ercatec.net>
- Gamepad and Lua integration: Mario Liebisch <mario.liebisch@gmail.com>
- Many engine improvements and graphics: Carlos Vives <mail@carlosvives.es>
- Maze maps: Henning Kühn <prg@cooco.de>
- Engine and frontend improvements: Henrik Rostedt <henrik.rostedt@gmail.com>
- Lua game modes and missions: John Lambert <redgrinner@gmail.com>
- Frontend improvements: Mayur Pawashe <zorgiepoo@gmail.com>
- Android port: Richard Deurwaarder <xeli@xelification.com>
- Android netplay, portability abstraction: Simeon Maxein <smaxein@googlemail.com>
- WebGL port, some pas2c and GLES2 work: Meng Xiangyun <xymengxy@gmail.com>
- Video recording: Stepan Podoskin <stepik-777@mail.ru>
- Campaign support, first campaign: Szabolcs Orbàn <szabibibi@gmail.com>
- Keybinds, feedback, maps and hats interfaces: Drew Gottlieb <gottlieb.drew@gmail.com>
- Login dialogs, frontend improvements: Ondrej Skopek <skopekondrej@gmail.com>
- Icegun weapon: Julia Struchenko <urbertar@gmail.com>
- iPhone/iPad ports: Anton Malmygin <antonc27@mail.ru>
+ Engine, frontend, net server: Andrey Korotaev <unC0Rr@gmail.com>
+ Many frontend improvements: Igor Ulyanov <disinbox@gmail.com>
+ Many engine and frontend improvements: Derek Pomery <nemo@m8y.org>
+ Drill rocket, Ballgun, RC Plane weapons: Martin Boze <afffect@gmail.com>
+ Mine number and time game settings: David A. Cuadrado <krawek@gmail.com>
+ Frontend improvements: Martin Minarik <ttsmj@pokec.sk>
+ Frontend improvements: Kristian Lehmann <email@thexception.net>
+ Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara <vittorio.giovara@gmail.com>
+ Many engine and frontend improvements (and bugs): Richard Karolyi <sheepluva@ercatec.net>
+ Gamepad and Lua integration: Mario Liebisch <mario.liebisch@gmail.com>
+ Many engine improvements and graphics: Carlos Vives <mail@carlosvives.es>
+ Maze maps: Henning Kühn <prg@cooco.de>
+ Engine and frontend improvements: Henrik Rostedt <henrik.rostedt@gmail.com>
+ Lua game modes and missions: John Lambert <redgrinner@gmail.com>
+ Frontend improvements: Mayur Pawashe <zorgiepoo@gmail.com>
+ Android port: Richard Deurwaarder <xeli@xelification.com>
+ Android netplay, portability abstraction: Simeon Maxein <smaxein@googlemail.com>
+ WebGL port, some pas2c and GLES2 work: Meng Xiangyun <xymengxy@gmail.com>
+ Video recording: Stepan Podoskin <stepik-777@mail.ru>
+ Campaign support, first campaign: Szabolcs Orbàn <szabibibi@gmail.com>
+ Keybinds, feedback, maps and hats interfaces: Drew Gottlieb <gottlieb.drew@gmail.com>
+ Login dialogs, frontend improvements: Ondrej Skopek <skopekondrej@gmail.com>
+ Icegun weapon: Julia Struchenko <urbertar@gmail.com>
+ iPhone/iPad ports: Anton Malmygin <antonc27@mail.ru>
+ Battalion style: Anachron <Anachron14@gmx.de>
+ Scripting, engine, frontend improvements, some missions: Wuzzy <Wuzzy2@mail.ru>
+ Theme customization improvements: KoBeWi
+ Theme music, engine and frontend improvements, graphics: Valentin Kraevskiy

Art:

John Dum <fizzy@gmail.com> -
+
Joshua Frese <joshfrese@gmail.com> -
+
Stanko Tadić <stanko@mfhinc.net> -
+
Julien Koesten <julienkoesten@aol.com> -
+
Joshua O'Sullivan <coheedftw@hotmail.co.uk> -
+
Nils Lück <nils.luck.design@gmail.com> -
+
Guillaume Englert <genglert@hybird.org> -
+
+

CopherNeue <ppicondo.cvac@gmail.com> +
Hats: Trey Perry <tx.perry.j@gmail.com>

Sounds:

Hedgehogs voice: Stephen Alexander <ArmagonNo1@gmail.com> -
+
John Dum <fizzy@gmail.com> -
+
Jonatan Nilsson <jonatanfan@gmail.com> -
+
Daniel Martin <elhombresinremedio@gmail.com>

Translations:

- Brazilian Portuguese: Romulo Fernandes Machado <abra185@gmail.com>
- Bulgarian: Svetoslav Stefanov
- Czech: Petr Řezáček <rezacek@gmail.com>
- Chinese: Jie Luo <lililjlj@gmail.com>
- English: Andrey Korotaev <unC0Rr@gmail.com>
- Finnish: Nina Kuisma <ninnnu@gmail.com>, Janne Uusitupa
- French: Antoine Turmel <geekshadow@gmail.com>, Clement Woitrain <sphrixclement@gmail.com>, Matisumi
- German: Peter Hüwe <PeterHuewe@gmx.de>, Mario Liebisch <mario.liebisch@gmail.com>, Richard Karolyi <sheepluva@ercatec.net>, Wuzzy <almikes@aol.com>
- Greek: <talos_kriti@yahoo.gr>
- Italian: Luca Bonora <bonora.luca@gmail.com>, Marco Bresciani <m.bresciani@email.it>, Gianfranco Costamagna <costamagnagianfranco@yahoo.it>
- Japanese: ADAM Etienne <etienne.adam@gmail.com>, Marco Bresciani <m.bresciani@email.it>
- Korean: Anthony Bellew <anthonyreflected@gmail.com>
- Lithuanian: Lukas Urbonas <lukasu08@gmail.com>
- Polish: Maciej Mroziński <mynick2@o2.pl>, Wojciech Latkowski <magik17l@gmail.com>, Piotr Mitana, Maciej Górny
- Portuguese: Fábio Canário <inufabie@gmail.com>
- Russian: Andrey Korotaev <unC0Rr@gmail.com>, Vitaly Novichkov <admin@wohlnet.ru>, Anton Malmygin <antonc27@mail.ru>
- Slovak: Jose Riha
- Spanish: Carlos Vives <mail@carlosvives.es>
- Swedish: Niklas Grahn <raewolusjoon@yaoo.com>, Henrik Rostedt <henrik.rostedt@gmail.com>
+ Brazilian Portuguese: Romulo Fernandes Machado <abra185@gmail.com>
+ Bulgarian: Svetoslav Stefanov
+ Czech: Petr Řezáček <rezacek@gmail.com>
+ Chinese: Jie Luo <lililjlj@gmail.com>
+ English: Andrey Korotaev <unC0Rr@gmail.com>
+ Finnish: Nina Kuisma <ninnnu@gmail.com>, Janne Uusitupa
+ French: Antoine Turmel <geekshadow@gmail.com>, Clement Woitrain <sphrixclement@gmail.com>, Matisumi
+ German: Peter Hüwe <PeterHuewe@gmx.de>, Mario Liebisch <mario.liebisch@gmail.com>, Richard Karolyi <sheepluva@ercatec.net>, Wuzzy <Wuzzy2@mail.ru>
+ Greek: <talos_kriti@yahoo.gr>
+ Italian: Luca Bonora <bonora.luca@gmail.com>, Marco Bresciani <m.bresciani@email.it>, Gianfranco Costamagna <costamagnagianfranco@yahoo.it>, Enrico <enricobe@hotmail.com>
+ Japanese: ADAM Etienne <etienne.adam@gmail.com>, Marco Bresciani <m.bresciani@email.it>
+ Korean: Anthony Bellew <anthonyreflected@gmail.com>
+ Lithuanian: Lukas Urbonas <lukasu08@gmail.com>
+ Polish: Maciej Mroziński <mynick2@o2.pl>, Wojciech Latkowski <magik17l@gmail.com>, Piotr Mitana, Maciej Górny, KoBeWi
+ Portuguese: Fábio Canário <inufabie@gmail.com>
+ Russian: Andrey Korotaev <unC0Rr@gmail.com>, Vitaly Novichkov <admin@wohlnet.ru>, Anton Malmygin <antonc27@mail.ru>
+ Slovak: Jose Riha
+ Spanish: Carlos Vives <mail@carlosvives.es>
+ Swedish: Niklas Grahn <raewolusjoon@yaoo.com>, Henrik Rostedt <henrik.rostedt@gmail.com>
Ukrainian: Eugene V. Lyubimkin <jackyf.devel@gmail.com>, Igor Paliychuk <mansonigor@gmail.com>, Eugene Sakara <eresid@gmail.com>

Special thanks:

- Aleksey Andreev <blaknayabr@gmail.com>
- Aleksander Rudalev <alexv@pomorsu.ru>
- Natasha Korotaeva <layout@pisem.net>
+ Aleksey Andreev <blaknayabr@gmail.com>
+ Aleksander Rudalev <alexv@pomorsu.ru>
+ Natasha Korotaeva <layout@pisem.net>
Adam Higerd (aka ahigerd at FreeNode)

diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/iconInitHealth.png Binary file QTfrontend/res/iconInitHealth.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/missionFinished.png Binary file QTfrontend/res/missionFinished.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/missionFinishedSelected.png Binary file QTfrontend/res/missionFinishedSelected.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/net.png Binary file QTfrontend/res/net.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/res/schemeicon.png Binary file QTfrontend/res/schemeicon.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/team.cpp --- a/QTfrontend/team.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/team.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -208,6 +208,14 @@ return f.exists(); } +// Returns true if the team name has been changed but a file with the same team name already exists. +// So if this team would be saved, another team file would be overwritten, which is generally not +// desired. +bool HWTeam::wouldOverwriteOtherFile() +{ + return (m_name != OldTeamName) && fileExists(); +} + bool HWTeam::deleteFile() { if(m_isNetTeam) diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/team.h --- a/QTfrontend/team.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/team.h Sun Dec 17 00:09:24 2017 +0100 @@ -62,6 +62,7 @@ bool deleteFile(); bool saveToFile(); bool fileExists(); + bool wouldOverwriteOtherFile(); // attribute getters unsigned int campaignProgress() const; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/dialog/bandialog.cpp --- a/QTfrontend/ui/dialog/bandialog.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/dialog/bandialog.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -85,7 +85,13 @@ { if(leId->text().isEmpty()) { - QMessageBox::warning(this, tr("Warning"), tr("Please, specify %1").arg(byIP() ? tr("IP") : tr("nickname"))); + QString warning_text; + if (byIP()) + warning_text = QString(tr("Please specify an IP address.")); + else + warning_text = QString(tr("Please specify a nickname.")); + + QMessageBox::warning(this, tr("Warning"), warning_text); return; } diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/dialog/upload_video.cpp --- a/QTfrontend/ui/dialog/upload_video.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/dialog/upload_video.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -57,7 +57,7 @@ "

By clicking 'upload,' you certify that you own all rights to the content or that " "you are authorized by the owner to make the content publicly available on YouTube, " "and that it otherwise complies with the YouTube Terms of Service located at " - "http://www.youtube.com/t/terms.

"; + "https://www.youtube.com/t/terms.

"; // youtube doesn't understand this characters, even when they are properly escaped // (either with CDATA or with < or >) diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/AbstractPage.cpp --- a/QTfrontend/ui/page/AbstractPage.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/AbstractPage.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -141,6 +141,13 @@ return btn; } +QPushButton* AbstractPage::addSoundlessButton(const QString & name, QGridLayout * grid, int row, int column, int rowSpan, int columnSpan, bool hasIcon, Qt::Alignment alignment) +{ + QPushButton * btn = formattedSoundlessButton(name, hasIcon); + grid->addWidget(btn, row, column, rowSpan, columnSpan, alignment); + return btn; +} + QPushButton* AbstractPage::addSoundlessButton(const QString & name, QBoxLayout * box, int where, bool hasIcon, Qt::Alignment alignment) { QPushButton* btn = formattedSoundlessButton(name, hasIcon); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/AbstractPage.h --- a/QTfrontend/ui/page/AbstractPage.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/AbstractPage.h Sun Dec 17 00:09:24 2017 +0100 @@ -190,6 +190,7 @@ * @return the button. */ QPushButtonWithSound * addButton(const QString & name, QGridLayout * grid, int row, int column, int rowSpan = 1, int columnSpan = 1, bool hasIcon = false, Qt::Alignment alignment = 0); + QPushButton * addSoundlessButton(const QString & name, QGridLayout * grid, int row, int column, int rowSpan = 1, int columnSpan = 1, bool hasIcon = false, Qt::Alignment alignment = 0); /** * @brief Creates a default formatted button and adds it to a diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagecampaign.cpp --- a/QTfrontend/ui/page/pagecampaign.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagecampaign.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -26,9 +26,10 @@ QLayout * PageCampaign::bodyLayoutDefinition() { QGridLayout * pageLayout = new QGridLayout(); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 2); - pageLayout->setColumnStretch(2, 1); + pageLayout->setColumnStretch(0, 5); + pageLayout->setColumnStretch(1, 1); + pageLayout->setColumnStretch(2, 9); + pageLayout->setColumnStretch(3, 5); pageLayout->setRowStretch(0, 1); pageLayout->setRowStretch(3, 1); @@ -43,6 +44,7 @@ // set this as default image first time page is created, this will change in hwform.cpp btnPreview = formattedButton(":/res/campaign/A_Classic_Fairytale/first_blood.png", true); + btnPreview->setWhatsThis(tr("Start fighting")); infoLayout->setAlignment(btnPreview, Qt::AlignHCenter | Qt::AlignVCenter); lbldescription = new QLabel(this); @@ -52,6 +54,10 @@ lbltitle = new QLabel(); lbltitle->setAlignment(Qt::AlignHCenter | Qt::AlignBottom); + QLabel* lblteam = new QLabel(tr("Team")); + QLabel* lblcampaign = new QLabel(tr("Campaign")); + QLabel* lblmission = new QLabel(tr("Mission")); + CBTeam = new QComboBox(this); CBMission = new QComboBox(this); CBCampaign = new QComboBox(this); @@ -63,19 +69,41 @@ infoLayout->addWidget(lbltitle,0,2,1,2); infoLayout->addWidget(lbldescription,1,2,1,2); - pageLayout->addLayout(infoLayout, 0, 0, 2, 3); - pageLayout->addWidget(CBTeam, 2, 1); - pageLayout->addWidget(CBCampaign, 3, 1); - pageLayout->addWidget(CBMission, 4, 1); + pageLayout->addLayout(infoLayout, 0, 0, 2, 4); + pageLayout->addWidget(lblteam, 2, 1); + pageLayout->addWidget(lblcampaign, 3, 1); + pageLayout->addWidget(lblmission, 4, 1); + pageLayout->addWidget(CBTeam, 2, 2); + pageLayout->addWidget(CBCampaign, 3, 2); + pageLayout->addWidget(CBMission, 4, 2); - BtnStartCampaign = new QPushButton(this); - BtnStartCampaign->setFont(*font14); - BtnStartCampaign->setText(QPushButton::tr("Go!")); - pageLayout->addWidget(BtnStartCampaign, 3, 2); return pageLayout; } +QLayout * PageCampaign::footerLayoutDefinition() +{ + QHBoxLayout * footerLayout = new QHBoxLayout(); + + const QIcon& lp = QIcon(":/res/Start.png"); + QSize sz = lp.actualSize(QSize(65535, 65535)); + BtnStartCampaign = new QPushButton(); + BtnStartCampaign->setWhatsThis(tr("Start fighting")); + BtnStartCampaign->setStyleSheet("padding: 5px 10px"); + BtnStartCampaign->setText(QPushButton::tr("Start")); + BtnStartCampaign->setMinimumWidth(sz.width() + 60); + BtnStartCampaign->setIcon(lp); + BtnStartCampaign->setFixedHeight(50); + BtnStartCampaign->setIconSize(sz); + BtnStartCampaign->setFlat(true); + BtnStartCampaign->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + footerLayout->addStretch(); + footerLayout->addWidget(BtnStartCampaign); + + return footerLayout; +} + PageCampaign::PageCampaign(QWidget* parent) : AbstractPage(parent) { initPage(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagecampaign.h --- a/QTfrontend/ui/page/pagecampaign.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagecampaign.h Sun Dec 17 00:09:24 2017 +0100 @@ -38,6 +38,9 @@ protected: QLayout * bodyLayoutDefinition(); + + private: + QLayout * footerLayoutDefinition(); }; #endif diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagedata.cpp --- a/QTfrontend/ui/page/pagedata.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagedata.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -54,7 +54,14 @@ QHBoxLayout * bottomLayout = new QHBoxLayout(); bottomLayout->setStretch(0, 1); - pbOpenDir = addButton(tr("Open packages directory"), bottomLayout, 1, false, Qt::AlignBottom); + pbHome = addButton(":/res/home.png", bottomLayout, 1, true, Qt::AlignBottom); + pbHome->setMinimumHeight(50); + pbHome->setMinimumWidth(50); + pbHome->setWhatsThis(tr("Load the start page")); + + pbOpenDir = addButton(":/res/folder.png", bottomLayout, 2, true, Qt::AlignBottom); + pbOpenDir->setStyleSheet("padding: 5px 10px"); + pbOpenDir->setWhatsThis(tr("Open packages directory")); pbOpenDir->setMinimumHeight(50); bottomLayout->setStretch(2, 1); @@ -67,6 +74,7 @@ connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&))); connect(this, SIGNAL(goBack()), this, SLOT(onPageLeave())); connect(pbOpenDir, SIGNAL(clicked()), this, SLOT(openPackagesDir())); + connect(pbHome, SIGNAL(clicked()), this, SLOT(fetchList())); } PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent) @@ -85,7 +93,12 @@ void PageDataDownload::request(const QUrl &url) { QUrl finalUrl; - if(url.host().isEmpty()) + if(url.isEmpty()) + { + qWarning() << "Empty URL requested"; + return; + } + else if(url.host().isEmpty()) finalUrl = QUrl("https://www.hedgewars.org" + url.path()); else finalUrl = url; @@ -123,22 +136,34 @@ void PageDataDownload::pageDownloaded() { QNetworkReply * reply = qobject_cast(sender()); + const char *html = + "

Hedgewars Downloadable Content



" + "

%1

"; - if (reply && (reply->error() == QNetworkReply::NoError)) { - QString html = QString::fromUtf8(reply->readAll()); - int begin = html.indexOf(""); - int end = html.indexOf(""); - if(begin != -1 && begin < end) + if (reply) { + if (reply->error() == QNetworkReply::NoError) { - html.truncate(end); - html.remove(0, begin); + QString html = QString::fromUtf8(reply->readAll()); + int begin = html.indexOf(""); + int end = html.indexOf(""); + if(begin != -1 && begin < end) + { + html.truncate(end); + html.remove(0, begin); + } + web->setHtml(html); } - web->setHtml(html); - } else - web->setHtml(QString( - "

Hedgewars Downloadable Content



" - "

%1

") - .arg(tr("This page requires an internet connection."))); + else + { + QString message = reply->error() == QNetworkReply::UnknownNetworkError ? + tr("Unknown network error (possibly missing SSL library).") : + QString(tr("This feature requires an Internet connection, but you don't appear to be online (error code: %1).")).arg(reply->error()); + web->setHtml(QString(html).arg(message)); + } + } + else { + web->setHtml(QString(html).arg(tr("Internal error: Reply object is invalid."))); + } } void PageDataDownload::fileDownloaded() @@ -199,7 +224,6 @@ request(QUrl("https://hedgewars.org/content.html")); } - void PageDataDownload::onPageLeave() { if (m_contentDownloaded) diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagedata.h --- a/QTfrontend/ui/page/pagedata.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagedata.h Sun Dec 17 00:09:24 2017 +0100 @@ -48,6 +48,7 @@ QHash progressBars; QVBoxLayout *progressBarsLayout; QPushButtonWithSound * pbOpenDir; + QPushButtonWithSound * pbHome; bool m_contentDownloaded; ///< true if something was downloaded since last page leave diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pageeditteam.cpp --- a/QTfrontend/ui/page/pageeditteam.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pageeditteam.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -32,6 +32,7 @@ #include "HWApplication.h" #include "keybinder.h" +#include "physfs.h" #include "DataManager.h" #include "hatbutton.h" @@ -77,20 +78,32 @@ HHNameEdit[i]->setFixedHeight(36); HHNameEdit[i]->setWhatsThis(tr("This hedgehog's name")); HHNameEdit[i]->setStyleSheet("padding: 6px;"); - GBHLayout->addWidget(HHNameEdit[i], i + 1, 1); + GBHLayout->addWidget(HHNameEdit[i], i + 1, 1, 1, 2); - btnRandomHogName[i] = addButton(":/res/dice.png", GBHLayout, i + 1, 3, 1, 1, true); + btnRandomHogName[i] = addButton(":/res/dice.png", GBHLayout, i + 1, 5, 1, 1, true); btnRandomHogName[i]->setFixedHeight(HHNameEdit[i]->height()); btnRandomHogName[i]->setWhatsThis(tr("Randomize this hedgehog's name")); } + btnRandomHats = new QPushButton(); + btnRandomHats->setText(tr("Random Hats")); + btnRandomHats->setStyleSheet("padding: 6px 10px;"); + GBHLayout->addWidget(btnRandomHats, 9, 1, 1, 1, Qt::AlignCenter); + btnRandomHats->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + btnRandomNames = new QPushButton(); + btnRandomNames->setText(tr("Random Names")); + btnRandomNames->setStyleSheet("padding: 6px 10px;"); + GBHLayout->addWidget(btnRandomNames, 9, 2, 1, 1, Qt::AlignCenter); + btnRandomNames->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + + vbox1->addWidget(GBoxHedgehogs); + btnRandomTeam = new QPushButton(); btnRandomTeam->setText(tr("Random Team")); btnRandomTeam->setStyleSheet("padding: 6px 10px;"); - GBHLayout->addWidget(btnRandomTeam, 9, 0, 1, 4, Qt::AlignCenter); btnRandomTeam->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - - vbox1->addWidget(GBoxHedgehogs); + vbox1->addWidget(btnRandomTeam, 0, Qt::AlignCenter); GBoxTeam = new QGroupBox(this); GBoxTeam->setTitle(QGroupBox::tr("Team Settings")); @@ -114,10 +127,12 @@ TeamNameEdit = new QLineEdit(GBoxTeam); TeamNameEdit->setMaxLength(64); - GBTLayout->addWidget(TeamNameEdit, 0, 1); + TeamNameEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + GBTLayout->addWidget(TeamNameEdit, 0, 1, 1, 2); vbox2->addWidget(GBoxTeam); CBTeamLvl = new QComboBox(GBoxTeam); + CBTeamLvl->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); CBTeamLvl->setIconSize(QSize(32, 32)); CBTeamLvl->addItem(QIcon(":/res/botlevels/small0.png"), QComboBox::tr("Human")); for(int i = 5; i > 0; i--) @@ -126,46 +141,97 @@ QComboBox::tr("Computer (Level %1)").arg(i) ); CBTeamLvl->setFixedHeight(38); - GBTLayout->addWidget(CBTeamLvl, 1, 1); + GBTLayout->addWidget(CBTeamLvl, 1, 1, 1, 2); CBGrave = new QComboBox(GBoxTeam); + CBGrave->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); CBGrave->setMaxCount(65535); CBGrave->setMaxVisibleItems(20); CBGrave->setIconSize(QSize(32, 32)); CBGrave->setFixedHeight(44); - GBTLayout->addWidget(CBGrave, 2, 1); + GBTLayout->addWidget(CBGrave, 2, 1, 1, 2); + // Player flags, combobox to select flag CBFlag = new QComboBox(GBoxTeam); CBFlag->setMaxCount(65535); CBFlag->setMaxVisibleItems(50); CBFlag->setIconSize(QSize(22, 15)); - GBTLayout->addWidget(CBFlag, 3, 1); + CBFlag->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + GBTLayout->addWidget(CBFlag, 3, 1, 1, 2); + + // 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 }; + + 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]); + + pixCPU[i] = QPixmap::fromImage(imgCPU); + } + + QHBoxLayout* hboxCPU = new QHBoxLayout(); + hboxCPU->setContentsMargins(0, 0, 0, 0); + + hboxCPUWidget = new QWidget(); + hboxCPUWidget->setLayout(hboxCPU); - QHBoxLayout * hbox = new QHBoxLayout(); + CPUFlag = new QLabel(); + CPUFlag->setPixmap(pixCPU[0]); + CPUFlag->setFixedHeight(38); + + hboxCPU->addWidget(CPUFlag); + + CPUFlagLabel = new QLabel("CPU"); + CPUFlagLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + hboxCPU->addWidget(CPUFlagLabel); + + hboxCPUWidget->setHidden(true); + GBTLayout->addWidget(hboxCPUWidget, 3, 1, 1, 1); + + btnRandomTeamName = addButton(":/res/dice.png", GBTLayout, 0, 3, 1, 1, true); + btnRandomTeamName->setWhatsThis(tr("Randomize the team name")); + + btnRandomGrave = addButton(":/res/dice.png", GBTLayout, 2, 3, 1, 1, true); + btnRandomGrave->setWhatsThis(tr("Randomize the grave")); + + btnRandomFlag = addButton(":/res/dice.png", GBTLayout, 3, 3, 1, 1, true); + btnRandomFlag->setWhatsThis(tr("Randomize the flag")); + CBVoicepack = new QComboBox(GBoxTeam); CBVoicepack->setMaxVisibleItems(50); + CBVoicepack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - hbox->addWidget(CBVoicepack, 100); - btnTestSound = addSoundlessButton(":/res/PlaySound.png", hbox, 1, true); - btnTestSound->setWhatsThis("Play a random example of this voice"); - hbox->setStretchFactor(btnTestSound, 1); + GBTLayout->addWidget(CBVoicepack, 4, 1, 1, 1); - GBTLayout->addLayout(hbox, 4, 1); + btnTestSound = addSoundlessButton(":/res/PlaySound.png", GBTLayout, 4, 2, 1, 1, true); + btnTestSound->setWhatsThis(tr("Play a random example of this voice")); + + btnRandomVoice = addButton(":/res/dice.png", GBTLayout, 4, 3, 1, 1, true); + btnRandomVoice->setWhatsThis(tr("Randomize the voice")); GBoxFort = new QGroupBox(this); GBoxFort->setTitle(QGroupBox::tr("Fort")); QGridLayout * GBFLayout = new QGridLayout(GBoxFort); CBFort = new QComboBox(GBoxFort); + CBFort->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); CBFort->setMaxVisibleItems(25); CBFort->setMaxCount(65535); + GBFLayout->addWidget(CBFort, 0, 0); + + btnRandomFort = addButton(":/res/dice.png", GBFLayout, 0, 2, 1, 1, true); + btnRandomFort->setWhatsThis(tr("Randomize the fort")); + FortPreview = new SquareLabel(GBoxFort); FortPreview->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); FortPreview->setMinimumSize(128, 128); FortPreview->setPixmap(QPixmap()); // perhaps due to handling its own paintevents, SquareLabel doesn't play nice with the stars //FortPreview->setAttribute(Qt::WA_PaintOnScreen, true); - GBFLayout->addWidget(FortPreview, 1, 0); + GBFLayout->addWidget(FortPreview, 1, 0, 1, 2); vbox2->addWidget(GBoxFort); vbox1->addStretch(); @@ -187,7 +253,7 @@ signalMapper2 = new QSignalMapper(this); connect(signalMapper1, SIGNAL(mapped(int)), this, SLOT(fixHHname(int))); - connect(signalMapper2, SIGNAL(mapped(int)), this, SLOT(setRandomName(int))); + connect(signalMapper2, SIGNAL(mapped(int)), this, SLOT(setRandomHogName(int))); for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) { @@ -198,11 +264,21 @@ signalMapper2->setMapping(btnRandomHogName[i], i); } - connect(btnRandomTeam, SIGNAL(clicked()), this, SLOT(setRandomNames())); + connect(btnRandomTeam, SIGNAL(clicked()), this, SLOT(setRandomTeam())); + connect(btnRandomNames, SIGNAL(clicked()), this, SLOT(setRandomHogNames())); + connect(btnRandomHats, SIGNAL(clicked()), this, SLOT(setRandomHats())); + + connect(CBTeamLvl, SIGNAL(currentIndexChanged(const int)), this, SLOT(CBTeamLvl_activated(const int))); + + connect(btnRandomTeamName, SIGNAL(clicked()), this, SLOT(setRandomTeamName())); + connect(btnRandomGrave, SIGNAL(clicked()), this, SLOT(setRandomGrave())); + connect(btnRandomFlag, SIGNAL(clicked()), this, SLOT(setRandomFlag())); + connect(btnRandomVoice, SIGNAL(clicked()), this, SLOT(setRandomVoice())); + connect(btnRandomFort, SIGNAL(clicked()), this, SLOT(setRandomFort())); connect(btnTestSound, SIGNAL(clicked()), this, SLOT(testSound())); - connect(CBFort, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(CBFort_activated(const QString &))); + connect(CBFort, SIGNAL(currentIndexChanged(const int)), this, SLOT(CBFort_activated(const int))); } PageEditTeam::PageEditTeam(QWidget* parent) : @@ -236,11 +312,32 @@ CBVoicepack->addItems(list); + QIcon dlcIcon; + dlcIcon.addFile(":/res/dlcMarker.png", QSize(), QIcon::Normal, QIcon::On); + dlcIcon.addFile(":/res/dlcMarkerSelected.png", QSize(), QIcon::Selected, QIcon::On); + QPixmap emptySpace = QPixmap(7, 15); + emptySpace.fill(QColor(0, 0, 0, 0)); + QIcon notDlcIcon = QIcon(emptySpace); // forts list = dataMgr.entryList("Forts", QDir::Files, QStringList("*L.png")); - list.replaceInStrings(QRegExp("L\\.png$"), ""); - CBFort->addItems(list); + foreach (QString file, list) + { + QString fortPath = PHYSFS_getRealDir(QString("Forts/%1").arg(file).toLocal8Bit().data()); + + QString fort = file.replace(QRegExp("L\\.png$"), ""); + + bool isDLC = !fortPath.startsWith(datadir->absolutePath()); + if (isDLC) + { + CBFort->addItem(dlcIcon, fort, fort); + } + else + { + CBFort->addItem(notDlcIcon, fort, fort); + } + + } // graves @@ -314,10 +411,26 @@ HHNameEdit[idx]->setText(QLineEdit::tr("hedgehog %1").arg(idx+1)); } -void PageEditTeam::CBFort_activated(const QString & fortname) +void PageEditTeam::CBFort_activated(const int index) +{ + QString fortName = CBFort->itemData(index).toString(); + QPixmap pix("physfs://Forts/" + fortName + "L.png"); + FortPreview->setPixmap(pix); +} + +void PageEditTeam::CBTeamLvl_activated(const int index) { - QPixmap pix("physfs://Forts/" + fortname + "L.png"); - FortPreview->setPixmap(pix); + CBFlag->setHidden(index != 0); + btnRandomFlag->setHidden(index != 0); + + if(index > 0) + { + int cpuLevel = 6 - index; + CPUFlag->setPixmap(pixCPU[cpuLevel - 1]); + //: Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + CPUFlagLabel->setText(tr("CPU %1").arg(cpuLevel)); + } + hboxCPUWidget->setHidden(index == 0); } void PageEditTeam::testSound() @@ -346,8 +459,16 @@ { m_playerHash = playerHash; lazyLoad(); + OldTeamName = name; + // Mostly create a default team, with 2 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); + // 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); } @@ -355,6 +476,7 @@ { m_playerHash = playerHash; lazyLoad(); + OldTeamName = name; HWTeam team(name); team.loadFromFile(); @@ -374,17 +496,66 @@ HWTeam(name).deleteFile(); } -void PageEditTeam::setRandomNames() +void PageEditTeam::setRandomTeam() +{ + HWTeam team = data(); + HWNamegen::teamRandomEverything(team); + loadTeam(team); +} + +void PageEditTeam::setRandomHogNames() { HWTeam team = data(); - HWNamegen::teamRandomNames(team, true); + HWNamegen::teamRandomHogNames(team); + loadTeam(team); +} + +void PageEditTeam::setRandomHats() +{ + HWTeam team = data(); + HWNamegen::teamRandomHats(team); + loadTeam(team); +} + +void PageEditTeam::setRandomHogName(int hh_index) +{ + HWTeam team = data(); + HWNamegen::teamRandomHogName(team,hh_index); loadTeam(team); } -void PageEditTeam::setRandomName(int hh_index) +void PageEditTeam::setRandomTeamName() +{ + HWTeam team = data(); + HWNamegen::teamRandomTeamName(team); + loadTeam(team); +} + +void PageEditTeam::setRandomGrave() { HWTeam team = data(); - HWNamegen::teamRandomName(team,hh_index); + HWNamegen::teamRandomGrave(team); + loadTeam(team); +} + +void PageEditTeam::setRandomFlag() +{ + HWTeam team = data(); + HWNamegen::teamRandomFlag(team); + loadTeam(team); +} + +void PageEditTeam::setRandomVoice() +{ + HWTeam team = data(); + HWNamegen::teamRandomVoice(team); + loadTeam(team); +} + +void PageEditTeam::setRandomFort() +{ + HWTeam team = data(); + HWNamegen::teamRandomFort(team); loadTeam(team); } @@ -411,7 +582,7 @@ CBGrave->setCurrentIndex(CBGrave->findText(team.grave())); CBFlag->setCurrentIndex(CBFlag->findData(team.flag())); - CBFort->setCurrentIndex(CBFort->findText(team.fort())); + CBFort->setCurrentIndex(CBFort->findData(team.fort())); CBVoicepack->setCurrentIndex(CBVoicepack->findText(team.voicepack())); QStandardItemModel * binds = DataManager::instance().bindsModel(); @@ -430,7 +601,8 @@ HWTeam PageEditTeam::data() { - HWTeam team(TeamNameEdit->text()); + HWTeam team(OldTeamName); + team.setName(TeamNameEdit->text()); team.setDifficulty(CBTeamLvl->currentIndex()); for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) @@ -446,7 +618,7 @@ } team.setGrave(CBGrave->currentText()); - team.setFort(CBFort->currentText()); + team.setFort(CBFort->itemData(CBFort->currentIndex()).toString()); team.setVoicepack(CBVoicepack->currentText()); team.setFlag(CBFlag->itemData(CBFlag->currentIndex()).toString()); @@ -461,7 +633,35 @@ void PageEditTeam::saveTeam() { - data().saveToFile(); + HWTeam team = data(); + if(!team.wouldOverwriteOtherFile()) + { + team.saveToFile(); + } + else + { + // Name already used -> look for an appropriate name: + int i=2; + QString origName = team.name(); + QString newName; + while(team.wouldOverwriteOtherFile()) + { + newName = tr("%1 (%2)").arg(origName).arg(i++); + team.setName(newName); + if(i > 1000) + break; + } + + QMessageBox teamNameFixedMsg(this); + 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.setWindowModality(Qt::WindowModal); + teamNameFixedMsg.setStandardButtons(QMessageBox::Ok); + teamNameFixedMsg.exec(); + + team.saveToFile(); + } } // When the "Use default for all binds" is pressed... diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pageeditteam.h --- a/QTfrontend/ui/page/pageeditteam.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pageeditteam.h Sun Dec 17 00:09:24 2017 +0100 @@ -43,7 +43,8 @@ void deleteTeam(const QString & name); public slots: - void CBFort_activated(const QString & gravename); + void CBTeamLvl_activated(const int index); + void CBFort_activated(const int index); private: QTabWidget * tbw; @@ -56,6 +57,10 @@ SquareLabel *FortPreview; QComboBox *CBGrave; QComboBox *CBFlag; + QLabel *CPUFlag; + QLabel *CPUFlagLabel; + QWidget *hboxCPUWidget; + QPixmap pixCPU[5]; QComboBox *CBTeamLvl; QComboBox *CBVoicepack; QGroupBox *GBoxBinds; @@ -65,6 +70,7 @@ HatButton * HHHats[HEDGEHOGS_PER_TEAM]; HWTeam data(); QString m_playerHash; + QString OldTeamName; KeyBinder * binder; bool m_loaded; @@ -75,17 +81,33 @@ void loadTeam(const HWTeam & team); // page 1 + QPushButton * btnRandomTeam; + QPushButton * btnRandomNames; + QPushButton * btnRandomHats; + QPushButton * btnRandomHogName[HEDGEHOGS_PER_TEAM]; - QPushButton * btnRandomTeam; + QPushButton * btnRandomTeamName; + QPushButton * btnRandomGrave; + QPushButton * btnRandomFlag; + QPushButton * btnRandomVoice; + QPushButton * btnRandomFort; QPushButton * btnTestSound; void lazyLoad(); private slots: void saveTeam(); - void setRandomNames(); + void setRandomTeam(); + void setRandomHogNames(); + void setRandomHats(); - void setRandomName(int hh_index); + void setRandomTeamName(); + void setRandomGrave(); + void setRandomFlag(); + void setRandomVoice(); + void setRandomFort(); + + void setRandomHogName(int hh_index); /// Plays a random voice sound of the currently edited team. void testSound(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagegamestats.cpp --- a/QTfrontend/ui/page/pagegamestats.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagegamestats.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -148,6 +148,7 @@ labelGameStats->setText(""); healthPoints.clear(); labelGameRank->setText(""); + labelGameWin->setText(""); playerPosition = 0; lastColor = 0; } @@ -301,8 +302,10 @@ QString message; QString killstring; if(kindOfPoints.compare("") == 0) { + //: Number of kills in stats screen, written after the team name killstring = PageGameStats::tr("(%1 kill)", "", kills).arg(kills); } 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(""); } @@ -316,7 +319,7 @@ { int i = info.indexOf(' '); int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("%1 thought it's good to shoot his own hedgehogs with %2 pts.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; + QString message = "

" + PageGameStats::tr("%1 thought it's good to shoot their own hedgehogs for %2 pts.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; AddStatText(message); break; } @@ -324,7 +327,7 @@ { int i = info.indexOf(' '); int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("%1 killed %2 of his own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; + QString message = "

" + PageGameStats::tr("%1 killed %2 of their own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; AddStatText(message); break; } diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pageinfo.cpp --- a/QTfrontend/ui/page/pageinfo.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pageinfo.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -41,7 +41,7 @@ { QHBoxLayout * bottomLayout = new QHBoxLayout(); bottomLayout->setContentsMargins(0,0,0,0); - BtnSnapshots = addButton(":/res/Star.png", bottomLayout, 0, true, Qt::AlignBottom); + BtnSnapshots = addButton(":/res/folder.png", bottomLayout, 0, true, Qt::AlignBottom); BtnSnapshots->setWhatsThis(tr("Open the snapshot folder")); BtnSnapshots->setMinimumSize(50,50); return bottomLayout; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagemultiplayer.cpp --- a/QTfrontend/ui/page/pagemultiplayer.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagemultiplayer.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -34,10 +34,12 @@ QHBoxLayout * pageLayout = new QHBoxLayout(); gameCFG = new GameCFGWidget(this); - pageLayout->addWidget(gameCFG, 3, Qt::AlignTop); + pageLayout->addWidget(gameCFG); + pageLayout->setAlignment(gameCFG, Qt::AlignTop); teamsSelect = new TeamSelWidget(this); - pageLayout->addWidget(teamsSelect, 2, Qt::AlignTop); + pageLayout->addWidget(teamsSelect); + teamsSelect->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); return pageLayout; } @@ -59,14 +61,14 @@ const QIcon& lp = QIcon(":/res/Start.png"); QSize sz = lp.actualSize(QSize(65535, 65535)); BtnStartMPGame = new QPushButton(); + BtnStartMPGame->setStyleSheet("padding: 5px 10px"); BtnStartMPGame->setText(tr("Start")); BtnStartMPGame->setWhatsThis(tr("Start fighting (requires at least 2 teams)")); - BtnStartMPGame->setMinimumWidth(sz.width() + 60); BtnStartMPGame->setIcon(lp); BtnStartMPGame->setFixedHeight(50); BtnStartMPGame->setIconSize(sz); BtnStartMPGame->setFlat(true); - BtnStartMPGame->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + BtnStartMPGame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); footerLayout->addStretch(); footerLayout->addWidget(BtnStartMPGame, 0, Qt::AlignBottom); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagenetgame.cpp --- a/QTfrontend/ui/page/pagenetgame.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagenetgame.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -50,7 +50,7 @@ leRoomName = new HistoryLineEdit(this, 10); leRoomName->setWhatsThis(tr("Room name")); - leRoomName->setMaxLength(60); + leRoomName->setMaxLength(40); leRoomName->setMinimumWidth(400); leRoomName->setMaximumWidth(600); leRoomName->setFixedHeight(30); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagenetserver.cpp --- a/QTfrontend/ui/page/pagenetserver.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagenetserver.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -83,7 +83,7 @@ labelURL->setText( "" ""); labelURL->setOpenExternalLinks(true); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pageoptions.cpp --- a/QTfrontend/ui/page/pageoptions.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pageoptions.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -167,7 +168,7 @@ } { // group: schemes - OptionGroupBox * groupSchemes = new OptionGroupBox(":/res/weaponsicon.png", tr("Schemes"), this); + OptionGroupBox * groupSchemes = new OptionGroupBox(":/res/schemeicon.png", tr("Schemes"), this); leftColumn->addWidget(groupSchemes); groupSchemes->layout()->setColumnStretch(0, 1); @@ -275,7 +276,8 @@ groupGame->layout()->addWidget(winResContainer, 2, 1); QLabel *winLabelX = new QLabel(groupGame); - winLabelX->setText("x"); // decorational x + //: 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); winLabelX->setAlignment(Qt::AlignCenter); @@ -310,10 +312,11 @@ // Stereo spacing QLabel * lblStereo = new QLabel(groupGame); - lblStereo->setText(QLabel::tr("Stereo rendering")); + lblStereo->setText(QLabel::tr("Stereoscopy")); groupGame->layout()->addWidget(lblStereo, 4, 0); CBStereoMode = new QComboBox(groupGame); + CBStereoMode->setWhatsThis(QComboBox::tr("Stereoscopy creates an illusion of depth when you wear 3D glasses.")); CBStereoMode->setMaxVisibleItems(50); CBStereoMode->addItem(QComboBox::tr("Disabled")); CBStereoMode->addItem(QComboBox::tr("Red/Cyan")); @@ -406,7 +409,7 @@ } { // group: frontend - OptionGroupBox * groupFrontend = new OptionGroupBox(":/res/graphicsicon.png", tr("Frontend"), this); + OptionGroupBox * groupFrontend = new OptionGroupBox(":/res/frontendicon.png", tr("Frontend"), this); rightColumn->addWidget(groupFrontend); // Fullscreen @@ -419,11 +422,12 @@ CBFrontendEffects = new QCheckBox(groupFrontend); CBFrontendEffects->setText(QCheckBox::tr("Visual effects")); + CBFrontendEffects->setWhatsThis(QCheckBox::tr("Enable visual effects such as animated menu transitions and falling stars")); groupFrontend->layout()->addWidget(CBFrontendEffects, 1, 0); } { // group: colors - OptionGroupBox * groupColors = new OptionGroupBox(":/res/lightbulb_on.png", tr("Custom colors"), this); + OptionGroupBox * groupColors = new OptionGroupBox(":/res/Palette.png", tr("Custom colors"), this); rightColumn->addWidget(groupColors); groupColors->layout()->setColumnStretch(0, 1); @@ -626,12 +630,41 @@ CBLanguage->setMaxVisibleItems(50); groupMisc->layout()->addWidget(CBLanguage, 0, 1); QStringList locs = DataManager::instance().entryList("Locale", QDir::Files, QStringList("hedgewars_*.qm")); + QStringList langnames; CBLanguage->addItem(QComboBox::tr("(System default)"), QString()); for(int i = 0; i < locs.count(); i++) { QString lname = locs[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1"); - QLocale loc(lname); - CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", lname); + QLocale loc = QLocale(lname); + QString entryName; + // If local identifier has underscore, it means the country has been specified + if(lname.contains("_")) + { + // Append country name for disambiguation + // FIXME: These brackets are hardcoded and can't be translated. Luckily, these are rarely used and work with most languages anyway + entryName = loc.nativeLanguageName() + " (" + loc.nativeCountryName() + ")"; + } + else + { + // Usually, we just print the language name + entryName = loc.nativeLanguageName(); + } + // Fallback code, if language name is empty for some reason. This should normally not happen + if(entryName.isEmpty()) + { + if(lname == "gd") + { + /* Workaround for Qt4: nativeLanguageName does not return correct name for Scottish Gaelic (QTBUG-59929), + so we have to add it ourselves :-/ */ + entryName = QString::fromUtf8("Gàidhlig"); + } + else + { + // If all else fails, show error and the locale identifier + entryName = tr("MISSING LANGUAGE NAME [%1]").arg(lname); + } + } + CBLanguage->addItem(entryName, lname); } QLabel *restartNoticeLabel = new QLabel(groupMisc); @@ -647,6 +680,7 @@ CBNameWithDate = new QCheckBox(groupMisc); CBNameWithDate->setText(QCheckBox::tr("Append date and time to record file name")); + CBNameWithDate->setWhatsThis(QCheckBox::tr("If enabled, Hedgewars adds the date and time in the form \"YYYY-MM-DD_hh-mm\" for automatically created demos.")); groupMisc->layout()->addWidget(CBNameWithDate, 3, 0, 1, 2); // Associate file extensions @@ -674,7 +708,7 @@ btnUpdateNow = new QPushButton(groupUpdates); connect(btnUpdateNow, SIGNAL(clicked()), this, SLOT(checkForUpdates())); btnUpdateNow->setWhatsThis(tr("Check for updates")); - btnUpdateNow->setText("Check now"); + btnUpdateNow->setText(tr("Check now")); btnUpdateNow->setFixedSize(130, 30); groupUpdates->layout()->addWidget(btnUpdateNow, 0, 1); } @@ -764,10 +798,10 @@ widthEdit->setValidator(new QIntValidator(this)); groupVideoRec->layout()->addWidget(widthEdit, 5, 1); - // x + // multiplication sign QLabel *labelX = new QLabel(groupVideoRec); - labelX->setText("X"); + labelX->setText(tr("x")); groupVideoRec->layout()->addWidget(labelX, 5, 2); // height @@ -789,17 +823,18 @@ groupVideoRec->layout()->addWidget(labelFramerate, 6, 0); framerateBox = new QComboBox(groupVideoRec); - framerateBox->addItem("24 fps", 24); - framerateBox->addItem("25 fps", 25); - framerateBox->addItem("30 fps", 30); - framerateBox->addItem("50 fps", 50); - framerateBox->addItem("60 fps", 60); + framerateBox->addItem(QComboBox::tr("24 FPS"), 24); + framerateBox->addItem(QComboBox::tr("25 FPS"), 25); + framerateBox->addItem(QComboBox::tr("30 FPS"), 30); + framerateBox->addItem(QComboBox::tr("50 FPS"), 50); + framerateBox->addItem(QComboBox::tr("60 FPS"), 60); groupVideoRec->layout()->addWidget(framerateBox, 6, 1); // label for Bitrate QLabel *labelBitrate = new QLabel(groupVideoRec); - labelBitrate->setText(QLabel::tr("Bitrate (Kbps)")); + //: “Kibit/s” is the symbol for 1024 bits per second + labelBitrate->setText(QLabel::tr("Bitrate (Kibit/s)")); groupVideoRec->layout()->addWidget(labelBitrate, 6, 2); // bitrate @@ -807,6 +842,7 @@ bitrateBox = new QSpinBox(groupVideoRec); bitrateBox->setRange(100, 5000); bitrateBox->setSingleStep(100); + bitrateBox->setWhatsThis(QSpinBox::tr("Specify the bitrate of recorded videos as a multiple of 1024 bits per second")); groupVideoRec->layout()->addWidget(bitrateBox, 6, 3); // button 'set default options' @@ -951,7 +987,10 @@ void PageOptions::requestDeleteSelectedTeam() { - emit deleteTeamRequested(CBTeamName->currentText()); + if(CBTeamName->count() > 1) + emit deleteTeamRequested(CBTeamName->currentText()); + else + QMessageBox::warning(this, tr("Can't delete last team"), tr("You can't delete the last team!")); } void PageOptions::setTeamOptionsEnabled(bool enabled) diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pageplayrecord.cpp --- a/QTfrontend/ui/page/pageplayrecord.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pageplayrecord.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -62,7 +62,7 @@ BtnPlayDemo = addButton(tr("Play demo"), bottomLayout, 0, false, Qt::AlignBottom); const QIcon& lp = QIcon(":/res/Start.png"); QSize sz = lp.actualSize(QSize(65535, 65535)); - BtnPlayDemo->setMinimumWidth(sz.width()); + BtnPlayDemo->setStyleSheet("padding: 5px 10px"); BtnPlayDemo->setIcon(lp); BtnPlayDemo->setFixedHeight(50); BtnPlayDemo->setIconSize(sz); @@ -136,8 +136,8 @@ { QMessageBox recordMsg(this); recordMsg.setIcon(QMessageBox::Warning); - recordMsg.setWindowTitle(QMessageBox::tr("Record Play - Error")); - recordMsg.setText(QMessageBox::tr("Please select record from the list")); + recordMsg.setWindowTitle(QMessageBox::tr("Error")); + recordMsg.setText(QMessageBox::tr("Please select a file from the list.")); recordMsg.setWindowModality(Qt::WindowModal); recordMsg.exec(); return ; @@ -163,8 +163,8 @@ { QMessageBox renameMsg(this); renameMsg.setIcon(QMessageBox::Warning); - renameMsg.setWindowTitle(QMessageBox::tr("Record Play - Error")); - renameMsg.setText(QMessageBox::tr("Cannot rename to ") + newfullname); + renameMsg.setWindowTitle(QMessageBox::tr("Error")); + renameMsg.setText(QMessageBox::tr("Cannot rename file to %1.").arg(newfullname)); renameMsg.setWindowModality(Qt::WindowModal); renameMsg.exec(); } @@ -180,8 +180,8 @@ { QMessageBox recordMsg(this); recordMsg.setIcon(QMessageBox::Warning); - recordMsg.setWindowTitle(QMessageBox::tr("Record Play - Error")); - recordMsg.setText(QMessageBox::tr("Please select record from the list")); + recordMsg.setWindowTitle(QMessageBox::tr("Error")); + recordMsg.setText(QMessageBox::tr("Please select a file from the list.")); recordMsg.setWindowModality(Qt::WindowModal); recordMsg.exec(); return ; @@ -195,8 +195,8 @@ { QMessageBox removeMsg(this); removeMsg.setIcon(QMessageBox::Warning); - removeMsg.setWindowTitle(QMessageBox::tr("Record Play - Error")); - removeMsg.setText(QMessageBox::tr("Cannot delete file ") + rfile.fileName()); + removeMsg.setWindowTitle(QMessageBox::tr("Error")); + removeMsg.setText(QMessageBox::tr("Cannot delete file %1.").arg(rfile.fileName())); removeMsg.setWindowModality(Qt::WindowModal); removeMsg.exec(); } diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pageroomslist.cpp --- a/QTfrontend/ui/page/pageroomslist.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pageroomslist.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -176,6 +176,7 @@ BtnAdmin = addButton(tr("Admin features"), bottomLayout, 0, false, Qt::AlignBottom); BtnAdmin->setMinimumSize(180, 50); + BtnAdmin->setStyleSheet("padding: 5px 10px"); BtnAdmin->setWhatsThis(tr("Open server administration page")); return bottomLayout; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagescheme.cpp --- a/QTfrontend/ui/page/pagescheme.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagescheme.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -68,25 +68,21 @@ gbBasicSettings->setLayout(glBSLayout); // Left - TBW_mode_Forts = new ToggleButtonWidget(gbGameModes, ":/res/btnForts@2x.png"); - TBW_mode_Forts->setWhatsThis(tr("Defend your fort and destroy the opponents, two team colours max!")); - glGMLayout->addWidget(TBW_mode_Forts,0,0,1,1); - TBW_disablegirders = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableGirders@2x.png"); TBW_disablegirders->setWhatsThis(tr("Disable girders when generating random maps.")); - glGMLayout->addWidget(TBW_disablegirders,0,1,1,1); + glGMLayout->addWidget(TBW_disablegirders,0,0,1,1); TBW_disablelandobjects = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableLandObjects@2x.png"); TBW_disablelandobjects->setWhatsThis(tr("Disable land objects when generating random maps.")); - glGMLayout->addWidget(TBW_disablelandobjects,0,2,1,1); + glGMLayout->addWidget(TBW_disablelandobjects,0,1,1,1); TBW_border = new ToggleButtonWidget(gbGameModes, ":/res/btnBorder@2x.png"); TBW_border->setWhatsThis(tr("Add an indestructible border around the terrain")); - glGMLayout->addWidget(TBW_border,0,3,1,1); + glGMLayout->addWidget(TBW_border,0,2,1,1); TBW_bottomborder = new ToggleButtonWidget(gbGameModes, ":/res/btnBottomBorder@2x.png"); TBW_bottomborder->setWhatsThis(tr("Add an indestructible border along the bottom")); - glGMLayout->addWidget(TBW_bottomborder,0,4,1,1); + glGMLayout->addWidget(TBW_bottomborder,0,3,1,1); TBW_solid = new ToggleButtonWidget(gbGameModes, ":/res/btnSolid@2x.png"); TBW_solid->setWhatsThis(tr("Land can not be destroyed!")); @@ -232,11 +228,11 @@ l = new QLabel(gbBasicSettings); l->setWhatsThis(wtInitHealth); l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconHealth.png")); + l->setPixmap(QPixmap(":/res/iconInitHealth.png")); glBSLayout->addWidget(l,2,1,1,1); SB_InitHealth = new QSpinBox(gbBasicSettings); SB_InitHealth->setWhatsThis(wtInitHealth); - SB_InitHealth->setRange(50, 200); + SB_InitHealth->setRange(1, 1000); SB_InitHealth->setValue(100); SB_InitHealth->setSingleStep(25); glBSLayout->addWidget(SB_InitHealth,2,2,1,1); @@ -287,7 +283,7 @@ glBSLayout->addWidget(l,5,1,1,1); SB_HealthDecrease = new QSpinBox(gbBasicSettings); SB_HealthDecrease->setWhatsThis(wtHealthDecrease); - SB_HealthDecrease->setRange(0, 100); + SB_HealthDecrease->setRange(0, 1000); SB_HealthDecrease->setValue(5); SB_HealthDecrease->setSingleStep(1); glBSLayout->addWidget(SB_HealthDecrease,5,2,1,1); @@ -354,7 +350,7 @@ glBSLayout->addWidget(l,9,1,1,1); SB_CrateHealth = new QSpinBox(gbBasicSettings); SB_CrateHealth->setWhatsThis(wtCrateHealth); - SB_CrateHealth->setRange(0, 200); + SB_CrateHealth->setRange(0, 1000); SB_CrateHealth->setValue(25); SB_CrateHealth->setSingleStep(5); glBSLayout->addWidget(SB_CrateHealth,9,2,1,1); @@ -503,7 +499,7 @@ l->setText(QLabel::tr("Scheme Name:")); LE_name = new QLineEdit(this); - LE_name->setWhatsThis("Name of this scheme"); + LE_name->setWhatsThis(tr("Name of this scheme")); gl->addWidget(LE_name,15,1,1,5); gl->addWidget(l,15,0,1,1); @@ -550,7 +546,6 @@ selectScheme->setModel(model); mapper->addMapping(LE_name, 0); - mapper->addMapping(TBW_mode_Forts, 1); mapper->addMapping(TBW_teamsDivide, 2); mapper->addMapping(TBW_solid, 3); mapper->addMapping(TBW_border, 4); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagescheme.h --- a/QTfrontend/ui/page/pagescheme.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagescheme.h Sun Dec 17 00:09:24 2017 +0100 @@ -51,7 +51,6 @@ private: QDataWidgetMapper * mapper; - ToggleButtonWidget * TBW_mode_Forts; ToggleButtonWidget * TBW_teamsDivide; ToggleButtonWidget * TBW_solid; ToggleButtonWidget * TBW_border; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pageselectweapon.cpp --- a/QTfrontend/ui/page/pageselectweapon.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pageselectweapon.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -30,6 +30,7 @@ QGridLayout * pageLayout = new QGridLayout(); pWeapons = new SelWeaponWidget(cAmmoNumber, this); + pWeapons->init(); pageLayout->addWidget(pWeapons); return pageLayout; @@ -59,11 +60,12 @@ void PageSelectWeapon::connectSignals() { + connect(selectWeaponSet, SIGNAL(currentIndexChanged(const QString&)), pWeapons, SLOT(switchWeapons(const QString&))); connect(BtnDefault, SIGNAL(clicked()), pWeapons, SLOT(setDefault())); connect(this, SIGNAL(goBack()), pWeapons, SLOT(save())); connect(BtnNew, SIGNAL(clicked()), pWeapons, SLOT(newWeaponsName())); connect(BtnCopy, SIGNAL(clicked()), pWeapons, SLOT(copy())); - connect(selectWeaponSet, SIGNAL(currentIndexChanged(const QString&)), pWeapons, SLOT(setWeaponsName(const QString&))); + connect(BtnDelete, SIGNAL(clicked()), pWeapons, SLOT(deleteWeaponsName())); } PageSelectWeapon::PageSelectWeapon(QWidget* parent) : AbstractPage(parent) diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagetraining.cpp --- a/QTfrontend/ui/page/pagetraining.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagetraining.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -73,14 +73,29 @@ pageLayout->setAlignment(infoLayout, Qt::AlignLeft); - // mission list - lstMissions = new QListWidget(this); - lstMissions->setWhatsThis(tr("Pick the mission or training to play")); - pageLayout->addWidget(lstMissions, 1, 0, 1, 2); // span 2 columns + // tab widget containing all lists + tbw = new QTabWidget(this); + pageLayout->addWidget(tbw, 1, 0, 1, 2); // span 2 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; }"); - // let's not make the list use more space than needed - lstMissions->setFixedWidth(400); - pageLayout->setAlignment(lstMissions, Qt::AlignHCenter); + // training/challenge/scenario lists + lstTrainings = new QListWidget(this); + lstTrainings ->setWhatsThis(tr("Pick the training to play")); + + lstChallenges = new QListWidget(this); + lstChallenges ->setWhatsThis(tr("Pick the challenge to play")); + + lstScenarios= new QListWidget(this); + lstScenarios->setWhatsThis(tr("Pick the scenario to play")); + + tbw->addTab(lstTrainings, tr("Trainings")); + tbw->addTab(lstChallenges, tr("Challenges")); + tbw->addTab(lstScenarios, tr("Scenarios")); + tbw->setCurrentWidget(lstTrainings); return pageLayout; } @@ -89,9 +104,18 @@ { QBoxLayout * bottomLayout = new QVBoxLayout(); - btnStart = formattedButton(QPushButton::tr("Go!")); + const QIcon& lp = QIcon(":/res/Start.png"); + QSize sz = lp.actualSize(QSize(65535, 65535)); + btnStart = new QPushButton(); + btnStart->setStyleSheet("padding: 5px 10px"); + btnStart->setText(QPushButton::tr("Start")); btnStart->setWhatsThis(tr("Start fighting")); - btnStart->setFixedWidth(140); + btnStart->setMinimumWidth(sz.width() + 60); + btnStart->setIcon(lp); + btnStart->setFixedHeight(50); + btnStart->setIconSize(sz); + btnStart->setFlat(true); + btnStart->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); bottomLayout->addWidget(btnStart); @@ -103,9 +127,20 @@ void PageTraining::connectSignals() { - connect(lstMissions, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(updateInfo())); - connect(lstMissions, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(updateInfo())); - connect(lstMissions, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(startSelected())); + connect(lstTrainings, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(updateInfo())); + connect(lstTrainings, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(updateInfo())); + connect(lstTrainings, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(startSelected())); + + connect(lstChallenges, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(updateInfo())); + connect(lstChallenges, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(updateInfo())); + connect(lstChallenges, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(startSelected())); + + connect(lstScenarios, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(updateInfo())); + connect(lstScenarios, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(updateInfo())); + connect(lstScenarios, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(startSelected())); + + connect(tbw, SIGNAL(currentChanged(int)), this, SLOT(updateInfo())); + connect(btnPreview, SIGNAL(clicked()), this, SLOT(startSelected())); connect(btnStart, SIGNAL(clicked()), this, SLOT(startSelected())); } @@ -140,79 +175,130 @@ m_info = new QSettings(infoFile, QSettings::IniFormat, this); m_info->setIniCodec("UTF-8"); - - QStringList missionList = dataMgr.entryList( - "Missions/Training", - QDir::Files, QStringList("*.lua")). - replaceInStrings(QRegExp("\\.lua$"), ""); - - // scripts to lost - TODO: model? - foreach (const QString & mission, missionList) - { - QListWidgetItem * item = new QListWidgetItem(mission); + QStringList m_list; + QListWidget * m_widget; + QString subFolder; - // fallback name: replace underscores in mission name with spaces - QString name = item->text().replace("_", " "); - - // see if we can get a prettier/translated name - name = m_info->value(mission + ".name", name).toString(); + for(int i=1; i<=3; i++) { + switch(i) { + case 1: + subFolder = "Training"; + m_widget = lstTrainings; + break; + case 2: + subFolder = "Challenge"; + m_widget = lstChallenges; + break; + case 3: + subFolder = "Scenario"; + m_widget = lstScenarios; + break; + } + m_list = dataMgr.entryList( + "Missions/" + subFolder, + QDir::Files, QStringList("*.lua")). + replaceInStrings(QRegExp("\\.lua$"), ""); - item->setText(name); + // scripts to load - TODO: model? + foreach (const QString & m_id, m_list) + { + QListWidgetItem * item = new QListWidgetItem(m_id); + + // fallback name: replace underscores in mission name with spaces + QString name = item->text().replace("_", " "); - // store original name in data - item->setData(Qt::UserRole, mission); + // see if we can get a prettier/translated name + name = m_info->value(m_id + ".name", name).toString(); + + item->setText(name); - lstMissions->addItem(item); + // store original name in data + item->setData(Qt::UserRole, m_id); + + m_widget->addItem(item); + } } updateInfo(); // pre-select first mission - if (lstMissions->count() > 0) - lstMissions->setCurrentRow(0); + if (lstTrainings->count() > 0) + lstTrainings->setCurrentRow(0); + + if (lstChallenges->count() > 0) + lstChallenges->setCurrentRow(0); + + if (lstScenarios->count() > 0) + lstScenarios->setCurrentRow(0); } +QString PageTraining::getSubFolderOfSelected() +{ + QString subFolder; + if (tbw->currentWidget() == lstTrainings) { + subFolder = "Training"; + } else if (tbw->currentWidget() == lstChallenges) { + subFolder = "Challenge"; + } else if (tbw->currentWidget() == lstScenarios) { + subFolder = "Scenario"; + } else { + subFolder = "Training"; + } + return subFolder; +} void PageTraining::startSelected() { - QListWidgetItem * curItem = lstMissions->currentItem(); + QListWidget *list; + list = (QListWidget*) tbw->currentWidget(); + QListWidgetItem * curItem = list->currentItem(); if (curItem != NULL) - emit startMission(curItem->data(Qt::UserRole).toString()); + emit startMission(curItem->data(Qt::UserRole).toString(), getSubFolderOfSelected()); } void PageTraining::updateInfo() { - if (lstMissions->currentItem()) + if (tbw->currentWidget()) { - // TODO also use .pngs in userdata folder - QString thumbFile = "physfs://Graphics/Missions/Training/" + - lstMissions->currentItem()->data(Qt::UserRole).toString() + - "@2x.png"; + QString subFolder; + QListWidget *list; + subFolder = getSubFolderOfSelected(); + list = (QListWidget*) tbw->currentWidget(); + if (list->currentItem()) + { + // TODO also use .pngs in userdata folder + QString thumbFile = "physfs://Graphics/Missions/" + + subFolder + "/" + + list->currentItem()->data(Qt::UserRole).toString() + + "@2x.png"; - if (QFile::exists(thumbFile)) - btnPreview->setIcon(QIcon(thumbFile)); - else - btnPreview->setIcon(QIcon(":/res/Trainings.png")); - - QString realName = lstMissions->currentItem()->data( - Qt::UserRole).toString(); + if (QFile::exists(thumbFile)) + btnPreview->setIcon(QIcon(thumbFile)); + else + btnPreview->setIcon(QIcon(":/res/Trainings.png")); - QString caption = m_info->value(realName + ".name", - lstMissions->currentItem()->text()).toString(); + btnPreview->setWhatsThis(tr("Start fighting")); + + QString realName = list->currentItem()->data( + Qt::UserRole).toString(); - QString description = m_info->value(realName + ".desc", - tr("No description available")).toString(); + QString caption = m_info->value(realName + ".name", + list->currentItem()->text()).toString(); + + QString description = m_info->value(realName + ".desc", + tr("No description available")).toString(); - lblCaption->setText("

" + caption +"

"); - lblDescription->setText(description); - } - else - { - btnPreview->setIcon(QIcon(":/res/Trainings.png")); - lblCaption->setText(tr("Select a mission!")); - // TODO better text and tr() - lblDescription->setText(""); + lblCaption->setText("

" + caption +"

"); + lblDescription->setText(description); + } + else + { + btnPreview->setIcon(QIcon(":/res/Trainings.png")); + lblCaption->setText(tr("Select a mission!")); + // TODO better text and tr() + lblDescription->setText(""); + } } } diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagetraining.h --- a/QTfrontend/ui/page/pagetraining.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagetraining.h Sun Dec 17 00:09:24 2017 +0100 @@ -30,7 +30,7 @@ signals: - void startMission(const QString & scriptName); + void startMission(const QString & scriptName, const QString & subFolder); protected: @@ -44,8 +44,12 @@ QPushButton * btnStart; QLabel * lblCaption; QLabel * lblDescription; - QListWidget * lstMissions; + QTabWidget * tbw; + QListWidget * lstTrainings; + QListWidget * lstChallenges; + QListWidget * lstScenarios; QSettings * m_info; + QString getSubFolderOfSelected(); private slots: diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/page/pagevideos.cpp --- a/QTfrontend/ui/page/pagevideos.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/page/pagevideos.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -77,7 +77,7 @@ QString name; QString prefix; // original filename without extension QString desc; // description (duration, resolution, etc...) - QString uploadUrl; // http://youtu.be/??????? + QString uploadUrl; // https://youtu.be/??????? HWRecorder * pRecorder; // non NULL if file is being encoded QNetworkReply * pUploading; // non NULL if file is being uploaded bool seen; // used when updating directory @@ -114,7 +114,7 @@ // list of videos { IconedGroupBox* pTableGroup = new IconedGroupBox(this); - pTableGroup->setIcon(QIcon(":/res/graphicsicon.png")); // FIXME + pTableGroup->setIcon(QIcon(":/res/Videos.png")); pTableGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); pTableGroup->setTitle(QGroupBox::tr("Videos")); @@ -151,7 +151,7 @@ // description { IconedGroupBox* pDescGroup = new IconedGroupBox(this); - pDescGroup->setIcon(QIcon(":/res/graphicsicon.png")); // FIXME + pDescGroup->setIcon(QIcon(":/res/miscicon.png")); pDescGroup->setTitle(QGroupBox::tr("Description")); QVBoxLayout* pDescLayout = new QVBoxLayout(pDescGroup); @@ -194,7 +194,7 @@ pBottomDescLayout->addWidget(btnDelete); btnToYouTube = new QPushButton(QPushButton::tr("Upload to YouTube"), pDescGroup); btnToYouTube->setEnabled(false); - btnToYouTube->setWhatsThis(QPushButton::tr("Upload this video to your Youtube account")); + btnToYouTube->setWhatsThis(QPushButton::tr("Upload this video to your YouTube account")); pBottomDescLayout->addWidget(btnToYouTube); pDescLayout->addWidget(labelThumbnail, 0); @@ -823,7 +823,7 @@ if (!videoid.isEmpty()) { - item->uploadUrl = "http://youtu.be/" + videoid; + item->uploadUrl = "https://youtu.be/" + videoid; updateDescription(); // save url in file diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/MinesTimeSpinBox.h --- a/QTfrontend/ui/widget/MinesTimeSpinBox.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/MinesTimeSpinBox.h Sun Dec 17 00:09:24 2017 +0100 @@ -44,7 +44,7 @@ protected: /** - * Returns it's value localized. + * Returns its value localized. * @param value integer value to be representing as string. * @return string representation */ diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/about.cpp --- a/QTfrontend/ui/widget/about.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/about.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -71,15 +71,18 @@ QLabel *lbl1 = new QLabel(this); lbl1->setOpenExternalLinks(true); lbl1->setText( - "" - "

Hedgewars " + *cVersionString + "

" - "

" + QLabel::tr("Revision") + " " + *cRevisionString + " (" + *cHashString + ")

" - "

https://www.hedgewars.org/

" + - QLabel::tr("This program is distributed under the %1").arg("GNU GPL v2") + + //: %1 contains Hedgewars' version number + "

"+QString(tr("Hedgewars %1")).arg(*cVersionString) + "

" + //: “Revision” stands for a revision in Mercurial, a distributed version control system. %1 is the revision, %2 is the hexadecimal hash. + "

" + QString(tr("Revision %1 (%2)")).arg(*cRevisionString, *cHashString) + "

" + //: %1 is replaced by the URL of Hedgewars. + "

" + QString(tr("Visit our homepage: %1")) + .arg("https://www.hedgewars.org/") + "

" + + //: %1 is the name of a license + tr("This program is distributed under the %1.") + .arg(""+ + //: Short for “GNU General Public License version 2” + tr("GNU GPL v2")+"") + "
" ); lbl1->setWordWrap(true); @@ -93,10 +96,12 @@ /* Library information */ - QString libinfo = ""; + //: For the version numbers of Hedgewars' software dependencies + QString libinfo = QString(tr("Dependency versions:") + QString("
")); #ifdef __GNUC__ - libinfo.append(QString("GCC %1
").arg(__VERSION__)); + libinfo.append(QString(tr("GCC: %1")).arg(__VERSION__)); + libinfo.append(QString("
")); #else libinfo.append(QString(tr("Unknown Compiler")).arg(__VERSION__) + QString("
")); #endif @@ -105,83 +110,93 @@ SDL_version sdl_version; SDL_GetVersion(&sdl_version); sdl_ver = &sdl_version; - libinfo.append(QString("SDL2 version: %1.%2.%3
") + libinfo.append(QString(tr("SDL2: %1.%2.%3")) .arg(sdl_ver->major) .arg(sdl_ver->minor) .arg(sdl_ver->patch)); + libinfo.append(QString("
")); const SDL_version *sdlmixer_ver = Mix_Linked_Version(); - libinfo.append(QString("SDL2_mixer version: %1.%2.%3
") + libinfo.append(QString(tr("SDL2_mixer: %1.%2.%3")) .arg(sdlmixer_ver->major) .arg(sdlmixer_ver->minor) .arg(sdlmixer_ver->patch)); + libinfo.append(QString("
")); // the remaining sdl modules used only in engine, so instead of needlessly linking them here // we dynamically call the function returning the linked version - void *sdlnet_handle = SDL_LoadObject(sopath("SDL_net")); + void *sdlnet_handle = SDL_LoadObject(sopath("SDL2_net")); if (sdlnet_handle != NULL) { SDL_version *(*sdlnet_ver_get)(void) = NULL; sdlnet_ver_get = (SDL_version *(*)(void)) SDL_LoadFunction(sdlnet_handle, "SDLNet_Linked_Version"); if (sdlnet_ver_get != NULL) { SDL_version *sdlnet_ver = sdlnet_ver_get(); - libinfo.append(QString("SDL_net version: %1.%2.%3
") + libinfo.append(QString(tr("SDL2_net: %1.%2.%3")) .arg(sdlnet_ver->major) .arg(sdlnet_ver->minor) .arg(sdlnet_ver->patch)); + libinfo.append(QString("
")); } SDL_UnloadObject(sdlnet_handle); } - void *sdlimage_handle = SDL_LoadObject(sopath("SDL_image")); + void *sdlimage_handle = SDL_LoadObject(sopath("SDL2_image")); if (sdlimage_handle != NULL) { SDL_version *(*sdlimage_ver_get)(void) = NULL; sdlimage_ver_get = (SDL_version *(*)(void)) SDL_LoadFunction(sdlimage_handle, "IMG_Linked_Version"); if (sdlimage_ver_get != NULL) { SDL_version *sdlimage_ver = sdlimage_ver_get(); - libinfo.append(QString("SDL_image version: %1.%2.%3
") + libinfo.append(QString(tr("SDL2_image: %1.%2.%3")) .arg(sdlimage_ver->major) .arg(sdlimage_ver->minor) .arg(sdlimage_ver->patch)); + libinfo.append(QString("
")); } - SDL_UnloadObject(sdlnet_handle); + SDL_UnloadObject(sdlimage_handle); } - void *sdlttf_handle = SDL_LoadObject(sopath("SDL_ttf")); + void *sdlttf_handle = SDL_LoadObject(sopath("SDL2_ttf")); if (sdlttf_handle != NULL) { SDL_version *(*sdlttf_ver_get)(void) = NULL; sdlttf_ver_get = (SDL_version *(*)(void)) SDL_LoadFunction(sdlttf_handle, "TTF_Linked_Version"); if (sdlttf_ver_get != NULL) { SDL_version *sdlttf_ver = sdlttf_ver_get(); - libinfo.append(QString("SDL_ttf version: %1.%2.%3
") + libinfo.append(QString(tr("SDL2_ttf: %1.%2.%3")) .arg(sdlttf_ver->major) .arg(sdlttf_ver->minor) .arg(sdlttf_ver->patch)); + libinfo.append(QString("
")); } - SDL_UnloadObject(sdlnet_handle); + SDL_UnloadObject(sdlttf_handle); } - libinfo.append(QString("Qt version: %1
").arg(QT_VERSION_STR)); + libinfo.append(QString(tr("Qt: %1")).arg(QT_VERSION_STR)); + libinfo.append(QString("
")); #ifdef VIDEOREC - libinfo.append(QString("libavcodec version: %1.%2.%3
") + libinfo.append(QString(tr("libavcodec: %1.%2.%3")) .arg(LIBAVCODEC_VERSION_MAJOR) .arg(LIBAVCODEC_VERSION_MINOR) .arg(LIBAVCODEC_VERSION_MICRO)); - libinfo.append(QString("libavformat version: %1.%2.%3
") + libinfo.append(QString("
")); + libinfo.append(QString(tr("libavformat: %1.%2.%3")) .arg(LIBAVFORMAT_VERSION_MAJOR) .arg(LIBAVFORMAT_VERSION_MINOR) .arg(LIBAVFORMAT_VERSION_MICRO)); - libinfo.append(QString("libavutil version: %1.%2.%3
") + libinfo.append(QString("
")); + libinfo.append(QString(tr("libavutil: %1.%2.%3")) .arg(LIBAVUTIL_VERSION_MAJOR) .arg(LIBAVUTIL_VERSION_MINOR) .arg(LIBAVUTIL_VERSION_MICRO)); + libinfo.append(QString("
")); #endif - libinfo.append(QString("PhysFS version: %1.%2.%3
") + libinfo.append(QString(tr("PhysFS: %1.%2.%3")) .arg(PHYSFS_VER_MAJOR) .arg(PHYSFS_VER_MINOR) .arg(PHYSFS_VER_PATCH)); + libinfo.append(QString("
")); // TODO: how to add Lua information? diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/chatwidget.cpp --- a/QTfrontend/ui/widget/chatwidget.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/chatwidget.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -270,6 +270,10 @@ acBan->setIcon(QIcon(":/res/ban.png")); acBan->setData(QVariant(true)); connect(acBan, SIGNAL(triggered(bool)), this, SLOT(onBan())); + acDelegate = new QAction(QAction::tr("Delegate room control"), chatNicks); + acDelegate->setIcon(QIcon(":/res/chat/roomadmin.png")); + acDelegate->setData(QVariant(true)); + connect(acDelegate, SIGNAL(triggered(bool)), this, SLOT(onDelegate())); acFollow = new QAction(QAction::tr("Follow"), chatNicks); acFollow->setIcon(QIcon(":/res/follow.png")); acFollow->setData(QVariant(false)); @@ -624,6 +628,14 @@ emit ban(mil[0].data().toString()); } +void HWChatWidget::onDelegate() +{ + QModelIndexList mil = chatNicks->selectionModel()->selectedRows(); + + if(mil.size()) + emit delegate(mil[0].data().toString()); +} + void HWChatWidget::onInfo() { QModelIndexList mil = chatNicks->selectionModel()->selectedRows(); @@ -732,6 +744,7 @@ { chatNicks->removeAction(acKick); //chatNicks->removeAction(acBan); + chatNicks->removeAction(acDelegate); m_isAdmin = b; @@ -739,6 +752,7 @@ { chatNicks->insertAction(0, acKick); //chatNicks->insertAction(0, acBan); + chatNicks->insertAction(acFriend, acDelegate); } } @@ -931,6 +945,7 @@ { acKick->setVisible(!isSelf && isOnline); acBan->setVisible(!isSelf); + acDelegate->setVisible(!isSelf && players->isFlagSet(m_userNick, PlayersListModel::InRoom)); } m_nicksMenu->clear(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/chatwidget.h --- a/QTfrontend/ui/widget/chatwidget.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/chatwidget.h Sun Dec 17 00:09:24 2017 +0100 @@ -128,6 +128,7 @@ void chatLine(const QString& str); void kick(const QString & str); void ban(const QString & str); + void delegate(const QString & str); void info(const QString & str); void follow(const QString &); void nickCountUpdate(int cnt); @@ -144,6 +145,7 @@ QAction * acInfo; QAction * acKick; QAction * acBan; + QAction * acDelegate; QAction * acFollow; QAction * acIgnore; QAction * acFriend; @@ -163,6 +165,7 @@ void returnPressed(); void onBan(); void onKick(); + void onDelegate(); void onInfo(); void onFollow(); void onIgnore(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/feedbackdialog.cpp --- a/QTfrontend/ui/widget/feedbackdialog.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/feedbackdialog.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -156,8 +156,9 @@ captchaLayoutWidget->setLayout(captchaLayout); feedbackLayout->addWidget(captchaLayoutWidget, 3, 1, 1, 2); - // TODO: Set green arrow icon for send button (:/res/Start.png) BtnSend = new QPushButton(tr("Send Feedback")); + BtnSend->setStyleSheet("qproperty-icon: url(:/res/Start.png);"); + feedbackLayout->addWidget(BtnSend, 3, 3); BtnSend->setFixedHeight(40); connect(BtnSend, SIGNAL(clicked()), this, SLOT(SendFeedback())); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/gamecfgwidget.cpp --- a/QTfrontend/ui/widget/gamecfgwidget.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/gamecfgwidget.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -333,6 +333,8 @@ bcfg << QString("e$mapgen %1").arg(mapgen).toUtf8(); if(!schemeData(43).isNull()) bcfg << QString("e$scriptparam %1").arg(schemeData(43).toString()).toUtf8(); + else + bcfg << QString("e$scriptparam ").toUtf8(); switch (mapgen) @@ -695,6 +697,11 @@ schemeChanged(GameSchemes->currentIndex()); } +void GameCFGWidget::resendAmmoData() +{ + ammoChanged(WeaponsName->currentIndex()); +} + void GameCFGWidget::onDrawnMapChanged(const QByteArray & data) { emit paramChanged("DRAWNMAP", QStringList(qCompress(data, 9).toBase64())); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/gamecfgwidget.h --- a/QTfrontend/ui/widget/gamecfgwidget.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/gamecfgwidget.h Sun Dec 17 00:09:24 2017 +0100 @@ -55,6 +55,7 @@ void setParam(const QString & param, const QStringList & value); void fullNetConfig(); void resendSchemeData(); + void resendAmmoData(); void setMaster(bool master); void setTabbed(bool tabbed); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/hedgehogerWidget.cpp --- a/QTfrontend/ui/widget/hedgehogerWidget.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/hedgehogerWidget.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -83,7 +83,7 @@ { Q_UNUSED(event); - if (this->width() >= 11 * numItems + 26) + if ((this->width() >= 11 * numItems + 26) || (numItems == 1)) ItemNum::paintEvent(event); else { diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/keybinder.cpp --- a/QTfrontend/ui/widget/keybinder.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/keybinder.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -60,6 +60,7 @@ { QPushButton * btnResetAll = new QPushButton(resetButtonText); catListContainer->addWidget(btnResetAll); + btnResetAll->setStyleSheet("padding: 5px 10px"); btnResetAll->setFixedHeight(40); catListContainer->setStretch(1, 0); catListContainer->setSpacing(10); @@ -241,13 +242,12 @@ { QComboBox * box = bindCellComboBoxMappings->value(item); QTableWidget * table = item->tableWidget(); - QFrame * frame = box->findChild(); + box->move( + table->horizontalHeader()->sectionSize(0), + (table->verticalHeader()->defaultSectionSize() * (item->row() + 1)) - (box->height()) + 1 + ); box->showPopup(); - frame->move( - frame->x() + table->horizontalHeader()->sectionSize(0), - frame->y() + (table->verticalHeader()->defaultSectionSize() * item->row()) - ); } // When a new row in a bind table is *selected*, this clears selection in any other table diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/mapContainer.cpp --- a/QTfrontend/ui/widget/mapContainer.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/mapContainer.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -253,7 +253,7 @@ bottomLeftLayout->addStretch(1); /* Theme chooser */ - QHBoxLayout * themeHBox = new QHBoxLayout(this); + QHBoxLayout * themeHBox = new QHBoxLayout(); btnRandTheme = new QPushButton(); btnRandTheme->setWhatsThis(tr("Randomize the theme")); @@ -262,7 +262,7 @@ btnRandTheme->setFixedHeight(30); btnRandTheme->setFixedWidth(30); connect(btnRandTheme, SIGNAL(clicked()), this, SLOT(setRandomTheme())); - m_childWidgets << btnTheme; + m_childWidgets << btnRandTheme; themeHBox->addWidget(btnRandTheme, 0); btnTheme = new QPushButton(this); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/roomnameprompt.cpp --- a/QTfrontend/ui/widget/roomnameprompt.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/roomnameprompt.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -48,7 +48,8 @@ // Input box leRoomName = new QLineEdit(this); leRoomName->setText(roomName); - leRoomName->setMaxLength(59); // It didn't like 60 :( + //leRoomName->setMaxLength(59); // It didn't like 60 :( + leRoomName->setMaxLength(40); leRoomName->setStyleSheet("QLineEdit { padding: 3px; }"); leRoomName->selectAll(); dialogLayout->addWidget(leRoomName); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/selectWeapon.cpp --- a/QTfrontend/ui/widget/selectWeapon.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/selectWeapon.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -189,11 +189,19 @@ setWeapons(*cDefaultAmmoStore); } +//Save current weapons set. void SelWeaponWidget::save() { + //The save() function is called by ANY change of the combo box. + //If an entry is deleted, this code would just re-add the deleted + //item. We use isDeleted to check if we are currently deleting to + //prevent this. + if (isDeleting) + return; // TODO make this return if success or not, so that the page can react // properly and not goBack if saving failed - if (m_name->text() == "") return; + if (m_name->text() == "") + return; QString state1; QString state2; @@ -218,12 +226,15 @@ for(int i = 0; i < cDefaultAmmos.size(); i++) { - if (cDefaultAmmos[i].first.compare(m_name->text()) == 0) + // Don't allow same name as default weapon set, even case-insensitively. + // This prevents some problems with saving/loading. + if (cDefaultAmmos[i].first.toLower().compare(m_name->text().toLower()) == 0) { // don't show warning if no change if (cDefaultAmmos[i].second.compare(stateFull) == 0) return; + m_name->setText(curWeaponsName); QMessageBox deniedMsg(this); deniedMsg.setIcon(QMessageBox::Warning); deniedMsg.setWindowTitle(QMessageBox::tr("Weapons - Warning")); @@ -240,7 +251,7 @@ wconf->remove(curWeaponsName); } wconf->setValue(m_name->text(), stateFull); - emit weaponsChanged(); + emit weaponsEdited(curWeaponsName, m_name->text(), stateFull); } int SelWeaponWidget::operator [] (unsigned int weaponIndex) const @@ -256,10 +267,11 @@ void SelWeaponWidget::deleteWeaponsName() { - if (curWeaponsName == "") return; + QString delWeaponsName = curWeaponsName; + if (delWeaponsName == "") return; for(int i = 0; i < cDefaultAmmos.size(); i++) - if (!cDefaultAmmos[i].first.compare(m_name->text())) + if (!cDefaultAmmos[i].first.compare(delWeaponsName)) { QMessageBox deniedMsg(this); deniedMsg.setIcon(QMessageBox::Warning); @@ -273,19 +285,21 @@ QMessageBox reallyDeleteMsg(this); 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(curWeaponsName)); + reallyDeleteMsg.setText(QMessageBox::tr("Do you really want to delete the weapon set '%1'?").arg(delWeaponsName)); reallyDeleteMsg.setWindowModality(Qt::WindowModal); reallyDeleteMsg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); if (reallyDeleteMsg.exec() == QMessageBox::Ok) { - wconf->remove(curWeaponsName); - emit weaponsDeleted(); + isDeleting = true; + wconf->remove(delWeaponsName); + emit weaponsDeleted(delWeaponsName); } } void SelWeaponWidget::newWeaponsName() { + save(); QString newName = tr("New"); if(wconf->contains(newName)) { @@ -294,6 +308,8 @@ while(wconf->contains(newName = tr("New (%1)").arg(i++))) ; } setWeaponsName(newName); + wconf->setValue(newName, *cEmptyAmmoStore); + emit weaponsAdded(newName, *cEmptyAmmoStore); } void SelWeaponWidget::setWeaponsName(const QString& name) @@ -312,6 +328,13 @@ } } +void SelWeaponWidget::switchWeapons(const QString& name) +{ + // Rescue old weapons set, then select new one + save(); + setWeaponsName(name); +} + QStringList SelWeaponWidget::getWeaponNames() const { return wconf->allKeys(); @@ -319,6 +342,7 @@ void SelWeaponWidget::copy() { + save(); if(wconf->contains(curWeaponsName)) { QString ammo = getWeaponsString(curWeaponsName); @@ -327,10 +351,12 @@ { //name already used -> look for an appropriate name: int i=2; - while(wconf->contains(newName = tr("Copy of %1 (%2)").arg(curWeaponsName, i++))); + while(wconf->contains(newName = tr("Copy of %1 (%2)").arg(curWeaponsName).arg(i++))); } setWeaponsName(newName); setWeapons(ammo); + wconf->setValue(newName, ammo); + emit weaponsAdded(newName, ammo); } } @@ -352,3 +378,13 @@ return sl.join(QString()); } + +void SelWeaponWidget::deletionDone() +{ + isDeleting = false; +} + +void SelWeaponWidget::init() +{ + isDeleting = false; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/selectWeapon.h --- a/QTfrontend/ui/widget/selectWeapon.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/selectWeapon.h Sun Dec 17 00:09:24 2017 +0100 @@ -52,24 +52,30 @@ SelWeaponWidget(int numItems, QWidget* parent=0); QString getWeaponsString(const QString& name) const; QStringList getWeaponNames() const; + void deletionDone(); + void init(); public slots: void setDefault(); void setWeapons(const QString& ammo); //sets the name of the current set void setWeaponsName(const QString& name); + void switchWeapons(const QString& name); void deleteWeaponsName(); void newWeaponsName(); void save(); void copy(); signals: - void weaponsChanged(); - void weaponsDeleted(); + void weaponsDeleted(QString weaponsName); + void weaponsAdded(QString weaponsName, QString ammo); + void weaponsEdited(QString oldWeaponsName, QString newWeaponsName, QString ammo); private: //the name of the current weapon set QString curWeaponsName; + //set to true while an entry is deleted. Used to avoid duplicate saving due to combobox change + bool isDeleting; QLineEdit* m_name; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/teamselect.cpp --- a/QTfrontend/ui/widget/teamselect.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/teamselect.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -43,6 +43,12 @@ blockSignals(false); connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)), this, SLOT(proxyTeamColorChanged(const HWTeam&))); + + // Hide team notice if at least two teams. + if (curPlayingTeams.size() >= 2) + { + numTeamNotice->hide(); + } } else { @@ -133,6 +139,11 @@ QObject::disconnect(framePlaying->getTeamWidget(*itPlay), SIGNAL(teamStatusChanged(HWTeam))); framePlaying->removeTeam(team); curPlayingTeams.erase(itPlay); + // Show team notice if less than two teams. + if (curPlayingTeams.size() < 2) + { + numTeamNotice->show(); + } } else { @@ -229,15 +240,17 @@ emit setEnabledGameStart(curPlayingTeams.size()>1); } -void TeamSelWidget::addScrArea(FrameTeams* pfteams, QColor color, int fixedHeight) +void TeamSelWidget::addScrArea(FrameTeams* pfteams, QColor color, int minHeight, int maxHeight, bool setFrame) { VertScrArea* area = new VertScrArea(color); area->setWidget(pfteams); - mainLayout.addWidget(area, 30); - if (fixedHeight > 0) + mainLayout.addWidget(area); + if (minHeight > 0) + area->setMinimumHeight(minHeight); + if (maxHeight > 0) + area->setMaximumHeight(maxHeight); + if (setFrame) { - area->setMinimumHeight(fixedHeight); - area->setMaximumHeight(fixedHeight); area->setStyleSheet( "FrameTeams{" "border: solid;" @@ -263,8 +276,8 @@ QPalette p; p.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); - addScrArea(framePlaying, p.color(QPalette::Window).light(105), 150); - addScrArea(frameDontPlaying, p.color(QPalette::Window).dark(105), 0); + addScrArea(framePlaying, p.color(QPalette::Window).light(105), 161, 325, true); + addScrArea(frameDontPlaying, p.color(QPalette::Window).dark(105), 80, 0, false); this->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); this->setMinimumWidth(200); @@ -292,6 +305,8 @@ foreach(HWTeam team, teamslist) addTeam(team); + numTeamNotice->show(); + repaint(); } @@ -310,6 +325,17 @@ return m_curNotPlayingTeams; } +unsigned short TeamSelWidget::getNumHedgehogs() const +{ + unsigned short numHogs = 0; + QList::const_iterator team; + for(team = curPlayingTeams.begin(); team != curPlayingTeams.end(); ++team) + { + numHogs += (*team).numHedgehogs(); + } + return numHogs; +} + void TeamSelWidget::pre_changeTeamStatus(const HWTeam & team) { //team.setColor(framePlaying->getNextColor()); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/ui/widget/teamselect.h --- a/QTfrontend/ui/widget/teamselect.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/ui/widget/teamselect.h Sun Dec 17 00:09:24 2017 +0100 @@ -47,6 +47,7 @@ bool isPlaying(const HWTeam &team) const; QList getPlayingTeams() const; QList getNotPlayingTeams() const; + unsigned short getNumHedgehogs() const; void setInteractivity(bool interactive); public slots: @@ -69,7 +70,7 @@ void proxyTeamColorChanged(const HWTeam& team); private: - void addScrArea(FrameTeams* pfteams, QColor color, int maxHeight); + void addScrArea(FrameTeams* pfteams, QColor color, int minHeight, int maxHeight, bool setFrame); FrameTeams* frameDontPlaying; FrameTeams* framePlaying; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/DataManager.cpp --- a/QTfrontend/util/DataManager.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/DataManager.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -31,6 +31,7 @@ #include "hwconsts.h" #include "HWApplication.h" #include "sdlkeys.h" +#include "physfs.h" #include "DataManager.h" @@ -61,7 +62,8 @@ QStringList DataManager::entryList( const QString & subDirectory, QDir::Filters filters, - const QStringList & nameFilters + const QStringList & nameFilters, + bool withDLC ) const { QDir tmpDir(QString("physfs://%1").arg(subDirectory)); @@ -69,9 +71,13 @@ // sort case-insensitive QMap sortedFileNames; + QString absolutePath = datadir->absolutePath().toLocal8Bit().data(); foreach ( QString fn, result) { - sortedFileNames.insert(fn.toLower(), fn); + // Filter out DLC entries if desired + QString realDir = PHYSFS_getRealDir(QString(subDirectory + "/" + fn).toLocal8Bit().data()); + if(withDLC || realDir == absolutePath) + sortedFileNames.insert(fn.toLower(), fn); } result = sortedFileNames.values(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/DataManager.h --- a/QTfrontend/util/DataManager.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/DataManager.h Sun Dec 17 00:09:24 2017 +0100 @@ -37,7 +37,7 @@ /** * @brief Offers access to the data files of hedgewars. * - * @see singleton pattern + * @see singleton pattern * * @author sheepluva * @since 0.9.17 @@ -50,7 +50,7 @@ /** * @brief Returns reference to the singleton instance of this class. * - * @see singleton pattern + * @see singleton pattern * * @return reference to the instance. */ @@ -66,7 +66,8 @@ */ QStringList entryList(const QString & subDirectory, QDir::Filters filters = QDir::NoFilter, - const QStringList & nameFilters = QStringList("*") + const QStringList & nameFilters = QStringList("*"), + bool withDLC = true ) const; /** @@ -141,7 +142,7 @@ * Not to be used from outside the class, * use the static {@link DataManager::instance()} instead. * - * @see singleton pattern + * @see singleton pattern */ DataManager(); diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/FileEngine.cpp --- a/QTfrontend/util/FileEngine.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/FileEngine.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -295,7 +295,11 @@ QString FileEngine::errorString() const { +#if PHYSFS_VER_MAJOR >= 3 + return PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode()); +#else return PHYSFS_getLastError(); +#endif } bool FileEngine::supportsExtension(Extension extension) const @@ -352,7 +356,12 @@ QString FileEngineHandler::errorStr() { - QString s = QString::fromUtf8(PHYSFS_getLastError()); + QString s; +#if PHYSFS_VER_MAJOR >= 3 + s = QString::fromUtf8(PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode())); +#else + s = QString::fromUtf8(PHYSFS_getLastError()); +#endif return s.isEmpty() ? "ok" : s; } diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/LibavInteraction.cpp --- a/QTfrontend/util/LibavInteraction.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/LibavInteraction.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -18,7 +18,7 @@ #include "LibavInteraction.h" -#if VIDEOREC +#ifdef VIDEOREC extern "C" { #include "libavcodec/avcodec.h" @@ -291,7 +291,8 @@ return ""; int s = float(pContext->duration)/AV_TIME_BASE; - QString desc = tr("Duration: %1m %2s").arg(s/60).arg(s%60) + "\n"; + //: Duration in minutes and seconds (SI units) + QString desc = tr("Duration: %1min %2s").arg(s/60).arg(s%60) + "\n"; for (int i = 0; i < (int)pContext->nb_streams; i++) { AVStream* pStream = pContext->streams[i]; @@ -307,7 +308,7 @@ if (pStream->avg_frame_rate.den) { float fps = float(pStream->avg_frame_rate.num)/pStream->avg_frame_rate.den; - desc += QString(tr("%1 fps")).arg(fps, 0, 'f', 2) + ", "; + desc += QString(tr("%1 FPS")).arg(fps, 0, 'f', 2) + ", "; } } else if (pCodec->codec_type == AVMEDIA_TYPE_AUDIO) diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/LibavInteraction.h --- a/QTfrontend/util/LibavInteraction.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/LibavInteraction.h Sun Dec 17 00:09:24 2017 +0100 @@ -24,7 +24,7 @@ /** * @brief Class for interacting with ffmpeg/libav libraries * - * @see singleton pattern + * @see singleton pattern */ class LibavInteraction : public QObject { diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/SDLInteraction.h --- a/QTfrontend/util/SDLInteraction.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/SDLInteraction.h Sun Dec 17 00:09:24 2017 +0100 @@ -41,7 +41,7 @@ /** * @brief Class for interacting with SDL (used for music and keys) * - * @see singleton pattern + * @see singleton pattern */ class SDLInteraction { @@ -53,7 +53,7 @@ * Not to be used from outside the class, * use the static {@link DataManager::instance()} instead. * - * @see singleton pattern + * @see singleton pattern */ SDLInteraction(); @@ -73,7 +73,7 @@ /** * @brief Returns reference to the singleton instance of this class. * - * @see singleton pattern + * @see singleton pattern * * @return reference to the instance. */ diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/namegen.cpp --- a/QTfrontend/util/namegen.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/namegen.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -33,8 +34,34 @@ QList HWNamegen::TypesHatnames; bool HWNamegen::typesAvailable = false; +void HWNamegen::teamRandomTeamName(HWTeam & team) +{ + QString newName = getRandomTeamName(-1); + if(!newName.isNull()) + team.setName(newName); +} -void HWNamegen::teamRandomNames(HWTeam & team, const bool changeteamname) +void HWNamegen::teamRandomFlag(HWTeam & team, bool withDLC) +{ + team.setFlag(getRandomFlag(withDLC)); +} + +void HWNamegen::teamRandomVoice(HWTeam & team, bool withDLC) +{ + team.setVoicepack(getRandomVoice(withDLC)); +} + +void HWNamegen::teamRandomGrave(HWTeam & team, bool withDLC) +{ + team.setGrave(getRandomGrave(withDLC)); +} + +void HWNamegen::teamRandomFort(HWTeam & team, bool withDLC) +{ + team.setFort(getRandomFort(withDLC)); +} + +void HWNamegen::teamRandomEverything(HWTeam & team) { // load types if not already loaded if (!typesAvailable) @@ -48,34 +75,53 @@ // the hat will influence which names the hogs get int kind = (rand()%(TypesHatnames.size())); - // pick team name based on hat - if (changeteamname) - { - if (TypesTeamnames[kind].size() > 0) - team.setName(TypesTeamnames[kind][rand()%(TypesTeamnames[kind].size())]); - - team.setGrave(getRandomGrave()); - team.setFort(getRandomFort()); - team.setVoicepack("Default"); - } + team.setGrave(getRandomGrave()); + team.setFort(getRandomFort()); + team.setFlag(getRandomFlag()); + team.setVoicepack(getRandomVoice()); QStringList dicts; QStringList dict; - if ((TypesHatnames[kind].size()) <= 0) - { - dicts = dictsForHat(team.hedgehog(0).Hat); - dict = dictContents(dicts[rand()%(dicts.size())]); - } + // Randomness mode: + // 0: Themed hats (from types.ini) + // 1: Equal hats for all + // 2: Random hat for each hedgehog + int r = rand() % 10; + int randomMode; + if (r <= 4) // 0-4 (50%) + randomMode = 0; + else if (r <= 8) // 5-8 (40%) + randomMode = 1; + else // 9 (10%) + randomMode = 2; + // Generate random hats for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) { - if ((TypesHatnames[kind].size()) > 0) + HWHog hh = team.hedgehog(i); + + if (randomMode == 0) + { + hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())]; + } + else if (randomMode == 1) { - HWHog hh = team.hedgehog(i); - hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())]; - team.setHedgehog(i,hh); + if (i == 0) + { + hh.Hat = getRandomHat(); + } + else + { + hh.Hat = team.hedgehog(i-1).Hat; + } } + else if (randomMode == 2) + { + hh.Hat = getRandomHat(); + } + + team.setHedgehog(i,hh); // there is a chance that this hog has the same hat as the previous one // let's reuse the hat-specific dict in this case @@ -86,21 +132,83 @@ } // give each hedgehog a random name - HWNamegen::teamRandomName(team,i,dict); + HWNamegen::teamRandomHogName(team,i,dict); } + // If using themed hats, use themed team name. + // Otherwise, only use “generic” team names from the first team + // in types.txt. + if (randomMode == 0) + team.setName(getRandomTeamName(kind)); + else + team.setName(getRandomTeamName(0)); + } -void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber) +// Set random hats for entire team +void HWNamegen::teamRandomHats(HWTeam & team, bool withDLC) +{ + // 50% chance that all hogs are set to the same hat. + // 50% chance that each hog gets a random head individually. + + bool sameHogs = (rand()%2) == 0; + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) + { + HWHog hh = team.hedgehog(i); + if (sameHogs and i > 0) + hh.Hat = team.hedgehog(i-1).Hat; + else + hh.Hat = getRandomHat(withDLC); + team.setHedgehog(i, hh); + } +} + +void HWNamegen::teamRandomHat(HWTeam & team, const int HedgehogNumber, bool withDLC) +{ + HWHog hh = team.hedgehog(HedgehogNumber); + + hh.Hat = getRandomHat(withDLC); + + team.setHedgehog(HedgehogNumber, hh); +} + +void HWNamegen::teamRandomHat(HWTeam & team, const int HedgehogNumber, const QStringList & dict) +{ + HWHog hh = team.hedgehog(HedgehogNumber); + + hh.Name = dict[rand()%(dict.size())]; + + team.setHedgehog(HedgehogNumber, hh); +} + +void HWNamegen::teamRandomHogNames(HWTeam & team) +{ + QStringList dicts, dict; + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) + { + // there is a chance that this hog has the same hat as the previous one + // let's reuse the hat-specific dict in this case + if ((i == 0) || (team.hedgehog(i).Hat != team.hedgehog(i-1).Hat)) + { + dicts = dictsForHat(team.hedgehog(i).Hat); + dict = dictContents(dicts[rand()%(dicts.size())]); + } + + // give each hedgehog a random name + HWNamegen::teamRandomHogName(team,i,dict); + } +} + +void HWNamegen::teamRandomHogName(HWTeam & team, const int HedgehogNumber) { QStringList dicts = dictsForHat(team.hedgehog(HedgehogNumber).Hat); QStringList dict = dictContents(dicts[rand()%(dicts.size())]); - teamRandomName(team, HedgehogNumber, dict); + teamRandomHogName(team, HedgehogNumber, dict); } -void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict) +void HWNamegen::teamRandomHogName(HWTeam & team, const int HedgehogNumber, const QStringList & dict) { QStringList namesDict = dict; @@ -151,22 +259,32 @@ { QStringList list; - // find .cfg to load the dicts from - QFile file(QString("physfs://Names/%1.cfg").arg(hatname)); + // Find and check .cfg to load the dicts from + QString path = QString("physfs://Names/%1.cfg").arg(hatname); + QFileInfo check_file(path); - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) + // Note: The .cfg file is optional; a fallback mechanism is in place (see below) + + // Check if file exists to prevent PhysFS from complaining in console so much + if (check_file.exists() && check_file.isFile()) { - QTextStream in(&file); - QString line; - do + QFile file(path); + + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - line = in.readLine(); + QTextStream in(&file); + QString line; + do + { + line = in.readLine(); - if(!line.isEmpty()) - list.append(line); - } while (!line.isNull()); + if(!line.isEmpty()) + list.append(line); + } while (!line.isNull()); + } } + // Use Data/Names/generic.cfg by default if (list.size() == 0) list.append(QString("generic")); @@ -231,9 +349,54 @@ return typesAvailable; } +/* Generates a random team name. +kind: Use to select a team name out of a group (types.ini). +Use a negative value if you don't care. +This function may return a null QString on error(this should never happen). */ +QString HWNamegen::getRandomTeamName(int kind) +{ + // load types if not already loaded + if (!typesAvailable) + if (!loadTypes()) + return QString(); // abort if loading failed + // abort if there are no hat types + if (TypesHatnames.size() <= 0) + return QString(); + + if(kind < 0) + kind = (rand()%(TypesHatnames.size())); + + if (TypesTeamnames[kind].size() > 0) + return TypesTeamnames[kind][rand()%(TypesTeamnames[kind].size())]; + else + return QString(); +} -QString HWNamegen::getRandomGrave() +QString HWNamegen::getRandomHat(bool withDLC) +{ + QStringList Hats; + + // list all available hats + Hats.append(DataManager::instance().entryList( + "Graphics/Hats", + QDir::Files, + QStringList("*.png"), + withDLC + ).replaceInStrings(QRegExp("\\.png$"), "") + ); + + if(Hats.size()==0) + { + // TODO do some serious error handling + return "Error"; + } + + // pick a random hat + return Hats[rand()%(Hats.size())]; +} + +QString HWNamegen::getRandomGrave(bool withDLC) { QStringList Graves; @@ -241,7 +404,8 @@ Graves.append(DataManager::instance().entryList( "Graphics/Graves", QDir::Files, - QStringList("*.png") + QStringList("*.png"), + withDLC ).replaceInStrings(QRegExp("\\.png$"), "") ); @@ -255,7 +419,33 @@ return Graves[rand()%(Graves.size())]; } -QString HWNamegen::getRandomFort() +QString HWNamegen::getRandomFlag(bool withDLC) +{ + QStringList Flags; + + //list all available flags + Flags.append(DataManager::instance().entryList( + "Graphics/Flags", + QDir::Files, + QStringList("*.png"), + withDLC + ).replaceInStrings(QRegExp("\\.png$"), "") + ); + //remove internal flags + Flags.removeAll("cpu"); + Flags.removeAll("cpu_plain"); + + if(Flags.size()==0) + { + // TODO do some serious error handling + return "Error"; + } + + //pick a random flag + return Flags[rand()%(Flags.size())]; +} + +QString HWNamegen::getRandomFort(bool withDLC) { QStringList Forts; @@ -263,7 +453,8 @@ Forts.append(DataManager::instance().entryList( "Forts", QDir::Files, - QStringList("*L.png") + QStringList("*L.png"), + withDLC ).replaceInStrings(QRegExp("L\\.png$"), "") ); @@ -276,3 +467,24 @@ //pick a random fort return Forts[rand()%(Forts.size())]; } + +QString HWNamegen::getRandomVoice(bool withDLC) +{ + QStringList Voices; + + //list all available voices + Voices.append(DataManager::instance().entryList( + "Sounds/voices", + QDir::Dirs | QDir::NoDotAndDotDot, + QStringList("*"), + withDLC)); + + if(Voices.size()==0) + { + // TODO do some serious error handling + return "Error"; + } + + //pick a random voice + return Voices[rand()%(Voices.size())]; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/namegen.h --- a/QTfrontend/util/namegen.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/namegen.h Sun Dec 17 00:09:24 2017 +0100 @@ -28,13 +28,27 @@ class HWNamegen { public: - - static void teamRandomName(HWTeam & team, const int HedgehogNumber); - static void teamRandomNames(HWTeam & team, const bool changeteamname); + static void teamRandomTeamName(HWTeam & team); + static void teamRandomGrave(HWTeam & team, bool withDLC = true); + static void teamRandomFort(HWTeam & team, bool withDLC = true); + static void teamRandomFlag(HWTeam & team, bool withDLC = true); + static void teamRandomVoice(HWTeam & team, bool withDLC = true); + static void teamRandomHats(HWTeam & team, bool withDLC = true); + static void teamRandomHat(HWTeam & team, const int HedgehogNumber, bool withDLC = true); + static void teamRandomHogNames(HWTeam & team); + static void teamRandomHogName(HWTeam & team, const int HedgehogNumber); + static void teamRandomEverything(HWTeam & team); private: HWNamegen(); + static QString getRandomTeamName(int kind); + static QString getRandomHat(bool withDLC = true); + static QString getRandomGrave(bool withDLC = true); + static QString getRandomFort(bool withDLC = true); + static QString getRandomFlag(bool withDLC = true); + static QString getRandomVoice(bool withDLC = true); + static QList TypesTeamnames; static QList TypesHatnames; static bool typesAvailable; @@ -43,9 +57,8 @@ static QStringList dictContents(const QString filename); static QStringList dictsForHat(const QString hatname); - static QString getRandomGrave(); - static QString getRandomFort(); - static void teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict); + static void teamRandomHat(HWTeam & team, const int HedgehogNumber, const QStringList & dict); + static void teamRandomHogName(HWTeam & team, const int HedgehogNumber, const QStringList & dict); }; diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/CocoaInitializer.h --- a/QTfrontend/util/platform/CocoaInitializer.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/platform/CocoaInitializer.h Sun Dec 17 00:09:24 2017 +0100 @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -// see original example here http://el-tramo.be/blog/mixing-cocoa-and-qt +// see original example here https://el-tramo.be/blog/mixing-cocoa-and-qt #ifndef COCOAINITIALIZER_H #define COCOAINITIALIZER_H diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/CocoaInitializer.mm --- a/QTfrontend/util/platform/CocoaInitializer.mm Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/platform/CocoaInitializer.mm Sun Dec 17 00:09:24 2017 +0100 @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -// see original example here http://el-tramo.be/blog/mixing-cocoa-and-qt +// see original example here https://el-tramo.be/blog/mixing-cocoa-and-qt #include "CocoaInitializer.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/SparkleAutoUpdater.mm --- a/QTfrontend/util/platform/SparkleAutoUpdater.mm Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/util/platform/SparkleAutoUpdater.mm Sun Dec 17 00:09:24 2017 +0100 @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -// see original example here http://el-tramo.be/blog/mixing-cocoa-and-qt +// see original example here https://el-tramo.be/blog/mixing-cocoa-and-qt #include "SparkleAutoUpdater.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/Xfire Game SDK.url --- a/QTfrontend/util/platform/Xfire Game SDK.url Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -[{000214A0-0000-0000-C000-000000000046}] -Prop3=19,2 -[InternetShortcut] -URL=http://www.xfire.com/cms/xf_game_sdk -IDList= diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/xfire.cpp --- a/QTfrontend/util/platform/xfire.cpp Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2004-2015 Andrey Korotaev - * - * 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 -#include -#include - -#include "xfire.h" -#include "xfiregameclient.h" - -#ifdef USE_XFIRE -// use_xfire: stores if xfire is loaded and functions should do something at all -bool use_xfire = false; -char *keys[XFIRE_KEY_COUNT]; -char *values[XFIRE_KEY_COUNT]; - -// xfire_init(): used to initialize all variables and set their default values -void xfire_init(void) -{ - if(use_xfire) - return; - use_xfire = XfireIsLoaded() == 1; - - if(!use_xfire) - return; - - for(int i = 0; i < XFIRE_KEY_COUNT; i++) - { - keys[i] = new char[256]; - values[i] = new char[256]; - strcpy(keys[i], ""); - strcpy(values[i], ""); - } - - strcpy(keys[XFIRE_NICKNAME], "Nickname"); - strcpy(keys[XFIRE_ROOM], "Room"); - strcpy(keys[XFIRE_SERVER], "Server"); - strcpy(keys[XFIRE_STATUS], "Status"); - xfire_update(); -} - -// xfire_free(): used to free up ressources used etc. -void xfire_free(void) -{ - if(!use_xfire) - return; - - for(int i = 0; i < XFIRE_KEY_COUNT; i++) - { - delete [] keys[i]; - delete [] values[i]; - } -} - -// xfire_setvalue(): set a specific value -void xfire_setvalue(const XFIRE_KEYS status, const char *value) -{ - if(!use_xfire || strlen(value) > 255) - return; - strcpy(values[status], value); -} - -// xfire_update(): submits current values to the xfire app -void xfire_update(void) -{ - if(!use_xfire) - return; - XfireSetCustomGameDataA(XFIRE_KEY_COUNT, (const char**)keys, (const char**)values); -} -#endif // USE_XFIRE diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/xfire.h --- a/QTfrontend/util/platform/xfire.h Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2004-2015 Andrey Korotaev - * - * 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 XFIRE_H -#define XFIRE_H - - -#ifdef USE_XFIRE -enum XFIRE_KEYS -{ - XFIRE_STATUS = 0, - XFIRE_NICKNAME, - XFIRE_SERVER, - XFIRE_ROOM, - XFIRE_KEY_COUNT, -}; - -void xfire_init(void); -void xfire_free(void); -void xfire_setvalue(const XFIRE_KEYS status, const char *value); -void xfire_update(void); -#endif - -#endif // XFIRE_H diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/xfire_license.txt --- a/QTfrontend/util/platform/xfire_license.txt Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -Terms and Conditions -AGREEMENT BETWEEN USER AND XFIRE INC. -This is a legal agreement between you and Xfire Inc. ("Xfire") with respect to your access and use of the Xfire Service, which may also include Xfire software, content and related documentation and information (collectively, the "Service"). You must accept without modification all of the terms, conditions, and notices contained in these Terms of Use in order to access and/or use the Service (collectively, the "Terms of Use" or "Agreement"). If you do not accept these Terms of Use in their entirety, you may not access or use the Service. - -Portions of the Service may be governed by posted guidelines, rules, or other terms and conditions. All such guidelines, rules, terms and conditions are hereby incorporated by reference into these Terms of Use. In the event of a conflict between such other guidelines, rules, terms and conditions and these Terms of Use, the Terms of Use shall control, except that the Xfire Service Privacy Policy, referenced below, supersedes any conflicting language in these Terms of Use and/or any other guidelines, rules, terms and conditions published in connection with the Service with respect to the subject matter covered by such privacy policy. - -MODIFICATION OF THESE TERMS OF USE; UPDATES -Xfire may change the Terms of Use at any time and such changes shall be effective immediately. You are responsible for regularly reviewing the Terms of Use. The most recent version of the Terms of Use can be found at http://www.xfire.com/xf/terms.php. Your continued use of the Service affirms your agreement to the Terms of Use and any changes. - -Xfire is not obligated to provide updates or improvements to the Service. However, if Xfire, in its sole discretion, updates or improves the Service, these Terms of Use shall apply to such updates and improvements unless expressly noted otherwise. - -CLIENT SOFTWARE USE LIMITATION -YOU MAY ONLY USE XFIRE CLIENT SOFTWARE OR AUTHORIZED THIRD-PARTY SOFTWARE TO ACCESS AND/OR USE THE SERVICE. You may not use any software or services in conjunction with the Xfire software or authorized third-party software which modifies or reroutes, or attempts to modify or reroute, the Service. You may not authorize any third party to access and/or use the Service on your behalf using any automated process such as a BOT, a spider or periodic caching of information stored by the Xfire Service on your behalf without a separate written agreement with Xfire. You may not use any software or hardware that reduces the number of users directly accessing or using the Service (sometimes called 'multiplexing' or 'pooling' software or hardware). - -You may not modify, copy, distribute, transmit, display, perform, reproduce, publish, license, create derivative works from, transfer, or sell any information, software, products or services that are part of the Service except as expressly provided in these Terms of Use. - -NO UNLAWFUL OR PROHIBITED USE; RESPONSIBILITY FOR YOUR ACCOUNT -As a condition of your use of the Service, you will not use the Service for any purpose that is unlawful or prohibited by these Terms of Use. You may not use the Service in any manner that could damage, disable, overburden, or impair the Service or interfere with any other party's use and enjoyment of it. You may not attempt to gain unauthorized access to any account, computer systems or networks associated with the Service or to otherwise interfere with or disrupt any accounts, computer systems or networks connected to the Service. You may not obtain or attempt to obtain any materials or information through any means not intentionally made available or provided for through the Service. You may not use access to the Service to obtain information necessary for you to design, develop or update unauthorized software that you use or provide to others to use to access the Service. You may not charge others to use the Service either directly or indirectly without the express written agreement of Xfire. -Subject to these Terms of Use, you may use the Service within your commercial organization, but you may not use the Service to advertise or offer to buy or sell any goods or services, or to run a business or commercial entity without the express written agreement of Xfire. -You agree to use the Service only to send, receive, and transfer appropriate messages and material. By way of example, and not as a limitation, you agree that when using the Service, you will not: - - - Use the Service in connection with surveys, contests, pyramid schemes, chain letters, junk email, spamming or any duplicative, bulk or unsolicited messages (commercial or otherwise). - - Defame, abuse, harass, stalk, threaten or otherwise violate the legal rights (such as rights of privacy and publicity) of others. - - Create a false identity for the purpose of misleading others. - - Publish, transfer, distribute or disseminate any inappropriate, profane, defamatory, obscene, indecent or unlawful topic, name, material or information. - - Transfer, stream, or otherwise make available, files or other material that contain images, photographs, software or other material protected by intellectual property laws, including, by way of example, and not as limitation, copyright or trademark laws (or by rights of privacy or publicity) unless you own or control the rights thereto or have received all necessary consents to do the same. - - Use any material or information, including images or photographs, which is made available through the Service in any manner that infringes any copyright, trademark, patent, trade secret, or other proprietary right of any party. - - Transfer, stream or otherwise make available, files or other material that contain viruses, Trojan horses, worms, time bombs, cancelbots, corrupted files, or any other similar software or programs that may damage the operation of another's computer or property of another. - - Download any file or other material transferred by another user of the Service that you know, or reasonably should know, cannot be legally distributed in such manner. - - Use, download or otherwise copy, or provide (whether or not for a fee) to a person or entity any directory of users of the Service or other user or usage information or any portion thereof. - - Falsify or delete any author attributions, legal or other proper notices or proprietary designations or labels of the origin or source of software or other material contained in a file that is transferred. - - Violate any code of conduct or other guidelines which may be applicable to the Service. - - Use any portion of the Service to harvest or otherwise collect information about others, including e-mail addresses. - -Xfire reserves the right at all times to monitor communications on the Service and disclose any information Xfire deems necessary to (i) ensure your compliance with this Agreement; (ii) satisfy any applicable law, regulation or legal process; or (iii) protect the rights, property, and interests of Xfire, its employees or the public. Xfire also reserves the right to edit, refuse to transfer or to remove any information or materials, in whole or in part, in Xfire's sole discretion. - -Always use caution when giving out any personally identifiable information about yourself or your children in the Service. Xfire does not control or endorse the content, messages or information exchanged by means of the Service and, therefore, Xfire specifically disclaims any liability with regard to the Service and any actions resulting from your participation in the Service. - -You are responsible for all activities that occur in your Service account. You agree to notify Xfire immediately of any unauthorized use of your account or breach in security known to you related to the Service. - - -PRIVACY -See the Xfire Service Privacy Statement at http://www.xfire.com/xf/privacy.php for disclosures relating to the collection and use of your information. - - -INTERACTION WITH THIRD PARTY SITES AND SERVICES -The Service may allow you to interact with third-party Web sites and Web services ("Link(s)"). The Links are not under the control of Xfire and Xfire is not responsible for the contents of any Links, including without limitation any link contained in a Link, or any changes or updates to a Link. Xfire is not responsible for any form of transmission received from any Link, nor is Xfire responsible if the Link is not working appropriately. Xfire is providing these Links to you only as a convenience, and the inclusion of any Link does not imply endorsement by Xfire of the Link or any association with its operators. You are responsible for viewing and abiding by any privacy statements and terms of use posted in connection with the Links. - -You are solely responsible for any dealings with third parties (including advertisers) who support the Service, including the delivery of and payment for goods and services. - -TERMS OF USE FOR SERVICE-ENABLED PROPERTIES -For the terms and conditions governing your use of any Xfire or authorized third party Web site or service that enables you to use the Service other than the Service itself ("Service-Enabled Properties"), please refer to the applicable Terms of Use for such Service-Enabled Properties. - -SOFTWARE AND CONTENT AVAILABLE ON THE SERVICE -All Xfire content and software (if any) that is made available to view and/or download in connection with the Service ("Software") is owned by and is the copyrighted work of Xfire and/or its suppliers and is licensed, not sold. Your use of the Software is governed by the terms of the license agreement, if any, which accompanies or is included with the Software ("License Agreement"). You may not install or use any Software that is accompanied by or includes a License Agreement unless you first agree to the License Agreement terms. For any Software not accompanied by a license agreement, Xfire hereby grants to you, the user, a non-exclusive, revocable, personal, non-transferable license to use the Software solely in connection with the Service in accordance with these Terms of Use. You may not lend, lease, rent or sublicense the Software or any aspect of the Service. - -You will not disassemble, decompile, or reverse engineer the Software. All Software is protected by copyright laws and international treaty provisions. Any unauthorized reproduction or redistribution of the Software is expressly prohibited by law, and may result in severe civil and criminal penalties. WITHOUT LIMITING THE FOREGOING, COPYING OR REPRODUCTION OF THE SOFTWARE TO ANY OTHER SERVER OR LOCATION FOR FURTHER REPRODUCTION OR REDISTRIBUTION IS EXPRESSLY PROHIBITED. THE SOFTWARE IS WARRANTED, IF AT ALL, ONLY ACCORDING TO THE TERMS OF THE LICENSE AGREEMENT. You acknowledge that the Software, and any accompanying documentation and/or technical information, is subject to applicable export control laws and regulations of the U.S.A. You agree not to export or re-export the Software, directly or indirectly, to any countries that are subject to U.S.A. export restrictions. - -Your license to use the Software with the Service terminates when you terminate your use of the Service. Your license to use the Software with the Service may also terminate if Xfire, in its sole discretion, modifies the Service to no longer support such Software. - -NO WARRANTIES; LIABILITY DISCLAIMER; EXCLUSIVE REMEDY -XFIRE PROVIDES THE SERVICE AND THE SOFTWARE "AS IS," "WITH ALL FAULTS" AND "AS AVAILABLE," AND THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH YOU. XFIRE, ITS AFFILIATES, ITS RESELLERS, DISTRIBUTORS, SERVICE PROVIDERS AND/OR SUPPLIERS (COLLECTIVELY, THE "XFIRE PARTIES") MAKE NO WARRANTIES. THE XFIRE PARTIES DISCLAIM ANY AND ALL WARRANTIES, EXPRESS, STATUTORY AND IMPLIED, INCLUDING WITHOUT LIMITATION (1) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, WORKMANLIKE EFFORT, ACCURACY, TITLE, QUIET ENJOYMENT, NO ENCUMBRANCES, NO LIENS AND NON-INFRINGEMENT, (2) WARRANTIES ARISING THROUGH COURSE OF DEALING OR USAGE OF TRADE, AND (3) WARRANTIES THAT ACCESS TO OR USE OF THE SERVICE WILL BE UNINTERRUPTED OR ERROR-FREE. THERE ARE NO WARRANTIES THAT EXTEND BEYOND THE FACE OF THIS AGREEMENT. XFIRE MAY CHANGE THE SERVICE OR THE FEATURES IN ANY WAY, AND AT ANY TIME AND FOR ANY REASON. - -IN NO EVENT SHALL ANY OF THE XFIRE PARTIES BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, SPECIAL, INCIDENTAL, OR PUNITIVE DAMAGES ARISING OUT OF, BASED ON, OR RESULTING FROM THIS AGREEMENT OR YOUR USE OF THE SERVICE, INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF USE, DATA OR PROFITS, WITH THE DELAY OR INABILITY TO USE THE SERVICE, THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, OR FOR ANY INFORMATION, SOFTWARE, PRODUCTS, OR SERVICES OBTAINED THROUGH THE SERVICE, OR OTHERWISE ARISING OUT OF THE USE OF THE SERVICE, WHETHER BASED ON CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY OR OTHERWISE, EVEN IF XFIREOR ANY OF ITS SUPPLIERS HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES. BECAUSE SOME STATES/JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU. - -IF YOU ARE DISSATISFIED WITH ANY PORTION OF THE SERVICE, OR WITH ANY OF THESE TERMS OF USE, YOUR SOLE AND EXCLUSIVE REMEDY IS TO DISCONTINUE USING THE SERVICE. - -INDEMNITY -You agree to indemnify and hold Xfire, its officers, and employees, harmless from any claim or demand, including reasonable attorneys' fees, made by any third party due to or arising out of your use of the Services, the violation of these Terms of Use by you, or the infringement by you, or other user of the Services using your computer or identity, of any intellectual property or other right of any person or entity. - -CUSTOMER SUPPORT -Xfire may, but is not required to, provide you with customer support ("Support"). Unless you have entered into a separate written support agreement with Xfire with respect to the Service, Xfire may terminate any Support it provides at any time in its sole discretion. - -Authorized third-party software that uses the Service is not supported by Xfire and you should contact the provider of such software for support, if any. - -TERMINATION/ACCESS RESTRICTION -Unless you, or a third party on your behalf, have entered into a separate written agreement with Xfire that modifies these Terms of Use, Xfire reserves the right, in its sole discretion, to terminate your access to and use of the Service or any portion thereof at any time, without notice. Also, unless you or a third party on your behalf have entered into a separate agreement with Xfire, Xfire may terminate or suspend your access to the Service for inactivity, which is defined as failing to log onto the Service for an extended period of time, as determined by Xfire. -ELECTRONIC NOTICES -You consent to Xfire providing you any information regarding the Service in electronic form. Xfire may provide such information to you via e-mail at the e-mail address you specified when you registered for the Service, by instant message to your account, or by access to a Xfire web site. As long as you access and use the Service, you will have the necessary software and hardware to receive such notices. If you do not consent to receive any notices electronically, you must discontinue your use of the Service. - -GENERAL -If you reside in the United States, claims for enforcement, breach or violation of duties or rights under these Terms of Use are governed by the laws of the State of California, without reference to conflict of laws principles. All other claims, including, without limitation, claims under or for violation of state consumer protection laws, unfair competition laws, and in tort, are governed by the laws of your state of residence in the United States. If you reside outside of the United States, these Terms of Use are governed by the laws of the State of California, without reference to conflict of laws principles. You hereby irrevocably consent to the exclusive jurisdiction and venue of courts in San Mateo County, California, U.S.A. in all disputes arising out of or relating to the use of the Service. - -YOU AND XFIRE AGREE THAT ANY CAUSE OF ACTION ARISING OUT OF OR RELATED TO THE SERVICE MUST COMMENCE WITHIN ONE (1) YEAR AFTER THE CAUSE OF ACTION ACCRUES. OTHERWISE, SUCH CAUSE OF ACTION IS PERMANENTLY BARRED. - -Xfire may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in any Web pages that are part of the Service. Except as expressly provided in these Terms of Use, the furnishing of such Web pages to you does not give you any license to these patents, trademarks, copyrights, or other intellectual property. Any rights not expressly granted herein are reserved. - -June 2004 - - - diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/xfiregameclient.cpp --- a/QTfrontend/util/platform/xfiregameclient.cpp Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ -/* This file is NOT open source. See "license.txt" to read the full license provided with the Xfire SDK. */ - -#define WIN32_LEAN_AND_MEAN -#include -#include - -#include "xfiregameclient.h" - -static HMODULE g_toucan_dll = NULL; -static void HelperInit(); -static HMODULE HelperGetToucanDLL(); - -typedef int (*XfireSetCustomGameDataAFunction)(int , const char **, const char **); -typedef int (*XfireSetCustomGameDataWFunction)(int , const wchar_t **, const wchar_t **); -typedef int (*XfireSetCustomGameDataUTF8Function)(int , const char **, const char **); - -static XfireSetCustomGameDataAFunction ptr_XfireSetCustomGameDataA = NULL; -static XfireSetCustomGameDataWFunction ptr_XfireSetCustomGameDataW = NULL; -static XfireSetCustomGameDataUTF8Function ptr_XfireSetCustomGameDataUTF8 = NULL; - -/* make sure we are going to call the ANSI version */ -#ifdef MODULEENTRY32 -#undef MODULEENTRY32 -#endif - -#ifdef Module32First -#undef Module32First -#endif - -#ifdef Module32Next -#undef Module32Next -#endif - - -int XfireIsLoaded() -{ - HelperInit(); - if (ptr_XfireSetCustomGameDataA && - ptr_XfireSetCustomGameDataW && - ptr_XfireSetCustomGameDataUTF8) - return 1; - return 0; -} - -int XfireSetCustomGameDataA(int num_keys, const char **keys, const char **values) -{ - HelperInit(); - if (ptr_XfireSetCustomGameDataA) - return ptr_XfireSetCustomGameDataA(num_keys, keys, values); - return 1; -} - -int XfireSetCustomGameDataW(int num_keys, const wchar_t **keys, const wchar_t **values) -{ - HelperInit(); - if (ptr_XfireSetCustomGameDataW) - return ptr_XfireSetCustomGameDataW(num_keys, keys, values); - return 1; -} - -int XfireSetCustomGameDataUTF8(int num_keys, const char **keys, const char **values) -{ - HelperInit(); - if (ptr_XfireSetCustomGameDataUTF8) - return ptr_XfireSetCustomGameDataUTF8(num_keys, keys, values); - return 1; -} - -/* ------------------------------------------------------------------------- */ -static void HelperInit() -{ - if (!ptr_XfireSetCustomGameDataA || - !ptr_XfireSetCustomGameDataW || - !ptr_XfireSetCustomGameDataUTF8) - { - HMODULE toucan_dll = HelperGetToucanDLL(); - if (toucan_dll) - { - ptr_XfireSetCustomGameDataA = (XfireSetCustomGameDataAFunction)::GetProcAddress(toucan_dll, "ToucanSendGameClientDataA_V1"); - ptr_XfireSetCustomGameDataW = (XfireSetCustomGameDataWFunction)::GetProcAddress(toucan_dll, "ToucanSendGameClientDataW_V1"); - ptr_XfireSetCustomGameDataUTF8 = (XfireSetCustomGameDataUTF8Function)::GetProcAddress(toucan_dll, "ToucanSendGameClientDataUTF8_V1"); - } - } -} - - -static HMODULE HelperGetToucanDLL() -{ - if (g_toucan_dll) - return g_toucan_dll; - - /* - ** We need to enumerate the DLLs loaded to find toucan dll. - ** This is done because the toucan dll changes with each update. - ** The toucan dll has the following format. "xfire_toucan_{BUILD_NUMBER}.dll" - ** We simply try to find a dll w/ the prefix "xfire_toucan" - */ - HANDLE snapshot_handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId()); - if (snapshot_handle != INVALID_HANDLE_VALUE) - { - MODULEENTRY32 module_entry; - module_entry.dwSize = sizeof(MODULEENTRY32); - - BOOL result = Module32First(snapshot_handle, &module_entry); - char module_name[] = "xfire_toucan"; - DWORD module_name_len = sizeof(module_name)-1; - while (result) - { - if (CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, module_entry.szModule, module_name_len, module_name, module_name_len) == CSTR_EQUAL) - { - g_toucan_dll = module_entry.hModule; - break; - } - result = Module32Next(snapshot_handle, &module_entry); - } - - CloseHandle(snapshot_handle); - } - - return g_toucan_dll; -} diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/util/platform/xfiregameclient.h --- a/QTfrontend/util/platform/xfiregameclient.h Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/* This file is NOT open source. See "license.txt" to read the full license provided with the Xfire SDK. */ - -#ifndef __XFIREGAMECLIENT_H__ -#define __XFIREGAMECLIENT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** XfireIsLoaded() -** -** returns 1 if application can talk to Xfire, 0 otherwise -*/ -int XfireIsLoaded(); - -/* -** XfireSetCustomGameDataA() -** -** ANSI version to tell xfire of custom game data -*/ -int XfireSetCustomGameDataA(int num_keys, const char **keys, const char **values); - -/* -** XfireSetCustomGameDataA() -** -** UNICODE version to tell xfire of custom game data -*/ -int XfireSetCustomGameDataW(int num_keys, const wchar_t **keys, const wchar_t **values); - -/* -** XfireSetCustomGameDataUTF8() -** -** UTF8 version to tell xfire of custom game data -*/ -int XfireSetCustomGameDataUTF8(int num_keys, const char **keys, const char **values); - -#ifdef UNICODE -#define XfireSetCustomGameData XfireSetCustomGameDataW -#else -#define XfireSetCustomGameData XfireSetCustomGameDataA -#endif - - -#ifdef __cplusplus -} -#endif - -#endif /* __XFIREGAMECLIENT_H__ */ diff -r 01f88c3b7b66 -r 1b2b84315d27 QTfrontend/weapons.h --- a/QTfrontend/weapons.h Thu Aug 11 23:05:14 2016 +0300 +++ b/QTfrontend/weapons.h Sun Dec 17 00:09:24 2017 +0100 @@ -16,10 +16,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#define AMMOLINE_EMPTY_QT "000000900000000000000000000000000000000000000000000000000" -#define AMMOLINE_EMPTY_PROB "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_EMPTY_DELAY "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_EMPTY_CRATE "131111031211111112311411111111111111121111111111111111111" +#define AMMOLINE_EMPTY_QT "0000009000000000000000000000000000000000000000000000000000" +#define AMMOLINE_EMPTY_PROB "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_EMPTY_DELAY "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_EMPTY_CRATE "1311110312111111123114111111111111111211111111111111111111" /* AmmoType lookup table (use monospace font / cursor movements) @@ -81,63 +81,64 @@ amKnife-------------------------------------------------------------------------------| amRubber-------------------------------------------------------------------------------| amAirMine-------------------------------------------------------------------------------| + amDuck-----------------------------------------------------------------------------------| */ -#define AMMOLINE_DEFAULT_QT "939192942219912103223511100120000000021110010101111100010" -#define AMMOLINE_DEFAULT_PROB "040504054160065554655446477657666666615551010111541111111" -#define AMMOLINE_DEFAULT_DELAY "000000000000020550000004000700400000000022000000060002000" -#define AMMOLINE_DEFAULT_CRATE "131111031211111112311411111111111111121111110111111111111" +#define AMMOLINE_DEFAULT_QT "9391929422199121032235111001200000000211100101011111000102" +#define AMMOLINE_DEFAULT_PROB "0405040541600655546554464776576666666155510101115411111114" +#define AMMOLINE_DEFAULT_DELAY "0000000000000205500000040007004000000000220000000600020000" +#define AMMOLINE_DEFAULT_CRATE "1311110312111111123114111111111111111211111111111111111111" -#define AMMOLINE_CRAZY_QT "999999999999999999299999999999999929999999990999999299919" -#define AMMOLINE_CRAZY_PROB "111111011111111111111111111111111111111111110111111111111" -#define AMMOLINE_CRAZY_DELAY "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_CRAZY_CRATE "131111031211111112311411111111111111121111010111111111111" +#define AMMOLINE_CRAZY_QT "9999999999999999992999999999999999299999999999999992999199" +#define AMMOLINE_CRAZY_PROB "1111110111111111111111111111111111111111111111111111111111" +#define AMMOLINE_CRAZY_DELAY "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_CRAZY_CRATE "1311110312111111123114111111111111111211111111111111111111" -#define AMMOLINE_PROMODE_QT "909000900000000000000900000000000000000000000000000000000" -#define AMMOLINE_PROMODE_PROB "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_PROMODE_DELAY "000000000000020550000004000700400000000020000000000002000" -#define AMMOLINE_PROMODE_CRATE "111111011111111111111111111111111111111110010111111111111" +#define AMMOLINE_PROMODE_QT "9090009000000000000009000000000000000000000000000000000000" +#define AMMOLINE_PROMODE_PROB "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_PROMODE_DELAY "0000000000000205500000040007004000000000200000000000020000" +#define AMMOLINE_PROMODE_CRATE "1111110111111111111111111111111111111111111111111111111111" -#define AMMOLINE_SHOPPA_QT "000000990000000000000000000000000000000000000000000000000" -#define AMMOLINE_SHOPPA_PROB "444441004424440221011212122242200000000200040001001100101" -#define AMMOLINE_SHOPPA_DELAY "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_SHOPPA_CRATE "111111011111111111111111111111111111111110110111111111101" +#define AMMOLINE_SHOPPA_QT "0000009900000000000000000000000000000000000000000000000000" +#define AMMOLINE_SHOPPA_PROB "4444410044244402210112121222422000000002000400010011001011" +#define AMMOLINE_SHOPPA_DELAY "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_SHOPPA_CRATE "1111110111111111111111111111111111111111111111111111111111" -#define AMMOLINE_CLEAN_QT "101000900001000001100000000000000000000000000000100000000" -#define AMMOLINE_CLEAN_PROB "040504054160065554655446477657666666615551010111541112111" -#define AMMOLINE_CLEAN_DELAY "000000000000000000000000000000000000000000000000000002000" -#define AMMOLINE_CLEAN_CRATE "131111031211111112311411111111111111121111110111111111111" +#define AMMOLINE_CLEAN_QT "1010009000010000011000000000000000000000000000001000000000" +#define AMMOLINE_CLEAN_PROB "0405040541600655546554464776576666666155510101115411121114" +#define AMMOLINE_CLEAN_DELAY "0000000000000000000000000000000000000000000000000000020000" +#define AMMOLINE_CLEAN_CRATE "1311110312111111123114111111111111111211111111111111111111" -#define AMMOLINE_MINES_QT "000000990009000000030000000000000000000000000000000000000" -#define AMMOLINE_MINES_PROB "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_MINES_DELAY "000000000000020550000004000700400000000020000000060002000" -#define AMMOLINE_MINES_CRATE "111111011111111111111111111111111111111111110111111111111" +#define AMMOLINE_MINES_QT "0000009900090000000300000000000000000000000000000000000000" +#define AMMOLINE_MINES_PROB "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_MINES_DELAY "0000000000000205500000040007004000000000200000000600020000" +#define AMMOLINE_MINES_CRATE "1111110111111111111111111111111111111111111111111111111111" -#define AMMOLINE_PORTALS_QT "900000900200000000210000000000000011000009000000000000000" -#define AMMOLINE_PORTALS_PROB "040504054160065554655446477657666666615551010111541112111" -#define AMMOLINE_PORTALS_DELAY "000000000000020550000004000700400000000020000000060002000" -#define AMMOLINE_PORTALS_CRATE "131111031211111112311411111111111111121111110111111111111" +#define AMMOLINE_PORTALS_QT "9000009002000000002100000000000000110000090000000000000000" +#define AMMOLINE_PORTALS_PROB "0405040541600655546554464776576666666155510101115411121112" +#define AMMOLINE_PORTALS_DELAY "0000000000000205500000040007004000000000200000000600020000" +#define AMMOLINE_PORTALS_CRATE "1311110312111111123114111111111111111211111111111111111111" -#define AMMOLINE_ONEEVERY_QT "111111911111111111111111111111111111111111111111111111111" -#define AMMOLINE_ONEEVERY_PROB "111111011111111111111111111111111111111111111111111111111" -#define AMMOLINE_ONEEVERY_DELAY "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_ONEEVERY_CRATE "111111011111111111111111111111111111111111111111111111111" +#define AMMOLINE_ONEEVERY_QT "1111119111111111111111111111111111111111111111111111111111" +#define AMMOLINE_ONEEVERY_PROB "1111110111111111111111111111111111111111111111111111111111" +#define AMMOLINE_ONEEVERY_DELAY "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_ONEEVERY_CRATE "1111110111111111111111111111111111111111111111111111111111" -#define AMMOLINE_HIGHLANDER_QT "111111911111111111110191111111111001011111011110110011010" -#define AMMOLINE_HIGHLANDER_PROB "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_HIGHLANDER_DELAY "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_HIGHLANDER_CRATE "000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_HIGHLANDER_QT "1111119111111111111101911111111110010111110111100100101111" +#define AMMOLINE_HIGHLANDER_PROB "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_HIGHLANDER_DELAY "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_HIGHLANDER_CRATE "0000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_CONSTRUCTION_QT "110001900000001001000000000000000000000000000000000000000" -#define AMMOLINE_CONSTRUCTION_PROB "111111011111111111111111111111111111111111111111111111110" -#define AMMOLINE_CONSTRUCTION_DELAY "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_CONSTRUCTION_CRATE "111111011111111111111111111111111111111111111111111111110" +#define AMMOLINE_CONSTRUCTION_QT "1100019000000010010000000000000000000000000000000000000000" +#define AMMOLINE_CONSTRUCTION_PROB "1111110111111111111111111111111111111111111111111111111111" +#define AMMOLINE_CONSTRUCTION_DELAY "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_CONSTRUCTION_CRATE "1111110111111111111111111111111111111111111111111111111111" -#define AMMOLINE_SHOPPAPRO_QT "000000990000000000000000000000000000000000000000000000000" -#define AMMOLINE_SHOPPAPRO_PROB "444440004404440000000000000040000000000000000000000000000" -#define AMMOLINE_SHOPPAPRO_DELAY "000000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_SHOPPAPRO_CRATE "111111011111111111111111111111111111111110110111111112110" +#define AMMOLINE_SHOPPAPRO_QT "0000009900000000000000000000000000000000000000000000000000" +#define AMMOLINE_SHOPPAPRO_PROB "4444400044044400000000000000400000000000000000000000000000" +#define AMMOLINE_SHOPPAPRO_DELAY "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_SHOPPAPRO_CRATE "1111110111111111111111111111111111111111111111111111121111" - -//When adding new weapons also insert one element in cDefaultAmmos list (hwconsts.cpp.in) - - +#define AMMOLINE_HEDGEEDITOR_QT "0000009000000000000000000000000000000000000000000000000000" +#define AMMOLINE_HEDGEEDITOR_PROB "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_HEDGEEDITOR_DELAY "0000000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_HEDGEEDITOR_CRATE "1111110111111111111111111111111111111111111111111111111111" diff -r 01f88c3b7b66 -r 1b2b84315d27 README.md --- a/README.md Thu Aug 11 23:05:14 2016 +0300 +++ b/README.md Sun Dec 17 00:09:24 2017 +0100 @@ -1,48 +1,125 @@ -Hedgewars - a turn based strategy game. -======================================= +Hedgewars - a turn-based strategy game +====================================== + +Description +----------- +This is the funniest and most addictive game you'll ever play—hilarious fun +that you can enjoy anywhere, anytime. **Hedgewars** is a **turn-based strategy +game** but the real buzz is from watching the **devastation caused by those +pesky hedgehogs** with those fantastic weapons—sneaky little blighters with a +bad attitude! + +Each player controls a **team of up to 8 hedgehogs**. During the course of +the game, players take turns with one of their hedgehogs. They then use +whatever tools and weapons are available to **attack and kill the opponents' +hedgehogs**, thereby winning the game. Hedgehogs may move around the terrain +in a variety of ways, normally by walking and jumping but also by using +particular tools such as the rope or parachute, to move to otherwise +inaccessible areas. Each **turn is time-limited** to ensure that players do +not hold up the game with excessive thinking or moving. + +A large **variety of tools and weapons** are available for players during +the game. Hedgewars features the standard artillery-genre classics (such as +grenade, cluster bomb, bazooka, shotgun), but also boasts a host of other +weapons quite unique to it alone. + +Most weapons, when used, cause **explosions that deform the terrain**, +removing circular chunks. Hedgehogs can die by drowning, being thrown off +either side of the arena, or when their health is reduced to zero. + +Getting started +--------------- +For complete beginners we recommend to start with the the first 2 or 3 +missions of the campaign “A Classic Fairytale” in the singleplayer menu. +It explains the basic controls and gameplay. + +Note that Hedgewars doesn't have a *complete* tutorial yet, but it is +planned to create one in future versions. + +In-depth information about the game can be found online: + +* : Getting Started +* : Hedgewars Wiki + +Default controls (excerpt) +-------------------------- +The most important default controls are: + +* Cursor keys: Walk and aim +* Mouse: Move camera +* Right mouse button: Open ammo menu +* Left mouse button: Select target or weapon +* Space bar: Shoot +* Left shift: Precise +* Left shift + Up/Down: Precise aiming +* Enter: Jump +* Backspace: High jump +* Backspace ×2: Backjump +* Tab: Switch hedgehog (after activating the utility) +* 1-5: Set weapon timer +* F1-F10: Weapon shortcuts +* P: Pause (also shows mission panel) +* Esc: Quit with prompt (also shows mission panel) +* T: Chat + +For the full list, go to the Hedgewars settings. Also read the weapon tooltips +for weapon-specific controls. + +### Special controls + +These are lesser-known controls of Hedgewars, they are based on your +configured controls: + +* Confirm: Team chat (if not confirming quit) +* Hold down Precise: Prevent slipping on ice +* Precise + Left/Right: Turn around +* Precise + Toggle team bars: Change hedgehog tabs +* Precise + Toggle team bars + Switch: Toggle HUD +* Precise + Screenshot: Save current map + mask in Screenshot directory + +Installation instructions +------------------------- +See the `INSTALL.md` file. + +Or see our wiki at . + +Source code +----------- +Our main repository is located at using +Mercurial as DVCS. A Git repository is also available (mirrored daily) +at . [![Build Status](https://travis-ci.org/hedgewars/hw.svg)](https://travis-ci.org/hedgewars/hw) -Copyright 2004-2015 Andrey Korotaev and others. -See QTfrontend/res/html/about.html and CREDITS for a complete list of authors. - -Licence: --------- -Source code is distributed under the terms of the GNU General Public Licence -version 2; images and sounds are distributed under the terms of the GNU Free -Documentation Licence version 1.2. See the COPYING file for the full text of -the licenses. - -Instructions: -------------- -See our wiki at: http://hedgewars.org/kb/BuildingHedgewars - -You can find an outline of the necessary dependencies in the INSTALL file. - -Source code: ------------- -Our main repository is located at http://hg.hedgewars.org/hedgewars/ using -Mercurial as DVCS. A Git repository is also available (mirrored daily) -at https://github.com/hedgewars/hw - -Contribute: ------------ +Contribute +---------- If you see a bug or have any suggestion please use the official bug tracker at -http://hedgewars.org/bugs or the integrated feedback -button. + or the integrated feedback button. If you want to help or get to know the sources better you can do that with some -easy tasks from http://hedgewars.org/kb/TODO. We also have an -extended API in LUA to customize your adventures in our wiki at -http://hedgewars.org/kb/LuaAPI. +easy tasks from . We also have an extensive API +in Lua to customize your adventures. See our wiki at +. If you know your way through the code feel free to send a patch or open a pull -request. The best LUA scripts get released in the official DLC page and later +request. The best Lua scripts get released in the official DLC page and later integrated in the next version. -Contact: --------- +Licence and credits +------------------- +This game is free software (“free” as in “freedom”). Source code is +distributed under the terms of the GNU General Public Licence version 2; +images and sounds are distributed under the terms of the GNU Free Documentation +Licence version 1.2. See the `COPYING` file for the full text of the licenses. + +Copyright 2004-2015 Andrey Korotaev and others. +See `QTfrontend/res/html/about.html` and `CREDITS` for a more complete list of +authors. + +Contact +------- +* Homepage - https://hedgewars.org/ * IRC channel - irc://irc.freenode.net/hedgewars -* community forum - http://www.hedgewars.org/forum -* mailing list - https://mail.gna.org/listinfo/hedgewars-dev +* Community forum - https://hedgewars.org/forum +* Mailing list - https://mail.gna.org/listinfo/hedgewars-dev diff -r 01f88c3b7b66 -r 1b2b84315d27 cmake_modules/CheckHaskellModuleExists.cmake --- a/cmake_modules/CheckHaskellModuleExists.cmake Thu Aug 11 23:05:14 2016 +0300 +++ b/cmake_modules/CheckHaskellModuleExists.cmake Sun Dec 17 00:09:24 2017 +0100 @@ -22,12 +22,15 @@ endforeach() endif() - set(PARAMETERS "") + #set(PARAMETERS "") execute_process(COMMAND ${GHC_EXECUTABLE} "-DMODULE=${MODULE}" "-DFUNCTION=${FUNCTION}" "-DPARAMETERS=${PARAMETERS}" + -hide-all-packages + -package ${LIBRARY} + -package base -cpp -c "${CMAKE_MODULE_PATH}/checkModule.hs" RESULT_VARIABLE COMMAND_RESULT diff -r 01f88c3b7b66 -r 1b2b84315d27 cmake_modules/FindLua.cmake --- a/cmake_modules/FindLua.cmake Thu Aug 11 23:05:14 2016 +0300 +++ b/cmake_modules/FindLua.cmake Sun Dec 17 00:09:24 2017 +0100 @@ -18,7 +18,7 @@ find_path(LUA_INCLUDE_DIR lua.h PATHS /usr/include /usr/local/include /usr/pkg/include PATH_SUFFIXES lua5.1 lua51 lua-5.1) -find_library(LUA_LIBRARY NAMES lua51 lua5.1 lua-5.1 lua +find_library(LUA_LIBRARY NAMES liblua lua51 lua5.1 lua-5.1 lua PATHS /lib /usr/lib /usr/local/lib /usr/pkg/lib) find_package_handle_standard_args(Lua DEFAULT_MSG LUA_LIBRARY LUA_INCLUDE_DIR) diff -r 01f88c3b7b66 -r 1b2b84315d27 cmake_modules/FindSDL2_image.cmake --- a/cmake_modules/FindSDL2_image.cmake Thu Aug 11 23:05:14 2016 +0300 +++ b/cmake_modules/FindSDL2_image.cmake Sun Dec 17 00:09:24 2017 +0100 @@ -55,13 +55,13 @@ PATH_SUFFIXES lib ) -if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h") - file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+[0-9]+$") - string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}") +if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}") set(SDL2_IMAGE_VERSION_STRING ${SDL2_IMAGE_VERSION_MAJOR}.${SDL2_IMAGE_VERSION_MINOR}.${SDL2_IMAGE_VERSION_PATCH}) unset(SDL2_IMAGE_VERSION_MAJOR_LINE) unset(SDL2_IMAGE_VERSION_MINOR_LINE) @@ -87,8 +87,8 @@ VERSION_VAR SDL2_IMAGE_VERSION_STRING) # for backward compatiblity -set(SDL2IMAGE_LIBRARY ${SDL2_IMAGE_LIBRARIES}) -set(SDL2IMAGE_INCLUDE_DIR ${SDL2_IMAGE_INCLUDE_DIRS}) -set(SDL2IMAGE_FOUND ${SDL2_IMAGE_FOUND}) +set(SDLIMAGE_LIBRARY ${SDL2_IMAGE_LIBRARIES}) +set(SDLIMAGE_INCLUDE_DIR ${SDL2_IMAGE_INCLUDE_DIRS}) +set(SDLIMAGE_FOUND ${SDL2_IMAGE_FOUND}) mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR) diff -r 01f88c3b7b66 -r 1b2b84315d27 cmake_modules/FindSDL2_mixer.cmake --- a/cmake_modules/FindSDL2_mixer.cmake Thu Aug 11 23:05:14 2016 +0300 +++ b/cmake_modules/FindSDL2_mixer.cmake Sun Dec 17 00:09:24 2017 +0100 @@ -33,8 +33,7 @@ # License text for the above reference.) if(NOT SDL2_MIXER_INCLUDE_DIR AND SDL2MIXER_INCLUDE_DIR) - set(SDL2_MIXER_INCLUDE_DIR ${SDL2MIXER_INCLUDE_DIR} CACHE PATH "directory cache -entry initialized from old variable name") + set(SDL2_MIXER_INCLUDE_DIR ${SDL2MIXER_INCLUDE_DIR} CACHE PATH "directory cache entry initialized from old variable name") endif() find_path(SDL2_MIXER_INCLUDE_DIR SDL_mixer.h HINTS @@ -55,13 +54,13 @@ PATH_SUFFIXES lib ) -if(SDL2_MIXER_INCLUDE_DIR AND EXISTS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h") - file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MIXER_MAJOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MIXER_MINOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_MIXER_PATCHLEVEL[ \t]+[0-9]+$") - string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MAJOR "${SDL2_MIXER_VERSION_MAJOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MINOR "${SDL2_MIXER_VERSION_MINOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_PATCH "${SDL2_MIXER_VERSION_PATCH_LINE}") +if(SDL2_MIXER_INCLUDE_DIR AND EXISTS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MAJOR "${SDL2_MIXER_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MINOR "${SDL2_MIXER_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_PATCH "${SDL2_MIXER_VERSION_PATCH_LINE}") set(SDL2_MIXER_VERSION_STRING ${SDL2_MIXER_VERSION_MAJOR}.${SDL2_MIXER_VERSION_MINOR}.${SDL2_MIXER_VERSION_PATCH}) unset(SDL2_MIXER_VERSION_MAJOR_LINE) unset(SDL2_MIXER_VERSION_MINOR_LINE) @@ -87,8 +86,8 @@ VERSION_VAR SDL2_MIXER_VERSION_STRING) # for backward compatiblity -set(SDL2MIXER_LIBRARY ${SDL2_MIXER_LIBRARIES}) -set(SDL2MIXER_INCLUDE_DIR ${SDL2_MIXER_INCLUDE_DIRS}) -set(SDL2MIXER_FOUND ${SDL2_MIXER_FOUND}) +set(SDLMIXER_LIBRARY ${SDL2_MIXER_LIBRARIES}) +set(SDLMIXER_INCLUDE_DIR ${SDL2_MIXER_INCLUDE_DIRS}) +set(SDLMIXER_FOUND ${SDL2_MIXER_FOUND}) mark_as_advanced(SDL2_MIXER_LIBRARY SDL2_MIXER_INCLUDE_DIR) diff -r 01f88c3b7b66 -r 1b2b84315d27 cmake_modules/FindSDL2_net.cmake --- a/cmake_modules/FindSDL2_net.cmake Thu Aug 11 23:05:14 2016 +0300 +++ b/cmake_modules/FindSDL2_net.cmake Sun Dec 17 00:09:24 2017 +0100 @@ -55,13 +55,13 @@ PATH_SUFFIXES lib ) -if(SDL2_NET_INCLUDE_DIR AND EXISTS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h") - file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_NET_MAJOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_NET_MINOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_NET_PATCHLEVEL[ \t]+[0-9]+$") - string(REGEX REPLACE "^#define[ \t]+SDL2_NET_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MAJOR "${SDL2_NET_VERSION_MAJOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_NET_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MINOR "${SDL2_NET_VERSION_MINOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_NET_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_PATCH "${SDL2_NET_VERSION_PATCH_LINE}") +if(SDL2_NET_INCLUDE_DIR AND EXISTS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_NET_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_NET_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL_net.h" SDL2_NET_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_NET_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MAJOR "${SDL2_NET_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MINOR "${SDL2_NET_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_NET_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_PATCH "${SDL2_NET_VERSION_PATCH_LINE}") set(SDL2_NET_VERSION_STRING ${SDL2_NET_VERSION_MAJOR}.${SDL2_NET_VERSION_MINOR}.${SDL2_NET_VERSION_PATCH}) unset(SDL2_NET_VERSION_MAJOR_LINE) unset(SDL2_NET_VERSION_MINOR_LINE) @@ -87,8 +87,8 @@ VERSION_VAR SDL2_NET_VERSION_STRING) # for backward compatiblity -set(SDL2NET_LIBRARY ${SDL2_NET_LIBRARIES}) -set(SDL2NET_INCLUDE_DIR ${SDL2_NET_INCLUDE_DIRS}) -set(SDL2NET_FOUND ${SDL2_NET_FOUND}) +set(SDLNET_LIBRARY ${SDL2_NET_LIBRARIES}) +set(SDLNET_INCLUDE_DIR ${SDL2_NET_INCLUDE_DIRS}) +set(SDLNET_FOUND ${SDL2_NET_FOUND}) mark_as_advanced(SDL2_NET_LIBRARY SDL2_NET_INCLUDE_DIR) diff -r 01f88c3b7b66 -r 1b2b84315d27 cmake_modules/FindSDL2_ttf.cmake --- a/cmake_modules/FindSDL2_ttf.cmake Thu Aug 11 23:05:14 2016 +0300 +++ b/cmake_modules/FindSDL2_ttf.cmake Sun Dec 17 00:09:24 2017 +0100 @@ -55,13 +55,13 @@ PATH_SUFFIXES lib ) -if(SDL2_TTF_INCLUDE_DIR AND EXISTS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h") - file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_TTF_MAJOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_TTF_MINOR_VERSION[ \t]+[0-9]+$") - file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_TTF_PATCHLEVEL[ \t]+[0-9]+$") - string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MAJOR "${SDL2_TTF_VERSION_MAJOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MINOR "${SDL2_TTF_VERSION_MINOR_LINE}") - string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_PATCH "${SDL2_TTF_VERSION_PATCH_LINE}") +if(SDL2_TTF_INCLUDE_DIR AND EXISTS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h") + file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_TTF_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_TTF_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_TTF_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_TTF_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MAJOR "${SDL2_TTF_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_TTF_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MINOR "${SDL2_TTF_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_TTF_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_PATCH "${SDL2_TTF_VERSION_PATCH_LINE}") set(SDL2_TTF_VERSION_STRING ${SDL2_TTF_VERSION_MAJOR}.${SDL2_TTF_VERSION_MINOR}.${SDL2_TTF_VERSION_PATCH}) unset(SDL2_TTF_VERSION_MAJOR_LINE) unset(SDL2_TTF_VERSION_MINOR_LINE) @@ -87,8 +87,8 @@ VERSION_VAR SDL2_TTF_VERSION_STRING) # for backward compatiblity -set(SDL2TTF_LIBRARY ${SDL2_TTF_LIBRARIES}) -set(SDL2TTF_INCLUDE_DIR ${SDL2_TTF_INCLUDE_DIRS}) -set(SDL2TTF_FOUND ${SDL2_TTF_FOUND}) +set(SDLTTF_LIBRARY ${SDL2_TTF_LIBRARIES}) +set(SDLTTF_INCLUDE_DIR ${SDL2_TTF_INCLUDE_DIRS}) +set(SDLTTF_FOUND ${SDL2_TTF_FOUND}) mark_as_advanced(SDL2_TTF_LIBRARY SDL2_TTF_INCLUDE_DIR) diff -r 01f88c3b7b66 -r 1b2b84315d27 cmake_modules/checkModule.hs --- a/cmake_modules/checkModule.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/cmake_modules/checkModule.hs Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,4 @@ +{-# LANGUAGE ImpredicativeTypes #-} module Main where import qualified MODULE as M diff -r 01f88c3b7b66 -r 1b2b84315d27 cmake_modules/cpackvars.cmake --- a/cmake_modules/cpackvars.cmake Thu Aug 11 23:05:14 2016 +0300 +++ b/cmake_modules/cpackvars.cmake Sun Dec 17 00:09:24 2017 +0100 @@ -81,6 +81,8 @@ "[dD]ebug$" "[rR]elease$" "CPack" + "CTestTestfile.cmake" + "gameServer2" "cmake_install\\\\.cmake$" "cmake_uninstall\\\\.cmake$" "CMakeCache\\\\.txt$" diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/Actions.hs --- a/gameServer/Actions.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/Actions.hs Sun Dec 17 00:09:24 2017 +0100 @@ -40,6 +40,9 @@ import Network.Socket import System.Random import qualified Data.Traversable as DT +import Text.Regex.Base +import qualified Text.Regex.TDFA as TDFA +import qualified Text.Regex.TDFA.ByteString as TDFAB ----------------------------- #if defined(OFFICIAL_SERVER) import OfficialServer.GameReplayStore @@ -512,12 +515,12 @@ rnc <- gets roomsClients clientNick <- client's nick clProto <- client's clientProto - isAuthenticated <- liftM (not . B.null) $ client's webPassword + isAuthenticated <- client's isRegistered isAdmin <- client's isAdministrator isContr <- client's isContributor loggedInClients <- liftM (Prelude.filter isVisible) $! allClientsS let (lobbyNicks, clientsChans) = unzip . L.map (nick &&& sendChan) $ loggedInClients - let authenticatedNicks = L.map nick . L.filter (not . B.null . webPassword) $ loggedInClients + let authenticatedNicks = L.map nick . L.filter isRegistered $ loggedInClients let adminsNicks = L.map nick . L.filter isAdministrator $ loggedInClients let contrNicks = L.map nick . L.filter isContributor $ loggedInClients inRoomNicks <- io $ @@ -528,8 +531,8 @@ roomsInfoList <- io $ do rooms <- roomsM rnc - mapM (\r -> (if isNothing $ masterID r then return "" else client'sM rnc nick (fromJust $ masterID r)) - >>= \cn -> return $ roomInfo clProto cn r) + mapM (\r -> (mapM (client'sM rnc id) $ masterID r) + >>= \cn -> return $ roomInfo clProto (maybeNick cn) r) $ filter (\r -> (roomProto r == clProto)) rooms mapM_ processAction . concat $ [ @@ -658,9 +661,13 @@ where checkNotExpired testTime (BanByIP _ _ time) = testTime `diffUTCTime` time <= 0 checkNotExpired testTime (BanByNick _ _ time) = testTime `diffUTCTime` time <= 0 - checkBan True ip _ (BanByIP bip _ _) = bip `B.isPrefixOf` ip - checkBan False _ n (BanByNick bn _ _) = caseInsensitiveCompare bn n + checkBan True ip _ (BanByIP bip _ _) = isMatch bip ip + checkBan False _ n (BanByNick bn _ _) = isMatch bn n checkBan _ _ _ _ = False + isMatch :: B.ByteString -> B.ByteString -> Bool + isMatch rexp src = (==) (Just True) $ mrexp rexp >>= flip matchM src + mrexp :: B.ByteString -> Maybe TDFAB.Regex + mrexp = makeRegexOptsM TDFA.defaultCompOpt{TDFA.caseSensitive = False} TDFA.defaultExecOpt getBanReason (BanByIP _ msg _) = msg getBanReason (BanByNick _ msg _) = msg diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/CMakeLists.txt --- a/gameServer/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -12,7 +12,7 @@ check_haskell_module_exists("Network.BSD" getHostName 0 network) check_haskell_module_exists("Data.Time" getCurrentTime 0 time) check_haskell_module_exists("Control.Monad.State" fix 1 mtl) -check_haskell_module_exists("Codec.Binary.Base64" encode 1 dataenc) +check_haskell_module_exists("Codec.Binary.Base64" encode 1 sandi) check_haskell_module_exists("System.Log.Logger" warningM 1 hslogger) check_haskell_module_exists("System.Process" createProcess 3 process) check_haskell_module_exists("Data.ByteString.Lazy.UTF8" decode 1 utf8-string) @@ -20,6 +20,7 @@ check_haskell_module_exists("System.Entropy" openHandle 0 entropy) check_haskell_module_exists("Codec.Compression.Zlib" decompress 1 zlib) check_haskell_module_exists("System.Random" getStdGen 0 random) +check_haskell_module_exists("Text.Regex.TDFA.ByteString" execute 2 regex-tdfa) # this one needs type signatures to work # check_haskell_module_exists("Control.DeepSeq" deepseq 2 deepseq) diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/CoreTypes.hs --- a/gameServer/CoreTypes.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/CoreTypes.hs Sun Dec 17 00:09:24 2017 +0100 @@ -311,8 +311,8 @@ True False "

http://www.hedgewars.org/

" - "

Hedgewars 0.9.22 is out! Please update.

Download page here" - 51 -- latestReleaseVersion + "

Hedgewars 0.9.23 is out! Please update.

Download page here" + 53 -- latestReleaseVersion 41 -- earliestCompatibleVersion 46631 "" diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/EngineInteraction.hs --- a/gameServer/EngineInteraction.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/EngineInteraction.hs Sun Dec 17 00:09:24 2017 +0100 @@ -44,26 +44,20 @@ import Utils #if defined(OFFICIAL_SERVER) -{- - this is snippet from http://stackoverflow.com/questions/10043102/how-to-catch-the-decompress-ioerror - because standard 'catch' doesn't seem to catch decompression errors for some reason --} import qualified Codec.Compression.Zlib.Internal as ZI import qualified Codec.Compression.Zlib as Z -decompressWithoutExceptions :: BL.ByteString -> Either String BL.ByteString -decompressWithoutExceptions = finalise - . ZI.foldDecompressStream cons nil err - . ZI.decompressWithErrors ZI.zlibFormat ZI.defaultDecompressParams - where err _ msg = Left msg - nil = Right [] - cons chunk = right (chunk :) - finalise = right BL.fromChunks -{- end snippet -} +decompressWithoutExceptions :: BL.ByteString -> BL.ByteString +decompressWithoutExceptions = BL.fromChunks . ZI.foldDecompressStreamWithInput chunk end err decomp + where + decomp = ZI.decompressST ZI.zlibFormat ZI.defaultDecompressParams + chunk = (:) + end _ = [] + err = const $ [BW.empty] #endif toEngineMsg :: B.ByteString -> B.ByteString -toEngineMsg msg = B.pack $ Base64.encode (fromIntegral (BW.length msg) : BW.unpack msg) +toEngineMsg msg = Base64.encode (fromIntegral (BW.length msg) `BW.cons` msg) {-fromEngineMsg :: B.ByteString -> Maybe B.ByteString @@ -85,15 +79,15 @@ checkNetCmd :: [Word8] -> B.ByteString -> (B.ByteString, B.ByteString, Maybe (Maybe B.ByteString)) checkNetCmd teamsIndexes msg = check decoded where - decoded = liftM (splitMessages . BW.pack) $ Base64.decode $ B.unpack msg - check Nothing = (B.empty, B.empty, Nothing) - check (Just msgs) = let (a, b) = (filter isLegal msgs, filter isNonEmpty a) in (encode a, encode b, lft a) - encode = B.pack . Base64.encode . BW.unpack . B.concat + decoded = liftM splitMessages $ Base64.decode msg + check (Left _) = (B.empty, B.empty, Nothing) + check (Right msgs) = let (a, b) = (filter isLegal msgs, filter isNonEmpty a) in (encode a, encode b, lft a) + encode = Base64.encode . B.concat isLegal m = (B.length m > 1) && (flip Set.member legalMessages . B.head . B.tail $ m) && not (isMalformed (B.head m) (B.tail m)) lft = foldr l Nothing l m n = let m' = B.head $ B.tail m; tst = flip Set.member in if not $ tst timedMessages m' then n - else if '+' /= m' then Just Nothing else Just . Just . B.pack . Base64.encode . BW.unpack $ m + else if '+' /= m' then Just Nothing else Just . Just . Base64.encode $ m isNonEmpty = (/=) '+' . B.head . B.tail legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,NpPwtgfhbc12345" ++ slotMessages slotMessages = "\128\129\130\131\132\133\134\135\136\137\138" @@ -187,13 +181,10 @@ by200 m = Just $ L.splitAt 200 m unpackDrawnMap :: B.ByteString -> BL.ByteString -unpackDrawnMap = either (const BL.empty) id - . decompressWithoutExceptions - . BL.pack - . L.drop 4 - . fromMaybe [] +unpackDrawnMap = either + (const BL.empty) + (decompressWithoutExceptions . BL.pack . drop 4 . BW.unpack) . Base64.decode - . B.unpack compressWithLength :: BL.ByteString -> BL.ByteString compressWithLength b = BL.drop 8 . encode . runPut $ do @@ -201,9 +192,8 @@ mapM_ putWord8 $ BW.unpack $ BL.toStrict $ Z.compress b packDrawnMap :: BL.ByteString -> B.ByteString -packDrawnMap = B.pack - . Base64.encode - . BW.unpack +packDrawnMap = + Base64.encode . BL.toStrict . compressWithLength diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/HWProtoCore.hs --- a/gameServer/HWProtoCore.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/HWProtoCore.hs Sun Dec 17 00:09:24 2017 +0100 @@ -40,7 +40,7 @@ handleCmd ("QUIT" : xs) = return [ByeClient msg] where - msg = if not $ null xs then head xs else loc "bye" + msg = if not $ null xs then "User quit: " `B.append` (head xs) else loc "bye" handleCmd ["PONG"] = do diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/HWProtoInRoomState.hs --- a/gameServer/HWProtoInRoomState.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/HWProtoInRoomState.hs Sun Dec 17 00:09:24 2017 +0100 @@ -111,7 +111,6 @@ clChan <- thisClientChans othChans <- roomOthersChans roomChans <- roomClientsChans - let isRegistered = (<) 0 . B.length . webPassword $ cl teamColor <- if clientProto cl < 42 then return color @@ -123,7 +122,7 @@ minimum [hhnum $ head roomTeams, canAddNumber roomTeams] else defaultHedgehogsNumber rm - let newTeam = clNick `seq` TeamInfo clNick tName teamColor grave fort voicepack flag isRegistered dif hhNum (hhsList hhsInfo) + let newTeam = clNick `seq` TeamInfo clNick tName teamColor grave fort voicepack flag (isRegistered cl) dif hhNum (hhsList hhsInfo) return $ if not . null . drop (teamsNumberLimit rm - 1) $ roomTeams then [Warning $ loc "too many teams"] diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/HWProtoLobbyState.hs --- a/gameServer/HWProtoLobbyState.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/HWProtoLobbyState.hs Sun Dec 17 00:09:24 2017 +0100 @@ -83,7 +83,7 @@ let chans = map sendChan (cl : jRoomClients) let isBanned = host cl `elem` roomBansList jRoom let clTeams = - if (clientProto cl >= 48) && (isJust $ gameInfo jRoom) then + if (clientProto cl >= 48) && (isJust $ gameInfo jRoom) && isRegistered cl then filter (\t -> teamowner t == nick cl) . teamsAtStart . fromJust $ gameInfo jRoom else [] @@ -95,7 +95,7 @@ [Warning $ loc "Room version incompatible to your hedgewars version"] else if isRestrictedJoins jRoom && not (hasSuperPower cl) then [Warning $ loc "Joining restricted"] - else if isRegisteredOnly jRoom && (B.null . webPassword $ cl) && not (isAdministrator cl) then + else if isRegisteredOnly jRoom && (not $ isRegistered cl) && not (isAdministrator cl) then [Warning $ loc "Registered users only"] else if isBanned then [Warning $ loc "You are banned in this room"] diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/NetRoutines.hs --- a/gameServer/NetRoutines.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/NetRoutines.hs Sun Dec 17 00:09:24 2017 +0100 @@ -25,11 +25,8 @@ import Control.Monad import Data.Unique import qualified Codec.Binary.Base64 as Base64 -import qualified Data.ByteString as BW -import qualified Data.ByteString.Char8 as B import qualified Control.Exception as E import System.Entropy -import Data.Either ----------------------------- import CoreTypes import Utils @@ -48,7 +45,7 @@ sendChan' <- newChan uid <- newUnique - salt <- liftM (B.pack . Base64.encode . BW.unpack) $ hGetEntropy ch 18 + salt <- liftM Base64.encode $ hGetEntropy ch 18 let newClient = (ClientInfo diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/OfficialServer/checker.hs --- a/gameServer/OfficialServer/checker.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/OfficialServer/checker.hs Sun Dec 17 00:09:24 2017 +0100 @@ -37,6 +37,7 @@ import qualified Codec.Binary.Base64 as Base64 import System.Process import Data.Maybe +import Data.Either import qualified Data.List as L #if !defined(mingw32_HOST_OS) import System.Posix @@ -54,7 +55,7 @@ deriving Show serverAddress = "netserver.hedgewars.org" -protocolNumber = "51" +protocolNumber = "53" getLines :: Handle -> IO [B.ByteString] getLines h = g @@ -92,7 +93,7 @@ checkReplay home exe prefix coreChan msgs = do tempDir <- getTemporaryDirectory (fileName, h) <- openBinaryTempFile tempDir "checker-demo" - B.hPut h . BW.pack . concat . map (fromMaybe [] . Base64.decode . B.unpack) $ msgs + B.hPut h . B.concat . map (either (const B.empty) id . Base64.decode) $ msgs hFlush h hClose h diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/Utils.hs --- a/gameServer/Utils.hs Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/Utils.hs Sun Dec 17 00:09:24 2017 +0100 @@ -116,6 +116,8 @@ , (50, "0.9.22-dev") , (51, "0.9.22") , (52, "0.9.23-dev") + , (53, "0.9.23") + , (54, "0.9.24-dev") ] askFromConsole :: B.ByteString -> IO B.ByteString @@ -245,3 +247,6 @@ where sc c | isAlphaNum c = c | otherwise = '_' + +isRegistered :: ClientInfo -> Bool +isRegistered = (<) 0 . B.length . webPassword diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer/hedgewars-server.cabal --- a/gameServer/hedgewars-server.cabal Thu Aug 11 23:05:14 2016 +0300 +++ b/gameServer/hedgewars-server.cabal Sun Dec 17 00:09:24 2017 +0100 @@ -5,7 +5,7 @@ Homepage: http://www.hedgewars.org/ License: GPL-2 Author: unC0Rr -Maintainer: unC0Rr@hedgewars.org +Maintainer: a.korotaev@hedgewars.org Category: Game Build-type: Simple Cabal-version: >=1.10 @@ -16,8 +16,9 @@ default-language: Haskell2010 +-- Don't forget to update INSTALL.md when you change these dependencies! Build-depends: - base >= 4.3, + base >= 4.8, containers, vector, bytestring, @@ -25,14 +26,15 @@ random, time, mtl >= 2, - dataenc, + sandi, hslogger, process, deepseq, utf8-string, SHA, entropy, - zlib >= 0.5.3 && < 0.6 + zlib >= 0.5.3 && < 0.6, + regex-tdfa if !os(windows) build-depends: unix diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/Cargo.toml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/Cargo.toml Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,13 @@ +[package] +name = "hedgewars-server" +version = "0.0.1" +authors = [ "Andrey Korotaev " ] + +[dependencies] +rand = "0.3" +mio = "0.6" +slab = "0.4" +netbuf = "0.4.0" +nom = "3.2" +env_logger = "0.4" +log = "0.3.8" diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/main.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/main.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,59 @@ +extern crate rand; +extern crate mio; +extern crate slab; +extern crate netbuf; +#[macro_use] +extern crate nom; +#[macro_use] +extern crate log; +extern crate env_logger; + +//use std::io::*; +//use rand::Rng; +//use std::cmp::Ordering; +use mio::net::*; +use mio::*; + +mod utils; +mod server; +mod protocol; + +fn main() { + env_logger::init().unwrap(); + + info!("Hedgewars game server, protocol {}", utils::PROTOCOL_VERSION); + + let address = "0.0.0.0:46631".parse().unwrap(); + let listener = TcpListener::bind(&address).unwrap(); + let mut server = server::server::HWServer::new(listener, 1024, 512); + + let poll = Poll::new().unwrap(); + server.register(&poll).unwrap(); + + let mut events = Events::with_capacity(1024); + + loop { + poll.poll(&mut events, None).unwrap(); + + for event in events.iter() { + if event.readiness() & Ready::readable() == Ready::readable() { + match event.token() { + utils::SERVER => server.accept(&poll).unwrap(), + Token(tok) => server.client_readable(&poll, tok).unwrap(), + } + } + if event.readiness() & Ready::writable() == Ready::writable() { + match event.token() { + utils::SERVER => unreachable!(), + Token(tok) => server.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(), +// } +// } + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/protocol/messages.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/protocol/messages.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,138 @@ +use server::coretypes::{ServerVar, GameCfg, TeamInfo, HedgehogInfo}; +use std; +use std::ops; +use std::convert::From; + +#[derive(PartialEq, Debug)] +pub enum HWProtocolMessage { + // core + Ping, + Pong, + Quit(Option), + //Cmd(String, Vec), + Global(String), + Watch(String), + ToggleServerRegisteredOnly, + SuperPower, + Info(String), + // not entered state + Nick(String), + Proto(u32), + Password(String, String), + Checker(u32, String, String), + // lobby + List, + Chat(String), + CreateRoom(String, Option), + Join(String, Option), + Follow(String), + Rnd(Vec), + 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), + Cfg(GameCfg), + AddTeam(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<(String, Option)>), + Vote(String), + ForceVote(String), + Save(String, String), + Delete(String), + SaveRoom(String), + LoadRoom(String), + Malformed, + Empty, +} + +pub enum HWServerMessage<'a> { + Ping, + Pong, + Bye(&'a str), + Nick(&'a str), + LobbyLeft(&'a str), + LobbyJoined(&'a [&'a str]), + ChatMsg(&'a str, &'a str), + ClientFlags(&'a str, &'a [&'a str]), + + Warning(&'a str), + Connected(u32), + Unreachable, +} + +fn construct_message(msg: & [&str]) -> String { + let mut m = String::with_capacity(64); + + for s in msg { + m.push_str(s); + m.push('\n'); + } + m.push('\n'); + + m +} + +impl<'a> HWServerMessage<'a> { + pub fn to_raw_protocol(&self) -> String { + match self { + &HWServerMessage::Ping + => "PING\n\n".to_string(), + &HWServerMessage::Pong + => "PONG\n\n".to_string(), + &HWServerMessage::Connected(protocol_version) + => construct_message(&[ + "CONNECTED", + "Hedgewars server http://www.hedgewars.org/", + &protocol_version.to_string() + ]), + &HWServerMessage::Bye(msg) + => construct_message(&["BYE", &msg]), + &HWServerMessage::Nick(nick) + => construct_message(&["NICK", &nick]), + &HWServerMessage::LobbyLeft(nick) + => construct_message(&["LOBBY_LEFT", &nick]), + &HWServerMessage::LobbyJoined(nicks) + => { + let mut v = vec!["LOBBY:JOINED"]; + v.extend_from_slice(nicks); + construct_message(&v) + }, + &HWServerMessage::ClientFlags(flags, nicks) + => { + let mut v = vec!["CLIENT_FLAGS"]; + v.push(flags); + v.extend_from_slice(nicks); + construct_message(&v) + }, + &HWServerMessage::ChatMsg(nick, msg) + => construct_message(&["CHAT", &nick, &msg]), + &HWServerMessage::Warning(msg) + => construct_message(&["WARNING", &msg]), + _ => construct_message(&["ERROR", "UNIMPLEMENTED"]), + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/protocol/mod.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/protocol/mod.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,42 @@ +use netbuf; +use std::io::Read; +use std::io::Result; +use nom::IResult; + +pub mod messages; +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(&mut self, stream: &mut R) -> Result { + self.buf.read_from(stream) + } + + pub fn extract_messages(&mut self) -> Vec { + let parse_result = parser::extract_messages(&self.buf[..]); + match parse_result { + IResult::Done(tail, msgs) => { + self.consumed = self.buf.len() - self.consumed - tail.len(); + msgs + }, + IResult::Incomplete(_) => unreachable!(), + IResult::Error(_) => unreachable!(), + } + } + + pub fn sweep(&mut self) { + self.buf.consume(self.consumed); + self.consumed = 0; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/protocol/parser.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/protocol/parser.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,141 @@ +use nom::*; + +use std::str; +use std::str::FromStr; +use super::messages::HWProtocolMessage; +use super::messages::HWProtocolMessage::*; + +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!( u8_line<&[u8], u8>, map_res!(str_line, FromStr::from_str)); +named!(u32_line<&[u8], u32>, map_res!(str_line, FromStr::from_str)); +named!(opt_param<&[u8], Option >, opt!(map!(flat_map!(preceded!(eol, str_line), non_empty), String::from))); + +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") >> (RoundFinished)) + | do_parse!(tag!("TOGGLE_RESTRICT_JOINS") >> (ToggleRestrictJoin)) + | do_parse!(tag!("TOGGLE_RESTRICT_TEAMS") >> (ToggleRestrictTeams)) + | do_parse!(tag!("TOGGLE_REGISTERED_ONLY") >> (ToggleRegisteredOnly)) +)); + +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!("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: u32_line >> (Proto(d))) + + | do_parse!(tag!("QUIT") >> msg: opt_param >> (Quit(msg))) +)); + +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") >> eol >> 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") >> eol >> m: opt_param >> (Quit(m))) + | do_parse!(tag_no_case!("QUIT") >> eol >> m: opt_param >> (Part(m))) + | do_parse!(tag_no_case!("DELEGATE") >> eol >> n: a_line >> (Delegate(n))) + | do_parse!(tag_no_case!("SAVEROOM") >> eol >> r: a_line >> (SaveRoom(r))) + | do_parse!(tag_no_case!("LOADROOM") >> eol >> r: a_line >> (LoadRoom(r))) + | do_parse!(tag_no_case!("DELETE") >> eol >> r: a_line >> (Delete(r))) + | do_parse!(tag_no_case!("GLOBAL") >> eol >> m: a_line >> (Global(m))) + | do_parse!(tag_no_case!("WATCH") >> eol >> i: a_line >> (Watch(i))) + | do_parse!(tag_no_case!("GREETING") >> eol >> m: a_line >> (Greeting(m))) + | do_parse!(tag_no_case!("VOTE") >> eol >> m: a_line >> (Vote(m))) + | do_parse!(tag_no_case!("FORCE") >> eol >> m: a_line >> (ForceVote(m))) + | do_parse!(tag_no_case!("INFO") >> eol >> n: a_line >> (Info(n))) + | do_parse!(tag_no_case!("MAXTEAMS") >> eol >> n: u8_line >> (MaxTeams(n))) +))); + +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: u32_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") >> eol >> + n: a_line >> + p: opt_param >> + (Join(n, p))) + | 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!(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 + ), end_of_message + ) + | terminated!(malformed_message, end_of_message) + | empty_message + ) +); + +named!(pub extract_messages<&[u8], Vec >, many0!(complete!(message))); + +#[test] +fn parse_test() { + assert_eq!(message(b"PING\n\n"), IResult::Done(&b""[..], Ping)); + assert_eq!(message(b"START_GAME\n\n"), IResult::Done(&b""[..], StartGame)); + assert_eq!(message(b"NICK\nit's me\n\n"), IResult::Done(&b""[..], Nick("it's me".to_string()))); + assert_eq!(message(b"PROTO\n51\n\n"), IResult::Done(&b""[..], Proto(51))); + assert_eq!(message(b"QUIT\nbye-bye\n\n"), IResult::Done(&b""[..], Quit(Some("bye-bye".to_string())))); + assert_eq!(message(b"QUIT\n\n"), IResult::Done(&b""[..], Quit(None))); + assert_eq!(message(b"CMD\nwatch\ndemo\n\n"), IResult::Done(&b""[..], Watch("demo".to_string()))); + assert_eq!(message(b"BAN\nme\nbad\n77\n\n"), IResult::Done(&b""[..], Ban("me".to_string(), "bad".to_string(), 77))); + + assert_eq!(extract_messages(b"QUIT\n1\n2\n\n"), IResult::Done(&b""[..], vec![Malformed])); + + assert_eq!(extract_messages(b"PING\n\nPING\n\nP"), IResult::Done(&b"P"[..], vec![Ping, Ping])); + assert_eq!(extract_messages(b"SING\n\nPING\n\n"), IResult::Done(&b""[..], vec![Malformed, Ping])); + assert_eq!(extract_messages(b"\n\n\n\nPING\n\n"), IResult::Done(&b""[..], vec![Empty, Empty, Ping])); + assert_eq!(extract_messages(b"\n\n\nPING\n\n"), IResult::Done(&b""[..], vec![Empty, Empty, Ping])); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/actions.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/actions.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,92 @@ +use mio; +use std::io::Write; +use std::io; + +use super::server::HWServer; +use super::server::HWRoom; +use protocol::messages::HWProtocolMessage; +use protocol::messages::HWServerMessage::*; +use super::handlers; + +pub enum Action { + SendMe(String), + SendAllButMe(String), + RemoveClient, + ByeClient(String), + ReactProtocolMessage(HWProtocolMessage), + CheckRegistered, + JoinLobby, + AddRoom(String, Option), + Warn(String), +} + +use self::Action::*; + +pub fn run_action(server: &mut HWServer, token: usize, poll: &mio::Poll, action: Action) { + match action { + SendMe(msg) => + server.send(token, &msg), + SendAllButMe(msg) => { + for (_i, c) in server.clients.iter_mut() { + if c.id != token { + c.send_string(&msg) + } + } + }, + ByeClient(msg) => { + server.react(token, poll, vec![ + SendMe(Bye(&msg).to_raw_protocol()), + RemoveClient, + ]); + }, + RemoveClient => { + server.clients[token].deregister(poll); + server.clients.remove(token); + }, + ReactProtocolMessage(msg) => + handlers::handle(server, token, poll, msg), + CheckRegistered => + if server.clients[token].protocol_number > 0 && server.clients[token].nick != "" { + server.react(token, poll, vec![ + JoinLobby, + ]); + }, + JoinLobby => { + server.clients[token].room_id = Some(server.lobby_id); + + let joined_msg; + { + let mut lobby_nicks: Vec<&str> = Vec::new(); + for (_, c) in server.clients.iter() { + if c.room_id.is_some() { + lobby_nicks.push(&c.nick); + } + } + joined_msg = LobbyJoined(&lobby_nicks).to_raw_protocol(); + } + let everyone_msg = LobbyJoined(&[&server.clients[token].nick]).to_raw_protocol(); + server.react(token, poll, vec![ + SendAllButMe(everyone_msg), + SendMe(joined_msg), + ]); + }, + AddRoom(name, password) => { + let room_id = server.rooms.insert(HWRoom::new()); + { + let r = &mut server.rooms[room_id]; + let c = &mut server.clients[token]; + r.name = name; + r.password = password; + r.id = room_id.clone(); + r.ready_players_number = 1; + r.protocol_number = c.protocol_number; + c.room_id = Some(room_id); + } + + }, + Warn(msg) => { + run_action(server, token, poll, SendMe(Warning(&msg).to_raw_protocol())); + } + //_ => unimplemented!(), + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/client.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/client.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,97 @@ +use mio::net::TcpStream; +use mio::*; +use std::io::Write; +use std::io; +use netbuf; + +use utils; +use protocol::ProtocolDecoder; +use protocol::messages::*; +use super::actions::Action::*; +use super::actions::Action; + +pub struct HWClient { + sock: TcpStream, + decoder: ProtocolDecoder, + buf_out: netbuf::Buf, + + pub id: usize, + pub room_id: Option, + pub nick: String, + pub protocol_number: u32, + pub is_master: bool, + pub is_ready: bool, + pub is_joined_mid_game: bool, +} + +impl HWClient { + pub fn new(sock: TcpStream) -> HWClient { + HWClient { + sock: sock, + decoder: ProtocolDecoder::new(), + buf_out: netbuf::Buf::new(), + room_id: None, + id: 0, + + nick: String::new(), + protocol_number: 0, + is_master: false, + is_ready: false, + is_joined_mid_game: false, + } + } + + pub fn register(&mut self, poll: &Poll, token: Token) { + poll.register(&self.sock, token, Ready::readable() | Ready::writable(), + PollOpt::edge()) + .ok().expect("could not register socket with event loop"); + + self.send_msg(HWServerMessage::Connected(utils::PROTOCOL_VERSION)); + } + + pub fn deregister(&mut self, poll: &Poll) { + poll.deregister(&self.sock) + .ok().expect("could not deregister socket"); + } + + pub fn send_raw_msg(&mut self, msg: &[u8]) { + self.buf_out.write(msg).unwrap(); + self.flush(); + } + + pub fn send_string(&mut self, msg: &String) { + self.send_raw_msg(&msg.as_bytes()); + } + + pub fn send_msg(&mut self, msg: HWServerMessage) { + self.send_string(&msg.to_raw_protocol()); + } + + fn flush(&mut self) { + self.buf_out.write_to(&mut self.sock).unwrap(); + self.sock.flush(); + } + + pub fn readable(&mut self, _poll: &Poll) -> Vec { + let v = self.decoder.read_from(&mut self.sock).unwrap(); + debug!("Read {} bytes", v); + let mut response = Vec::new(); + { + for msg in self.decoder.extract_messages() { + response.push(ReactProtocolMessage(msg)); + } + } + self.decoder.sweep(); + response + } + + pub fn writable(&mut self, _poll: &Poll) -> io::Result<()> { + self.buf_out.write_to(&mut self.sock)?; + + Ok(()) + } + + pub fn error(&mut self, _poll: &Poll) -> Vec { + return vec![ByeClient("Connection reset".to_string())] + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/coretypes.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/coretypes.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,30 @@ +#[derive(PartialEq, Debug)] +pub enum ServerVar { + MOTDNew(String), + MOTDOld(String), + LatestProto(u32), +} + +#[derive(PartialEq, Debug)] +pub enum GameCfg { + +} + +#[derive(PartialEq, Debug)] +pub struct TeamInfo { + name: String, + color: u8, + grave: String, + fort: String, + voice_pack: String, + flag: String, + difficulty: u8, + hedgehogs_number: u8, + hedgehogs: [HedgehogInfo; 8], +} + +#[derive(PartialEq, Debug)] +pub struct HedgehogInfo { + name: String, + hat: String, +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/handlers/inroom.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/handlers/inroom.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,13 @@ +use mio; + +use server::server::HWServer; +use server::actions::Action; +use server::actions::Action::*; +use protocol::messages::HWProtocolMessage; +use protocol::messages::HWServerMessage::*; + +pub fn handle(server: &mut HWServer, token: usize, _poll: &mio::Poll, message: HWProtocolMessage) { + match message { + _ => warn!("Unimplemented!"), + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/handlers/lobby.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/handlers/lobby.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,39 @@ +use mio; + +use server::server::HWServer; +use server::actions::Action; +use server::actions::Action::*; +use protocol::messages::HWProtocolMessage; +use protocol::messages::HWServerMessage::*; + +pub fn handle(server: &mut HWServer, token: usize, poll: &mio::Poll, message: HWProtocolMessage) { + match message { + HWProtocolMessage::Chat(msg) => { + let chat_msg = ChatMsg(&server.clients[token].nick, &msg).to_raw_protocol(); + server.react(token, poll, vec![SendAllButMe(chat_msg)]); + }, + HWProtocolMessage::CreateRoom(name, password) => { + let room_exists = server.rooms.iter().find(|&(_, r)| r.name == name).is_some(); + if room_exists { + server.react(token, poll, vec![Warn("Room exists".to_string())]); + } else { + let flags_msg = ClientFlags("+hr", &[&server.clients[token].nick]).to_raw_protocol(); + { + let c = &mut server.clients[token]; + c.is_master = true; + c.is_ready = true; + c.is_joined_mid_game = false; + } + server.react(token, poll, vec![ + AddRoom(name, password) + , SendMe(flags_msg) + ]); + } + }, + HWProtocolMessage::Join(name, password) => { + + }, + HWProtocolMessage::List => warn!("Deprecated LIST message received"), + _ => warn!("Incorrect command in lobby state"), + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/handlers/loggingin.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/handlers/loggingin.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,23 @@ +use mio; + +use server::server::HWServer; +use server::actions::Action; +use server::actions::Action::*; +use protocol::messages::HWProtocolMessage; +use protocol::messages::HWServerMessage::*; + +pub fn handle(server: &mut HWServer, token: usize, poll: &mio::Poll, message: HWProtocolMessage) { + match message { + HWProtocolMessage::Nick(nick) => + if server.clients[token].room_id == None { + server.react(token, poll, vec![SendMe(Nick(&nick).to_raw_protocol())]); + server.clients[token].nick = nick; + server.react(token, poll, vec![CheckRegistered]); + }, + HWProtocolMessage::Proto(proto) => { + server.clients[token].protocol_number = proto; + server.react(token, poll, vec![CheckRegistered]); + }, + _ => warn!("Incorrect command in logging-in state"), + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/handlers/mod.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/handlers/mod.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,35 @@ +use mio; +use std::io::Write; +use std::io; + +use super::server::HWServer; +use super::actions::Action; +use super::actions::Action::*; +use protocol::messages::HWProtocolMessage; +use protocol::messages::HWServerMessage::*; + +mod loggingin; +mod lobby; +mod inroom; + +pub fn handle(server: &mut HWServer, token: usize, poll: &mio::Poll, message: HWProtocolMessage) { + match message { + HWProtocolMessage::Ping => + server.react(token, poll, vec![SendMe(Pong.to_raw_protocol())]), + HWProtocolMessage::Quit(Some(msg)) => + server.react(token, poll, vec![ByeClient("User quit: ".to_string() + &msg)]), + HWProtocolMessage::Quit(None) => + server.react(token, poll, vec![ByeClient("User quit".to_string())]), + HWProtocolMessage::Malformed => warn!("Malformed/unknown message"), + HWProtocolMessage::Empty => warn!("Empty message"), + _ => { + if !server.clients[token].room_id.is_some() { + loggingin::handle(server, token, poll, message); + } else if server.clients[token].room_id == Some(server.lobby_id) { + lobby::handle(server, token, poll, message); + } else { + inroom::handle(server, token, poll, message); + } + }, + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/mod.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/mod.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,5 @@ +pub mod server; +pub mod client; +pub mod coretypes; +mod actions; +mod handlers; diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/server/server.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/server.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,110 @@ +use slab; +use mio::net::*; +use mio::*; +use std::io; + +use utils; +use super::client::HWClient; +use super::actions; + +type Slab = slab::Slab; + +pub struct HWServer { + listener: TcpListener, + pub clients: Slab, + pub rooms: Slab, + pub lobby_id: usize, +} + +impl HWServer { + pub fn new(listener: TcpListener, clients_limit: usize, rooms_limit: usize) -> HWServer { + let mut rooms = Slab::with_capacity(rooms_limit); + let token = rooms.insert(HWRoom::new()); + HWServer { + listener: listener, + clients: Slab::with_capacity(clients_limit), + rooms: rooms, + lobby_id: token, + } + } + + pub fn register(&self, poll: &Poll) -> io::Result<()> { + poll.register(&self.listener, utils::SERVER, Ready::readable(), + PollOpt::edge()) + } + + pub fn accept(&mut self, poll: &Poll) -> io::Result<()> { + let (sock, addr) = self.listener.accept()?; + info!("Connected: {}", addr); + + let client = HWClient::new(sock); + let token = self.clients.insert(client); + + self.clients[token].id = token; + self.clients[token].register(poll, Token(token)); + + Ok(()) + } + + pub fn client_readable(&mut self, poll: &Poll, + token: usize) -> io::Result<()> { + let actions; + { + actions = self.clients[token].readable(poll); + } + + self.react(token, poll, actions); + + Ok(()) + } + + pub fn client_writable(&mut self, poll: &Poll, + token: usize) -> io::Result<()> { + self.clients[token].writable(poll)?; + + Ok(()) + } + + pub fn client_error(&mut self, poll: &Poll, + token: usize) -> io::Result<()> { + let actions; + { + actions = self.clients[token].error(poll); + } + + self.react(token, poll, actions); + + Ok(()) + } + + pub fn send(&mut self, token: usize, msg: &String) { + self.clients[token].send_string(msg); + } + + pub fn react(&mut self, token: usize, poll: &Poll, actions: Vec) { + for action in actions { + actions::run_action(self, token, poll, action); + } + } +} + + +pub struct HWRoom { + pub id: usize, + pub name: String, + pub password: Option, + pub protocol_number: u32, + pub ready_players_number: u8, +} + +impl HWRoom { + pub fn new() -> HWRoom { + HWRoom { + id: 0, + name: String::new(), + password: None, + protocol_number: 0, + ready_players_number: 0, + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 gameServer2/src/utils.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/utils.rs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,4 @@ +use mio; + +pub const PROTOCOL_VERSION : u32 = 3; +pub const SERVER: mio::Token = mio::Token(1000000000 + 0); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,10 +1,10 @@ enable_language(Pascal) find_package(SDL2 REQUIRED) -find_package(SDL2_image REQUIRED) -find_package(SDL2_net REQUIRED) -find_package(SDL2_ttf REQUIRED) -find_package(SDL2_mixer REQUIRED) +find_package(SDL2_image 2 REQUIRED) +find_package(SDL2_net 2 REQUIRED) +find_package(SDL2_ttf 2 REQUIRED) +find_package(SDL2_mixer 2 REQUIRED) include(CheckLibraryExists) include(${CMAKE_MODULE_PATH}/utils.cmake) diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/PNGh.pas --- a/hedgewars/PNGh.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/PNGh.pas Sun Dec 17 00:09:24 2017 +0100 @@ -79,6 +79,7 @@ procedure PngFlushData(png_ptr: png_structp); cdecl; begin + png_ptr:= png_ptr; end; procedure png_init_pascal_io(png_ptr: png_structp; pf : PFile); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/SDLh.pas Sun Dec 17 00:09:24 2017 +0100 @@ -27,6 +27,9 @@ {$IFDEF FREEBSD} {$DEFINE UNIX} {$ENDIF} +{$IFDEF OPENBSD} + {$DEFINE UNIX} +{$ENDIF} {$IFDEF DARWIN} {$DEFINE UNIX} {$ENDIF} @@ -74,6 +77,9 @@ ///////////////////// CONSTANT DEFINITIONS ///////////////////// ///////////////////////////////////////////////////////////////// + SDL_FALSE = 0; + SDL_TRUE = 1; + // SDL_Init() flags SDL_INIT_TIMER = $00000001; SDL_INIT_AUDIO = $00000010; @@ -94,7 +100,8 @@ AUDIO_S16SYS = {$IFDEF ENDIAN_LITTLE}AUDIO_S16LSB{$ELSE}AUDIO_S16MSB{$ENDIF}; // default audio format from SDL_mixer.h - MIX_DEFAULT_FORMAT = AUDIO_S16SYS; + //MIX_DEFAULT_FORMAT = AUDIO_S16SYS; + MIX_DEFAULT_FORMAT = {$IFDEF ENDIAN_LITTLE}AUDIO_S16LSB{$ELSE}AUDIO_S16MSB{$ENDIF}; SDL_BUTTON_LEFT = 1; SDL_BUTTON_MIDDLE = 2; @@ -1054,7 +1061,7 @@ procedure SDL_FreeSurface(Surface: PSDL_Surface); cdecl; external SDLLibName; function SDL_SetColorKey(surface: PSDL_Surface; flag, key: LongWord): LongInt; cdecl; external SDLLibName; function SDL_SetAlpha(surface: PSDL_Surface; flag, key: LongWord): LongInt; cdecl; external SDLLibName; -function SDL_ConvertSurface(src: PSDL_Surface; fmt: PSDL_PixelFormat; flags: LongInt): PSDL_Surface; cdecl; external SDLLibName; +function SDL_ConvertSurface(src: PSDL_Surface; fmt: PSDL_PixelFormat; flags: LongWord): PSDL_Surface; cdecl; external SDLLibName; function SDL_UpperBlit(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): LongInt; cdecl; external SDLLibName; function SDL_FillRect(dst: PSDL_Surface; dstrect: PSDL_Rect; color: LongWord): LongInt; cdecl; external SDLLibName; @@ -1107,6 +1114,7 @@ function SDL_SetHint(name, value: PChar): Boolean; cdecl; external SDLLibName; procedure SDL_StartTextInput; cdecl; external SDLLibName; procedure SDL_StopTextInput; cdecl; external SDLLibName; +procedure SDL_FlushEvent(eventType: LongWord); cdecl; external SDLLibName; function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: TSDL_eventaction; minType, maxType: LongWord): LongInt; cdecl; external SDLLibName; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/adler32.pas --- a/hedgewars/adler32.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/adler32.pas Sun Dec 17 00:09:24 2017 +0100 @@ -65,7 +65,7 @@ Also, the structure was removed to simplify C conversion *) -function Adler32Update (var adler : longint; Msg :Pointer; Len :longint ) : longint; +function Adler32Update (adler : longint; Msg :Pointer; Len :longint ) : longint; implementation @@ -123,7 +123,7 @@ end; *) -function Adler32Update(var adler:longint; Msg: Pointer; Len :longint) : longint; +function Adler32Update(adler:longint; Msg: Pointer; Len :longint) : longint; {-update Adler32 with Msg data} const BASE = 65521; {max. prime < 65536 } diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/avwrapper/CMakeLists.txt --- a/hedgewars/avwrapper/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/avwrapper/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -3,7 +3,9 @@ include_directories(${LIBAV_INCLUDE_DIR}) add_library(avwrapper avwrapper.c) -#TODO: find good VERSION and SOVERSION values +set_target_properties(avwrapper PROPERTIES + VERSION 1.0 + SOVERSION 1.0) target_link_libraries(avwrapper ${LIBAV_LIBRARIES}) install(TARGETS avwrapper RUNTIME DESTINATION ${target_binary_install_dir} LIBRARY DESTINATION ${target_library_install_dir} diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/hwengine.pas Sun Dec 17 00:09:24 2017 +0100 @@ -32,6 +32,7 @@ {$IFDEF USE_VIDEO_RECORDING}, uVideoRec {$ENDIF} {$IFDEF USE_TOUCH_INTERFACE}, uTouch {$ENDIF} {$IFDEF ANDROID}, GLUnit{$ENDIF} + {$IFDEF WIN32}, dynlibs{$ENDIF} ; function RunEngine(argc: LongInt; argv: PPChar): Longint; cdecl; export; @@ -42,6 +43,12 @@ implementation uses uFLUICallback, uFLTypes; +{$IFDEF WIN32} +type TSetProcessDpiAwareness = function(value: Integer): Integer; stdcall; +var SetProcessDpiAwareness: TSetProcessDpiAwareness; +var ShcoreLibHandle: TLibHandle; +{$ENDIF} + /////////////////////////////////////////////////////////////////////////////// function DoTimer(Lag: LongInt): boolean; var s: shortstring; @@ -57,7 +64,6 @@ SetLandTexture; UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT, false); setAILandMarks; - ParseCommand('sendlanddigest', true); GameState:= gsStart; end; gsStart: @@ -71,6 +77,7 @@ AddFlakes; SetRandomSeed(cSeed, false); StoreLoad(false); + ParseCommand('sendlanddigest', true); // extending land digest to all synced pixels (anything that could modify land) if not allOK then exit; AssignHHCoords; AddMiscGears; @@ -151,6 +158,7 @@ previousGameState: TGameState; wheelEvent: boolean; begin + previousGameState:= gsStart; isTerminated:= false; PrevTime:= SDL_GetTicks; while (not isTerminated) and allOK do @@ -188,14 +196,22 @@ cHasFocus:= false; onFocusStateChanged(); end; +{$IFDEF MOBILE} +(* Suspend game if minimized on mobile. +NOTE: Mobile doesn't support online multiplayer yet, so it's not a problem. +BUT: This section WILL become a bug when online multiplayer is added to +Hedgewars and needs to be rethought. This is because it will cause the +game to freeze if one online player minimizes Hedgewars. *) SDL_WINDOWEVENT_MINIMIZED: begin previousGameState:= GameState; GameState:= gsSuspend; end; +{$ENDIF} SDL_WINDOWEVENT_RESTORED: begin - GameState:= previousGameState; + if GameState = gsSuspend then + GameState:= previousGameState; {$IFDEF ANDROID} //This call is used to reinitialize the glcontext and reload the textures ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true); @@ -232,7 +248,8 @@ SDL_MOUSEWHEEL: begin wheelEvent:= true; - ProcessMouseWheel(event.wheel.x, event.wheel.y); + //ProcessMouseWheel(event.wheel.x, event.wheel.y); + ProcessMouseWheel(event.wheel.y); end; {$ENDIF} @@ -362,7 +379,6 @@ ControllerInit(); // has to happen before InitKbdKeyTable to map keys InitKbdKeyTable(); - AddProgress(); if not allOK then exit; LoadLocale(cPathz[ptLocale] + '/en.txt'); // Do an initial load with english @@ -380,6 +396,9 @@ if not allOK then exit; WriteLnToConsole(msgGettingConfig); + LoadFonts(); + AddProgress(); + if cTestLua then begin ParseCommand('script ' + cScriptName, true); @@ -416,7 +435,6 @@ if GameType = gmtRecord then begin RecorderMainLoop(); - freeEverything(true); exit; end; {$ENDIF} @@ -514,6 +532,9 @@ {$IFDEF USE_TOUCH_INTERFACE}uTouch.freeModule;{$ENDIF} //stub {$IFDEF ANDROID}GLUnit.freeModule;{$ENDIF} uTextures.freeModule; + SDL_GL_DeleteContext(SDLGLcontext); + SDL_DestroyWindow(SDLwindow); + SDL_Quit() end; uIO.freeModule; @@ -577,6 +598,16 @@ operatingsystem_parameter_argc:= argc; operatingsystem_parameter_argv:= argv; +{$IFDEF WIN32} + ShcoreLibHandle := LoadLibrary('Shcore.dll'); + if (ShcoreLibHandle <> 0) then + begin + SetProcessDpiAwareness := + TSetProcessDpiAwareness(GetProcedureAddress(ShcoreLibHandle, 'SetProcessDpiAwareness')); + if (SetProcessDpiAwareness <> nil) then + SetProcessDpiAwareness(1); + end; +{$ENDIF} {$IFDEF PAS2C} // workaround for pascal's ParamStr and ParamCount init(argc, argv); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/pas2cRedo.pas --- a/hedgewars/pas2cRedo.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/pas2cRedo.pas Sun Dec 17 00:09:24 2017 +0100 @@ -8,6 +8,7 @@ LongWord = uinteger; Cardinal = uinteger; PtrInt = integer; + SizeInt = PtrInt; Word = uinteger; Byte = integer; SmallInt = integer; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/pas2cSystem.pas --- a/hedgewars/pas2cSystem.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/pas2cSystem.pas Sun Dec 17 00:09:24 2017 +0100 @@ -7,6 +7,7 @@ LongWord = uinteger; Cardinal = uinteger; PtrInt = integer; + SizeInt = PtrInt; Word = uinteger; Byte = integer; SmallInt = integer; @@ -133,7 +134,7 @@ PHYSFS_init, PHYSFS_deinit, PHYSFS_mount, PHYSFS_readBytes, PHYSFS_writeBytes, PHYSFS_read : function : LongInt; PHYSFSRWOPS_openRead, PHYSFSRWOPS_openWrite, PHYSFS_openRead, PHYSFS_openWrite : function : pointer; - PHYSFS_eof, PHYSFS_close, PHYSFS_exists, PHYSFS_mkdir, PHYSFS_flush, PHYSFS_setWriteDir : function : boolean; + PHYSFS_eof, PHYSFS_close, PHYSFS_exists, PHYSFS_mkdir, PHYSFS_flush, PHYSFS_setWriteDir, PHYSFS_setBuffer : function : boolean; PHYSFS_getLastError : function : PChar; PHYSFS_enumerateFiles : function : PPChar; PHYSFS_freeList : procedure; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uAI.pas Sun Dec 17 00:09:24 2017 +0100 @@ -31,7 +31,8 @@ implementation uses uConsts, SDLh, uAIMisc, uAIAmmoTests, uAIActions, uAmmos, uTypes, - uVariables, uCommands, uUtils, uDebug, uAILandMarks; + uVariables, uCommands, uUtils, uDebug, uAILandMarks, + uGearsUtils; var BestActions: TActions; CanUseAmmo: array [TAmmoType] of boolean; @@ -150,20 +151,20 @@ // if not between shots, activate invulnerability/vampirism if available if CurrentHedgehog^.MultiShootAttacks = 0 then begin - if HHHasAmmo(Me^.Hedgehog^, amInvulnerable) > 0 then + if (HHHasAmmo(Me^.Hedgehog^, amInvulnerable) > 0) and (Me^.Hedgehog^.Effects[heInvulnerable] = 0) then begin AddAction(BestActions, aia_Weapon, Longword(amInvulnerable), 80, 0, 0); AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); end; - if HHHasAmmo(Me^.Hedgehog^, amExtraDamage) > 0 then + if (HHHasAmmo(Me^.Hedgehog^, amExtraDamage) > 0) and (cDamageModifier <> _1_5) then begin AddAction(BestActions, aia_Weapon, Longword(amExtraDamage), 80, 0, 0); AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); end; - if HHHasAmmo(Me^.Hedgehog^, amVampiric) > 0 then + if (HHHasAmmo(Me^.Hedgehog^, amVampiric) > 0) and (not cVampiric) then begin AddAction(BestActions, aia_Weapon, Longword(amVampiric), 80, 0, 0); AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); @@ -471,8 +472,17 @@ FillBonuses(false); + // Hog has no idea what to do. Use tardis or skip if not bonuses.activity then - AddAction(BestActions, aia_Skip, 0, 250, 0, 0); + if ((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); + AddAction(BestActions, aia_attack, aim_push, 10, 0, 0); + AddAction(BestActions, aia_attack, aim_release, 10, 0, 0); + end + else + AddAction(BestActions, aia_Skip, 0, 250, 0, 0); end; end else SDL_Delay(100) diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uAIAmmoTests.pas Sun Dec 17 00:09:24 2017 +0100 @@ -124,7 +124,8 @@ (proc: nil; flags: 0), // amIceGun (proc: nil; flags: 0), // amKnife (proc: nil; flags: 0), // amRubber - (proc: nil; flags: 0) // amAirMine + (proc: nil; flags: 0), // amAirMine + (proc: nil; flags: 0) // amDuck ); implementation @@ -253,7 +254,7 @@ function TestBee(Me: PGear; Targ: TTarget; Level: LongInt; var ap: TAttackParams): LongInt; var i, j: LongInt; valueResult, v, a, p: LongInt; - mX, mY, dX: real; + mX, mY: real; eX, eY: LongInt; begin if Level > 1 then diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uAmmos.pas --- a/hedgewars/uAmmos.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uAmmos.pas Sun Dec 17 00:09:24 2017 +0100 @@ -50,7 +50,7 @@ var StoreCnt: LongInt; implementation -uses uVariables, uCommands, uUtils, uCaptions, uDebug; +uses uVariables, uCommands, uUtils, uCaptions, uDebug, uScript; type TAmmoCounts = array[TAmmoType] of Longword; TAmmoArray = array[TAmmoType] of TAmmo; @@ -210,11 +210,11 @@ cnt:= a^.Count else cnt:= 0; -if (cnt <> AMMO_INFINITE) then - begin - inc(cnt, amt); - SetAmmo(Hedgehog, ammo, cnt) - end +if (cnt >= AMMO_INFINITE) or (amt >= AMMO_INFINITE) then + cnt:= AMMO_INFINITE +else + cnt:= min(AMMO_FINITE_MAX, cnt + amt); +SetAmmo(Hedgehog, ammo, cnt); end; procedure AddAmmo(var Hedgehog: THedgehog; ammo: TAmmoType); @@ -287,6 +287,8 @@ CurWeapon:= GetCurAmmoEntry(Hedgehog); with Hedgehog do begin + if CurAmmoType <> amNothing then + ScriptCall('onUsedAmmo', ord(CurAmmoType)); MultiShootAttacks:= 0; with CurWeapon^ do @@ -329,11 +331,19 @@ begin if (AmmoType <> amNothing) then begin - CurMinAngle:= Ammoz[AmmoType].minAngle; - if Ammoz[AmmoType].maxAngle <> 0 then - CurMaxAngle:= Ammoz[AmmoType].maxAngle + if ((CurAmmoGear <> nil) and (CurAmmoGear^.AmmoType = amRope)) then + begin + CurMaxAngle:= Ammoz[amRope].maxAngle; + CurMinAngle:= Ammoz[amRope].minAngle; + end else - CurMaxAngle:= cMaxAngle; + begin + CurMinAngle:= Ammoz[AmmoType].minAngle; + if Ammoz[AmmoType].maxAngle <> 0 then + CurMaxAngle:= Ammoz[AmmoType].maxAngle + else + CurMaxAngle:= cMaxAngle; + end; with Hedgehog.Gear^ do begin @@ -376,15 +386,14 @@ procedure ApplyAmmoChanges(var Hedgehog: THedgehog); var s: ansistring; - CurWeapon: PAmmo; + OldWeapon, CurWeapon: PAmmo; begin TargetPoint.X:= NoPointX; with Hedgehog do begin - Timer:= 10; - CurWeapon:= GetCurAmmoEntry(Hedgehog); + OldWeapon:= GetCurAmmoEntry(Hedgehog); if (CurWeapon^.Count = 0) then SwitchToFirstLegalAmmo(Hedgehog) @@ -393,11 +402,18 @@ CurWeapon:= GetCurAmmoEntry(Hedgehog); + // Weapon selection animation (if new ammo type) + if CurWeapon^.AmmoType <> OldWeapon^.AmmoType then + Timer:= 10; + ApplyAngleBounds(Hedgehog, CurWeapon^.AmmoType); with CurWeapon^ do begin - s:= trammo[Ammoz[AmmoType].NameId]; + if length(trluaammo[Ammoz[AmmoType].NameId]) > 0 then + s:= trluaammo[Ammoz[AmmoType].NameId] + else + s:= trammo[Ammoz[AmmoType].NameId]; if (Count <> AMMO_INFINITE) and (not (Hedgehog.Team^.ExtDriven or (Hedgehog.BotLevel > 0))) then s:= s + ansistring(' (' + IntToStr(Count) + ')'); if (Propz and ammoprop_Timerable) <> 0 then diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uCaptions.pas --- a/hedgewars/uCaptions.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uCaptions.pas Sun Dec 17 00:09:24 2017 +0100 @@ -47,7 +47,7 @@ if cOnlyStats then exit; if Length(s) = 0 then exit; - if Captions[Group].Text <> s then + if (Captions[Group].Text <> s) or (Captions[Group].Color <> Color) then FreeAndNilTexture(Captions[Group].Tex); if Captions[Group].Tex = nil then diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uChat.pas --- a/hedgewars/uChat.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uChat.pas Sun Dec 17 00:09:24 2017 +0100 @@ -47,7 +47,7 @@ s: shortstring; Color: TSDL_Color; end; - TChatCmd = (ccQuit, ccPause, ccFinish, ccShowHistory, ccFullScreen); + TChatCmd = (ccQuit, ccPause, ccShowHistory, ccFullScreen); var Strs: array[0 .. MaxStrIndex] of TChatLine; MStrs: array[0 .. MaxStrIndex] of shortstring; @@ -88,7 +88,6 @@ end = ( (ChatCmd: '/quit'; ProcedureCallChatCmd: 'halt'), (ChatCmd: '/pause'; ProcedureCallChatCmd: 'pause'), - (ChatCmd: '/finish'; ProcedureCallChatCmd: 'finish'), (ChatCmd: '/history'; ProcedureCallChatCmd: 'history'), (ChatCmd: '/fullscreen'; ProcedureCallChatCmd: 'fullscr') ); @@ -161,7 +160,7 @@ * It will use the color stored in cl and update width *) procedure RenderChatLineTex(var cl: TChatLine; var str: shortstring); -var strSurface, +var strSurface, tmpSurface, resSurface: PSDL_Surface; dstrect : TSDL_Rect; // destination rectangle for blitting font : THWFont; @@ -194,10 +193,14 @@ SDL_FillRect(resSurface, @dstrect, shadowint); // create and blit text +tmpSurface:= nil; strSurface:= TTF_RenderUTF8_Blended(Fontz[font].Handle, Str2PChar(str), cl.color); +// fix format +if strSurface <> nil then tmpSurface:= SDL_ConvertSurface(strSurface, resSurface^.format, 0); +SDL_FreeSurface(strSurface); //SDL_UpperBlit(strSurface, nil, resSurface, @dstrect); -if strSurface <> nil then copyToXY(strSurface, resSurface, Padding, Padding); -SDL_FreeSurface(strSurface); +if tmpSurface <> nil then copyToXY(tmpSurface, resSurface, Padding, Padding); +SDL_FreeSurface(tmpSurface); cl.Tex:= Surface2Tex(resSurface, false); @@ -1095,11 +1098,18 @@ end; procedure chChat(var s: shortstring); +var i: Integer; begin s:= s; // avoid compiler hint GameState:= gsChat; SDL_StopTextInput(); SDL_StartTextInput(); + //Make REALLY sure unexpected events are flushed (1 time is insufficient as of SDL 2.0.7) + for i := 1 to 2 do + begin + SDL_PumpEvents(); + SDL_FlushEvent(SDL_TEXTINPUT); + end; //SDL_EnableKeyRepeat(200,45); if length(s) = 0 then SetLine(InputStr, '', true) diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uCommandHandlers.pas --- a/hedgewars/uCommandHandlers.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uCommandHandlers.pas Sun Dec 17 00:09:24 2017 +0100 @@ -27,7 +27,7 @@ implementation uses uCommands, uTypes, uVariables, uIO, uDebug, uConsts, uScript, uUtils, SDLh, uWorld, uRandom, uCaptions - , uVisualGearsList + , uVisualGearsList, uGearsHedgehog {$IFDEF USE_VIDEO_RECORDING}, uVideoRec {$ENDIF}; var prevGState: TGameState = gsConfirm; @@ -37,9 +37,9 @@ procedure chGenCmd(var s: shortstring); begin case s[1] of - 'R': if ReadyTimeLeft > 1 then + 'R': if ReadyTimeLeft > 0 then begin - ReadyTimeLeft:= 1; + ReadyTimeLeft:= 0; if not isExternalSource then SendIPC('c'+s); end @@ -474,12 +474,7 @@ if not isExternalSource then SendIPC('t' + s); -with CurrentHedgehog^.Gear^ do - begin - Message:= Message or (gmAnimate and InputMask); - MsgParam:= byte(s[1]) ; - ScriptCall('onTaunt', MsgParam); - end +PlayTaunt(byte(s[1])) end; procedure chPut(var s: shortstring); @@ -538,7 +533,7 @@ cSeed:= s; InitStepsFlags:= InitStepsFlags or cifRandomize end - end; +end; procedure chAmmoMenu(var s: shortstring); begin @@ -554,7 +549,7 @@ if bShowAmmoMenu then bShowAmmoMenu:= false - else if not(CurrentTeam^.Extdriven) and (((Gear^.State and (gstAttacking or gstAttacked)) <> 0) + else if not(CurrentTeam^.Extdriven) and ((Gear = nil) or ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) or ((Gear^.State and gstHHDriven) = 0)) then begin end diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uConsole.pas --- a/hedgewars/uConsole.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uConsole.pas Sun Dec 17 00:09:24 2017 +0100 @@ -28,7 +28,7 @@ var lastConsoleline : shortstring; implementation -uses Types, uUtils {$IFDEF ANDROID}, log in 'log.pas'{$ENDIF}; +uses uUtils {$IFDEF ANDROID}, log in 'log.pas'{$ENDIF}; procedure WriteToConsole(s: shortstring); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uConsts.pas Sun Dec 17 00:09:24 2017 +0100 @@ -27,17 +27,22 @@ const HDPIScaleFactor = 1; + + // application return codes HaltNoError = 0; - HaltUsageError = 1; - HaltFatalError = 2; - HaltStartupError = 3; - HaltFatalErrorNoIPC = 4; + + // error codes are placed in range 50-99 because that way then don't overlap with run-time errors of pascal + // see https://www.freepascal.org/docs-html/user/userap4.html + HaltUsageError = 51; + HaltFatalError = 52; + HaltStartupError = 53; + HaltFatalErrorNoIPC = 54; // for automatic tests HaltTestSuccess = 0; - HaltTestFailed = 10; - HaltTestLuaError = 11; - HaltTestUnexpected = 12; + HaltTestFailed = 60; + HaltTestLuaError = 61; + HaltTestUnexpected = 62; sfMax = 1000; @@ -90,10 +95,11 @@ rqDesyncVBlank= $00000800; // don't sync on vblank // image flags (for LoadImage()) + // TODO: discuss whether ifAlpha and ifColorKey are actually needed and if and where we want to support which colorkeys ifNone = $00000000; // nothing special ifAlpha = $00000001; // use alpha channel (unused right now?) ifCritical = $00000002; // image is critical for gameplay (exit game if unable to load) - ifTransparent = $00000004; // image uses transparent pixels (color keying) + ifColorKey = $00000004; // image uses transparent pixels (color keying) ifIgnoreCaps = $00000008; // ignore hardware capabilities when loading (i.e. image will not be drawn using OpenGL) // texture priority (allows OpenGL to keep frequently used textures in video memory more easily) @@ -269,7 +275,8 @@ gmDelete = $00010000; gmAllStoppable = gmLeft or gmRight or gmUp or gmDown or gmAttack or gmPrecise; - cMaxSlotIndex = 9; + cMaxSlotIndex = 10; + cHiddenSlotIndex = cMaxSlotIndex; // slot for hidden ammo types, not visible and has no key cMaxSlotAmmoIndex = 5; // ai hints @@ -299,9 +306,14 @@ ammoprop_Track = $00040000; ammoprop_DoesntStopTimerInMultiShoot = $00080000; + ammoprop_DoesntStopTimerWhileAttackingInInfAttackMode + = $00100000; + ammoprop_ForceTurnEnd = $00200000; + ammoprop_NoTargetAfter= $00400000; ammoprop_NoRoundEnd = $10000000; AMMO_INFINITE = 100; + AMMO_FINITE_MAX = 99; // explosion flags //EXPLAllDamageInRadius = $00000001; Completely unused for ages diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uCursor.pas --- a/hedgewars/uCursor.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uCursor.pas Sun Dec 17 00:09:24 2017 +0100 @@ -18,6 +18,13 @@ procedure resetPosition; begin + // 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); end; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uGears.pas Sun Dec 17 00:09:24 2017 +0100 @@ -42,16 +42,18 @@ procedure ProcessGears; procedure EndTurnCleanup; procedure DrawGears; +procedure DrawGearsTimers; procedure FreeGearsList; procedure AddMiscGears; procedure AssignHHCoords; function GearByUID(uid : Longword) : PGear; +function IsClockRunning() : boolean; implementation uses uStore, uSound, uTeams, uRandom, uIO, uLandGraphics, {$IFDEF USE_TOUCH_INTERFACE}uTouch,{$ENDIF} uLocale, uAmmos, uStats, uVisualGears, uScript, uVariables, - uCommands, uUtils, uTextures, uRenderUtils, uGearsRender, uCaptions, uDebug, + uCommands, uUtils, uTextures, uRenderUtils, uGearsRender, uCaptions, uGearsHedgehog, uGearsUtils, uGearsList, uGearsHandlersRope , uVisualGearsList, uGearsHandlersMess, uAI; @@ -125,7 +127,7 @@ if Gear^.Kind = gtHedgehog then begin tmp:= 0; - if Gear^.Hedgehog^.Effects[hePoisoned] <> 0 then + if (Gear^.Hedgehog^.Effects[hePoisoned] <> 0) and (Gear^.Hedgehog^.Effects[heFrozen] = 0) then begin inc(tmp, ModifyDamage(Gear^.Hedgehog^.Effects[hePoisoned], Gear)); if (GameFlags and gfResetHealth) <> 0 then @@ -336,7 +338,7 @@ ChangeToSDClouds; ChangeToSDFlakes; - SetSkyColor(SDSkyColor.r * (SDTint/255) / 255, SDSkyColor.g * (SDTint/255) / 255, SDSkyColor.b * (SDTint/255) / 255); + SetSkyColor(SDSkyColor.r * (SDTint.r/255) / 255, SDSkyColor.g * (SDTint.r/255) / 255, SDSkyColor.b * (SDTint.b/255) / 255); Ammoz[amTardis].SkipTurns:= 9999; Ammoz[amTardis].Probability:= 0; end; @@ -437,6 +439,7 @@ step:= stChDmg; if TagTurnTimeLeft = 0 then TagTurnTimeLeft:= TurnTimeLeft; + GameOver:= true; TurnTimeLeft:= 0 end end @@ -444,27 +447,32 @@ end; if TurnTimeLeft > 0 then - if CurrentHedgehog^.Gear <> nil then - if (((CurrentHedgehog^.Gear^.State and gstAttacking) = 0) - or (Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_DoesntStopTimerWhileAttacking <> 0)) - and (not(isInMultiShoot and ((Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_DoesntStopTimerInMultiShoot) <> 0))) then - //(CurrentHedgehog^.CurAmmoType in [amShotgun, amDEagle, amSniperRifle]) - begin - if (TurnTimeLeft = 5000) - and (cHedgehogTurnTime >= 10000) - and (not PlacingHogs) - and (CurrentHedgehog^.Gear <> nil) - and ((CurrentHedgehog^.Gear^.State and gstAttacked) = 0) then - PlaySoundV(sndHurry, CurrentTeam^.voicepack); - if ReadyTimeLeft > 0 then - begin - if (ReadyTimeLeft = 2000) and (LastVoice.snd = sndNone) then - AddVoice(sndComeonthen, CurrentTeam^.voicepack); - dec(ReadyTimeLeft) - end - else - dec(TurnTimeLeft) - end; + if IsClockRunning() then + //(CurrentHedgehog^.CurAmmoType in [amShotgun, amDEagle, amSniperRifle]) + begin + if (cHedgehogTurnTime >= 10000) + and (CurrentHedgehog^.Gear <> nil) + and ((CurrentHedgehog^.Gear^.State and gstAttacked) = 0) + and (not isGetAwayTime) then + if TurnTimeLeft = 5000 then + PlaySoundV(sndHurry, CurrentTeam^.voicepack) + else if TurnTimeLeft = 4000 then + PlaySound(sndCountdown4) + else if TurnTimeLeft = 3000 then + PlaySound(sndCountdown3) + else if TurnTimeLeft = 2000 then + PlaySound(sndCountdown2) + else if TurnTimeLeft = 1000 then + PlaySound(sndCountdown1); + if ReadyTimeLeft > 0 then + begin + if (ReadyTimeLeft = 2000) and (LastVoice.snd = sndNone) and (not PlacingHogs) then + AddVoice(sndComeonthen, CurrentTeam^.voicepack); + dec(ReadyTimeLeft) + end + else + dec(TurnTimeLeft) + end; if skipFlag then begin @@ -505,7 +513,8 @@ if (GameFlags and gfLowGravity) = 0 then begin cGravity:= cMaxWindSpeed * 2; - cGravityf:= 0.00025 * 2 + cGravityf:= 0.00025 * 2; + cLowGravity:= false end; if (GameFlags and gfVampiric) = 0 then @@ -514,7 +523,10 @@ cDamageModifier:= _1; if (GameFlags and gfLaserSight) = 0 then + begin cLaserSighting:= false; + cLaserSightingSniper:= false + end; if (GameFlags and gfArtillery) = 0 then cArtillery:= false; @@ -578,6 +590,20 @@ DrawHHOrder(); end; +procedure DrawGearsTimers; +var Gear: PGear; + x, y: LongInt; +begin +Gear:= GearsList; +while Gear <> nil do + begin + x:= hwRound(Gear^.X) + WorldDx; + y:= hwRound(Gear^.Y) + WorldDy; + RenderGearTimer(Gear, x, y); + Gear:= Gear^.NextGear + end; +end; + procedure FreeGearsList; var t, tt: PGear; begin @@ -624,7 +650,10 @@ if Gear = nil then inc(unplaced) else + begin unplaced:= 0; + AddCI(Gear) + end; inc(i) end; @@ -696,7 +725,8 @@ if (GameFlags and gfLowGravity) <> 0 then begin cGravity:= cMaxWindSpeed; - cGravityf:= 0.00025 + cGravityf:= 0.00025; + cLowGravity:= true end; if (GameFlags and gfVampiric) <> 0 then @@ -819,14 +849,24 @@ PlacingHogs:= true; divide:= ((GameFlags and gfDivideTeams) <> 0); -sectionDivide:= divide and ((GameFlags and gfForts) <> 0); + +(* sectionDivide will determine the mode of hog distribution + * + * On generated maps or maps not designed with divided mode in mind, + * using spawning sections can be problematic, because some sections may + * contain too little land surface for sensible spawning. + * + * if sectionDivide is true, the map will be sliced into equal-width sections + * and one team spawned in each + * if false, the hogs will be spawned normally and sorted by teams after + * + *) // TODO: there might be a smarter way to decide if dividing clans into equal-width map sections makes sense // e.g. by checking if there is enough spawn area in each section -if divide and (not sectionDivide) then - sectionDivide:= (ClansCount = 2); +sectionDivide:= divide and ((cMapGen = mgForts) or (ClansCount = 2)); -// in section-divide mode, divide the map into equal-width sections and put each clan in one of them +// divide the map into equal-width sections and put each clan in one of them if sectionDivide then begin t:= leftX; @@ -845,6 +885,7 @@ FindPlace(Gear, false, t, t + playWidth div ClansCount, true);// could make Gear == nil; 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 @@ -879,6 +920,7 @@ FindPlace(ar[i]^.Gear, false, leftX, rightX, 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; @@ -906,6 +948,7 @@ hwRound(Gear^.Y) - SpritesData[sprTargetBee].Height div 2, sprTargetBee, 0, lfBasic, $FFFFFFFF, false, false, false); Gear^.Y:= int2hwFloat(hwRound(Gear^.Y) - 16 - 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)) + ')') end; @@ -1038,6 +1081,17 @@ end end; +function IsClockRunning() : boolean; +begin + IsClockRunning := + (CurrentHedgehog^.Gear <> nil) + and (((CurrentHedgehog^.Gear^.State and gstAttacking) = 0) + 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))); +end; + procedure chSkip(var s: shortstring); begin @@ -1195,7 +1249,8 @@ @doStepIceGun, @doStepAddAmmo, @doStepGenericFaller, - @doStepKnife); + @doStepKnife, + @doStepDuck); begin doStepHandlers:= handlers; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uGearsHandlersMess.pas Sun Dec 17 00:09:24 2017 +0100 @@ -47,7 +47,7 @@ procedure doStepBee(Gear: PGear); procedure doStepShotIdle(Gear: PGear); procedure doStepShotgunShot(Gear: PGear); -procedure spawnBulletTrail(Bullet: PGear); +procedure spawnBulletTrail(Bullet: PGear; bulletX, bulletY: hwFloat); procedure doStepBulletWork(Gear: PGear); procedure doStepDEagleShot(Gear: PGear); procedure doStepSniperRifleShot(Gear: PGear); @@ -138,6 +138,7 @@ procedure doStepGenericFaller(Gear: PGear); //procedure doStepCreeper(Gear: PGear); procedure doStepKnife(Gear: PGear); +procedure doStepDuck(Gear: PGear); var upd: Longword; @@ -146,8 +147,8 @@ implementation uses uConsts, uVariables, uVisualGearsList, uRandom, uCollisions, uGearsList, uUtils, uSound , SDLh, uScript, uGearsHedgehog, uGearsUtils, uIO, uCaptions, uLandGraphics - , uGearsHandlers, uTextures, uRenderUtils, uAmmos, uTeams, uLandTexture, uCommands - , uStore, uAI, uStats; + , uGearsHandlers, uTextures, uRenderUtils, uAmmos, uTeams, uLandTexture + , uStore, uAI, uStats, uLocale; procedure doStepPerPixel(Gear: PGear; step: TGearStepProcedure; onlyCheckIfChanged: boolean); var @@ -259,7 +260,7 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepDrowningGear(Gear: PGear); -var i, d: LongInt; +var i, d, bubbleX, bubbleY: LongInt; bubble: PVisualGear; begin if Gear^.Timer = 0 then @@ -291,12 +292,17 @@ Gear^.X := Gear^.X + Gear^.dX * cDrownSpeed; // Create some bubbles (0.5% might be better but causes too few bubbles sometimes) +if (Gear^.Kind = gtHedgehog) and (Gear^.dX.isNegative) then + bubbleX:= hwRound(Gear^.X) - Gear^.Radius +else + bubbleX:= hwRound(Gear^.X) + Gear^.Radius; +bubbleY:= hwRound(Gear^.Y) - Gear^.Radius; if ((not SuddenDeathDmg and (WaterOpacity < $FF)) or (SuddenDeathDmg and (SDWaterOpacity < $FF))) and ((GameTicks and $1F) = 0) then if (Gear^.Kind = gtHedgehog) and (Random(4) = 0) then - AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble) + AddVisualGear(bubbleX, bubbleY, vgtBubble) else if Random(12) = 0 then - AddVisualGear(hwRound(Gear^.X) - Gear^.Radius, hwRound(Gear^.Y) - Gear^.Radius, vgtBubble); + AddVisualGear(bubbleX, bubbleY, vgtBubble); if (not SuddenDeathDmg and (WaterOpacity > $FE)) or (SuddenDeathDmg and (SDWaterOpacity > $FE)) or (hwRound(Gear^.Y) > Gear^.Radius + cWaterLine + cVisibleWater) then @@ -467,7 +473,7 @@ if isFalling and (Gear^.State and gstNoGravity = 0) then begin Gear^.dY := Gear^.dY + cGravity; - if (GameFlags and gfMoreWind <> 0) and + if (GameFlags and gfMoreWind <> 0) and (TurnTimeLeft > 0) and ((xland or land) = 0) and ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) > _0_02.QWordValue) then Gear^.dX := Gear^.dX + cWindSpeed / Gear^.Density @@ -1189,7 +1195,7 @@ end; //////////////////////////////////////////////////////////////////////////////// -procedure spawnBulletTrail(Bullet: PGear); +procedure spawnBulletTrail(Bullet: PGear; bulletX, bulletY: hwFloat); var oX, oY: hwFloat; VGear: PVisualGear; begin @@ -1211,14 +1217,14 @@ begin VGear^.X:= hwFloat2Float(ox); VGear^.Y:= hwFloat2Float(oy); - VGear^.dX:= hwFloat2Float(Bullet^.X); - VGear^.dY:= hwFloat2Float(Bullet^.Y); + VGear^.dX:= hwFloat2Float(bulletX); + VGear^.dY:= hwFloat2Float(bulletY); // reached edge of land. assume infinite beam. Extend it way out past camera - if (hwRound(Bullet^.X) and LAND_WIDTH_MASK <> 0) - or (hwRound(Bullet^.Y) and LAND_HEIGHT_MASK <> 0) then + if (hwRound(bulletX) and LAND_WIDTH_MASK <> 0) + or (hwRound(bulletY) and LAND_HEIGHT_MASK <> 0) then // only extend if not under water - if not CheckCoordInWater(hwRound(Bullet^.X), hwRound(Bullet^.Y)) then + if not CheckCoordInWater(hwRound(bulletX), hwRound(bulletY)) then begin VGear^.dX := VGear^.dX + max(LAND_WIDTH,4096) * (VGear^.dX - VGear^.X); VGear^.dY := VGear^.dY + max(LAND_WIDTH,4096) * (VGear^.dY - VGear^.Y); @@ -1230,13 +1236,14 @@ procedure doStepBulletWork(Gear: PGear); var - i, x, y: LongWord; - oX, oY, tX, tY, cX, cY: hwFloat; + i, x, y, iInit: LongWord; + oX, oY, tX, tY, tDx, tDy: hwFloat; VGear: PVisualGear; begin AllInactive := false; inc(Gear^.Timer); - i := 80; + iInit := 80; + i := iInit; oX := Gear^.X; oY := Gear^.Y; repeat @@ -1244,19 +1251,19 @@ Gear^.Y := Gear^.Y + Gear^.dY; tX:= Gear^.X; tY:= Gear^.Y; + tDx:= Gear^.dX; + tDy:= Gear^.dY; if (Gear^.PortalCounter < 30) and WorldWrap(Gear) then begin - cX:= Gear^.X; - cY:= Gear^.Y; - Gear^.X:= tX; - Gear^.Y:= tY; - SpawnBulletTrail(Gear); - Gear^.X:= cX; - Gear^.Y:= cY; + DrawTunnel(oX, oY, tDx, tDy, iInit + 2 - i, 1); + SpawnBulletTrail(Gear, tX, tY); + iInit:= i; + oX:= Gear^.X; + oY:= Gear^.Y; inc(Gear^.PortalCounter); Gear^.Elasticity:= Gear^.X; Gear^.Friction:= Gear^.Y; - SpawnBulletTrail(Gear); + SpawnBulletTrail(Gear, Gear^.X, Gear^.Y); end; x := hwRound(Gear^.X); y := hwRound(Gear^.Y); @@ -1289,7 +1296,7 @@ if Gear^.Damage > 0 then begin - DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, 82 - i, 1); + DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, iInit + 2 - i, 1); dec(Gear^.Health, Gear^.Damage); Gear^.Damage := 0 end; @@ -1315,8 +1322,8 @@ or (hwRound(Gear^.X) and LAND_WIDTH_MASK <> 0) or (hwRound(Gear^.Y) and LAND_HEIGHT_MASK <> 0) then begin - if (Gear^.Kind = gtSniperRifleShot) and ((GameFlags and gfLaserSight) = 0) then - cLaserSighting := false; + if (Gear^.Kind = gtSniperRifleShot) then + cLaserSightingSniper := false; if (Ammoz[Gear^.AmmoType].Ammo.NumPerTurn <= CurrentHedgehog^.MultiShootAttacks) and ((GameFlags and gfArtillery) = 0) then cArtillery := false; @@ -1330,7 +1337,7 @@ end; end; - spawnBulletTrail(Gear); + spawnBulletTrail(Gear, Gear^.X, Gear^.Y); Gear^.doStep := @doStepShotIdle end; end; @@ -1369,10 +1376,10 @@ HHGear^.State := HHGear^.State or gstNotKickable; HedgehogChAngle(HHGear); - if not cLaserSighting then - // game does not have default laser sight. turn it on and give them a chance to aim - begin - cLaserSighting := true; + if cLaserSightingSniper = false then + // Turn sniper's laser sight on and give it a chance to aim + begin + cLaserSightingSniper := true; HHGear^.Message := 0; if (HHGear^.Angle >= 32) then dec(HHGear^.Angle,32) @@ -1407,9 +1414,7 @@ if (HHGear^.Angle >= 1) then dec(HHGear^.Angle); - if (TurnTimeLeft > 0) then - dec(TurnTimeLeft) - else + if (TurnTimeLeft = 0) then begin HHGear^.State := HHGear^.State and (not gstNotKickable); DeleteGear(Gear); @@ -1427,7 +1432,7 @@ AllInactive := false; if Gear^.Timer = 0 then begin - AddCaption(trmsg[sidStartFight], cWhiteColor, capgrpGameState); + AddCaption(GetEventString(eidRoundStart), cWhiteColor, capgrpGameState); end end; gtATFinishGame: @@ -1461,8 +1466,6 @@ WorldWrap(Gear); HHGear := Gear^.Hedgehog^.Gear; dec(Gear^.Timer); - if ((GameFlags and gfInfAttack) <> 0) and (TurnTimeLeft > 0) then - dec(TurnTimeLeft); if (TurnTimeLeft = 0) or (Gear^.Timer = 0) or((Gear^.Message and gmDestroy) <> 0) or((HHGear^.State and gstHHDriven) =0) then @@ -1589,11 +1592,10 @@ AllInactive := false; WorldWrap(Gear); dec(Gear^.Timer); - if ((GameFlags and gfInfAttack) <> 0) and (TurnTimeLeft > 0) then - dec(TurnTimeLeft); if Gear^.Hedgehog^.Gear = nil then begin + StopSoundChan(Gear^.SoundChannel); DeleteGear(Gear); AfterAttack; exit @@ -1671,6 +1673,7 @@ if (TurnTimeLeft = 0) or (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then begin + StopSoundChan(Gear^.SoundChannel); HHGear^.Message := 0; HHGear^.State := HHGear^.State and (not gstNotKickable); DeleteGear(Gear); @@ -1695,6 +1698,7 @@ cHHStepTicks, cHHRadius * 2 + 7); HHGear^.Message := 0; HHGear^.State := HHGear^.State or gstNotKickable; + Gear^.SoundChannel := LoopSound(sndBlowTorch); Gear^.doStep := @doStepBlowTorchWork end; @@ -1755,6 +1759,14 @@ else // gstAttacking <> 0 begin AllInactive := false; + // tag of 1 means this mine has a random timer + if (Gear^.Tag = 1) and (Gear^.Timer = 0) then + begin + if (GameTicks mod 2 = 0) then GetRandom(2); + if (GameTicks mod 3 = 0) then GetRandom(2); + Gear^.Timer:= GetRandom(51) * 100; + Gear^.Tag:= 0; + end; if (Gear^.Timer and $FF) = 0 then PlaySound(sndMineTick); if Gear^.Timer = 0 then @@ -1876,9 +1888,15 @@ else trackSpeed.QWordValue:= Gear^.Power; if (Gear^.X < targ^.X) and (Gear^.dX < _0_1) then - Gear^.dX:= Gear^.dX+trackSpeed // please leave as an add. I like the effect + if (WorldEdge = weWrap) and ((targ^.X - Gear^.X) > ((Gear^.X - int2hwFloat(LeftX)) + (int2hwFloat(RightX) - targ^.X))) then + Gear^.dX:= Gear^.dX-trackSpeed + else + Gear^.dX:= Gear^.dX+trackSpeed // please leave as an add. I like the effect else if (Gear^.X > targ^.X) and (Gear^.dX > -_0_1) then - Gear^.dX:= Gear^.dX-trackSpeed; + if (WorldEdge = weWrap) and ((Gear^.X - targ^.X) > ((targ^.X - int2hwFloat(LeftX)) + (int2hwFloat(RightX) - Gear^.X))) then + Gear^.dX:= Gear^.dX+trackSpeed + else + Gear^.dX:= Gear^.dX-trackSpeed; if (Gear^.Y < targ^.Y) and (Gear^.dY < _0_1) then Gear^.dY:= Gear^.dY+trackSpeed else if (Gear^.Y > targ^.Y) and (Gear^.dY > -_0_1) then @@ -1982,14 +2000,14 @@ if ((Gear^.State and gsttmpFlag) <> 0) and (Gear^.Health <> 0) then begin - if ((Gear^.State and gstAttacking) = 0) then + if ((Gear^.State and gstAttacking) = 0) and ((Gear^.State and gstFrozen) = 0) then begin if ((GameTicks and $1F) = 0) then // FIXME - values taken from mine. use a gear val and set both to same if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State := Gear^.State or gstAttacking end - else // gstAttacking <> 0 + else if (Gear^.State and gstFrozen) = 0 then // gstAttacking <> 0 begin AllInactive := false; if Gear^.Timer = 0 then @@ -2012,7 +2030,6 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepDynamite(Gear: PGear); -var VGear: PVisualGear; begin doStepFallingGear(Gear); AllInactive := false; @@ -2114,7 +2131,6 @@ dX, dY: HWFloat; hog: PHedgehog; sparkles: PVisualGear; - gi: PGear; begin k := Gear^.Kind; @@ -2146,6 +2162,8 @@ 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); @@ -2296,15 +2314,28 @@ var HHGear: PGear; begin - HHGear := Gear^.Hedgehog^.Gear; - HHGear^.State := HHGear^.State or gstNoDamage; - DeleteCI(HHGear); - - AmmoShove(Gear, Gear^.Boom, 115); - - HHGear^.State := (HHGear^.State and (not gstNoDamage)) or gstMoving; - Gear^.Timer := 250; - Gear^.doStep := @doStepIdle + dec(Gear^.Timer); + if Gear^.Timer = 0 then + begin + inc(Gear^.Tag); + Gear^.Timer := 50 + end; + + if Gear^.Tag = 3 then + begin + HHGear := Gear^.Hedgehog^.Gear; + HHGear^.State := HHGear^.State or gstNoDamage; + DeleteCI(HHGear); + + AmmoShove(Gear, Gear^.Boom, 115); + + HHGear^.State := (HHGear^.State and (not gstNoDamage)) or gstMoving; + end + else if Gear^.Tag = 4 then + begin + Gear^.Timer := 250; + Gear^.doStep := @doStepIdle + end end; //////////////////////////////////////////////////////////////////////////////// @@ -2599,6 +2630,8 @@ 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) then + HHGear^.Hedgehog^.CurAmmoType:= amParachute; isCursorVisible := false; ApplyAmmoChanges(HHGear^.Hedgehog^); exit @@ -2848,6 +2881,8 @@ valid:= false; lx:= Gear^.Target.X - SpritesData[sprHHTelepMask].Width div 2; // left + if WorldEdge <> weBounce then + lx:= CalcWorldWrap(lx, SpritesData[sprHHTelepMask].Width div 2); // Take world edge into account ty:= Gear^.Target.Y - SpritesData[sprHHTelepMask].Height div 2; // top // remember original target location @@ -2863,6 +2898,9 @@ dec(Gear^.Target.Y); end; + if (WorldEdge = weBounce) and ((Gear^.Target.X < LeftX) or (Gear^.Target.X > RightX)) then + valid:= false; + if not valid then begin HHGear^.Message := HHGear^.Message and (not gmAttack); @@ -2950,6 +2988,8 @@ CurrentTeam^.CurrHedgehog := (CurrentTeam^.CurrHedgehog + switchDir) mod CurrentTeam^.HedgehogsNumber; until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.Damage = 0) and + (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.Health > 0) and + ((CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.State and gstHHDeath) = 0) and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen]=0); SwitchCurrentHedgehog(@CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]); @@ -3025,6 +3065,7 @@ HHGear: PGear; sparkles: PVisualGear; hasWishes: boolean; + s: ansistring; begin AllInactive := false; hasWishes:= ((Gear^.Message and (gmPrecise or gmSwitch)) = (gmPrecise or gmSwitch)); @@ -3122,10 +3163,13 @@ FrameTicks:= random(400) + 250 end end; + s:= ansistring(Gear^.Hedgehog^.Name); + AddCaption(FormatA(GetEventString(eidKamikaze), s), cWhiteColor, capgrpMessage); + uStats.HedgehogSacrificed(Gear^.Hedgehog); AfterAttack; HHGear^.Message:= HHGear^.Message or gmDestroy; DeleteGear(Gear); - end + end else begin dec(Gear^.Health, Gear^.Damage); @@ -3167,6 +3211,7 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepCakeExpl(Gear: PGear); +var gi: PGear; begin AllInactive := false; @@ -3175,6 +3220,14 @@ exit; InCinematicMode:= false; + gi := GearsList; + while gi <> nil do + begin + if gi^.Kind = gtHedgehog then + gi^.State := gi^.State and (not gstLoser); + gi:= gi^.NextGear; + end; + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound); AfterAttack; DeleteGear(Gear) @@ -3203,7 +3256,7 @@ //fY.QWordValue:= fY.QWordValue and $FFFFFFFF00000000; fX:= int2hwFloat(hwRound(Gear^.X)); fY:= int2hwFloat(hwRound(Gear^.Y)); - dmgBase:= cakeDmg shl 1 + cHHRadius div 2; + dmgBase:= Gear^.Boom shl 1 + cHHRadius div 2; partyEpicness:= 0; gi := GearsList; while gi <> nil do @@ -3215,7 +3268,7 @@ tdY:= gi^.Y-fY; if hwRound(hwAbs(tdX)+hwAbs(tdY)) < dmgBase then dmg:= dmgBase - max(hwRound(Distance(tdX, tdY)),gi^.Radius); - if (dmg > 1) then dmg:= ModifyDamage(min(dmg div 2, cakeDmg), gi); + if (dmg > 1) then dmg:= ModifyDamage(min(dmg div 2, Gear^.Boom), gi); if (dmg > 1) then if (CurrentHedgehog^.Gear = gi) and (gi^.Hedgehog^.Effects[heInvulnerable] = 0) then begin @@ -3273,7 +3326,7 @@ if Gear^.Health mod 100 = 0 then Gear^.PortalCounter:= 0; // This is not seconds, but at least it is *some* feedback - if (Gear^.Health = 0) or ((Gear^.Message and gmAttack) <> 0) then + if (Gear^.Health <= 0) or ((Gear^.Message and gmAttack) <> 0) then begin FollowGear := Gear; Gear^.RenderTimer := false; @@ -3308,12 +3361,14 @@ AllInactive := false; inc(Gear^.Tag); - if Gear^.Tag < 100 then + // Animation delay. Skipped if cake only dropped a very short distance. + if (Gear^.Tag < 100) and (Gear^.FlightTime > 1) then exit; Gear^.Tag := 0; - if Gear^.Pos = 6 then - begin + if (Gear^.Pos = 6) or (Gear^.FlightTime <= 1) then + begin + Gear^.Pos := 6; cakeData:= PCakeData(Gear^.Data); with cakeData^ do begin @@ -3324,6 +3379,13 @@ end; CakeI := 0; end; + (* This is called frequently if the cake is completely stuck. + With this a stuck cake takes equally long to explode then + a normal cake. Removing this code just makes the cake walking + for a few seconds longer. *) + if (Gear^.FlightTime <= 1) and (Gear^.Health > 2) then + dec(Gear^.Health); + Gear^.FlightTime := 0; Gear^.doStep := @doStepCakeWalk end else @@ -3335,6 +3397,8 @@ AllInactive := false; Gear^.dY := Gear^.dY + cGravity; + // FlightTime remembers the drop time + inc(Gear^.FlightTime); if TestCollisionYwithGear(Gear, 1) <> 0 then Gear^.doStep := @doStepCakeUp else @@ -3369,7 +3433,12 @@ with hogs.ar^[i]^ do if (hogs.ar^[i] <> CurrentHedgehog^.Gear) and (Hedgehog^.Effects[heFrozen] = 0) then begin - dX:= _50 * cGravity * (Gear^.X - X) / _25; + if (WorldEdge <> weWrap) or (not (hwAbs(Gear^.X - X) > int2hwFloat(Gear^.Radius))) then + dX:= _50 * cGravity * (Gear^.X - X) / _25 + else if (not (hwAbs(Gear^.X + int2hwFloat(RightX-LeftX) - X) > int2hwFloat(Gear^.Radius))) then + dX:= _50 * cGravity * ((Gear^.X + int2hwFloat(RightX-LeftX)) - X) / _25 + else + dX:= _50 * cGravity * ((Gear^.X - int2hwFloat(RightX-LeftX)) - X) / _25; dY:= -_450 * cGravity; Active:= true; end @@ -3416,18 +3485,47 @@ PlaySound(sndYoohoo); end; - if (Gear^.Pos = 14) and (RealTicks and $3 = 0) then + + // note: use GameTicks, not RealTicks, otherwise amount can vary greatly + if (Gear^.Pos = 14) and (GameTicks and $1 = 0) then begin heart:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot); 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)); + dy:= 0.001 * (random(201)); + + // half of hearts go down + if random(2) = 0 then + begin + // create a pointy shape + if 0.2 < dx + dy then + begin + dy:= 0.2 - dy; + dx:= 0.2 - dx; + end; + // sin bulge it out a little to avoid corners on the side + dx:= dx + (dx/0.2) * ((0.2 * sin(pi * ((0.2 - dy) / 0.4))) - (0.2 - dy)); + // change sign + dy:= -dy; + end + else // shape hearts on top into 2 arcs + dy:= dy * (0.3 + 0.7 * sin(pi * dx / 0.2)); + + // half of the hearts go left + if random(2) = 0 then + dx := -dx; FrameTicks:= random(750) + 1000; State:= ord(sprSeduction) end; @@ -3799,8 +3897,10 @@ end; if HHGear <> nil then + begin HHGear^.Message := 0; - ParseCommand('/taunt ' + #1, true) + PlayTaunt(1) + end end end; @@ -3859,7 +3959,11 @@ bubble^.dY:= random(20)/10+0.1; end end - else HHGear^.dY := HHGear^.dY - move; + else + begin + PlaySound(sndJetpackBoost); + HHGear^.dY := HHGear^.dY - move; + end end; dec(Gear^.Health, fuel); Gear^.MsgParam := Gear^.MsgParam or gmUp; @@ -3885,7 +3989,8 @@ else bubble^.X := bubble^.X - 28; end; end - end; + end + else PlaySound(sndJetpackBoost); dec(Gear^.Health, fuel div 5); Gear^.MsgParam := Gear^.MsgParam or (HHGear^.Message and (gmLeft or gmRight)); Gear^.Timer := GameTicks @@ -3948,6 +4053,8 @@ 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) then + HHGear^.Hedgehog^.CurAmmoType:= amJetpack; isCursorVisible := false; ApplyAmmoChanges(HHGear^.Hedgehog^); // if Gear^.Tex <> nil then FreeTexture(Gear^.Tex); @@ -3966,6 +4073,8 @@ Gear^.doStep := @doStepJetpackWork; HHGear := Gear^.Hedgehog^.Gear; + + PlaySound(sndJetpackLaunch); FollowGear := HHGear; AfterAttack; with HHGear^ do @@ -4114,8 +4223,9 @@ dec(Gear^.Timer, 1); HHGear := Gear^.Hedgehog^.Gear; - if HHGear = nil then - begin + if (HHGear = nil) or ((HHGear^.State and gstHHDriven) = 0) then + begin + Gear^.Hedgehog := nil; Gear^.Timer := 0; Gear^.State := Gear^.State or gstAnimation or gstTmpFlag; Gear^.Timer := 0; @@ -4225,6 +4335,7 @@ with CurrentHedgehog^ do if (CurAmmoType = amPortalGun) then begin + PlaySound(sndPortalSwitch); CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and (not gmSwitch); CurWeapon:= GetCurAmmoEntry(CurrentHedgehog^); @@ -4339,6 +4450,10 @@ if not ((Gear^.dX*ox + Gear^.dY*oy).isNegative) then continue; + if iterator^.Kind = gtDuck then + // Make duck go into “falling” mode again + iterator^.Pos:= 0; + isbullet:= (iterator^.Kind in [gtShotgunShot, gtDEagleShot, gtSniperRifleShot, gtSineGunShot]); r:= int2hwFloat(iterator^.Radius); @@ -4369,7 +4484,7 @@ if (iterator^.Kind = gtDEagleShot) or (iterator^.Kind = gtSniperRifleShot) then begin // draw bullet trail - spawnBulletTrail(iterator); + spawnBulletTrail(iterator, iterator^.X, iterator^.Y); // the bullet can now hurt the hog that fired it iterator^.Data:= nil; end; @@ -4636,6 +4751,7 @@ if ((Gear^.LinkedGear = nil) or (hwRound(Distance(Gear^.X - Gear^.LinkedGear^.X,Gear^.Y-Gear^.LinkedGear^.Y)) >=Gear^.Radius*2)) then begin + PlaySound(sndPortalOpen); loadNewPortalBall(Gear, false); inc(Gear^.Tag); Gear^.doStep := @doStepPortal; @@ -4678,6 +4794,8 @@ newPortal^.LinkedGear := nil; + PlaySound(sndPortalShot); + if CurrentHedgehog <> nil then with CurrentHedgehog^ do begin @@ -4720,7 +4838,7 @@ iterator:= GearsList; while iterator <> nil do begin - if not (iterator^.Kind in [gtPortal, gtAirAttack, gtKnife]) and ((iterator^.Hedgehog <> CurrentHedgehog) + if not (iterator^.Kind in [gtPortal, gtAirAttack, gtKnife, gtSMine]) and ((iterator^.Hedgehog <> CurrentHedgehog) or ((iterator^.Message and gmAllStoppable) = 0)) then begin iterator^.Active:= true; @@ -4773,6 +4891,7 @@ begin Gear^.Y:= Gear^.Y + _50; OnUsedAmmo(CurrentHedgehog^); + uStats.HedgehogSacrificed(CurrentHedgehog); if CurrentHedgehog^.Gear <> nil then begin // Drown the hedgehog. Could also just delete it, but hey, this gets a caption @@ -4796,6 +4915,7 @@ begin Gear^.Y:= Gear^.Y + _50; OnUsedAmmo(CurrentHedgehog^); + uStats.HedgehogSacrificed(CurrentHedgehog); if CurrentHedgehog^.Gear <> nil then begin // Drown the hedgehog. Could also just delete it, but hey, this gets a caption @@ -5242,7 +5362,7 @@ procedure doStepHammer(Gear: PGear); var HHGear, tmp, tmp2: PGear; t: PGearArray; - i, dmg, d: LongInt; + i, dmg: LongInt; begin HHGear:= Gear^.Hedgehog^.Gear; HHGear^.State:= HHGear^.State or gstNoDamage; @@ -5385,6 +5505,7 @@ resgear: PGear; hh: PHedgehog; i: LongInt; + s: ansistring; begin if (TurnTimeLeft > 0) then dec(TurnTimeLeft); @@ -5456,6 +5577,8 @@ RenderHealth(resgear^.Hedgehog^); RecountTeamHealth(resgear^.Hedgehog^.Team); resgear^.Hedgehog^.Effects[heResurrected]:= 1; + s:= ansistring(resgear^.Hedgehog^.Name); + AddCaption(FormatA(GetEventString(eidResurrected), s), cWhiteColor, capgrpMessage); // only make hat-less hedgehogs look like zombies, preserve existing hats if resgear^.Hedgehog^.Hat = 'NoHat' then @@ -5659,11 +5782,13 @@ procedure doStepTardisWarp(Gear: PGear); var HH: PHedgehog; i,j,cnt: LongWord; + s: ansistring; begin HH:= Gear^.Hedgehog; if Gear^.Pos = 2 then begin StopSoundChan(Gear^.SoundChannel); + Gear^.SoundChannel:= -1; if (Gear^.Timer = 0) then begin if (HH^.Gear <> nil) and (HH^.Gear^.State and gstInvisible = 0) then @@ -5676,7 +5801,11 @@ 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 - RestoreHog(HH) + begin + RestoreHog(HH); + s:= ansistring(HH^.Name); + AddCaption(FormatA(GetEventString(eidTimeTravelEnd), s), cWhiteColor, capgrpMessage) + end end; inc(Gear^.Timer); @@ -5708,6 +5837,7 @@ if (Gear^.Pos = 3) and (Gear^.Power = 0) then begin StopSoundChan(Gear^.SoundChannel); + Gear^.SoundChannel:= -1; if HH^.GearHidden = nil then begin DeleteGear(Gear); @@ -5758,46 +5888,17 @@ end; procedure doStepTardis(Gear: PGear); -var i,j,cnt: LongWord; - HH: PHedgehog; +var HH: PHedgehog; begin -(* - Conditions for not activating. - 1. Hog is last of his clan - 2. Sudden Death is in play - 3. Hog is a king -*) HH:= Gear^.Hedgehog; - if HH^.Gear <> nil then - if (HH^.Gear = nil) or (HH^.King) or (SuddenDeathDmg) then - begin - if HH^.Gear <> nil then - begin - HH^.Gear^.Message := HH^.Gear^.Message and (not gmAttack); - HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking); - end; + if (not CanUseTardis(HH^.Gear)) then + begin + HH^.Gear^.Message := HH^.Gear^.Message and (not gmAttack); + HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking); PlaySound(sndDenied); - DeleteGear(gear); + DeleteGear(Gear); exit - end; - cnt:= 0; - for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do - for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do - if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) - and ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) - and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then - inc(cnt); - if cnt < 2 then - begin - if HH^.Gear <> nil then - begin - HH^.Gear^.Message := HH^.Gear^.Message and (not gmAttack); - HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking); - end; - PlaySound(sndDenied); - DeleteGear(gear); - exit - end; + end; Gear^.SoundChannel := LoopSound(sndTardis); Gear^.doStep:= @doStepTardisWarp end; @@ -5964,7 +6065,7 @@ while iter <> nil do begin if (iter^.State and gstFrozen = 0) and - ((iter^.Kind = gtExplosives) or (iter^.Kind = gtCase) or (iter^.Kind = gtMine)) and + ((iter^.Kind = gtExplosives) or (iter^.Kind = gtCase) or (iter^.Kind = gtMine) or (iter^.Kind = gtSMine)) and (abs(LongInt(iter^.X.Round) - target.x) + abs(LongInt(iter^.Y.Round) - target.y) + 2 < 2 * iceRadius) and (Distance(iter^.X - int2hwFloat(target.x), iter^.Y - int2hwFloat(target.y)) < int2hwFloat(iceRadius * 2)) then begin @@ -5992,6 +6093,16 @@ iter^.Damage := 0; iter^.State := iter^.State and (not gstAttacking) end + else if iter^.Kind = gtSMine then // disabe sticky mine and drop it into the water + begin + iter^.State:= iter^.State or gstFrozen; + iter^.CollisionMask:= 0; + vg:= AddVisualGear(hwRound(iter^.X) - 2 + Random(4), hwRound(iter^.Y) - 2 - Random(2), vgtSmoke); + if vg <> nil then + vg^.Scale:= 0.4; + PlaySound(sndVaporize); + iter^.State := iter^.State and (not gstAttacking) + end else if iter^.Kind = gtCase then begin DeleteCI(iter); @@ -6279,6 +6390,180 @@ and (TestCollisionYwithGear(Gear, 1) = 0) then Gear^.State:= Gear^.State and (not gstCollision) or gstMoving; end end; + +//////////////////////////////////////////////////////////////////////////////// +procedure doStepDuck(Gear: PGear); +begin + // Mirror duck on bounce world edge, even turn around later + if WorldWrap(Gear) and (WorldEdge = weBounce) then + begin + Gear^.Tag:= Gear^.Tag * -1; + if Gear^.Pos = 2 then + Gear^.Pos:= 1 + else if Gear^.Pos = 1 then + Gear^.Pos:= 2 + else if Gear^.Pos = 5 then + Gear^.Pos:= 6 + else if Gear^.Pos = 5 then + Gear^.Pos:= 5; + end; + + AllInactive := false; + + // Duck falls (Pos = 0) + if Gear^.Pos = 0 then + doStepFallingGear(Gear); + + (* Check if duck is near water surface + (Karma is distance from water) *) + if (Gear^.Pos <> 1) and (Gear^.Pos <> 2) and (cWaterLine <= hwRound(Gear^.Y) + Gear^.Karma) then + begin + if cWaterLine = hwRound(Gear^.Y) + Gear^.Karma then + begin + // Let's make that duck swim! + // Does the duck come FROM the Sea edge? (left or right) + if (((Gear^.Pos = 3) or (Gear^.Pos = 7)) and (cWindSpeed > _0)) or (((Gear^.Pos = 4) or (Gear^.Pos = 8)) and (cWindSpeed < _0)) then + begin + PlaySound(sndDuckWater); + Gear^.DirAngle:= 0; + Gear^.Pos:= 1; + Gear^.dY:= _0; + end; + + // Duck comes either falling (usual case) or was rising from below + if (Gear^.Pos = 0) or (Gear^.Pos = 5) or (Gear^.Pos = 6) then + begin + PlaySound(sndDroplet2); + if Gear^.dY > _0_4 then + PlaySound(sndDuckWater); + Gear^.Pos:= 1; + Gear^.dY:= _0; + end; + end + else if Gear^.Pos = 0 then + Gear^.Pos:= 5; + end; + + // Manual speed handling when duck is on water + if Gear^.Pos <> 0 then + begin + Gear^.X:= Gear^.X + Gear^.dX; + Gear^.Y:= Gear^.Y + Gear^.dY; + end; + + // Handle speed + // 1-4: On water: Let's swim! + if Gear^.Pos = 1 then + // On water (normal) + Gear^.dX:= cWindSpeed * Gear^.Damage + else if Gear^.Pos = 2 then + // On water, mirrored (after bounce edge bounce) + Gear^.dX:= -cWindSpeed * Gear^.Damage + else if Gear^.Pos = 3 then + // On left Sea edge + Gear^.dY:= cWindSpeed * Gear^.Damage + else if Gear^.Pos = 4 then + // On right Sea edge + Gear^.dY:= -cWindSpeed * Gear^.Damage + // 5-8: Underwater: Slowly rise to the surface and slightly follow wind + else if Gear^.Pos = 5 then + // Underwater (normal) + begin + Gear^.dX:= (cWindSpeed / 4) * Gear^.Damage; + Gear^.dY:= -_0_07; + end + else if Gear^.Pos = 6 then + // Underwater, mirrored duck (after bounce edge bounce) + begin + Gear^.dX:= -(cWindSpeed / 4) * Gear^.Damage; + Gear^.dY:= -_0_07; + end + else if Gear^.Pos = 7 then + // Inside left Sea edge + begin + Gear^.dX:= _0_07; + Gear^.dY:= (cWindSpeed / 4) * Gear^.Damage; + end + else if Gear^.Pos = 8 then + // Inside right Sea edge + begin + Gear^.dX:= -_0_07; + Gear^.dY:= -(cWindSpeed / 4) * Gear^.Damage; + end; + + + // Rotate duck and change direction when reaching Sea world edge (Pos 3 or 4) + if (WorldEdge = weSea) and (Gear^.Pos <> 3) and (Gear^.Pos <> 4) then + // Swimming TOWARDS left edge + if (LeftX >= hwRound(Gear^.X) - Gear^.Karma) and ((cWindSpeed < _0) or ((Gear^.Pos = 0) or (Gear^.Pos = 7))) then + begin + // Turn duck when reaching edge the first time + if (Gear^.Pos <> 3) and (Gear^.Pos <> 7) then + begin + if Gear^.Tag = 1 then + Gear^.DirAngle:= 90 + else + Gear^.DirAngle:= 270; + end; + + // Reaching the edge surface + if (LeftX = hwRound(Gear^.X) - Gear^.Karma) and (Gear^.Pos <> 3) then + // We are coming from the horizontal side + begin + PlaySound(sndDuckWater); + Gear^.dX:= _0; + Gear^.Pos:= 3; + end + else + // We are coming from inside the Sea, go into “surfacing” mode + Gear^.Pos:= 7; + + end + + // Swimming TOWARDS right edge (similar to left edge) + else if (RightX <= hwRound(Gear^.X) + Gear^.Karma) and ((cWindSpeed > _0) or ((Gear^.Pos = 0) or (Gear^.Pos = 8))) then + begin + if (Gear^.Pos <> 4) and (Gear^.Pos <> 8) then + begin + if Gear^.Tag = 1 then + Gear^.DirAngle:= 270 + else + Gear^.DirAngle:= 90; + end; + + if (RightX = hwRound(Gear^.X) + Gear^.Karma) and (Gear^.Pos <> 4) then + begin + PlaySound(sndDuckWater); + Gear^.dX:= _0; + Gear^.Pos:= 4; + end + else + Gear^.Pos:= 8; + + end; + + + if Gear^.Pos <> 0 then + // Manual collision check required because we don't use onStepFallingGear in this case + CheckCollision(Gear); + if (Gear^.Timer = 0) or ((Gear^.State and gstCollision) <> 0) then + // Explode duck + begin + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Boom, Gear^.Hedgehog, EXPLAutoSound); + PlaySound(sndDuckDie); + DeleteGear(Gear); + exit; + end; + + // Update timer stuff + if Gear^.Timer < 6000 then + Gear^.RenderTimer:= true + else + Gear^.RenderTimer:= false; + + dec(Gear^.Timer); +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? diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uGearsHandlersRope.pas --- a/hedgewars/uGearsHandlersRope.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uGearsHandlersRope.pas Sun Dec 17 00:09:24 2017 +0100 @@ -66,6 +66,8 @@ or (TestCollisionYwithGear(HHGear, 1) <> 0) then begin DeleteGear(Gear); + if (TestCollisionYwithGear(HHGear, 1) <> 0) and (GetAmmoEntry(HHGear^.Hedgehog^, amRope)^.Count >= 1) and ((Ammoz[HHGear^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) then + HHGear^.Hedgehog^.CurAmmoType:= amRope; isCursorVisible := false; ApplyAmmoChanges(HHGear^.Hedgehog^); exit @@ -441,6 +443,21 @@ end else if not CurrentTeam^.ExtDriven and (FollowGear <> nil) then FollowGear := HHGear; + // Destroy rope if it touched bouncy or world wrap world edge. + // TODO: Allow to shoot rope through the world wrap edge and rope normally. + if (WorldWrap(Gear) and (WorldEdge = weWrap)) or + ((WorldEdge = weBounce) and ((hwRound(Gear^.X) <= LeftX) or (hwRound(Gear^.X) >= RightX))) then + begin + HHGear^.State := HHGear^.State and (not (gstAttacking or gstHHJumping or gstHHHJump)); + HHGear^.Message := HHGear^.Message and (not gmAttack); + DeleteGear(Gear); + if (GetAmmoEntry(HHGear^.Hedgehog^, amRope)^.Count >= 1) and ((Ammoz[HHGear^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) then + HHGear^.Hedgehog^.CurAmmoType:= amRope; + isCursorVisible := false; + ApplyAmmoChanges(HHGear^.Hedgehog^); + exit() + end; + DeleteCI(HHGear); if (HHGear^.State and gstMoving) <> 0 then @@ -530,6 +547,10 @@ Message := Message and (not gmAttack) end; DeleteGear(Gear); + if (GetAmmoEntry(HHGear^.Hedgehog^, amRope)^.Count >= 1) and ((Ammoz[HHGear^.Hedgehog^.CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) then + HHGear^.Hedgehog^.CurAmmoType:= amRope; + isCursorVisible := false; + ApplyAmmoChanges(HHGear^.Hedgehog^); exit; end; if CheckGearDrowning(HHGear) then DeleteGear(Gear) diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uGearsHedgehog.pas Sun Dec 17 00:09:24 2017 +0100 @@ -30,6 +30,7 @@ procedure PickUp(HH, Gear: PGear); procedure AddPickup(HH: THedgehog; ammo: TAmmoType; cnt, X, Y: LongWord); procedure CheckIce(Gear: PGear); inline; +procedure PlayTaunt(taunt: Longword); implementation uses uConsts, uVariables, uFloat, uAmmos, uSound, uCaptions, @@ -325,6 +326,19 @@ newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSniperRifleShot, 0, xx * _0_5, yy * _0_5, 0); end; amDynamite: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtDynamite, 0, SignAs(_0_03, dX), _0, 5000); + amDuck: begin + // Does duck spawn inside water? + if (LeftX > hwRound(Gear^.X) - Gear^.Karma) or (RightX < hwRound(Gear^.X) + Gear^.Karma) or (cWaterLine < hwRound(Gear^.Y) + Gear^.Karma) then + PlaySound(sndDroplet2) + else + // Duck spawned in air, normal drop sound + PlaySound(sndDuckDrop); + newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtDuck, 0, SignAs(_0_03, dX), _0, 0); + if not ((not dX.isNegative) xor ((State and gstHHHJump) <> 0)) then + newGear^.Tag:= -1 + else + newGear^.Tag:= 1; + end; amFirePunch: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtFirePunch, 0, xx, _0, 0); amWhip: begin newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtWhip, 0, SignAs(_1, dX), - _0_8, 0); @@ -378,18 +392,25 @@ amLowGravity: begin PlaySound(sndLowGravity); cGravity:= cMaxWindSpeed; - cGravityf:= 0.00025 + cGravityf:= 0.00025; + cLowGravity := true end; amExtraDamage: begin PlaySound(sndHellishImpact4); cDamageModifier:= _1_5 end; - amInvulnerable: Effects[heInvulnerable]:= 1; + amInvulnerable: begin + PlaySound(sndInvulnerable); + Effects[heInvulnerable]:= 1 + end; amExtraTime: begin PlaySound(sndExtraTime); TurnTimeLeft:= TurnTimeLeft + 30000 end; - amLaserSight: cLaserSighting:= true; + amLaserSight: begin + PlaySound(sndLaserSight); + cLaserSighting:= true + end; amVampiric: begin PlaySoundV(sndOw1, Team^.voicepack); cVampiric:= true; @@ -552,10 +573,12 @@ if (CurAmmoGear <> nil) and (CurAmmoGear^.State and gstSubmersible <> 0) and CheckCoordInWater(hwRound(CurAmmoGear^.X), hwRound(CurAmmoGear^.Y)) then TurnTimeLeft:=(Ammoz[a].TimeAfterTurn * cGetAwayTime) div 25 else TurnTimeLeft:=(Ammoz[a].TimeAfterTurn * cGetAwayTime) div 100; + IsGetAwayTime := true; end; if ((Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) = 0) and (HHGear <> nil) then HHGear^.State:= HHGear^.State or gstAttacked; - if (Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) <> 0 then + if (a = amNothing) or ((Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) <> 0) or + (((GameFlags and gfInfAttack) <> 0) and ((Ammoz[a].Ammo.Propz and ammoprop_ForceTurnEnd) = 0)) then ApplyAmmoChanges(CurrentHedgehog^) end; end @@ -655,32 +678,45 @@ procedure AddPickup(HH: THedgehog; ammo: TAmmoType; cnt, X, Y: LongWord); var s: ansistring; + name: ansistring; vga: PVisualGear; begin if cnt <> 0 then AddAmmo(HH, ammo, cnt) else AddAmmo(HH, ammo); - if (not (HH.Team^.ExtDriven - or (HH.BotLevel > 0))) - or (HH.Team^.Clan^.ClanIndex = LocalClan) - or (GameType = gmtDemo) then + if IsHogLocal(@HH) then begin - if cnt <> 0 then - s:= trammo[Ammoz[ammo].NameId] + ansistring(' (+' + IntToStr(cnt) + ')') + if length(trluaammo[Ammoz[ammo].NameId]) > 0 then + name:= trluaammo[Ammoz[ammo].NameId] else - s:= trammo[Ammoz[ammo].NameId] + ansistring(' (+' + IntToStr(Ammoz[ammo].NumberInCase) + ')'); + name:= trammo[Ammoz[ammo].NameId]; + + if cnt = 0 then + cnt:= Ammoz[ammo].NumberInCase; + + if (ammo = amNothing) or (cnt = 0) then + s:= trmsg[sidEmptyCrate] + else if cnt >= AMMO_INFINITE then + s:= name + ansistring(' (+∞)') + else + s:= name + ansistring(' (+' + IntToStr(cnt) + ')'); + AddCaption(s, HH.Team^.Clan^.Color, capgrpAmmoinfo); - // show ammo icon - vga:= AddVisualGear(X, Y, vgtAmmo); - if vga <> nil then - vga^.Frame:= Longword(ammo); + // show ammo icon (if not empty) + if (ammo <> amNothing) and (cnt <> 0) then + begin + vga:= AddVisualGear(X, Y, vgtAmmo); + if vga <> nil then + vga^.Frame:= Longword(ammo); + end + end; end; //////////////////////////////////////////////////////////////////////////////// procedure PickUp(HH, Gear: PGear); -var s: shortstring; +var s: ansistring; i: LongInt; vga: PVisualGear; ag, gi: PGear; @@ -732,13 +768,13 @@ PlaySound(sndShotgunReload); inc(HH^.Health, Gear^.Health); HH^.Hedgehog^.Effects[hePoisoned] := 0; - s:= '+' + IntToStr(Gear^.Health); - AddCaption(ansistring(s), HH^.Hedgehog^.Team^.Clan^.Color, capgrpAmmoinfo); + s:= IntToStr(Gear^.Health); + AddCaption(FormatA(trmsg[sidHealthGain], s), HH^.Hedgehog^.Team^.Clan^.Color, capgrpAmmoinfo); RenderHealth(HH^.Hedgehog^); RecountTeamHealth(HH^.Hedgehog^.Team); i:= 0; - while i < Gear^.Health do + while (i < Gear^.Health) and (i <= 1000) do begin vga:= AddVisualGear(hwRound(HH^.X), hwRound(HH^.Y), vgtStraightShot); if vga <> nil then @@ -927,6 +963,7 @@ var isFalling, isUnderwater: boolean; land: Word; cnt: LongWord; + s: ansistring; begin if Gear^.Hedgehog^.Unplaced then begin @@ -1178,7 +1215,8 @@ if (Gear^.FlightTime > 1500) and ((hwRound(Gear^.X) < LongInt(leftX)-250) or (hwRound(Gear^.X) > LongInt(rightX)+250)) then begin Gear^.FlightTime:= 0; - AddCaption(GetEventString(eidHomerun), cWhiteColor, capgrpMessage); + s:= ansistring(CurrentHedgehog^.Name); + AddCaption(FormatA(GetEventString(eidHomerun), s), cWhiteColor, capgrpMessage); PlaySound(sndHomerun) end; end @@ -1194,28 +1232,41 @@ var t: PGear; wasJumping: boolean; Hedgehog: PHedgehog; + s: ansistring; begin Hedgehog:= HHGear^.Hedgehog; if not isInMultiShoot then AllInactive:= false else if Hedgehog^.CurAmmoType in [amShotgun, amDEagle, amSniperRifle] then - HHGear^.Message:= 0; + HHGear^.Message:= HHGear^.Message and gmPrecise; if ((Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_Utility) <> 0) and isInMultiShoot then AllInactive:= true else if not isInMultiShoot then AllInactive:= false; -if (TurnTimeLeft = 0) or (HHGear^.Damage > 0) then +if (TurnTimeLeft = 0) or (HHGear^.Damage > 0) 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 + begin + AddVoice(sndBoring, Hedgehog^.Team^.voicepack); + if (GameFlags and gfInfAttack = 0) then + begin + s:= Hedgehog^.Name; + AddCaption(FormatA(GetEventString(eidTimeout), s), cWhiteColor, capgrpMessage); + end; + end; isCursorVisible:= false; HHGear^.State:= HHGear^.State and (not (gstHHDriven or gstAnimation or gstAttacking)); AttackBar:= 0; + StopSound(sndThrowPowerUp); + LuaEndTurnRequested:= false; + LuaNoEndTurnTaunts:= false; if HHGear^.Damage > 0 then HHGear^.State:= HHGear^.State and (not (gstHHJumping or gstHHHJump)); exit @@ -1375,7 +1426,10 @@ Gear^.doStep:= @doStepHedgehogDead; // Death message s:= ansistring(Gear^.Hedgehog^.Name); - AddCaption(FormatA(GetEventString(eidDied), s), cWhiteColor, capgrpMessage); + if Gear^.Hedgehog^.King then + AddCaption(FormatA(GetEventString(eidKingDied), s), cWhiteColor, capgrpMessage) + else + AddCaption(FormatA(GetEventString(eidDied), s), cWhiteColor, capgrpMessage); end; end else @@ -1498,4 +1552,15 @@ end; end; +procedure PlayTaunt(taunt: Longword); +begin + if CurrentHedgehog^.Gear <> nil then + with CurrentHedgehog^.Gear^ do + begin + Message:= Message or (gmAnimate and InputMask); + MsgParam:= taunt; + ScriptCall('onTaunt', MsgParam); + end +end; + end. diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uGearsList.pas --- a/hedgewars/uGearsList.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uGearsList.pas Sun Dec 17 00:09:24 2017 +0100 @@ -105,6 +105,7 @@ (* gtAddAmmo *) , amNothing (* gtGenericFaller *) , amNothing (* gtKnife *) , amKnife +(* gtDuck *) , amDuck ); @@ -263,6 +264,7 @@ else Gear^.Boom := 3; gtPoisonCloud: Gear^.Boom := 20; gtKnife: Gear^.Boom := 40000; // arbitrary scaling factor since impact-based + gtDuck: Gear^.Boom := 40; end; case Kind of @@ -507,7 +509,11 @@ gear^.Density:= _1_5; gear^.RenderTimer:= true end; - gtShover: gear^.Radius:= 20; + gtShover: begin + gear^.Radius:= 20; + gear^.Tag:= 0; + gear^.Timer:= 50; + end; gtFlame: begin gear^.Tag:= GetRandom(32); gear^.Radius:= 1; @@ -574,6 +580,8 @@ gear^.Z:= cOnHHZ; gear^.RenderTimer:= false; gear^.DirAngle:= -90 * hwSign(Gear^.dX); + gear^.FlightTime:= 100; // (roughly) ticks spent dropping, used to skip getting up anim when stuck. + // Initially set to a high value so cake has at least one getting up anim. if not dX.isNegative then gear^.Angle:= 1 else @@ -631,6 +639,8 @@ gtMolotov: begin gear^.AdvBounce:= 1; gear^.Radius:= 6; + gear^.Elasticity:= _0_8; + gear^.Friction:= _0_8; gear^.Density:= _2 end; gtBirdy: begin @@ -713,6 +723,24 @@ gear^.Health:= 1000; gear^.Radius:= 8; end; + gtDuck: begin + gear^.Pos:= 0; // 0: in air, 1-4: on water, 5-8: underwater + // 1: bottom, 2: bottom (mirrored), + // 3: left Sea edge, 4: right Sea edge + // 6: bottom, 7: bottom (mirrored) + // 7: left Sea edge, 8: right Sea edge + gear^.Tag:= 1; // 1: facing right, -1: facing left + if gear^.Timer = 0 then + gear^.Timer:= 15000; // Explosion timer to avoid duck existing forever + gear^.Radius:= 9; // Collision radius (with landscape) + gear^.Karma:= 24; // Distance from water when swimming + gear^.Damage:= 500; // Speed factor when swimming on water (multiplied with wind speed) + gear^.State:= gear^.State or gstSubmersible; + gear^.Elasticity:= _0_6; + gear^.Friction:= _0_8; + gear^.Density:= _0_5; + gear^.AdvBounce:= 1; + end; gtGenericFaller:begin gear^.AdvBounce:= 1; gear^.Radius:= 1; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uGearsRender.pas Sun Dec 17 00:09:24 2017 +0100 @@ -36,6 +36,7 @@ rounded : array[0..MAXROPEPOINTS + 2] of TVertex2f; end; procedure RenderGear(Gear: PGear; x, y: LongInt); +procedure RenderGearTimer(Gear: PGear; x, y: LongInt); procedure DrawHHOrder(); var RopePoints: record @@ -382,7 +383,7 @@ *) dx:= sign * m * Sin(Gear^.Angle * pi / cMaxAngle); dy:= -Cos(Gear^.Angle * pi / cMaxAngle); - if cLaserSighting then + if cLaserSighting or cLaserSightingSniper then begin lx:= GetLaunchX(HH^.CurAmmoType, sign * m, Gear^.Angle); ly:= GetLaunchY(HH^.CurAmmoType, Gear^.Angle); @@ -536,7 +537,6 @@ end; defaultPos:= false end; - gtShover: DrawSpriteRotated(sprHandBaseball, hx, hy, sign, aangle + 180); gtFirePunch: begin DrawHedgehog(sx, sy, @@ -633,13 +633,18 @@ case CurAmmoGear^.Kind of gtShotgunShot, gtDEagleShot, - gtSniperRifleShot, - gtShover: + gtSniperRifleShot: begin DrawHedgehog(sx, sy, sign, 0, 4, 0); defaultPos:= false; HatVisible:= true - end + end; + gtShover: + begin + DrawHedgehog(sx, sy, sign, 0, 5, 0); + defaultPos:= false; + HatVisible:= true + end end end else @@ -725,6 +730,7 @@ amSkip: DrawSpriteRotated(sprHandSkip, hx, hy, sign, aangle); amClusterBomb: DrawSpriteRotated(sprHandCluster, hx, hy, sign, aangle); amDynamite: DrawSpriteRotated(sprHandDynamite, hx, hy, sign, aangle); + amDuck: DrawSpriteRotatedF(sprHandDuck, hx, hy, 0, sign, aangle); amHellishBomb: DrawSpriteRotated(sprHandHellish, hx, hy, sign, aangle); amGasBomb: DrawSpriteRotated(sprHandCheese, hx, hy, sign, aangle); amMine: DrawSpriteRotated(sprHandMine, hx, hy, sign, aangle); @@ -789,6 +795,7 @@ case amt of amAirAttack, + amNapalm, amMineStrike, amDrillStrike: DrawSpriteRotated(sprHandAirAttack, sx, oy, sign, 0); amPickHammer: DrawHedgehog(sx, sy, @@ -796,7 +803,8 @@ 1, 2, 0); - amTeleport: DrawSpriteRotatedF(sprTeleport, sx, sy, 0, sign, 0); + amTeleport, + amPiano: DrawSpriteRotatedF(sprTeleport, sx, sy, 0, sign, 0); amKamikaze: DrawHedgehog(sx, sy, sign, 1, @@ -814,6 +822,15 @@ 0, sign, 0); + amBaseballBat: + begin + HatVisible:= true; + DrawHedgehog(sx, sy, + sign, + 0, + 5, + 0); + end else DrawHedgehog(sx, sy, sign, @@ -836,9 +853,9 @@ end; case amt of - amBaseballBat: DrawSpriteRotated(sprHandBaseball, - sx - 4 * sign, - sy + 9, sign, aangle); + amBaseballBat: DrawSpritePivotedF(sprHandBaseball, + sx + 9 * sign, + sy + 2, 0, sign, -8, 1, aangle); end; defaultPos:= false @@ -916,26 +933,66 @@ and (HatVisibility > 0) then if DefaultPos then begin - DrawTextureF(curhat, - HatVisibility, - sx, - sy - 5, - (RealTicks div 128 + Gear^.Pos) mod 19, - sign, - 32, - 32); - if curhat^.w > 64 then + // Simple hat with automatic offset + if (curhat^.h = 32) and ((curhat^.w = 32) or (curhat^.w = 64)) then begin - Tint(HH^.Team^.Clan^.Color shl 8 or $FF); + // Frame + tx := (RealTicks div 128 + Gear^.Pos) mod 19; + // Hat offset + ty := 0; + if (tx = 2) or (tx = 7) or (tx = 12) then + ty := 1 + else if tx = 16 then + ty := -1; + // First frame: No tint + DrawTextureF(curhat, + HatVisibility, + sx, + sy - 5 + ty, + 0, + sign, + 32, + 32); + // Second frame: Clan tint (if present) + if (curhat^.w = 64) then + begin + Tint(HH^.Team^.Clan^.Color shl 8 or $FF); + DrawTextureF(curhat, + HatVisibility, + sx, + sy - 5 + ty, + 1, + sign, + 32, + 32); + untint + end + end + else + // Classic animated hat (all frames drawn manually) + begin DrawTextureF(curhat, HatVisibility, sx, sy - 5, - (RealTicks div 128 + Gear^.Pos) mod 19 + 32, + (RealTicks div 128 + Gear^.Pos) mod 19, sign, 32, 32); - untint + // Apply clan tint + if curhat^.w > 64 then + begin + Tint(HH^.Team^.Clan^.Color shl 8 or $FF); + DrawTextureF(curhat, + HatVisibility, + sx, + sy - 5, + (RealTicks div 128 + Gear^.Pos) mod 19 + 32, + sign, + 32, + 32); + untint + end end; if HH^.Team^.hasGone then untint end @@ -949,14 +1006,18 @@ sign*m, 32, 32); - if curhat^.w > 64 then + if (curhat^.w > 64) or ((curhat^.w = 64) and (curhat^.h = 32)) then begin + if ((curhat^.w = 64) and (curhat^.h = 32)) then + tx := 1 + else + tx := 32; Tint(HH^.Team^.Clan^.Color shl 8 or $FF); DrawTextureF(curhat, HatVisibility, sx, sy - 5, - 32, + tx, sign*m, 32, 32); @@ -973,8 +1034,21 @@ amJetpack: DrawSprite(sprJetpack, sx-32, sy-32, 0); end end; *) - if CurAmmoGear <> nil then + if (CurAmmoGear = nil) then + begin + 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); + end; + end; + end + else + begin + aangle:= Gear^.Angle * 180 / cMaxAngle - 90; case CurAmmoGear^.Kind of gtJetpack: begin DrawSprite(sprJetpack, sx-32, sy-32, 0); @@ -991,6 +1065,7 @@ DrawTextureCentered(sx, sy - 40, CurAmmoGear^.Tex); DrawAltWeapon(Gear, sx, sy) end; + gtShover: DrawSpritePivotedF(sprHandBaseball, sx + 9 * sign, sy + 2, CurAmmoGear^.Tag, sign, -8, 1, aangle); end; end end; @@ -1168,17 +1243,17 @@ gtShell: DrawSpriteRotated(sprBazookaShell, x, y, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); gtGrave: begin - DrawTextureF(Gear^.Hedgehog^.Team^.GraveTex, 1, x, y, (GameTicks shr 7+Gear^.uid) and 7, 1, 32, 32); + 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 - (GameTicks mod 1500) / (750 + Gear^.Health))))); + 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 end; - gtBee: DrawSpriteRotatedF(sprBee, x, y, (GameTicks shr 5) mod 2, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); + gtBee: DrawSpriteRotatedF(sprBee, x, y, (RealTicks shr 5) mod 2, 0, DxDy2Angle(Gear^.dY, Gear^.dX)); gtPickHammer: DrawSprite(sprPHammer, x - 16, y - 50 + LongInt(((GameTicks shr 5) and 1) * 2), 0); gtRope: DrawRope(Gear); @@ -1218,7 +1293,7 @@ DrawSprite(sprCase, x - 24, y - 28, 0) else begin - i:= (GameTicks shr 6) mod 64; + i:= (RealTicks shr 6) mod 64; if i > 18 then i:= 0; DrawSprite(sprCase, x - 24, y - 24, i) end @@ -1229,7 +1304,7 @@ DrawSprite(sprFAid, x - 24, y - 28, 0) else begin - i:= ((GameTicks shr 6) + 38) mod 64; + i:= ((RealTicks shr 6) + 38) mod 64; if i > 13 then i:= 0; DrawSprite(sprFAid, x - 24, y - 24, i) end @@ -1240,7 +1315,7 @@ DrawSprite(sprUtility, x - 24, y - 28, 0) else begin - i:= (GameTicks shr 6) mod 70; + i:= (RealTicks shr 6) mod 70; if i > 23 then i:= 0; i:= i mod 12; DrawSprite(sprUtility, x - 24, y - 24, i) @@ -1258,7 +1333,7 @@ DrawSprite(sprExplosivesRoll, x - 24, y - 24, 0) else if Gear^.State and gstAnimation = 0 then begin - i:= (GameTicks shr 6 + Gear^.uid*3) mod 64; + i:= (RealTicks shr 6 + Gear^.uid*3) mod 64; if i > 18 then i:= 0; DrawSprite(sprExplosives, x - 24, y - 24, i) @@ -1294,8 +1369,8 @@ gtClusterBomb: DrawSpriteRotated(sprClusterBomb, x, y, 0, Gear^.DirAngle); gtCluster: DrawSprite(sprClusterParticle, x - 8, y - 8, 0); gtFlame: if Gear^.Tag and 1 = 0 then - DrawTextureF(SpritesData[sprFlame].Texture, 2 / (Gear^.Tag mod 3 + 2), x, y, (GameTicks shr 7 + LongWord(Gear^.Tag)) mod 8, 1, 16, 16) - else DrawTextureF(SpritesData[sprFlame].Texture, 2 / (Gear^.Tag mod 3 + 2), x, y, (GameTicks shr 7 + LongWord(Gear^.Tag)) mod 8, -1, 16, 16); + DrawTextureF(SpritesData[sprFlame].Texture, 2 / (Gear^.Tag mod 3 + 2), x, y, (RealTicks shr 7 + LongWord(Gear^.Tag)) mod 8, 1, 16, 16) + else DrawTextureF(SpritesData[sprFlame].Texture, 2 / (Gear^.Tag mod 3 + 2), x, y, (RealTicks shr 7 + LongWord(Gear^.Tag)) mod 8, -1, 16, 16); gtParachute: begin DrawSprite(sprParachute, x - 24, y - 48, 0); DrawAltWeapon(Gear, x + 1, y - 3) @@ -1316,7 +1391,7 @@ 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, (GameTicks shr 6) mod 12); + gtSwitcher: DrawSprite(sprSwitch, x - 16, y - 56, (RealTicks shr 6) mod 12); gtTarget: begin Tint($FF, $FF, $FF, round($FF * Gear^.Timer / 1000)); DrawSprite(sprTarget, x - 16, y - 16, 0); @@ -1473,11 +1548,18 @@ end end end; + gtDuck: DrawSpriteRotatedF(sprDuck, x, y, 1, Gear^.Tag, + // replace with something based on dx/dy? + Gear^.DirAngle + 10-round(20 * abs(1 - (RealTicks mod round(0.1/max(0.00005,cWindSpeedf))) / round(0.05/max(0.00005,cWindSpeedf))) )); gtGenericFaller: DrawCircle(x, y, 3, 3, $FF, $00, $00, $FF); // debug end; - if Gear^.RenderTimer and (Gear^.Tex <> nil) then - DrawTextureCentered(x + 8, y + 8, Gear^.Tex); if Gear^.State and gstFrozen <> 0 then untint end; +procedure RenderGearTimer(Gear: PGear; x, y: LongInt); +begin +if Gear^.RenderTimer and (Gear^.Tex <> nil) then + DrawTextureCentered(x + 8, y + 8, Gear^.Tex); +end; + end. diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uGearsUtils.pas Sun Dec 17 00:09:24 2017 +0100 @@ -47,6 +47,7 @@ function GearsNear(X, Y: hwFloat; Kind: TGearType; r: LongInt): PGearArrayS; procedure SpawnBoxOfSmth; procedure ShotgunShot(Gear: PGear); +function CanUseTardis(HHGear: PGear): boolean; procedure SetAllToActive; procedure SetAllHHToActive(Ice: boolean); @@ -57,6 +58,7 @@ function WorldWrap(var Gear: PGear): boolean; +function IsHogLocal(HH: PHedgehog): boolean; function MakeHedgehogsStep(Gear: PGear) : boolean; @@ -83,6 +85,7 @@ i, cnt: LongInt; wrap: boolean; bubble: PVisualGear; + s: ansistring; begin if Radius > 4 then AddFileLog('Explosion: at (' + inttostr(x) + ',' + inttostr(y) + ')'); if Radius > 25 then KickFlakes(Radius, X, Y); @@ -174,8 +177,18 @@ Gear^.Active:= true; if Gear^.Kind <> gtFlame then FollowGear:= Gear end; - if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) and (Gear^.State and gstHHDeath = 0) then - Gear^.Hedgehog^.Effects[hePoisoned] := 5; + if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and + (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) and (Gear^.Hedgehog^.Effects[heFrozen] = 0) and + (Gear^.State and gstHHDeath = 0) then + begin + if Gear^.Hedgehog^.Effects[hePoisoned] = 0 then + begin + s:= ansistring(Gear^.Hedgehog^.Name); + AddCaption(FormatA(GetEventString(eidPoisoned), s), cWhiteColor, capgrpMessage); + uStats.HedgehogPoisoned(Gear, AttackingHog) + end; + Gear^.Hedgehog^.Effects[hePoisoned] := 5; + end end; end; @@ -249,7 +262,7 @@ end; procedure ApplyDamage(Gear: PGear; AttackerHog: PHedgehog; Damage: Longword; Source: TDamageSource); -var s: shortstring; +var s: ansistring; vampDmg, tmpDmg, i: Longword; vg: PVisualGear; begin @@ -274,12 +287,12 @@ // was considering pulsing on attack, Tiy thinks it should be permanent while in play //CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State or gstVampiric; inc(CurrentHedgehog^.Gear^.Health,vampDmg); - s:= '+' + IntToStr(vampDmg); - AddCaption(ansistring(s), CurrentHedgehog^.Team^.Clan^.Color, capgrpAmmoinfo); + s:= IntToStr(vampDmg); + AddCaption(FormatA(trmsg[sidHealthGain], s), CurrentHedgehog^.Team^.Clan^.Color, capgrpAmmoinfo); RenderHealth(CurrentHedgehog^); RecountTeamHealth(CurrentHedgehog^.Team); i:= 0; - while i < vampDmg do + while (i < vampDmg) and (i < 1000) do begin vg:= AddVisualGear(hwRound(CurrentHedgehog^.Gear^.X), hwRound(CurrentHedgehog^.Gear^.Y), vgtStraightShot); if vg <> nil then @@ -292,15 +305,16 @@ end; end end; - if (GameFlags and gfKarma <> 0) and (GameFlags and gfInvulnerable = 0) and - (CurrentHedgehog^.Effects[heInvulnerable] = 0) then - begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid - inc(CurrentHedgehog^.Gear^.Karma, tmpDmg); - CurrentHedgehog^.Gear^.LastDamage := CurrentHedgehog; - spawnHealthTagForHH(CurrentHedgehog^.Gear, tmpDmg); + if (GameFlags and gfKarma <> 0) and (GameFlags and gfInvulnerable = 0) and + (CurrentHedgehog^.Effects[heInvulnerable] = 0) then + begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid + inc(CurrentHedgehog^.Gear^.Karma, tmpDmg); + CurrentHedgehog^.Gear^.LastDamage := CurrentHedgehog; + spawnHealthTagForHH(CurrentHedgehog^.Gear, tmpDmg); + end; end; + uStats.HedgehogDamaged(Gear, AttackerHog, Damage, false); - end; if AprilOne and (Gear^.Hedgehog^.Hat = 'fr_tomato') and (Damage > 2) then for i := 0 to random(min(Damage,20))+5 do @@ -474,7 +488,7 @@ PlaySound(sndSplash) else if hwTmp > _0_5 then PlaySound(sndSkip) - else + else if hwTmp > _0_0002 then // arbitrary sanity cutoff. mostly for airmines PlaySound(sndDroplet2); end; @@ -645,6 +659,8 @@ begin CheckGearDrowning := true; Gear^.State := gstDrowning; + if Gear = CurrentHedgehog^.Gear then + TurnTimeLeft := 0; Gear^.RenderTimer := false; if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot) and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then @@ -661,7 +677,10 @@ DrownGear(Gear); Gear^.State := Gear^.State and (not gstHHDriven); s:= ansistring(Gear^.Hedgehog^.Name); - AddCaption(FormatA(GetEventString(eidDrowned), s), cWhiteColor, capgrpMessage); + if Gear^.Hedgehog^.King then + AddCaption(FormatA(GetEventString(eidKingDied), s), cWhiteColor, capgrpMessage) + else + AddCaption(FormatA(GetEventString(eidDrowned), s), cWhiteColor, capgrpMessage); end end else @@ -683,7 +702,7 @@ // check if surface was penetrated // no penetration if center's water distance not smaller than radius - if abs(dist2Water + Gear^.Radius) >= Gear^.Radius then + if ((dist2Water + Gear^.Radius div 2) < 0) or (abs(dist2Water + Gear^.Radius) >= Gear^.Radius) then isImpact:= false else begin @@ -691,16 +710,19 @@ if isDirH then begin tmp:= hwRound(Gear^.X - Gear^.dX); - tmp:= abs(min(tmp - leftX, rightX - tmp)); + if abs(tmp - real(leftX)) < abs(tmp - real(rightX)) then // left edge + isImpact:= (abs(tmp-real(leftX)) >= Gear^.Radius) and (Gear^.dX.isNegative) + else + isImpact:= (abs(tmp-real(rightX)) >= Gear^.Radius) and (not Gear^.dX.isNegative); end else begin tmp:= hwRound(Gear^.Y - Gear^.dY); tmp:= abs(cWaterLine - tmp); + // there was an impact if distance was >= radius + isImpact:= (tmp >= Gear^.Radius) and (not Gear^.dY.isNegative); end; - // there was an impact if distance was >= radius - isImpact:= (tmp >= Gear^.Radius) end; end; // end of submersible end; // end of not skipping @@ -763,22 +785,22 @@ RecountTeamHealth(tempTeam); end; -function CountNonZeroz(x, y, r, c: LongInt; mask: LongWord): LongInt; +function CountLand(x, y, r, c: LongInt; mask, antimask: LongWord): LongInt; var i: LongInt; count: LongInt = 0; begin if (y and LAND_HEIGHT_MASK) = 0 then for i:= max(x - r, 0) to min(x + r, LAND_WIDTH - 1) do - if Land[y, i] and mask <> 0 then - begin + if (Land[y, i] and mask <> 0) and (Land[y, i] and antimask = 0) then + begin inc(count); if count = c then - begin - CountNonZeroz:= count; + begin + CountLand:= count; exit + end; end; - end; - CountNonZeroz:= count; + CountLand:= count; end; function isSteadyPosition(x, y, r, c: LongInt; mask: Longword): boolean; @@ -860,27 +882,32 @@ repeat inc(y, 2); until (y >= cWaterLine) or - ((not ignoreOverlap) and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, $FFFF) = 0)) or - (ignoreOverlap and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, lfLandMask) = 0)); + (ignoreOverLap and (CountLand(x, y, Gear^.Radius - 1, 1, $FF00, 0) = 0)) or + (not ignoreOverLap and (CountLand(x, y, Gear^.Radius - 1, 1, $FFFF, 0) = 0)); + sy:= y; repeat inc(y); until (y >= cWaterLine) or - ((not ignoreOverlap) and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, $FFFF) <> 0)) or - (ignoreOverlap and (CountNonZeroz(x, y, Gear^.Radius - 1, 1, lfLandMask) <> 0)); + (ignoreOverlap and + (CountLand(x, y, Gear^.Radius - 1, 1, $FFFF, 0) <> 0)) or + (not ignoreOverlap and + (CountLand(x, y, Gear^.Radius - 1, 1, lfLandMask, 0) <> 0)); if (y - sy > Gear^.Radius * 2) and (y < cWaterLine) and (((Gear^.Kind = gtExplosives) and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 60, 60)) and (isSteadyPosition(x, y+1, Gear^.Radius - 1, 3, $FFFF) - or (CountNonZeroz(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, $FFFF) > Gear^.Radius) + or (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, $FFFF, 0) > Gear^.Radius) )) or ((Gear^.Kind <> gtExplosives) and (ignoreNearObjects or NoGearsToAvoid(x, y - Gear^.Radius, 110, 110)) - )) then + and (isSteadyPosition(x, y+1, Gear^.Radius - 1, 3, lfIce) + or (CountLand(x, y+1, Gear^.Radius - 1, Gear^.Radius+1, $FFFF, lfIce) <> 0) + ))) then begin ar[cnt].X:= x; if withFall then @@ -975,7 +1002,10 @@ while t <> nil do begin if (t <> Gear) and (t^.Kind = Kind) then - if not((hwSqr(Gear^.X - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1) then + if (not ((hwSqr(Gear^.X - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1)) or + ((WorldEdge = weWrap) and ( + (not ((hwSqr(Gear^.X - int2hwFloat(RightX-LeftX) - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1)) or + (not ((hwSqr(Gear^.X + int2hwFloat(RightX-LeftX) - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > _1)))) then begin CheckGearNear:= t; exit; @@ -1145,6 +1175,35 @@ DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), cShotgunRadius) end; +// Returns true if the given hog gear can use the tardis +function CanUseTardis(HHGear: PGear): boolean; +var usable: boolean; + i, j, cnt: LongInt; + HH: PHedgehog; +begin +(* + Conditions for not activating. + 1. Hog is last of his clan + 2. Sudden Death is in play + 3. Hog is a king +*) + usable:= true; + HH:= HHGear^.Hedgehog; + if HHGear <> nil then + if (HHGear = nil) or (HH^.King) or (SuddenDeathDmg) then + usable:= false; + cnt:= 0; + for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do + for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do + if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) + and ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) + and (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then + inc(cnt); + if (cnt < 2) then + usable:= false; + CanUseTardis:= usable; +end; + procedure AmmoShove(Ammo: PGear; Damage, Power: LongInt); var t: PGearArray; Gear: PGear; @@ -1335,6 +1394,7 @@ var t: PGear; s: Longword; + xc, xc_left, xc_right, yc: hwFloat; begin r:= r*r; s:= 0; @@ -1342,15 +1402,22 @@ t := GearsList; while t <> nil do begin - if (t^.Kind = Kind) - and ((X - t^.X)*(X - t^.X) + (Y - t^.Y)*(Y-t^.Y) < int2hwFloat(r)) then - begin - inc(s); - SetLength(GearsNearArray, s); - GearsNearArray[s - 1] := t; - end; - t := t^.NextGear; - end; + xc:= (X - t^.X)*(X - t^.X); + xc_left:= ((X - int2hwFloat(RightX-LeftX)) - t^.X)*((X - int2hwFloat(RightX-LeftX)) - t^.X); + xc_right := ((X + int2hwFloat(RightX-LeftX)) - t^.X)*((X + int2hwFloat(RightX-LeftX)) - t^.X); + yc:= (Y - t^.Y)*(Y - t^.Y); + if (t^.Kind = Kind) + and ((xc + yc < int2hwFloat(r)) + or ((WorldEdge = weWrap) and + ((xc_left + yc < int2hwFloat(r)) or + (xc_right + yc < int2hwFloat(r))))) then + begin + inc(s); + SetLength(GearsNearArray, s); + GearsNearArray[s - 1] := t; + end; + t := t^.NextGear; + end; GearsNear.size:= s; GearsNear.ar:= @GearsNearArray @@ -1586,7 +1653,15 @@ Scale:= hwFloat2Float(Gear^.Density * hwAbs(Gear^.dY) + hwAbs(Gear^.dX)) / 1.5; State:= ord(sprBoing) end; - PlaySound(sndMelonImpact, true) + if Gear^.Kind = gtDuck then + PlaySound(sndDuckDrop, true) + else + PlaySound(sndMelonImpact, true) +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); end; end. diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uIO.pas --- a/hedgewars/uIO.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uIO.pas Sun Dec 17 00:09:24 2017 +0100 @@ -457,7 +457,8 @@ CurrentHedgehog^ do if (State and gstChooseTarget) <> 0 then begin - isCursorVisible:= false; + if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoTargetAfter) <> 0 then + isCursorVisible:= false; if not CurrentTeam^.ExtDriven then begin if fromAI then @@ -470,10 +471,13 @@ TargetPoint.X:= CursorPoint.X - WorldDx; TargetPoint.Y:= cScreenHeight - CursorPoint.Y - WorldDy; end; + if (WorldEdge <> weBounce) then + TargetPoint.X:= CalcWorldWrap(TargetPoint.X, 0); SendIPCXY('p', TargetPoint.X, TargetPoint.Y); end else begin + TargetPoint.X:= CalcWorldWrap(TargetPoint.X, 0); TargetPoint.X:= putX; TargetPoint.Y:= putY end; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uInputHandler.pas --- a/hedgewars/uInputHandler.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uInputHandler.pas Sun Dec 17 00:09:24 2017 +0100 @@ -30,7 +30,8 @@ //procedure MaskModifier(var code: LongInt; modifier: LongWord); procedure MaskModifier(Modifier: shortstring; var code: LongInt); procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); -procedure ProcessMouseWheel(x, y: LongInt); +//procedure ProcessMouseWheel(x, y: LongInt); +procedure ProcessMouseWheel(y: LongInt); procedure ProcessKey(event: TSDL_KeyboardEvent); inline; procedure ProcessKey(code: LongInt; KeyDown: boolean); @@ -172,7 +173,7 @@ begin if (code < cKeyMaxIndex - 2) // means not mouse buttons and KeyDown - and (not ((CurrentBinds[code] = 'put')) or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r')) + and (not ((CurrentBinds[code] = 'put') or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r'))) and (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) then bShowAmmoMenu:= false; @@ -232,8 +233,10 @@ var mwheelupCode, mwheeldownCode: Integer; -procedure ProcessMouseWheel(x, y: LongInt); +//procedure ProcessMouseWheel(x, y: LongInt); +procedure ProcessMouseWheel(y: LongInt); begin + // we don't use //writelntoconsole('[MOUSEWHEEL] '+inttostr(x)+', '+inttostr(y)); if y > 0 then begin @@ -321,7 +324,7 @@ for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+char(48+i); for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i); - loadBinds('dbind', cPathz[ptData] + '/settings.ini'); + loadBinds('dbind', cPathz[ptConfig] + '/settings.ini'); end; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uLand.pas Sun Dec 17 00:09:24 2017 +0100 @@ -53,7 +53,7 @@ x, yd, yu: LongInt; targetMask: Word; begin - tmpsurf:= LoadDataImage(ptCurrTheme, 'Border', ifCritical or ifIgnoreCaps or ifTransparent); + tmpsurf:= LoadDataImage(ptCurrTheme, 'Border', ifCritical or ifIgnoreCaps or ifColorKey); // if mask only, all land gets filled with landtex and therefore needs borders if maskOnly then @@ -165,6 +165,96 @@ end end; +procedure ColorizeLandFast(mapsurf: PSDL_Surface); +var ltexsurf: PSDL_Surface; + i: LongInt; + ltlnp, srcp, dstp, stopp: Pointer; + c: SizeInt; +begin + ltexsurf:= LoadDataImage(ptCurrTheme, 'LandTex', ifCritical or ifIgnoreCaps); + + // pointer to current line of ltexsurf pixels. will be moved from line to line + ltlnp:= ltexsurf^.pixels; + // pointer to mapsurf pixels. will jump forward after every move() + dstp:= mapsurf^.pixels; + + // time to get serious + SDL_LockSurface(mapsurf); + SDL_LockSurface(ltexsurf); + + // for now only fill a row with the height of landtex. do vertical copies within mapsurf after + + // do this loop for each line of ltexsurf (unless we run out of map height first) + for i:= 1 to min(ltexsurf^.h, mapsurf^.h) do + begin + // amount of pixels to write in first move() + c:= ltexsurf^.pitch; + + // protect from odd cases where landtex wider than map + if c > mapsurf^.pitch then + c:= mapsurf^.pitch; + + // write line of landtex to mapsurf + move(ltlnp^, dstp^, c); + + // fill the rest of the line by copying left-to-right until full + + // new src is start of line that we've just written to + srcp:= dstp; + // set stop pointer to start of next pixel line of mapsurf + stopp:= dstp + mapsurf^.pitch; + // move dst pointer to after what we've just written + inc(dstp, c); + + // loop until dstp went past end of line + while dstp < stopp do + begin + // copy all from left of dstp to right of it (or just fill the gap if smaller) + c:= min(dstp-srcp, stopp-dstp); + move(srcp^, dstp^, c); + inc(dstp, c); + end; + + // move to next line in ltexsurf + inc(ltlnp, ltexsurf^.pitch); + end; + + // we don't need ltexsurf itself anymore -> cleanup + ltlnp:= nil; + SDL_UnlockSurface(ltexsurf); + SDL_FreeSurface(ltexsurf); + ltexsurf:= nil; + + // from now on only copy pixels within mapsurf + + // copy all the already written lines at once for that get number of written bytes so far + // already written pixels are between start and current dstp + srcp:= mapsurf^.pixels; + + // first byte after end of pixels + stopp:= srcp + (mapsurf^.pitch * mapsurf^.h); + + while dstp < stopp do + begin + // copy all from before dstp to after (or just fill the gap if smaller) + c:= min(dstp-srcp, stopp-dstp); + // worried about size of c with humongous maps? don't be: + // the OS wouldn't have allowed allocation of object with size > max of SizeInt anyway + move(srcp^, dstp^, c); + inc(dstp, c); + end; + + // cleanup + srcp:= nil; + dstp:= nil; + stopp:= nil; + SDL_UnlockSurface(mapsurf); + + // freed in freeModule() below + LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifColorKey); + if (LandBackSurface <> nil) and GrayScale then Surface2GrayScale(LandBackSurface); +end; + procedure ColorizeLand(Surface: PSDL_Surface); var tmpsurf: PSDL_Surface; r: TSDL_Rect; @@ -188,7 +278,7 @@ SDL_FreeSurface(tmpsurf); // freed in freeModule() below - LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifTransparent); + LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifColorKey); if (LandBackSurface <> nil) and GrayScale then Surface2GrayScale(LandBackSurface); end; @@ -277,7 +367,7 @@ tmpsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, LAND_WIDTH, LAND_HEIGHT, 32, RMask, GMask, BMask, AMask); if checkFails(tmpsurf <> nil, 'Error creating pre-land surface', true) then exit; - ColorizeLand(tmpsurf); + ColorizeLandFast(tmpsurf); if gameFlags and gfShoppaBorder = 0 then DrawBorderFromImage(tmpsurf); AddOnLandObjects(tmpsurf); @@ -454,11 +544,11 @@ if mirror then begin // not critical because if no R we can fallback to mirrored L - tmpsurf:= LoadDataImage(ptForts, SpawnClansArray[i]^.Teams[0]^.FortName + 'R', ifAlpha or ifTransparent or ifIgnoreCaps); + tmpsurf:= LoadDataImage(ptForts, SpawnClansArray[i]^.Teams[0]^.FortName + 'R', ifAlpha or ifColorKey or ifIgnoreCaps); // fallback if tmpsurf = nil then begin - tmpsurf:= LoadDataImage(ptForts, SpawnClansArray[i]^.Teams[0]^.FortName + 'L', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps); + tmpsurf:= LoadDataImage(ptForts, SpawnClansArray[i]^.Teams[0]^.FortName + 'L', ifAlpha or ifCritical or ifColorKey or ifIgnoreCaps); BlitImageAndGenerateCollisionInfo(leftX + sectionWidth * i + ((sectionWidth - tmpsurf^.w) div 2), LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf, 0, true); end else @@ -467,7 +557,7 @@ end else begin - tmpsurf:= LoadDataImage(ptForts, SpawnClansArray[i]^.Teams[0]^.FortName + 'L', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps); + tmpsurf:= LoadDataImage(ptForts, SpawnClansArray[i]^.Teams[0]^.FortName + 'L', ifAlpha or ifCritical or ifColorKey or ifIgnoreCaps); BlitImageAndGenerateCollisionInfo(leftX + sectionWidth * i + ((sectionWidth - tmpsurf^.w) div 2), LAND_HEIGHT - tmpsurf^.h, tmpsurf^.w, tmpsurf); SDL_FreeSurface(tmpsurf); end; @@ -507,11 +597,11 @@ x, y, cpX, cpY: Longword; mapName: shortstring; begin -tmpsurf:= LoadDataImage(ptMapCurrent, 'mask', ifAlpha or ifTransparent or ifIgnoreCaps); +tmpsurf:= LoadDataImage(ptMapCurrent, 'mask', ifAlpha or ifColorKey or ifIgnoreCaps); if tmpsurf = nil then begin mapName:= ExtractFileName(cPathz[ptMapCurrent]); - tmpsurf:= LoadDataImage(ptMissionMaps, mapName + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps); + tmpsurf:= LoadDataImage(ptMissionMaps, mapName + '/mask', ifAlpha or ifColorKey or ifIgnoreCaps); end; @@ -549,7 +639,7 @@ if not disableLandBack then begin // freed in freeModule() below - LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifTransparent); + LandBackSurface:= LoadDataImage(ptCurrTheme, 'LandBackTex', ifIgnoreCaps or ifColorKey); if (LandBackSurface <> nil) and GrayScale then Surface2GrayScale(LandBackSurface) end; @@ -566,11 +656,11 @@ begin WriteLnToConsole('Loading land from file...'); AddProgress; -tmpsurf:= LoadDataImage(ptMapCurrent, 'map', ifAlpha or ifTransparent or ifIgnoreCaps); +tmpsurf:= LoadDataImage(ptMapCurrent, 'map', ifAlpha or ifColorKey or ifIgnoreCaps); if tmpsurf = nil then begin mapName:= ExtractFileName(cPathz[ptMapCurrent]); - tmpsurf:= LoadDataImage(ptMissionMaps, mapName + '/map', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps); + tmpsurf:= LoadDataImage(ptMissionMaps, mapName + '/map', ifAlpha or ifCritical or ifColorKey or ifIgnoreCaps); if not allOK then exit; end; // (bare) Sanity check. Considering possible LongInt comparisons as well as just how much system memoery it would take @@ -599,26 +689,27 @@ end; procedure DrawBottomBorder; // broken out from other borders for doing a floor-only map, or possibly updating bottom during SD -var x, w, c: Longword; +var x, w, c, y: Longword; begin for w:= 0 to 23 do for x:= leftX to rightX do begin - Land[Longword(cWaterLine) - 1 - w, x]:= lfIndestructible; - if (x + w) mod 32 < 16 then + y:= Longword(cWaterLine) - 1 - w; + Land[y, x]:= lfIndestructible; + if (x + y) mod 32 < 16 then c:= AMask else c:= AMask or RMask or GMask; // FF00FFFF if (cReducedQuality and rqBlurryLand) = 0 then - LandPixels[Longword(cWaterLine) - 1 - w, x]:= c + LandPixels[y, x]:= c else - LandPixels[(Longword(cWaterLine) - 1 - w) div 2, x div 2]:= c + LandPixels[y div 2, x div 2]:= c end end; procedure GenMap; -var x, y, w, c: Longword; +var x, y, w, c, c2: Longword; map, mask: shortstring; begin hasBorder:= false; @@ -630,36 +721,33 @@ //if ((GameFlags and gfForts) <> 0) or (Pathz[ptMapCurrent] <> '') then // FillChar(Land,SizeOf(TCollisionArray),0);*) - if (GameFlags and gfForts) = 0 then - if cPathz[ptMapCurrent] <> '' then - begin - map:= cPathz[ptMapCurrent] + '/map.png'; - mask:= cPathz[ptMapCurrent] + '/mask.png'; - if (not(pfsExists(map)) and pfsExists(mask)) then - begin - maskOnly:= true; - LoadMask; - GenLandSurface - end - else LoadMap; - end - else + if cPathz[ptMapCurrent] <> '' then + begin + map:= cPathz[ptMapCurrent] + '/map.png'; + mask:= cPathz[ptMapCurrent] + '/mask.png'; + if (not(pfsExists(map)) and pfsExists(mask)) then begin - WriteLnToConsole('Generating land...'); - case cMapGen of - mgRandom: GenTemplated(EdgeTemplates[SelectTemplate]); - mgMaze : begin ResizeLand(4096,2048); GenMaze; end; - mgPerlin: begin ResizeLand(4096,2048); GenPerlin; end; - mgDrawn : GenDrawnMap; - mgForts : begin GameFlags:= (GameFlags or gfForts or gfDivideTeams); MakeFortsMap(); end; - else - OutError('Unknown mapgen', true); - end; - if cMapGen <> mgForts then - GenLandSurface + maskOnly:= true; + LoadMask; + GenLandSurface end + else LoadMap; + end else - MakeFortsMap; + begin + WriteLnToConsole('Generating land...'); + case cMapGen of + mgRandom: GenTemplated(EdgeTemplates[SelectTemplate]); + mgMaze : begin ResizeLand(4096,2048); GenMaze; end; + mgPerlin: begin ResizeLand(4096,2048); GenPerlin; end; + mgDrawn : GenDrawnMap; + mgForts : begin GameFlags:= (GameFlags or gfForts or gfDivideTeams); MakeFortsMap(); end; + else + OutError('Unknown mapgen', true); + end; + if cMapGen <> mgForts then + GenLandSurface + end; AddProgress; @@ -704,20 +792,24 @@ begin Land[y, leftX + w]:= lfIndestructible; Land[y, rightX - w]:= lfIndestructible; - if (y + w) mod 32 < 16 then + if (y + leftX + w) mod 32 < 16 then c:= AMask else c:= AMask or RMask or GMask; // FF00FFFF + if (y + rightX - w) mod 32 < 16 then + c2:= AMask + else + c2:= AMask or RMask or GMask; // FF00FFFF if (cReducedQuality and rqBlurryLand) = 0 then begin LandPixels[y, leftX + w]:= c; - LandPixels[y, rightX - w]:= c; + LandPixels[y, rightX - w]:= c2; end else begin LandPixels[y div 2, (leftX + w) div 2]:= c; - LandPixels[y div 2, (rightX - w) div 2]:= c; + LandPixels[y div 2, (rightX - w) div 2]:= c2; end; end; @@ -886,16 +978,15 @@ if digest = '' then digest:= s else - checkFails(s = digest, 'Different maps generated, sorry', true); + checkFails(s = digest, 'Different map or critical resources loaded, sorry', true); end; procedure chSendLandDigest(var s: shortstring); -var adler, i: LongInt; +var i: LongInt; begin - adler:= 1; for i:= 0 to LAND_HEIGHT-1 do - adler:= Adler32Update(adler, @Land[i,0], LAND_WIDTH); - s:= 'M' + IntToStr(adler) + cScriptName; + syncedPixelDigest:= Adler32Update(syncedPixelDigest, @Land[i,0], LAND_WIDTH*2); + s:= 'M' + IntToStr(syncedPixelDigest); // + cScriptName; script name is no longer needed. scripts are hashed ScriptSetString('LandDigest', s); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uLandObjects.pas Sun Dec 17 00:09:24 2017 +0100 @@ -35,7 +35,7 @@ implementation uses uStore, uConsts, uConsole, uRandom, uSound , uTypes, uVariables, uDebug, uUtils - , uPhysFSLayer; + , uPhysFSLayer, adler32, uRenderUtils; const MaxRects = 512; MAXOBJECTRECTS = 16; @@ -46,9 +46,10 @@ PRectArray = ^TRectsArray; TThemeObject = record Surf, Mask: PSDL_Surface; - inland: TSDL_Rect; + inland: array[0..Pred(MAXOBJECTRECTS)] of TSDL_Rect; outland: array[0..Pred(MAXOBJECTRECTS)] of TSDL_Rect; - rectcnt: Longword; + inrectcnt: Longword; + outrectcnt: Longword; Width, Height: Longword; Maxcnt: Longword; end; @@ -258,7 +259,10 @@ bRes: boolean; begin if girSurf = nil then - girSurf:= LoadDataImageAltPath(ptCurrTheme, ptGraphics, 'Girder', ifCritical or ifTransparent or ifIgnoreCaps); + girSurf:= LoadDataImageAltPath(ptCurrTheme, ptGraphics, 'Girder', ifCritical or ifColorKey or ifIgnoreCaps); + +for y := 0 to girsurf^.h-1 do + syncedPixelDigest:= Adler32Update(syncedPixelDigest, @PByteArray(girsurf^.pixels)^[y*girsurf^.pitch], girsurf^.w*4); girderHeight:= girSurf^.h; @@ -355,22 +359,27 @@ var i: Longword; bRes: boolean; begin -with Obj do - if CheckLand(inland, x, y, lfBasic) then - begin + with Obj do begin bRes:= true; i:= 1; - while bRes and (i <= rectcnt) do + while bRes and (i <= inrectcnt) do + begin + bRes:= CheckLand(inland[i], x, y, lfBasic); + inc(i) + end; + + i:= 1; + while bRes and (i <= outrectcnt) do begin bRes:= CheckLand(outland[i], x, y, 0); inc(i) end; + if bRes then - bRes:= not CheckIntersect(x, y, Width, Height) - end - else - bRes:= false; -CheckCanPlace:= bRes; + bRes:= not CheckIntersect(x, y, Width, Height); + + CheckCanPlace:= bRes; + end end; function TryPut(var Obj: TThemeObject): boolean; @@ -390,6 +399,10 @@ repeat y:= topY+32; // leave room for a hedgie to teleport in repeat + + if (inland[1].x = 0) and (inland[1].y = 0) and (inland[1].w = 0) and (inland[1].h = 0) then + y := LAND_HEIGHT - Height; + if CheckCanPlace(x, y, Obj) then begin ar[cnt].x:= x; @@ -459,15 +472,10 @@ inc(x, getrandom(12) + 12) until x >= LAND_WIDTH - Width; bRes:= cnt <> 0; -AddFileLog('CHECKPOINT 004'); if bRes then begin i:= getrandom(cnt); - r.x:= ar[i].X; - r.y:= ar[i].Y; - r.w:= Width; - r.h:= Height; - SDL_UpperBlit(Obj.Surf, nil, Surface, @r); + copyToXY(Obj.Surf, Surface, ar[i].X, ar[i].Y); AddRect(ar[i].x - 32, ar[i].y - 32, Width + 64, Height + 64); dec(Maxcnt) end @@ -488,7 +496,7 @@ procedure ReadThemeInfo(var ThemeObjects: TThemeObjects; var SprayObjects: TSprayObjects); var s, key: shortstring; f: PFSFile; - i: LongInt; + i, y: LongInt; ii, t: Longword; c2: TSDL_Color; begin @@ -561,6 +569,29 @@ SDSkyColor.g:= SkyColor.g; SDSkyColor.b:= SkyColor.b; end + else if key = 'sd-tint' then + begin + i:= Pos(',', s); + SDTint.r:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + i:= Pos(',', s); + SDTint.g:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + i:= Pos(',', s); + SDTint.b:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + SDTint.a:= StrToInt(Trim(s)); + if GrayScale + then + begin + t:= round(SDTint.r * RGB_LUMINANCE_RED + SDTint.g * RGB_LUMINANCE_GREEN + SDTint.b * RGB_LUMINANCE_BLUE); + if t > 255 then + t:= 255; + SDTint.r:= t; + SDTint.g:= t; + SDTint.b:= t + end; + end else if key = 'border' then begin i:= Pos(',', s); @@ -652,36 +683,55 @@ with ThemeObjects.objs[Pred(ThemeObjects.Count)] do begin i:= Pos(',', s); - Surf:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i))), ifTransparent or ifIgnoreCaps or ifCritical); + Surf:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i))), ifColorKey or ifIgnoreCaps or ifCritical); Width:= Surf^.w; Height:= Surf^.h; - Mask:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i)))+'_mask', ifTransparent or ifIgnoreCaps); + Mask:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i)))+'_mask', ifColorKey or ifIgnoreCaps); Delete(s, 1, i); i:= Pos(',', s); Maxcnt:= StrToInt(Trim(Copy(s, 1, Pred(i)))); Delete(s, 1, i); if (Maxcnt < 1) or (Maxcnt > MAXTHEMEOBJECTS) then OutError('Object''s max count should be between 1 and '+ inttostr(MAXTHEMEOBJECTS) +' (it was '+ inttostr(Maxcnt) +').', true); - with inland do - begin - i:= Pos(',', s); - x:= StrToInt(Trim(Copy(s, 1, Pred(i)))); - Delete(s, 1, i); - i:= Pos(',', s); - y:= StrToInt(Trim(Copy(s, 1, Pred(i)))); - Delete(s, 1, i); - i:= Pos(',', s); - w:= StrToInt(Trim(Copy(s, 1, Pred(i)))); - Delete(s, 1, i); - i:= Pos(',', s); - h:= StrToInt(Trim(Copy(s, 1, Pred(i)))); - Delete(s, 1, i); - CheckRect(Width, Height, x, y, w, h) - end; + for y := 0 to Surf^.h-1 do + syncedPixelDigest:= Adler32Update(syncedPixelDigest, @PByteArray(Surf^.pixels)^[y*Surf^.pitch], Surf^.w*4); + + inrectcnt := 0; + + for ii := 1 to Length(S) do + if S[ii] = ',' then + inc(inrectcnt); + + if inrectcnt mod 2 = 0 then + inrectcnt := 1 + else begin + i:= Pos(',', s); + inrectcnt:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + end; + + for ii:= 1 to inrectcnt do + with inland[ii] do + begin + i:= Pos(',', s); + x:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + i:= Pos(',', s); + y:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + i:= Pos(',', s); + w:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + i:= Pos(',', s); + h:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + CheckRect(Width, Height, x, y, w, h) + end; + i:= Pos(',', s); - rectcnt:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + outrectcnt:= StrToInt(Trim(Copy(s, 1, Pred(i)))); Delete(s, 1, i); - for ii:= 1 to rectcnt do + for ii:= 1 to outrectcnt do with outland[ii] do begin i:= Pos(',', s); @@ -693,7 +743,7 @@ i:= Pos(',', s); w:= StrToInt(Trim(Copy(s, 1, Pred(i)))); Delete(s, 1, i); - if ii = rectcnt then + if ii = outrectcnt then h:= StrToInt(Trim(s)) else begin @@ -703,6 +753,7 @@ end; CheckRect(Width, Height, x, y, w, h) end; + end; end else if key = 'spray' then @@ -711,13 +762,33 @@ with SprayObjects.objs[Pred(SprayObjects.Count)] do begin i:= Pos(',', s); - Surf:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i))), ifTransparent or ifIgnoreCaps); + Surf:= LoadDataImage(ptCurrTheme, Trim(Copy(s, 1, Pred(i))), ifAlpha or ifIgnoreCaps); Width:= Surf^.w; Height:= Surf^.h; Delete(s, 1, i); Maxcnt:= StrToInt(Trim(s)); end; end + else if key = 'water-animation' then + begin + i:= Pos(',', s); + watFrames:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + i:= Pos(',', s); + watFrameTicks:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + watMove:= StrToInt(Trim(s)); + end + else if key = 'sd-water-animation' then + begin + i:= Pos(',', s); + watSDFrames:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + i:= Pos(',', s); + watSDFrameTicks:= StrToInt(Trim(Copy(s, 1, Pred(i)))); + Delete(s, 1, i); + watSDMove:= StrToInt(Trim(s)); + end else if key = 'flakes' then begin i:= Pos(',', s); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uLandUtils.pas --- a/hedgewars/uLandUtils.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uLandUtils.pas Sun Dec 17 00:09:24 2017 +0100 @@ -42,6 +42,7 @@ lx:= LongInt(LAND_WIDTH) - 1; +// use maximum available map width if there is no special world edge if WorldEdge = weNone then begin playWidth:= LAND_WIDTH; @@ -50,6 +51,13 @@ EXIT; end; +// keep fort distance consistent if we're in wrap mode on fort map +if (cMapGen = mgForts) and (WorldEdge = weWrap) then + begin + // edges were adjusted already in MakeFortsMap() in uLand + EXIT; + end; + ly:= LongInt(LAND_HEIGHT) - 1; // find most left land pixels and set leftX accordingly diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uLocale.pas --- a/hedgewars/uLocale.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uLocale.pas Sun Dec 17 00:09:24 2017 +0100 @@ -22,7 +22,7 @@ interface uses uTypes; -const MAX_EVENT_STRINGS = 100; +const MAX_EVENT_STRINGS = 255; procedure LoadLocale(FileName: shortstring); function Format(fmt: shortstring; var arg: shortstring): shortstring; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uMisc.pas Sun Dec 17 00:09:24 2017 +0100 @@ -164,6 +164,7 @@ Rewrite(f, 1); if IOResult = 0 then begin + writeResult:= 0; // suppress fpc hint BlockWrite(f, head, sizeof(head), writeResult); BlockWrite(f, image^.buffer^, size, writeResult); Close(f); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uPhysFSLayer.pas --- a/hedgewars/uPhysFSLayer.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uPhysFSLayer.pas Sun Dec 17 00:09:24 2017 +0100 @@ -61,6 +61,7 @@ function PHYSFS_seek(f: PFSFile; pos: QWord): LongBool; cdecl; external PhysfsLibName; function PHYSFS_flush(f: PFSFile): LongBool; cdecl; external PhysfsLibName; function PHYSFS_close(f: PFSFile): LongBool; cdecl; external PhysfsLibName; +function PHYSFS_setBuffer(f: PFSFile; pos: QWord): LongBool; cdecl; external PhysfsLibName; function PHYSFS_exists(fname: PChar): LongBool; cdecl; external PhysfsLibName; function PHYSFS_mkdir(path: PChar): LongBool; cdecl; external PhysfsLibName; function PHYSFS_getLastError(): PChar; cdecl; external PhysfsLibName; @@ -84,8 +85,12 @@ end; function pfsOpenRead(fname: shortstring): PFSFile; +var f: PFSFile; begin - exit(PHYSFS_openRead(Str2PChar(fname))); + f:= PHYSFS_openRead(Str2PChar(fname)); + if f <> nil then + PHYSFS_setBuffer(f, 4096); + exit(f); end; function pfsOpenWrite(fname: shortstring): PFSFile; @@ -189,11 +194,13 @@ procedure pfsMount(path: PChar; mountpoint: PChar); begin + system.writeln('Mounting ',path,' at ', mountpoint); PHYSFS_mount(path, mountpoint, false) end; procedure pfsMountAtRoot(path: PChar); begin + system.writeln('Mounting ',path,' at root'); pfsMount(path, PChar(_S'/')); end; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uRender.pas --- a/hedgewars/uRender.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uRender.pas Sun Dec 17 00:09:24 2017 +0100 @@ -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 DrawSpritePivotedF(Sprite: TSprite; X, Y, Frame, Dir, PivotX, PivotY: LongInt; Angle: real); procedure DrawTexture (X, Y: LongInt; Texture: PTexture); inline; procedure DrawTexture (X, Y: LongInt; Texture: PTexture; Scale: GLfloat); @@ -73,6 +74,7 @@ procedure FinishRender(); function isAreaOffscreen(X, Y, Width, Height: LongInt): boolean; inline; +function isCircleOffscreen(X, Y, RadiusSquared: LongInt): boolean; inline; // 0 => not offscreen, <0 => left/top of screen >0 => right/below of screen function isDxAreaOffscreen(X, Width: LongInt): LongInt; inline; @@ -103,8 +105,8 @@ implementation -uses {$IFNDEF PAS2C} StrUtils, {$ENDIF}uVariables, uUtils, uConsts - {$IFDEF GL2}, uMatrix, uConsole{$ENDIF}, uPhysFSLayer, uDebug; +uses {$IFNDEF PAS2C} StrUtils, {$ENDIF}uVariables, uUtils + {$IFDEF GL2}, uMatrix, uConsole{$ENDIF}, uConsts; {$IFDEF USE_TOUCH_INTERFACE} const @@ -147,6 +149,20 @@ isAreaOffscreen:= (isDxAreaOffscreen(X, Width) <> 0) or (isDyAreaOffscreen(Y, Height) <> 0); end; +function isCircleOffscreen(X, Y, RadiusSquared: LongInt): boolean; inline; +var dRightX, dBottomY, dLeftX, dTopY: LongInt; +begin + dRightX:= (X - ViewRightX); + dBottomY:= (Y - ViewBottomY); + dLeftX:= (ViewLeftX - X); + dTopY:= (ViewTopY - Y); + isCircleOffscreen:= + ((dRightX > 0) and (sqr(dRightX) > RadiusSquared)) or + ((dBottomY > 0) and (sqr(dBottomY) > RadiusSquared)) or + ((dLeftX > 0) and (sqr(dLeftX) > RadiusSquared)) or + ((dTopY > 0) and (sqr(dTopY) > RadiusSquared)) +end; + function isDxAreaOffscreen(X, Width: LongInt): LongInt; inline; begin if X > ViewRightX then exit(1); @@ -1131,11 +1147,8 @@ if Angle <> 0 then begin - // sized doubled because the sprite might occupy up to 1.4 * of it's - // original size in each dimension, because it is rotated - if isDxAreaOffscreen(X - SpritesData[Sprite].Width, 2 * SpritesData[Sprite].Width) <> 0 then - exit; - if isDYAreaOffscreen(Y - SpritesData[Sprite].Height, 2 * SpritesData[Sprite].Height) <> 0 then + // Check the bounding circle + if isCircleOffscreen(X, Y, sqr(SpritesData[Sprite].Width) + sqr(SpritesData[Sprite].Height)) then exit; end else @@ -1164,6 +1177,43 @@ end; +procedure DrawSpritePivotedF(Sprite: TSprite; X, Y, Frame, Dir, PivotX, PivotY: LongInt; Angle: real); +begin +if Angle <> 0 then + begin + // Check the bounding circle + // Assuming the pivot point is inside the sprite's rectangle, the farthest possible point is 3/2 of its diagonal away from the center + if isCircleOffscreen(X, Y, 9 * (sqr(SpritesData[Sprite].Width) + sqr(SpritesData[Sprite].Height)) div 4) then + exit; + end +else + begin + if isDxAreaOffscreen(X - SpritesData[Sprite].Width div 2, SpritesData[Sprite].Width) <> 0 then + exit; + if isDYAreaOffscreen(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 rotation around the pivot after (conditional) mirroring +if Angle <> 0 then + begin + openglTranslatef(PivotX, PivotY, 0); + openglRotatef(Angle, 0, 0, 1); + openglTranslatef(-PivotX, -PivotY, 0); + end; + +DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame); + +openglPopMatrix; +end; + procedure DrawTextureRotated(Texture: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); begin @@ -1733,19 +1783,31 @@ end; procedure DrawWaves(Dir, dX, dY, oX: LongInt; tnt: Byte); -var first, count, topy, lx, rx, spriteHeight, spriteWidth: LongInt; - lw, nWaves, shift: GLfloat; +var first, count, topy, lx, rx, spriteHeight, spriteWidth, waterSpeed: LongInt; + waterFrames, waterFrameTicks, frame : LongWord; + lw, nWaves, shift, realHeight: GLfloat; sprite: TSprite; begin // note: spriteHeight is the Height of the wave sprite while // cWaveHeight describes how many pixels of it will be above waterline if SuddenDeathDmg then - sprite:= sprSDWater + begin + sprite:= sprSDWater; + waterFrames:= watSDFrames; + waterFrameTicks:= watSDFrameTicks; + waterSpeed:= watSDMove; + end else + begin sprite:= sprWater; - + waterFrames:= watFrames; + waterFrameTicks:= watFrameTicks; + waterSpeed:= watMove; + end; + spriteHeight:= SpritesData[sprite].Height; +realHeight:= SpritesData[sprite].Texture^.ry / waterFrames; // shift parameters by wave height // ( ox and dy are used to create different horizontal and vertical offsets @@ -1806,14 +1868,19 @@ nWaves:= lw / spriteWidth; shift:= - nWaves / 2; -TextureBuffer[3].X:= shift + ((LongInt(RealTicks shr 6) * Dir + dX) mod spriteWidth) / (spriteWidth - 1); -TextureBuffer[3].Y:= 0; +if waterFrames > 1 then + frame:= RealTicks div waterFrameTicks mod waterFrames +else + frame:= 0; + +TextureBuffer[3].X:= shift + ((LongInt((RealTicks * waterSpeed div 100) shr 6) * Dir + dX) mod spriteWidth) / (spriteWidth - 1); +TextureBuffer[3].Y:= frame * realHeight; TextureBuffer[5].X:= TextureBuffer[3].X + nWaves; -TextureBuffer[5].Y:= 0; +TextureBuffer[5].Y:= frame * realHeight; TextureBuffer[4].X:= TextureBuffer[5].X; -TextureBuffer[4].Y:= SpritesData[sprite].Texture^.ry; +TextureBuffer[4].Y:= (frame+1) * realHeight; TextureBuffer[2].X:= TextureBuffer[3].X; -TextureBuffer[2].Y:= SpritesData[sprite].Texture^.ry; +TextureBuffer[2].Y:= (frame+1) * realHeight; if (WorldEdge = weSea) then begin @@ -1821,15 +1888,15 @@ // left side TextureBuffer[1].X:= TextureBuffer[3].X - nWaves; - TextureBuffer[1].Y:= 0; + TextureBuffer[1].Y:= frame * realHeight; TextureBuffer[0].X:= TextureBuffer[1].X; - TextureBuffer[0].Y:= SpritesData[sprite].Texture^.ry; + TextureBuffer[0].Y:= (frame+1) * realHeight; // right side TextureBuffer[7].X:= TextureBuffer[5].X + nWaves; - TextureBuffer[7].Y:= 0; + TextureBuffer[7].Y:= frame * realHeight; TextureBuffer[6].X:= TextureBuffer[7].X; - TextureBuffer[6].Y:= SpritesData[sprite].Texture^.ry; + TextureBuffer[6].Y:= (frame+1) * realHeight; end; glBindTexture(GL_TEXTURE_2D, SpritesData[sprite].Texture^.id); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uRenderUtils.pas --- a/hedgewars/uRenderUtils.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uRenderUtils.pas Sun Dec 17 00:09:24 2017 +0100 @@ -144,38 +144,74 @@ procedure copyToXY(src, dest: PSDL_Surface; destX, destY: LongInt); inline; begin + // copy from complete src copyToXYFromRect(src, dest, 0, 0, src^.w, src^.h, destX, destY); end; procedure copyToXYFromRect(src, dest: PSDL_Surface; srcX, srcY, srcW, srcH, destX, destY: LongInt); -var i, j, maxDest, maxSrc, iX, iY: LongInt; +var spi, dpi, iX, iY, dX, dY, lX, lY, aT: LongInt; srcPixels, destPixels: PLongWordArray; - r0, g0, b0, a0, r1, g1, b1, a1: Byte; + rD, gD, bD, aD, rT, gT, bT: Byte; begin - maxDest:= (dest^.pitch div 4) * dest^.h; - maxSrc:= (src^.pitch div 4) * src^.h; - SDL_LockSurface(src); SDL_LockSurface(dest); srcPixels:= src^.pixels; destPixels:= dest^.pixels; - for iX:= 0 to srcW - 1 do - for iY:= 0 to srcH - 1 do + // what's the offset between src and dest coords? + dX:= destX - srcX; + dY:= destY - srcY; + + // let's figure out where the rectangle we can actually copy ends + lX:= min(srcX + srcW, src^.w) - 1; + if lX + dx >= dest^.w then lX:= dest^.w - dx - 1; + lY:= min(srcY + srcH, src^.h) - 1; + if lY + dy >= dest^.h then lY:= dest^.h - dy - 1; + + for iX:= srcX to lX do + for iY:= srcY to lY do begin - i:= (destY + iY) * (dest^.pitch div 4) + (destX + iX); - j:= (srcY + iY) * (src^.pitch div 4) + (srcX + iX); - if (i < maxDest) and (j < maxSrc) and (srcPixels^[j] and AMask <> 0) then + // src pixel index + spi:= iY * src^.w + iX; + // dest pixel index + dpi:= (iY + dY) * dest^.w + (iX + dX); + + // get src alpha (and set it as target alpha for now) + aT:= (srcPixels^[spi] and AMask) shr AShift; + + // src pixel opaque? + if aT = 255 then begin - SDL_GetRGBA(destPixels^[i], dest^.format, @r0, @g0, @b0, @a0); - SDL_GetRGBA(srcPixels^[j], src^.format, @r1, @g1, @b1, @a1); - r0:= (r0 * (255 - LongInt(a1)) + r1 * LongInt(a1)) div 255; - g0:= (g0 * (255 - LongInt(a1)) + g1 * LongInt(a1)) div 255; - b0:= (b0 * (255 - LongInt(a1)) + b1 * LongInt(a1)) div 255; - a0:= a0 + ((255 - LongInt(a0)) * a1 div 255); - destPixels^[i]:= SDL_MapRGBA(dest^.format, r0, g0, b0, a0); + // just copy full pixel + destPixels^[dpi]:= srcPixels^[spi]; + continue; + end; + + // get dst alpha (without shift for now) + aD:= (destPixels^[dpi] and AMask) shr AShift; + + // dest completely transparent? + if aD = 0 then + begin + // just copy src pixel + destPixels^[dpi]:= srcPixels^[spi]; + continue; end; + + // looks like some blending is necessary + + // set color of target RGB to src for now + SDL_GetRGB(srcPixels^[spi], src^.format, @rT, @gT, @bT); + SDL_GetRGB(destPixels^[dpi], dest^.format, @rD, @gD, @bD); + // note: this is not how to correctly blend RGB, just sayin' (R,G,B are not linear...) + rT:= (rD * (255 - aT) + rT * aT) div 255; + gT:= (gD * (255 - aT) + gT * aT) div 255; + bT:= (bD * (255 - aT) + bT * aT) div 255; + aT:= aD + ((255 - LongInt(aD)) * aT div 255); + + destPixels^[dpi]:= SDL_MapRGBA(dest^.format, rT, gT, bT, Byte(aT)); + end; SDL_UnlockSurface(src); @@ -184,7 +220,7 @@ procedure DrawSprite2Surf(sprite: TSprite; dest: PSDL_Surface; x,y: LongInt); inline; begin - DrawSpriteFrame2Surf(sprite, dest, x, y, 0); + DrawSpriteFrame2Surf(sprite, dest, x, y, 0); end; procedure DrawSpriteFrame2Surf(sprite: TSprite; dest: PSDL_Surface; x,y,frame: LongInt); @@ -300,7 +336,7 @@ WriteInRoundRect(finalSurface, 0, 0, Color, font, s, maxLength); - checkFails(SDL_SetColorKey(finalSurface, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, false); + checkFails(SDL_SetColorKey(finalSurface, SDL_TRUE, 0) = 0, errmsgTransparentSet, false); RenderStringTexLim:= Surface2Tex(finalSurface, false); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uScript.pas Sun Dec 17 00:09:24 2017 +0100 @@ -23,7 +23,7 @@ * This unit defines, implements and registers functions and * variables/constants bindings for usage in Lua scripts. * - * Please keep http://hedgewars.org/kb/LuaAPI up to date! + * Please keep https://hedgewars.org/kb/LuaAPI up to date! * * Note: If you add a new function, make sure to test if _all_ parameters * work as intended! (Especially conversions errors can sneak in @@ -223,7 +223,7 @@ function LuaToGearTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(TGearType))) or (i > ord(High(TGearType))) then begin LuaCallError('Invalid gearType!', call, paramsyntax); @@ -236,7 +236,7 @@ function LuaToVisualGearTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(TVisualGearType))) or (i > ord(High(TVisualGearType))) then begin LuaCallError('Invalid visualGearType!', call, paramsyntax); @@ -249,7 +249,7 @@ function LuaToAmmoTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(TAmmoType))) or (i > ord(High(TAmmoType))) then begin LuaCallError('Invalid ammoType!', call, paramsyntax); @@ -262,7 +262,7 @@ function LuaToStatInfoTypeOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(TStatInfoType))) or (i > ord(High(TStatInfoType))) then begin LuaCallError('Invalid statInfoType!', call, paramsyntax); @@ -275,7 +275,7 @@ function LuaToSoundOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(TSound))) or (i > ord(High(TSound))) then begin LuaCallError('Invalid soundId!', call, paramsyntax); @@ -288,10 +288,10 @@ function LuaToHogEffectOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(THogEffect))) or (i > ord(High(THogEffect))) then begin - LuaCallError('Invalid gear type!', call, paramsyntax); + LuaCallError('Invalid effect type!', call, paramsyntax); LuaToHogEffectOrd:= -1; end else @@ -301,7 +301,7 @@ function LuaToCapGroupOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(TCapGroup))) or (i > ord(High(TCapGroup))) then begin LuaCallError('Invalid capgroup type!', call, paramsyntax); @@ -314,7 +314,7 @@ function LuaToSpriteOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(TSprite))) or (i > ord(High(TSprite))) then begin LuaCallError('Invalid sprite id!', call, paramsyntax); @@ -327,7 +327,7 @@ function LuaToMapGenOrd(L : Plua_State; i: LongInt; call, paramsyntax: shortstring): LongInt; inline; begin if lua_isnoneornil(L, i) then i:= -1 - else i:= lua_tointeger(L, i); + else i:= Trunc(lua_tonumber(L, i)); if (i < ord(Low(TMapGen))) or (i > ord(High(TMapGen))) then begin LuaCallError('Invalid mapgen id!', call, paramsyntax); @@ -350,7 +350,7 @@ function lc_band(L: PLua_State): LongInt; Cdecl; begin if CheckLuaParamCount(L, 2, 'band', 'value1, value2') then - lua_pushinteger(L, lua_tointeger(L, 2) and lua_tointeger(L, 1)) + lua_pushnumber(L, Trunc(lua_tonumber(L, 2)) and Trunc(lua_tonumber(L, 1))) else lua_pushnil(L); lc_band := 1; @@ -359,7 +359,7 @@ function lc_bor(L: PLua_State): LongInt; Cdecl; begin if CheckLuaParamCount(L, 2, 'bor', 'value1, value2') then - lua_pushinteger(L, lua_tointeger(L, 2) or lua_tointeger(L, 1)) + lua_pushnumber(L, Trunc(lua_tonumber(L, 2)) or Trunc(lua_tonumber(L, 1))) else lua_pushnil(L); lc_bor := 1; @@ -368,7 +368,7 @@ function lc_bnot(L: PLua_State): LongInt; Cdecl; begin if CheckLuaParamCount(L, 1, 'bnot', 'value') then - lua_pushinteger(L, (not lua_tointeger(L, 1))) + lua_pushnumber(L, (not Trunc(lua_tonumber(L, 1)))) else lua_pushnil(L); lc_bnot := 1; @@ -377,7 +377,7 @@ function lc_div(L: PLua_State): LongInt; Cdecl; begin if CheckLuaParamCount(L, 2, 'div', 'dividend, divisor') then - lua_pushinteger(L, lua_tointeger(L, 1) div lua_tointeger(L, 2)) + lua_pushnumber(L, Trunc(lua_tonumber(L, 1)) div Trunc(lua_tonumber(L, 2))) else lua_pushnil(L); lc_div := 1; @@ -386,14 +386,14 @@ function lc_getinputmask(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParamCount(L, 0, 'GetInputMask', '') then - lua_pushinteger(L, InputMask); + lua_pushnumber(L, InputMask); lc_getinputmask:= 1 end; function lc_setinputmask(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParamCount(L, 1, 'SetInputMask', 'mask') then - InputMask:= lua_tointeger(L, 1); + InputMask:= Trunc(lua_tonumber(L, 1)); lc_setinputmask:= 0 end; @@ -467,7 +467,7 @@ cBuildMaxDist:= cDefaultBuildMaxDist; end else - CBuildMaxDist:= lua_tointeger(L, 1); + CBuildMaxDist:= Trunc(lua_tonumber(L, 1)); end; lc_setmaxbuilddistance:= 0; end; @@ -539,7 +539,7 @@ function lc_showmission(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParamCount(L, 5, 'ShowMission', 'caption, subcaption, text, icon, time') then - ShowMission(lua_tostringA(L, 1), lua_tostringA(L, 2), lua_tostringA(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5)); + ShowMission(lua_tostringA(L, 1), lua_tostringA(L, 2), lua_tostringA(L, 3), Trunc(lua_tonumber(L, 4)), Trunc(lua_tonumber(L, 5))); lc_showmission:= 0; end; @@ -550,6 +550,33 @@ lc_hidemission:= 0; end; +function lc_setammotexts(L : Plua_State) : LongInt; Cdecl; +const + call = 'SetAmmoTexts'; + params = 'ammoType, name, caption, description'; +begin + if CheckLuaParamCount(L, 4, call, params) then + SetAmmoTexts(TAmmoType(LuaToAmmoTypeOrd(L, 1, call, params)), lua_tostringA(L, 2), lua_tostringA(L, 3), lua_tostringA(L, 4)); + lc_setammotexts:= 0; +end; + +function lc_setammodescriptionappendix(L : Plua_State) : LongInt; Cdecl; +const + call = 'SetAmmoDescriptionAppendix'; + params = 'ammoType, descAppend'; +var + ammoType: TAmmoType; + descAppend: ansistring; +begin + if CheckLuaParamCount(L, 2, call, params) then + begin + ammoType := TAmmoType(LuaToAmmoTypeOrd(L, 1, call, params)); + descAppend := lua_tostringA(L, 2); + trluaammoa[Ammoz[ammoType].NameId] := descAppend; + end; + lc_setammodescriptionappendix := 0; +end; + function lc_enablegameflags(L : Plua_State) : LongInt; Cdecl; var i, n : integer; begin @@ -557,7 +584,7 @@ if CheckAndFetchLuaParamMinCount(L, 1, 'EnableGameFlags', 'gameFlag, ... ', n) then begin for i:= 1 to n do - GameFlags := GameFlags or LongWord(lua_tointeger(L, i)); + GameFlags := GameFlags or LongWord(Trunc(lua_tonumber(L, i))); ScriptSetInteger('GameFlags', GameFlags); end; lc_enablegameflags:= 0; @@ -570,7 +597,7 @@ if CheckAndFetchLuaParamMinCount(L, 1, 'DisableGameFlags', 'gameFlag, ... ', n) then begin for i:= 1 to n do - GameFlags := GameFlags and (not LongWord(lua_tointeger(L, i))); + GameFlags := GameFlags and (not LongWord(Trunc(lua_tonumber(L, i)))); ScriptSetInteger('GameFlags', GameFlags); end; lc_disablegameflags:= 0; @@ -589,7 +616,7 @@ function lc_getgameflag(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParamCount(L, 1, 'GetGameFlag', 'gameflag') then - lua_pushboolean(L, (GameFlags and LongWord(lua_tointeger(L, 1)) <> 0)) + lua_pushboolean(L, (GameFlags and LongWord(Trunc(lua_tonumber(L, 1))) <> 0)) else lua_pushnil(L); lc_getgameflag:= 1; @@ -609,7 +636,7 @@ begin cg:= LuaToCapGroupOrd(L, 3, call, params); if cg >= 0 then - AddCaption(lua_tostringA(L, 1), lua_tointeger(L, 2) shr 8, TCapGroup(cg)); + AddCaption(lua_tostringA(L, 1), Trunc(lua_tonumber(L, 2)) shr 8, TCapGroup(cg)); end end; lc_addcaption:= 0; @@ -638,10 +665,10 @@ begin if CheckLuaParamCount(L, 4,'SpawnFakeHealthCrate', 'x, y, explode, poison') then begin - gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), + gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), HealthCrate, lua_toboolean(L, 3), lua_toboolean(L, 4)); if gear <> nil then - lua_pushinteger(L, gear^.uid) + lua_pushnumber(L, gear^.uid) else lua_pushnil(L) end else @@ -654,10 +681,10 @@ begin if CheckLuaParamCount(L, 4,'SpawnFakeAmmoCrate', 'x, y, explode, poison') then begin - gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), + gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), AmmoCrate, lua_toboolean(L, 3), lua_toboolean(L, 4)); if gear <> nil then - lua_pushinteger(L, gear^.uid) + lua_pushnumber(L, gear^.uid) else lua_pushnil(L) end else @@ -670,10 +697,10 @@ begin if CheckLuaParamCount(L, 4,'SpawnFakeUtilityCrate', 'x, y, explode, poison') then begin - gear := SpawnFakeCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), + gear := SpawnFakeCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), UtilityCrate, lua_toboolean(L, 3), lua_toboolean(L, 4)); if gear <> nil then - lua_pushinteger(L, gear^.uid) + lua_pushnumber(L, gear^.uid) else lua_pushnil(L) end else @@ -688,12 +715,12 @@ if CheckAndFetchParamCount(L, 2, 3, 'SpawnHealthCrate', 'x, y [, health]', n) then begin if n = 3 then - health:= lua_tointeger(L, 3) + health:= Trunc(lua_tonumber(L, 3)) else health:= cHealthCaseAmount; - gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), HealthCrate, health, 0); + gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), HealthCrate, health, 0); if gear <> nil then - lua_pushinteger(L, gear^.uid) + lua_pushnumber(L, gear^.uid) else lua_pushnil(L); end else @@ -708,10 +735,10 @@ if CheckAndFetchParamCount(L, 3, 4, 'SpawnAmmoCrate', 'x, y, content [, amount]', n) then begin if n = 3 then - gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), AmmoCrate, lua_tointeger(L, 3), 0) - else gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), AmmoCrate, lua_tointeger(L, 3), lua_tointeger(L, 4)); + gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), AmmoCrate, Trunc(lua_tonumber(L, 3)), 0) + else gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), AmmoCrate, Trunc(lua_tonumber(L, 3)), Trunc(lua_tonumber(L, 4))); if gear <> nil then - lua_pushinteger(L, gear^.uid) + lua_pushnumber(L, gear^.uid) else lua_pushnil(L); end else @@ -726,10 +753,10 @@ if CheckAndFetchParamCount(L, 3, 4, 'SpawnUtilityCrate', 'x, y, content [, amount]', n) then begin if n = 3 then - gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), UtilityCrate, lua_tointeger(L, 3), 0) - else gear := SpawnCustomCrateAt(lua_tointeger(L, 1), lua_tointeger(L, 2), UtilityCrate, lua_tointeger(L, 3), lua_tointeger(L, 4)); + gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), UtilityCrate, Trunc(lua_tonumber(L, 3)), 0) + else gear := SpawnCustomCrateAt(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2)), UtilityCrate, Trunc(lua_tonumber(L, 3)), Trunc(lua_tonumber(L, 4))); if gear <> nil then - lua_pushinteger(L, gear^.uid) + lua_pushnumber(L, gear^.uid) else lua_pushnil(L); end else @@ -752,16 +779,16 @@ if t >= 0 then begin gt:= TGearType(t); - x:= lua_tointeger(L, 1); - y:= lua_tointeger(L, 2); - s:= lua_tointeger(L, 4); - dx:= int2hwFloat(lua_tointeger(L, 5)) / 1000000; - dy:= int2hwFloat(lua_tointeger(L, 6)) / 1000000; - t:= lua_tointeger(L, 7); + x:= Trunc(lua_tonumber(L, 1)); + y:= Trunc(lua_tonumber(L, 2)); + s:= Trunc(lua_tonumber(L, 4)); + dx:= int2hwFloat(Trunc(lua_tonumber(L, 5))) / 1000000; + dy:= int2hwFloat(Trunc(lua_tonumber(L, 6))) / 1000000; + t:= Trunc(lua_tonumber(L, 7)); gear:= AddGear(x, y, gt, s, dx, dy, t); lastGearByUID:= gear; - lua_pushinteger(L, gear^.uid) + lua_pushnumber(L, gear^.uid) end else lua_pushnil(L); @@ -776,7 +803,7 @@ begin if CheckLuaParamCount(L, 1, 'DeleteGear', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then gear^.Message:= gear^.Message or gmDelete; end; @@ -800,14 +827,14 @@ if s >= 0 then begin vgt:= TVisualGearType(s); - x:= lua_tointeger(L, 1); - y:= lua_tointeger(L, 2); - s:= lua_tointeger(L, 4); + x:= Trunc(lua_tonumber(L, 1)); + y:= Trunc(lua_tonumber(L, 2)); + s:= Trunc(lua_tonumber(L, 4)); c:= lua_toboolean(L, 5); if n = 6 then begin - layer:= lua_tointeger(L, 6); + layer:= Trunc(lua_tonumber(L, 6)); vg:= AddVisualGear(x, y, vgt, s, c, layer); end else @@ -817,7 +844,7 @@ begin lastVisualGearByUID:= vg; uid:= vg^.uid; - lua_pushinteger(L, uid); + lua_pushnumber(L, uid); end; end else @@ -834,7 +861,7 @@ vg:= nil; if CheckLuaParamCount(L, 1, 'DeleteVisualGear', 'vgUid') then begin - vg:= VisualGearByUID(lua_tointeger(L, 1)); + vg:= VisualGearByUID(Trunc(lua_tonumber(L, 1))); if vg <> nil then DeleteVisualGear(vg); end; @@ -843,24 +870,41 @@ lc_deletevisualgear:= 1 end; +function lc_getvisualgeartype(L : Plua_State) : LongInt; Cdecl; +var vg : PVisualGear; +begin + if CheckLuaParamCount(L, 1, 'GetVisualGearType', 'vgUid') then + begin + vg := VisualGearByUID(Trunc(lua_tonumber(L, 1))); + if vg <> nil then + lua_pushnumber(L, ord(vg^.Kind)) + else + lua_pushnil(L); + end + else + lua_pushnil(L); // return value on stack (nil) + lc_getvisualgeartype:= 1 +end; + + function lc_getvisualgearvalues(L : Plua_State) : LongInt; Cdecl; var vg: PVisualGear; begin if CheckLuaParamCount(L, 1, 'GetVisualGearValues', 'vgUid') then begin - vg:= VisualGearByUID(lua_tointeger(L, 1)); + vg:= VisualGearByUID(Trunc(lua_tonumber(L, 1))); if vg <> nil then begin - lua_pushinteger(L, round(vg^.X)); - lua_pushinteger(L, round(vg^.Y)); + lua_pushnumber(L, round(vg^.X)); + lua_pushnumber(L, round(vg^.Y)); lua_pushnumber(L, vg^.dX); lua_pushnumber(L, vg^.dY); lua_pushnumber(L, vg^.Angle); - lua_pushinteger(L, vg^.Frame); - lua_pushinteger(L, vg^.FrameTicks); - lua_pushinteger(L, vg^.State); - lua_pushinteger(L, vg^.Timer); - lua_pushinteger(L, vg^.Tint); + lua_pushnumber(L, vg^.Frame); + lua_pushnumber(L, vg^.FrameTicks); + lua_pushnumber(L, vg^.State); + lua_pushnumber(L, vg^.Timer); + lua_pushnumber(L, vg^.Tint); end else begin @@ -882,13 +926,13 @@ // Param count can be 1-11 at present // if CheckLuaParamCount(L, 11, 'SetVisualGearValues', 'vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint') then // begin - vg:= VisualGearByUID(lua_tointeger(L, 1)); + vg:= VisualGearByUID(Trunc(lua_tonumber(L, 1))); if vg <> nil then begin if not lua_isnoneornil(L, 2) then - vg^.X:= lua_tointeger(L, 2); + vg^.X:= Trunc(lua_tonumber(L, 2)); if not lua_isnoneornil(L, 3) then - vg^.Y:= lua_tointeger(L, 3); + vg^.Y:= Trunc(lua_tonumber(L, 3)); if not lua_isnoneornil(L, 4) then vg^.dX:= lua_tonumber(L, 4); if not lua_isnoneornil(L, 5) then @@ -896,15 +940,15 @@ if not lua_isnoneornil(L, 6) then vg^.Angle:= lua_tonumber(L, 6); if not lua_isnoneornil(L, 7) then - vg^.Frame:= lua_tointeger(L, 7); + vg^.Frame:= Trunc(lua_tonumber(L, 7)); if not lua_isnoneornil(L, 8) then - vg^.FrameTicks:= lua_tointeger(L, 8); + vg^.FrameTicks:= Trunc(lua_tonumber(L, 8)); if not lua_isnoneornil(L, 9) then - vg^.State:= lua_tointeger(L, 9); + vg^.State:= Trunc(lua_tonumber(L, 9)); if not lua_isnoneornil(L, 10) then - vg^.Timer:= lua_tointeger(L, 10); + vg^.Timer:= Trunc(lua_tonumber(L, 10)); if not lua_isnoneornil(L, 11) then - vg^.Tint:= lua_tointeger(L, 11) + vg^.Tint:= Trunc(lua_tonumber(L, 11)) end; // end // else @@ -919,22 +963,22 @@ begin if CheckLuaParamCount(L, 1, 'GetGearValues', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin - lua_pushinteger(L, gear^.Angle); - lua_pushinteger(L, gear^.Power); - lua_pushinteger(L, gear^.WDTimer); - lua_pushinteger(L, gear^.Radius); - lua_pushinteger(L, hwRound(gear^.Density * _10000)); - lua_pushinteger(L, gear^.Karma); + lua_pushnumber(L, gear^.Angle); + lua_pushnumber(L, gear^.Power); + lua_pushnumber(L, gear^.WDTimer); + lua_pushnumber(L, gear^.Radius); + lua_pushnumber(L, hwRound(gear^.Density * _10000)); + lua_pushnumber(L, gear^.Karma); lua_pushnumber(L, gear^.DirAngle); - lua_pushinteger(L, gear^.AdvBounce); - lua_pushinteger(L, Integer(gear^.ImpactSound)); - lua_pushinteger(L, gear^.nImpactSounds); - lua_pushinteger(L, gear^.Tint); - lua_pushinteger(L, gear^.Damage); - lua_pushinteger(L, gear^.Boom) + lua_pushnumber(L, gear^.AdvBounce); + lua_pushnumber(L, Integer(gear^.ImpactSound)); + lua_pushnumber(L, gear^.nImpactSounds); + lua_pushnumber(L, gear^.Tint); + lua_pushnumber(L, gear^.Damage); + lua_pushnumber(L, gear^.Boom) end else begin @@ -958,35 +1002,35 @@ // Currently allows 1-14 params // if CheckLuaParamCount(L, 14, 'SetGearValues', 'gearUid, Angle, Power, WDTimer, Radius, Density, Karma, DirAngle, AdvBounce, ImpactSound, # ImpactSounds, Tint, Damage, Boom') then // begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin if not lua_isnoneornil(L, 2) then - gear^.Angle := lua_tointeger(L, 2); + gear^.Angle := Trunc(lua_tonumber(L, 2)); if not lua_isnoneornil(L, 3) then - gear^.Power := lua_tointeger(L, 3); + gear^.Power := Trunc(lua_tonumber(L, 3)); if not lua_isnoneornil(L, 4) then - gear^.WDTimer := lua_tointeger(L, 4); + gear^.WDTimer := Trunc(lua_tonumber(L, 4)); if not lua_isnoneornil(L, 5) then - gear^.Radius := lua_tointeger(L, 5); + gear^.Radius := Trunc(lua_tonumber(L, 5)); if not lua_isnoneornil(L, 6) then - gear^.Density:= int2hwFloat(lua_tointeger(L, 6)) / 10000; + gear^.Density:= int2hwFloat(Trunc(lua_tonumber(L, 6))) / 10000; if not lua_isnoneornil(L, 7) then - gear^.Karma := lua_tointeger(L, 7); + gear^.Karma := Trunc(lua_tonumber(L, 7)); if not lua_isnoneornil(L, 8) then gear^.DirAngle:= lua_tonumber(L, 8); if not lua_isnoneornil(L, 9) then - gear^.AdvBounce := lua_tointeger(L, 9); + gear^.AdvBounce := Trunc(lua_tonumber(L, 9)); if not lua_isnoneornil(L, 10) then - gear^.ImpactSound := TSound(lua_tointeger(L, 10)); + gear^.ImpactSound := TSound(Trunc(lua_tonumber(L, 10))); if not lua_isnoneornil(L, 11) then - gear^.nImpactSounds := lua_tointeger(L, 11); + gear^.nImpactSounds := Trunc(lua_tonumber(L, 11)); if not lua_isnoneornil(L, 12) then - gear^.Tint := lua_tointeger(L, 12); + gear^.Tint := Trunc(lua_tonumber(L, 12)); if not lua_isnoneornil(L, 13) then - gear^.Damage := lua_tointeger(L, 13); + gear^.Damage := Trunc(lua_tonumber(L, 13)); if not lua_isnoneornil(L, 14) then - gear^.Boom := lua_tointeger(L, 14); + gear^.Boom := Trunc(lua_tonumber(L, 14)); end; // end // else @@ -1001,7 +1045,7 @@ if FollowGear = nil then lua_pushnil(L) else - lua_pushinteger(L, FollowGear^.uid); + lua_pushnumber(L, FollowGear^.uid); end else lua_pushnil(L); @@ -1013,9 +1057,9 @@ begin if CheckLuaParamCount(L, 1, 'GetGearType', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, ord(gear^.Kind)) + lua_pushnumber(L, ord(gear^.Kind)) else lua_pushnil(L); end @@ -1029,9 +1073,9 @@ begin if CheckLuaParamCount(L, 1, 'GetGearMessage', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.message) + lua_pushnumber(L, gear^.message) else lua_pushnil(L); end @@ -1045,9 +1089,9 @@ begin if CheckLuaParamCount(L, 1, 'GetGearElasticity', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, hwRound(gear^.elasticity * _10000)) + lua_pushnumber(L, hwRound(gear^.elasticity * _10000)) else lua_pushnil(L); end @@ -1061,9 +1105,9 @@ begin if CheckLuaParamCount(L, 2, 'SetGearElasticity', 'gearUid, Elasticity') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - gear^.Elasticity:= int2hwFloat(lua_tointeger(L, 2)) / 10000 + gear^.Elasticity:= int2hwFloat(Trunc(lua_tonumber(L, 2))) / 10000 end; lc_setgearelasticity:= 0 end; @@ -1073,9 +1117,9 @@ begin if CheckLuaParamCount(L, 1, 'GetGearFriction', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, hwRound(gear^.friction * _10000)) + lua_pushnumber(L, hwRound(gear^.friction * _10000)) else lua_pushnil(L); end @@ -1089,9 +1133,9 @@ begin if CheckLuaParamCount(L, 2, 'SetGearFriction', 'gearUid, Friction') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - gear^.Friction:= int2hwFloat(lua_tointeger(L, 2)) / 10000 + gear^.Friction:= int2hwFloat(Trunc(lua_tonumber(L, 2))) / 10000 end; lc_setgearfriction:= 0 end; @@ -1101,9 +1145,9 @@ begin if CheckLuaParamCount(L, 2, 'SetGearMessage', 'gearUid, message') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - gear^.message:= lua_tointeger(L, 2); + gear^.message:= Trunc(lua_tonumber(L, 2)); end; lc_setgearmessage:= 0 end; @@ -1113,9 +1157,9 @@ begin if CheckLuaParamCount(L, 1, 'GetGearPos', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.Pos) + lua_pushnumber(L, gear^.Pos) else lua_pushnil(L); end @@ -1129,9 +1173,9 @@ begin if CheckLuaParamCount(L, 2, 'SetGearPos', 'gearUid, value') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - gear^.Pos:= lua_tointeger(L, 2); + gear^.Pos:= Trunc(lua_tonumber(L, 2)); end; lc_setgearpos:= 0 end; @@ -1141,9 +1185,9 @@ begin if CheckLuaParamCount(L, 1, 'GetGearCollisionMask', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.CollisionMask) + lua_pushnumber(L, gear^.CollisionMask) else lua_pushnil(L); end @@ -1157,9 +1201,9 @@ begin if CheckLuaParamCount(L, 2, 'SetGearCollisionMask', 'gearUid, mask') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - gear^.CollisionMask:= lua_tointeger(L, 2); + gear^.CollisionMask:= Trunc(lua_tonumber(L, 2)); end; lc_setgearcollisionmask:= 0 end; @@ -1169,9 +1213,9 @@ begin if CheckLuaParamCount(L, 1, 'GetHogLevel', 'gearUid') then begin - gear := GearByUID(lua_tointeger(L, 1)); + gear := GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then - lua_pushinteger(L, gear^.Hedgehog^.BotLevel) + lua_pushnumber(L, gear^.Hedgehog^.BotLevel) else lua_pushnil(L); end; @@ -1183,9 +1227,9 @@ begin if CheckLuaParamCount(L, 2, 'SetHogLevel', 'gearUid, level') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then - gear^.Hedgehog^.BotLevel:= lua_tointeger(L, 2); + gear^.Hedgehog^.BotLevel:= Trunc(lua_tonumber(L, 2)); end; lc_sethoglevel:= 0 end; @@ -1195,10 +1239,10 @@ begin if CheckLuaParamCount(L, 1, 'GetHogClan', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then begin - lua_pushinteger(L, gear^.Hedgehog^.Team^.Clan^.ClanIndex) + lua_pushnumber(L, gear^.Hedgehog^.Team^.Clan^.ClanIndex) end else lua_pushnil(L); @@ -1213,7 +1257,7 @@ begin if CheckLuaParamCount(L, 1, 'GetClanColor', 'clanIdx') then begin - idx:= lua_tointeger(L, 1); + idx:= Trunc(lua_tonumber(L, 1)); if (not lua_isnumber(L, 1)) then begin LuaError('Argument ''clanIdx'' must be a number!'); @@ -1225,7 +1269,7 @@ lua_pushnil(L); end else - lua_pushinteger(L, ClansArray[idx]^.Color shl 8 or $FF); + lua_pushnumber(L, ClansArray[idx]^.Color shl 8 or $FF); end else lua_pushnil(L); // return value on stack (nil) @@ -1240,10 +1284,10 @@ begin if CheckLuaParamCount(L, 2, 'SetClanColor', 'clan, color') then begin - i:= lua_tointeger(L,1); + i:= Trunc(lua_tonumber(L,1)); if i >= ClansCount then exit(0); clan := ClansArray[i]; - clan^.Color:= lua_tointeger(L, 2) shr 8; + clan^.Color:= Trunc(lua_tonumber(L, 2)) shr 8; for i:= 0 to Pred(clan^.TeamsNumber) do begin @@ -1274,7 +1318,7 @@ begin if CheckLuaParamCount(L, 1, 'GetHogVoicepack', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.Voicepack^.name)) else @@ -1290,7 +1334,7 @@ begin if CheckLuaParamCount(L, 1, 'GetHogGrave', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.GraveName)) else @@ -1306,7 +1350,8 @@ begin if CheckLuaParamCount(L, 1, 'GetHogFlag', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); + // TODO error messages if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.Flag)) else @@ -1317,12 +1362,47 @@ lc_gethogflag:= 1 end; +function lc_gethogfort(L : Plua_State) : LongInt; Cdecl; +var gear : PGear; +begin + if CheckLuaParamCount(L, 1, 'GetHogFort', 'gearUid') then + begin + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); + // TODO error messages + if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then + lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.FortName)) + else + lua_pushnil(L); + end + else + lua_pushnil(L); // return value on stack (nil) + lc_gethogfort:= 1 +end; + +function lc_ishoglocal(L : Plua_State) : LongInt; Cdecl; +var gear : PGear; +begin + if CheckLuaParamCount(L, 1, 'IsHogLocal', 'gearUid') then + begin + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); + // TODO error messages + if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then + lua_pushboolean(L, IsHogLocal(gear^.Hedgehog)) + else + lua_pushnil(L); + end + else + lua_pushnil(L); // return value on stack (nil) + lc_ishoglocal:= 1 +end; + function lc_gethogteamname(L : Plua_State) : LongInt; Cdecl; var gear : PGear; begin if CheckLuaParamCount(L, 1, 'GetHogTeamName', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); + // TODO error messages if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then lua_pushstring(L, str2pchar(gear^.Hedgehog^.Team^.TeamName)) else @@ -1338,7 +1418,7 @@ begin if CheckLuaParamCount(L, 2, 'SetHogTeamName', 'gearUid, name') then begin - gear := GearByUID(lua_tointeger(L, 1)); + gear := GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then begin gear^.Hedgehog^.Team^.TeamName := lua_tostring(L, 2); @@ -1359,7 +1439,7 @@ begin if CheckLuaParamCount(L, 1, 'GetHogName', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then begin lua_pushstring(L, str2pchar(gear^.Hedgehog^.Name)) @@ -1377,7 +1457,7 @@ begin if CheckLuaParamCount(L, 2, 'SetHogName', 'gearUid, name') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then begin gear^.Hedgehog^.Name:= lua_tostring(L, 2); @@ -1394,9 +1474,9 @@ begin if CheckLuaParamCount(L, 1, 'GetTimer', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.Timer) + lua_pushnumber(L, gear^.Timer) else lua_pushnil(L); end @@ -1410,9 +1490,9 @@ begin if CheckLuaParamCount(L, 1, 'GetFlightTime', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.FlightTime) + lua_pushnumber(L, gear^.FlightTime) else lua_pushnil(L); end @@ -1426,9 +1506,9 @@ begin if CheckLuaParamCount(L, 1, 'GetHealth', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.Health) + lua_pushnumber(L, gear^.Health) else lua_pushnil(L); end @@ -1442,9 +1522,9 @@ begin if CheckLuaParamCount(L, 1, 'GetX', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, hwRound(gear^.X)) + lua_pushnumber(L, hwRound(gear^.X)) else lua_pushnil(L); end @@ -1458,9 +1538,9 @@ begin if CheckLuaParamCount(L, 1, 'GetY', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, hwRound(gear^.Y)) + lua_pushnumber(L, hwRound(gear^.Y)) else lua_pushnil(L); end @@ -1474,8 +1554,8 @@ begin if CheckLuaParamCount(L, 2, 'CopyPV', 'fromGearUid, toGearUid') then begin - gears:= GearByUID(lua_tointeger(L, 1)); - geard:= GearByUID(lua_tointeger(L, 2)); + gears:= GearByUID(Trunc(lua_tonumber(L, 1))); + geard:= GearByUID(Trunc(lua_tonumber(L, 2))); if (gears <> nil) and (geard <> nil) then begin geard^.X:= gears^.X; @@ -1492,7 +1572,7 @@ begin if CheckLuaParamCount(L, 1, 'FollowGear', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then FollowGear:= gear end; lc_followgear:= 0 @@ -1506,12 +1586,12 @@ begin if CheckAndFetchParamCount(L, 3, 4, 'HogSay', 'gearUid, text, manner [, vgState]', n) then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin // state defaults to 0 if state param is given if n = 4 then - s:= lua_tointeger(L, 4) + s:= Trunc(lua_tonumber(L, 4)) else s:= 0; vgear:= AddVisualGear(0, 0, vgtSpeechBubble, s, true); @@ -1525,10 +1605,10 @@ end else vgear^.Frame:= gear^.uid; - vgear^.FrameTicks:= lua_tointeger(L, 3); + vgear^.FrameTicks:= Trunc(lua_tonumber(L, 3)); if (vgear^.FrameTicks < 1) or (vgear^.FrameTicks > 3) then vgear^.FrameTicks:= 1; - lua_pushinteger(L, vgear^.Uid); + lua_pushnumber(L, vgear^.Uid); end end else @@ -1544,7 +1624,7 @@ begin if CheckLuaParamCount(L, 1, 'SwitchHog', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); // 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 @@ -1558,8 +1638,14 @@ end; SwitchCurrentHedgehog(gear^.Hedgehog); + AmmoMenuInvalidated:= true; CurrentTeam:= CurrentHedgehog^.Team; + repeat + CurrentTeam^.CurrHedgehog := (CurrentTeam^.CurrHedgehog + 1) mod CurrentTeam^.HedgehogsNumber + until + CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = CurrentHedgehog^.Gear; + gear^.State:= gear^.State or gstHHDriven; gear^.Active := true; gear^.Z := cCurrHHZ; @@ -1581,12 +1667,12 @@ at:= LuaToAmmoTypeOrd(L, 2, call, params); if at >= 0 then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and (gear^.Hedgehog <> nil) then if n = 2 then AddAmmo(gear^.Hedgehog^, TAmmoType(at)) else - SetAmmo(gear^.Hedgehog^, TAmmoType(at), lua_tointeger(L, 3)) + SetAmmo(gear^.Hedgehog^, TAmmoType(at), Trunc(lua_tonumber(L, 3))) end; end; lc_addammo:= 0 @@ -1602,7 +1688,7 @@ begin if CheckLuaParamCount(L, 2, call, params) then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and (gear^.Hedgehog <> nil) then begin at:= LuaToAmmoTypeOrd(L, 2, call, params); @@ -1610,12 +1696,12 @@ begin ammo:= GetAmmoEntry(gear^.Hedgehog^, TAmmoType(at)); if ammo^.AmmoType = amNothing then - lua_pushinteger(L, 0) + lua_pushnumber(L, 0) else - lua_pushinteger(L, ammo^.Count); + lua_pushnumber(L, ammo^.Count); end; end - else lua_pushinteger(L, 0); + else lua_pushnumber(L, 0); end else lua_pushnil(L); @@ -1627,10 +1713,10 @@ begin if CheckLuaParamCount(L, 2, 'SetHealth', 'gearUid, health') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin - gear^.Health:= lua_tointeger(L, 2); + gear^.Health:= Trunc(lua_tonumber(L, 2)); if (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then begin @@ -1651,8 +1737,8 @@ begin if CheckLuaParamCount(L, 2, 'SetTimer', 'gearUid, timer') then begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then gear^.Timer:= lua_tointeger(L, 2) + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); + if gear <> nil then gear^.Timer:= Trunc(lua_tonumber(L, 2)) end; lc_settimer:= 0 end; @@ -1662,8 +1748,8 @@ begin if CheckLuaParamCount(L, 2, 'SetFlightTime', 'gearUid, flighttime') then begin - gear:= GearByUID(lua_tointeger(L, 1)); - if gear <> nil then gear^.FlightTime:= lua_tointeger(L, 2) + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); + if gear <> nil then gear^.FlightTime:= Trunc(lua_tonumber(L, 2)) end; lc_setflighttime:= 0 end; @@ -1680,9 +1766,9 @@ t:= LuaToHogEffectOrd(L, 2, call, params); if t >= 0 then begin - gear := GearByUID(lua_tointeger(L, 1)); + gear := GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and (gear^.Hedgehog <> nil) then - gear^.Hedgehog^.Effects[THogEffect(t)]:= lua_tointeger(L, 3); + gear^.Hedgehog^.Effects[THogEffect(t)]:= Trunc(lua_tonumber(L, 3)); end; end; lc_seteffect := 0; @@ -1700,15 +1786,15 @@ t:= LuaToHogEffectOrd(L, 2, call, params); if t >= 0 then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and (gear^.Hedgehog <> nil) then - lua_pushinteger(L, gear^.Hedgehog^.Effects[THogEffect(t)]) + lua_pushnumber(L, gear^.Hedgehog^.Effects[THogEffect(t)]) else - lua_pushinteger(L, 0) + lua_pushnumber(L, 0) end; end else - lua_pushinteger(L, 0); + lua_pushnumber(L, 0); lc_geteffect:= 1 end; @@ -1717,10 +1803,10 @@ begin if CheckLuaParamCount(L, 2, 'SetState', 'gearUid, state') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin - gear^.State:= lua_tointeger(L, 2); + gear^.State:= Trunc(lua_tonumber(L, 2)); SetAllToActive; end end; @@ -1732,9 +1818,9 @@ begin if CheckLuaParamCount(L, 1, 'GetState', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.State) + lua_pushnumber(L, gear^.State) else lua_pushnil(L) end @@ -1748,9 +1834,9 @@ begin if CheckLuaParamCount(L, 1, 'GetTag', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.Tag) + lua_pushnumber(L, gear^.Tag) else lua_pushnil(L); end @@ -1764,10 +1850,10 @@ begin if CheckLuaParamCount(L, 2, 'SetTag', 'gearUid, tag') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin - gear^.Tag:= lua_tointeger(L, 2); + gear^.Tag:= Trunc(lua_tonumber(L, 2)); SetAllToActive; end end; @@ -1781,6 +1867,19 @@ lc_endgame:= 0 end; +function lc_endturn(L : Plua_State) : LongInt; Cdecl; +var n: LongInt; +const + call = 'EndTurn'; + params = '[noTaunts]'; +begin + if CheckAndFetchParamCount(L, 0, 1, call, params, n) then + if n >= 1 then + LuaNoEndTurnTaunts:= lua_toboolean(L, 1); + LuaEndTurnRequested:= true; + lc_endturn:= 0 +end; + function lc_sendstat(L : Plua_State) : LongInt; Cdecl; var statInfo : TStatInfoType; i, n : LongInt; @@ -1844,6 +1943,27 @@ lc_sendstat:= 0 end; +function lc_sendgameresultoff(L : Plua_State) : LongInt; Cdecl; +begin + L:= L; // avoid compiler hint + uStats.SendGameResultOn := false; + lc_sendgameresultoff:= 0 +end; + +function lc_sendrankingstatsoff(L : Plua_State) : LongInt; Cdecl; +begin + L:= L; // avoid compiler hint + uStats.SendRankingStatsOn := false; + lc_sendrankingstatsoff:= 0 +end; + +function lc_sendachievementsstatsoff(L : Plua_State) : LongInt; Cdecl; +begin + L:= L; // avoid compiler hint + uStats.SendAchievementsStatsOn := false; + lc_sendachievementsstatsoff:= 0 +end; + function lc_sendhealthstatsoff(L : Plua_State) : LongInt; Cdecl; begin L:= L; // avoid compiler hint @@ -1859,10 +1979,10 @@ begin if CheckAndFetchParamCount(L, 4, 5, 'FindPlace', 'gearUid, fall, left, right [, tryHarder]', n) then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); fall:= lua_toboolean(L, 2); - left:= lua_tointeger(L, 3); - right:= lua_tointeger(L, 4); + left:= Trunc(lua_tonumber(L, 3)); + right:= Trunc(lua_tonumber(L, 4)); if n = 5 then tryhard:= lua_toboolean(L, 5) else @@ -1870,7 +1990,7 @@ if gear <> nil then FindPlace(gear, fall, left, right, tryhard); if gear <> nil then - lua_pushinteger(L, gear^.uid) + lua_pushnumber(L, gear^.uid) else lua_pushnil(L); end @@ -1896,7 +2016,7 @@ PlaySound(TSound(s)) else begin - gear:= GearByUID(lua_tointeger(L, 2)); + gear:= GearByUID(Trunc(lua_tonumber(L, 2))); if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then AddVoice(TSound(s),gear^.Hedgehog^.Team^.Voicepack) end; @@ -1917,7 +2037,7 @@ if (np = 6) then ParseCommand('flag ' + lua_tostring(L, 6), true, true); CurrentTeam^.Binds:= DefaultBinds // fails on x64 - //lua_pushinteger(L, LongInt(CurrentTeam)); + //lua_pushnumber(L, LongInt(CurrentTeam)); end; //else //lua_pushnil(L) @@ -1967,6 +2087,53 @@ lc_dismissteam:= 0; end; +function lc_getteamstats(L : Plua_State) : LongInt; Cdecl; +var i: LongInt; +begin + if CheckLuaParamCount(L, 1, 'GetTeamStats', 'teamname') then + begin + if TeamsCount > 0 then + for i:= 0 to Pred(TeamsCount) do + begin + // skip teams that don't have matching name + if TeamsArray[i]^.TeamName <> lua_tostring(L, 1) then + continue; + + lua_newtable(L); + + lua_pushstring(L, str2pchar('Kills')); + lua_pushnumber(L, TeamsArray[i]^.stats.Kills); + lua_settable(L, -3); + + lua_pushstring(L, str2pchar('Suicides')); + lua_pushnumber(L, TeamsArray[i]^.stats.Suicides); + lua_settable(L, -3); + + lua_pushstring(L, str2pchar('AIKills')); + lua_pushnumber(L, TeamsArray[i]^.stats.AIKills); + lua_settable(L, -3); + + lua_pushstring(L, str2pchar('TeamKills')); + lua_pushnumber(L, TeamsArray[i]^.stats.TeamKills); + lua_settable(L, -3); + + lua_pushstring(L, str2pchar('TurnSkips')); + lua_pushnumber(L, TeamsArray[i]^.stats.TurnSkips); + lua_settable(L, -3); + + lua_pushstring(L, str2pchar('TeamDamage')); + lua_pushnumber(L, TeamsArray[i]^.stats.TeamDamage); + lua_settable(L, -3); + + end; + end + else + lua_pushnil(L); + lc_getteamstats:= 1; +end; + + + function lc_addhog(L : Plua_State) : LongInt; Cdecl; var temp: ShortString; begin @@ -1975,7 +2142,7 @@ temp:= 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_pushinteger(L, CurrentHedgehog^.Gear^.uid); + lua_pushnumber(L, CurrentHedgehog^.Gear^.uid); end else lua_pushnil(L); @@ -1987,7 +2154,7 @@ begin if CheckLuaParamCount(L, 2, 'HogTurnLeft', 'gearUid, boolean') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then gear^.dX.isNegative:= lua_toboolean(L, 2); end; @@ -1999,11 +2166,11 @@ begin if CheckLuaParamCount(L, 1, 'GetGearPosition', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin - lua_pushinteger(L, hwRound(gear^.X)); - lua_pushinteger(L, hwRound(gear^.Y)) + lua_pushnumber(L, hwRound(gear^.X)); + lua_pushnumber(L, hwRound(gear^.Y)) end else begin @@ -2026,12 +2193,12 @@ begin if CheckLuaParamCount(L, 3, 'SetGearPosition', 'gearUid, x, y') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin col:= gear^.CollisionIndex >= 0; - x:= lua_tointeger(L, 2); - y:= lua_tointeger(L, 3); + x:= Trunc(lua_tonumber(L, 2)); + y:= Trunc(lua_tonumber(L, 3)); if col then DeleteCI(gear); gear^.X:= int2hwfloat(x); @@ -2049,11 +2216,11 @@ begin if CheckLuaParamCount(L, 1, 'GetGearTarget', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin - lua_pushinteger(L, gear^.Target.X); - lua_pushinteger(L, gear^.Target.Y) + lua_pushnumber(L, gear^.Target.X); + lua_pushnumber(L, gear^.Target.Y) end else begin @@ -2074,11 +2241,11 @@ begin if CheckLuaParamCount(L, 3, 'SetGearTarget', 'gearUid, x, y') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin - gear^.Target.X:= lua_tointeger(L, 2); - gear^.Target.Y:= lua_tointeger(L, 3) + gear^.Target.X:= Trunc(lua_tonumber(L, 2)); + gear^.Target.Y:= Trunc(lua_tonumber(L, 3)) end end; lc_setgeartarget:= 0 @@ -2090,14 +2257,14 @@ begin if CheckLuaParamCount(L, 1, 'GetGearVelocity', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin t:= hwRound(gear^.dX * 1000000); // gear dX determines hog orientation if (gear^.dX.isNegative) and (t = 0) then t:= -1; - lua_pushinteger(L, t); - lua_pushinteger(L, hwRound(gear^.dY * 1000000)) + lua_pushnumber(L, t); + lua_pushnumber(L, hwRound(gear^.dY * 1000000)) end end else @@ -2113,11 +2280,11 @@ begin if CheckLuaParamCount(L, 3, 'SetGearVelocity', 'gearUid, dx, dy') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then begin - gear^.dX:= int2hwFloat(lua_tointeger(L, 2)) / 1000000; - gear^.dY:= int2hwFloat(lua_tointeger(L, 3)) / 1000000; + gear^.dX:= int2hwFloat(Trunc(lua_tonumber(L, 2))) / 1000000; + gear^.dY:= int2hwFloat(Trunc(lua_tonumber(L, 3))) / 1000000; SetAllToActive; end end; @@ -2158,9 +2325,9 @@ if at >= 0 then begin if np = 4 then - ScriptSetAmmo(TAmmoType(at), lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), 1) + ScriptSetAmmo(TAmmoType(at), Trunc(lua_tonumber(L, 2)), Trunc(lua_tonumber(L, 3)), Trunc(lua_tonumber(L, 4)), 1) else - ScriptSetAmmo(TAmmoType(at), lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5)); + ScriptSetAmmo(TAmmoType(at), Trunc(lua_tonumber(L, 2)), Trunc(lua_tonumber(L, 3)), Trunc(lua_tonumber(L, 4)), Trunc(lua_tonumber(L, 5))); end; end; lc_setammo:= 0 @@ -2176,31 +2343,19 @@ begin at:= LuaToAmmoTypeOrd(L, 1, call, params); if at >= 0 then - ScriptSetAmmoDelay(TAmmoType(at), lua_tointeger(L, 2)); + ScriptSetAmmoDelay(TAmmoType(at), Trunc(lua_tonumber(L, 2))); end; lc_setammodelay:= 0 end; -function lc_setammostore(L : Plua_State) : LongInt; Cdecl; -begin - if CheckLuaParamCount(L, 4, 'SetAmmoStore', 'loadouts, probabilities, delays, reinforments') then - begin - ScriptAmmoLoadout:= lua_tostring(L, 1); - ScriptAmmoProbability:= lua_tostring(L, 2); - ScriptAmmoDelay:= lua_tostring(L, 3); - ScriptAmmoReinforcement:= lua_tostring(L, 4); - end; - lc_setammostore:= 0 -end; - function lc_getrandom(L : Plua_State) : LongInt; Cdecl; var m : LongInt; begin if CheckLuaParamCount(L, 1, 'GetRandom', 'number') then begin - m:= lua_tointeger(L, 1); + m:= Trunc(lua_tonumber(L, 1)); if (m > 0) then - lua_pushinteger(L, GetRandom(m)) + lua_pushnumber(L, GetRandom(m)) else begin LuaError('Lua: Tried to pass 0 to GetRandom!'); @@ -2216,7 +2371,7 @@ begin if CheckLuaParamCount(L, 1, 'SetWind', 'windSpeed') then begin - cWindSpeed:= int2hwfloat(lua_tointeger(L, 1)) / 100 * cMaxWindSpeed; + cWindSpeed:= int2hwfloat(Trunc(lua_tonumber(L, 1))) / 100 * cMaxWindSpeed; cWindSpeedf:= SignAs(cWindSpeed,cWindSpeed).QWordValue / SignAs(_1,_1).QWordValue; if cWindSpeed.isNegative then CWindSpeedf := -cWindSpeedf; @@ -2239,9 +2394,9 @@ begin if CheckLuaParamCount(L, 1, 'GetGearRadius', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - lua_pushinteger(L, gear^.Radius) + lua_pushnumber(L, gear^.Radius) else lua_pushnil(L); end @@ -2255,7 +2410,7 @@ begin if CheckLuaParamCount(L, 1, 'GetHogHat', 'gearUid') then begin - gear := GearByUID(lua_tointeger(L, 1)); + gear := GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and ((gear^.Kind = gtHedgehog) or (gear^.Kind = gtGrave)) and (gear^.Hedgehog <> nil) then lua_pushstring(L, str2pchar(gear^.Hedgehog^.Hat)) else @@ -2272,7 +2427,7 @@ begin if CheckLuaParamCount(L, 2, 'SetHogHat', 'gearUid, hat') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if (gear <> nil) and (gear^.Kind = gtHedgehog) and (gear^.Hedgehog <> nil) then begin hat:= lua_tostring(L, 2); @@ -2301,7 +2456,7 @@ if CheckAndFetchLuaParamMinCount(L, 4, call, params, n) then begin if not lua_isnoneornil(L, 5) then - tint := lua_tointeger(L, 5) + tint := Trunc(lua_tonumber(L, 5)) else tint := $FFFFFFFF; if not lua_isnoneornil(L, 6) then behind := lua_toboolean(L, 6) @@ -2316,7 +2471,7 @@ // accept any amount of landflags, loop is never executed if n<9 for i:= 9 to n do - lf:= lf or lua_tointeger(L, i); + lf:= lf or Trunc(lua_tonumber(L, i)); n:= LuaToSpriteOrd(L, 3, call, params); if n >= 0 then @@ -2326,9 +2481,9 @@ LuaError(call + ': ' + EnumToStr(spr) + ' cannot be placed! (required information not loaded)' ) else placed:= ForcePlaceOnLand( - lua_tointeger(L, 1) - SpritesData[spr].Width div 2, - lua_tointeger(L, 2) - SpritesData[spr].Height div 2, - spr, lua_tointeger(L, 4), lf, tint, behind, flipHoriz, flipVert); + Trunc(lua_tonumber(L, 1)) - SpritesData[spr].Width div 2, + Trunc(lua_tonumber(L, 2)) - SpritesData[spr].Height div 2, + spr, Trunc(lua_tonumber(L, 4)), lf, tint, behind, flipHoriz, flipVert); end; end; @@ -2363,7 +2518,7 @@ // accept any amount of landflags, loop is never executed if n<9 for i:= 9 to n do - lf:= lf or lua_tointeger(L, i); + lf:= lf or Trunc(lua_tonumber(L, i)); n:= LuaToSpriteOrd(L, 3, call, params); if n >= 0 then @@ -2373,9 +2528,9 @@ LuaError(call + ': ' + EnumToStr(spr) + ' cannot be placed! (required information not loaded)' ) else EraseLand( - lua_tointeger(L, 1) - SpritesData[spr].Width div 2, - lua_tointeger(L, 2) - SpritesData[spr].Height div 2, - spr, lua_tointeger(L, 4), lf, eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert); + Trunc(lua_tonumber(L, 1)) - SpritesData[spr].Width div 2, + Trunc(lua_tonumber(L, 2)) - SpritesData[spr].Height div 2, + spr, Trunc(lua_tonumber(L, 4)), lf, eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert); end; end; lc_erasesprite:= 0 @@ -2387,20 +2542,34 @@ placed:= false; if CheckLuaParamCount(L, 3, 'PlaceGirder', 'x, y, frameIdx') then placed:= TryPlaceOnLandSimple( - lua_tointeger(L, 1) - SpritesData[sprAmGirder].Width div 2, - lua_tointeger(L, 2) - SpritesData[sprAmGirder].Height div 2, - sprAmGirder, lua_tointeger(L, 3), true, false); + Trunc(lua_tonumber(L, 1)) - SpritesData[sprAmGirder].Width div 2, + Trunc(lua_tonumber(L, 2)) - SpritesData[sprAmGirder].Height div 2, + sprAmGirder, Trunc(lua_tonumber(L, 3)), true, false); lua_pushboolean(L, placed); lc_placegirder:= 1 end; +function lc_placerubber(L : Plua_State) : LongInt; Cdecl; +var placed: boolean; +begin + placed:= false; + if CheckLuaParamCount(L, 3, 'PlaceRubber', 'x, y, frameIdx') then + placed:= TryPlaceOnLand( + Trunc(lua_tonumber(L, 1)) - SpritesData[sprAmRubber].Width div 2, + Trunc(lua_tonumber(L, 2)) - SpritesData[sprAmRubber].Height div 2, + sprAmRubber, Trunc(lua_tonumber(L, 3)), true, lfBouncy); + + lua_pushboolean(L, placed); + lc_placerubber:= 1 +end; + function lc_getcurammotype(L : Plua_State): LongInt; Cdecl; begin if (CurrentHedgehog <> nil) and (CheckLuaParamCount(L, 0, 'GetCurAmmoType', '')) then - lua_pushinteger(L, ord(CurrentHedgehog^.CurAmmoType)) + lua_pushnumber(L, ord(CurrentHedgehog^.CurAmmoType)) else - lua_pushinteger(L, ord(amNothing)); + lua_pushnumber(L, ord(amNothing)); lc_getcurammotype := 1; end; @@ -2424,10 +2593,16 @@ begin if CheckLuaParamCount(L, 1, 'HideHog', 'gearUid') then begin - gear:= GearByUID(lua_tointeger(L, 1)); - HideHog(gear^.hedgehog) + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); + if (gear <> nil) and (gear^.hedgehog <> nil) then + begin + HideHog(gear^.hedgehog); + lua_pushboolean(L, true); + end + else + lua_pushboolean(L, false); end; - lc_hidehog := 0; + lc_hidehog := 1; end; function lc_restorehog(L: Plua_State): LongInt; Cdecl; @@ -2436,7 +2611,7 @@ begin if CheckLuaParamCount(L, 1, 'RestoreHog', 'gearUid') then begin - uid:= LongWord(lua_tointeger(L, 1)); + uid:= LongWord(Trunc(lua_tonumber(L, 1))); if TeamsCount > 0 then for i:= 0 to Pred(TeamsCount) do for h:= 0 to cMaxHHIndex do @@ -2456,10 +2631,10 @@ if CheckLuaParamCount(L, 5, 'TestRectForObstacle', 'x1, y1, x2, y2, landOnly') then begin rtn:= TestRectangleForObstacle( - lua_tointeger(L, 1), - lua_tointeger(L, 2), - lua_tointeger(L, 3), - lua_tointeger(L, 4), + Trunc(lua_tonumber(L, 1)), + Trunc(lua_tonumber(L, 2)), + Trunc(lua_tonumber(L, 3)), + Trunc(lua_tonumber(L, 4)), lua_toboolean(L, 5) ); lua_pushboolean(L, rtn); @@ -2473,7 +2648,7 @@ function lc_getgravity(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParamCount(L, 0, 'GetGravity', '') then - lua_pushinteger(L, hwRound(SignAs(_0_5, cGravity) + (cGravity * 50 / cMaxWindSpeed))); + lua_pushnumber(L, hwRound(SignAs(_0_5, cGravity) + (cGravity * 50 / cMaxWindSpeed))); lc_getgravity:= 1 end; @@ -2481,8 +2656,8 @@ begin if CheckLuaParamCount(L, 1, 'SetGravity', 'percent') then begin - cGravity:= _0_02 * lua_tointeger(L, 1) * cMaxWindSpeed; - cGravityf:= 0.00025 * lua_tointeger(L, 1) * 0.02 + cGravity:= _0_02 * Trunc(lua_tonumber(L, 1)) * cMaxWindSpeed; + cGravityf:= 0.00025 * Trunc(lua_tonumber(L, 1)) * 0.02 end; lc_setgravity:= 0 end; @@ -2492,7 +2667,7 @@ begin if CheckLuaParamCount(L, 1, 'SetWaterLine', 'waterline') then begin - cWaterLine:= lua_tointeger(L,1); + cWaterLine:= Trunc(lua_tonumber(L,1)); AllInactive:= false; iterator:= GearsList; while iterator <> nil do @@ -2515,9 +2690,9 @@ begin if CheckLuaParamCount(L, 2, 'SetAIHintOnGear', 'gearUid, aiHints') then begin - gear:= GearByUID(lua_tointeger(L, 1)); + gear:= GearByUID(Trunc(lua_tonumber(L, 1))); if gear <> nil then - gear^.aihints:= lua_tointeger(L, 2); + gear^.aihints:= Trunc(lua_tonumber(L, 2)); end; lc_setgearaihints:= 0 end; @@ -2536,21 +2711,44 @@ function lc_declareachievement(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParamCount(L, 4, 'DeclareAchievement', 'achievementId, teamname, location, value') then - declareAchievement(lua_tostring(L, 1), lua_tostring(L, 2), lua_tostring(L, 3), lua_tointeger(L, 4)); + declareAchievement(lua_tostring(L, 1), lua_tostring(L, 2), lua_tostring(L, 3), Trunc(lua_tonumber(L, 4))); lc_declareachievement:= 0 end; +function lc_getammoname(L : Plua_state) : LongInt; Cdecl; +var np, at: LongInt; + ignoreOverwrite: Boolean; +const call = 'GetAmmoName'; + params = 'ammoType [, ignoreOverwrite ]'; +begin + if CheckAndFetchParamCountRange(L, 1, 2, call, params, np) then + begin + at:= LuaToAmmoTypeOrd(L, 1, call, params); + ignoreOverwrite := false; + if np > 1 then + ignoreOverwrite := lua_toboolean(L, 2); + if at >= 0 then + if (not ignoreOverwrite) and (length(trluaammo[Ammoz[TAmmoType(at)].NameId]) > 0) then + lua_pushstring(L, PChar(trluaammo[Ammoz[TAmmoType(at)].NameId])) + else + lua_pushstring(L, PChar(trammo[Ammoz[TAmmoType(at)].NameId])); + end + else + lua_pushnil(L); + lc_getammoname:= 1; +end; + function lc_startghostpoints(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParamCount(L, 1, 'StartGhostPoints', 'count') then - startGhostPoints(lua_tointeger(L, 1)); + startGhostPoints(Trunc(lua_tonumber(L, 1))); lc_startghostpoints:= 0 end; function lc_dumppoint(L : Plua_State) : LongInt; Cdecl; begin if CheckLuaParamCount(L, 2, 'DumpPoint', 'x, y') then - dumpPoint(lua_tointeger(L, 1), lua_tointeger(L, 2)); + dumpPoint(Trunc(lua_tonumber(L, 1)), Trunc(lua_tonumber(L, 2))); lc_dumppoint:= 0 end; @@ -2568,17 +2766,17 @@ if CheckAndFetchParamCountRange(L, 2, 4, 'AddPoint', 'x, y [, width [, erase] ]', np) then begin // x - param:= LongInt(lua_tointeger(L,1)); + param:= LongInt(Trunc(lua_tonumber(L,1))); PointsBuffer:= PointsBuffer + char((param shr 8) and $FF); PointsBuffer:= PointsBuffer + char((param and $FF)); // y - param:= LongInt(lua_tointeger(L,2)); + param:= LongInt(Trunc(lua_tonumber(L,2))); PointsBuffer:= PointsBuffer + char((param shr 8) and $FF); PointsBuffer:= PointsBuffer + char((param and $FF)); // width if np > 2 then begin - param:= lua_tointeger(L,3); + param:= Trunc(lua_tonumber(L,3)); param:= (param or $80); // erase if (np > 3) and lua_toboolean(L, 4) then @@ -2615,7 +2813,7 @@ if CheckLuaParamCount(L, 1, call, params) then begin - case lua_tointeger(L, 1) of + case Trunc(lua_tonumber(L, 1)) of HaltTestSuccess : rstring:= 'Success'; HaltTestFailed: rstring:= 'FAILED'; else @@ -2628,7 +2826,7 @@ if cTestLua then begin WriteLnToConsole('Lua test finished, result: ' + rstring); - halt(lua_tointeger(L, 1)); + halt(Trunc(lua_tonumber(L, 1))); end else LuaError('Not in lua test mode, engine will keep running. Reported test result: ' + rstring); @@ -2665,7 +2863,7 @@ procedure ScriptSetInteger(name : shortstring; value : LongInt); begin - lua_pushinteger(luaState, value); + lua_pushnumber(luaState, value); lua_setglobal(luaState, Str2PChar(name)); end; @@ -2678,7 +2876,7 @@ function ScriptGetInteger(name : shortstring) : LongInt; begin lua_getglobal(luaState, Str2PChar(name)); - ScriptGetInteger:= lua_tointeger(luaState, -1); + ScriptGetInteger:= Trunc(lua_tonumber(luaState, -1)); lua_pop(luaState, 1); end; @@ -2689,6 +2887,13 @@ lua_pop(luaState, 1); end; +function ScriptGetAnsiString(name : shortstring) : ansistring; +begin + lua_getglobal(luaState, Str2PChar(name)); + ScriptGetAnsiString:= lua_tostringa(luaState, -1); + lua_pop(luaState, 1); +end; + procedure ScriptOnPreviewInit; begin // not required if there is no script to run @@ -2721,8 +2926,8 @@ // push game variables so they may be modified by the script ScriptSetInteger('CursorX', CursorPoint.X); ScriptSetInteger('CursorY', CursorPoint.Y); -ScriptSetInteger('BorderColor', ExplosionBorderColor); ScriptSetInteger('GameFlags', GameFlags); +ScriptSetInteger('WorldEdge', ord(WorldEdge)); ScriptSetString('Seed', cSeed); ScriptSetInteger('TemplateFilter', cTemplateFilter); ScriptSetInteger('TemplateNumber', LuaTemplateNumber); @@ -2739,6 +2944,7 @@ ScriptSetInteger('MinesNum', cLandMines); ScriptSetInteger('MinesTime', cMinesTime); ScriptSetInteger('MineDudPercent', cMineDudPercent); +ScriptSetInteger('AirMinesNum', cAirMines); ScriptSetInteger('Explosives', cExplosives); ScriptSetInteger('Delay', cInactDelay); ScriptSetInteger('Ready', cReadyDelay); @@ -2746,6 +2952,7 @@ ScriptSetInteger('WaterRise', cWaterRise); ScriptSetInteger('HealthDecrease', cHealthDecrease); ScriptSetInteger('GetAwayTime', cGetAwayTime); +ScriptSetInteger('AmmoTypeMax', Ord(High(TAmmoType))); ScriptSetString('Map', cMapName); ScriptSetString('Theme', Theme); ScriptSetString('Goals', ''); @@ -2759,6 +2966,7 @@ cMapGen := TMapGen(ScriptGetInteger('MapGen')); cFeatureSize := ScriptGetInteger('MapFeatureSize'); GameFlags := ScriptGetInteger('GameFlags'); +WorldEdge := TWorldEdge(ScriptGetInteger('WorldEdge')); cHedgehogTurnTime:= ScriptGetInteger('TurnTime'); cCaseFactor := ScriptGetInteger('CaseFreq'); cHealthCaseProb := ScriptGetInteger('HealthCaseProb'); @@ -2768,6 +2976,7 @@ cLandMines := ScriptGetInteger('MinesNum'); cMinesTime := ScriptGetInteger('MinesTime'); cMineDudPercent := ScriptGetInteger('MineDudPercent'); +cAirMines := ScriptGetInteger('AirMinesNum'); cExplosives := ScriptGetInteger('Explosives'); cInactDelay := ScriptGetInteger('Delay'); cReadyDelay := ScriptGetInteger('Ready'); @@ -2780,7 +2989,7 @@ ParseCommand('map ' + ScriptGetString('Map'), true, true); if ScriptGetString('Theme') <> '' then ParseCommand('theme ' + ScriptGetString('Theme'), true, true); -LuaGoals:= ScriptGetString('Goals'); +LuaGoals:= ScriptGetAnsiString('Goals'); // Support lua changing the ammo layout - assume all hogs have same ammo, note this might leave a few ammo stores lying around. k:= 0; @@ -2839,12 +3048,89 @@ // custom script loader via physfs, passed to lua_load const BUFSIZE = 1024; +var inComment: boolean; +var inQuote: boolean; +var locSum: LongWord; +var braceCount: LongWord; +var wordCount: LongWord; +var lastChar: char; +// ⭒⭐⭒✨⭐⭒✨⭐☆✨⭐✨✧✨☆✨✧✨☆⭒✨☆⭐⭒☆✧✨⭒✨⭐✧⭒☆⭒✧☆✨✧⭐☆✨☆✧⭒✨✧⭒☆⭐☆✧ +function ScriptReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; Cdecl; +var mybuf: PChar; + i: LongInt; +begin + SetRandomSeed(cSeed,true); + mybuf := physfsReader(L, f, sz); + if (mybuf <> nil) and ((sz^) > 0) then + begin + for i:= 0 to sz^-1 do + begin + if (lastChar = '-') and (mybuf[i] = '-') then + inComment := true + // gonna add any non-magic whitespace and skip - just to make comment avoidance easier + else if not inComment and (byte(mybuf[i]) > $20) and (byte(mybuf[i]) < $7F) and (mybuf[i]<>'-') then + begin + AddRandomness(byte(mybuf[i])); // wish I had the seed... + CheckSum := CheckSum xor GetRandom($FFFFFFFF); + end; + lastChar := mybuf[i]; + if (byte(mybuf[i]) = $0D) or (byte(mybuf[i]) = $0A) then + inComment := false + end; + end; + ScriptReader:= mybuf +end; +function ScriptLocaleReader(L: Plua_State; f: PFSFile; sz: Psize_t) : PChar; Cdecl; +var mybuf: PChar; + i: LongInt; +begin + mybuf := physfsReader(L, f, sz); + if (mybuf <> nil) and ((sz^) > 0) then + begin + for i:= 0 to sz^-1 do + begin + if not inComment and (mybuf[i] = '"') and (lastChar <> '\') then + inQuote := not inQuote; + if not inQuote and (lastChar = '-') and (mybuf[i] = '-') then + inComment := true; + if not inComment and (not inQuote) then + locSum := locSum xor (byte(mybuf[i]) shl (i mod 4)); + if not inComment and (not inQuote) and + ((mybuf[i] = '(') or + (mybuf[i] = ')') or + (mybuf[i] = '+') or + (mybuf[i] = '#') or + (braceCount > 2) or + (wordCount > 6)) then + CheckSum := locSum; + if not inComment and (not inQuote) and ((mybuf[i] = '{') or (mybuf[i] = '}')) then + inc(braceCount); + if not inComment and (not inQuote) and + (((byte(mybuf[i]) > $40) and (byte(mybuf[i]) < $5B)) or + ((byte(mybuf[i]) > $60) and (byte(mybuf[i]) < $7B)) or + ((byte(mybuf[i]) >= $30) and (byte(mybuf[i]) < $3A))) then + inc(wordCount); + lastChar := mybuf[i]; + if (byte(mybuf[i]) = $0D) or (byte(mybuf[i]) = $0A) then + inComment := false + end; + end; + ScriptLocaleReader:= mybuf +end; +// ⭒⭐⭒✨⭐⭒✨⭐☆✨⭐✨✧✨☆✨✧✨☆⭒✨☆⭐⭒☆✧✨⭒✨⭐✧⭒☆⭒✧☆✨✧⭐☆✨☆✧⭒✨✧⭒☆⭐☆✧ + procedure ScriptLoad(name : shortstring); var ret : LongInt; s : shortstring; f : PFSFile; buf : array[0..Pred(BUFSIZE)] of byte; begin +inComment:= false; +inQuote:= false; +lastChar:= 'X'; +braceCount:= 0; +wordCount:= 0; +locSum:= 0; s:= cPathz[ptData] + name; if not pfsExists(s) then begin @@ -2856,8 +3142,12 @@ if f = nil then exit; +hedgewarsMountPackage(Str2PChar(copy(s, 1, length(s)-4)+'.hwp')); + physfsReaderSetBuffer(@buf); -ret:= lua_load(luaState, @physfsReader, f, Str2PChar(s)); +if Pos('Locale/',s) <> 0 then + ret:= lua_load(luaState, @ScriptLocaleReader, f, Str2PChar(s)) +else ret:= lua_load(luaState, @ScriptReader, f, Str2PChar(s)); pfsClose(f); if ret <> 0 then @@ -2872,12 +3162,12 @@ lua_pcall(luaState, 0, 0, 0); ScriptLoaded:= true end; -hedgewarsMountPackage(Str2PChar(copy(s, 1, length(s)-4)+'.hwp')); end; procedure SetGlobals; begin ScriptSetInteger('TurnTimeLeft', TurnTimeLeft); +ScriptSetInteger('ReadyTimeLeft', ReadyTimeLeft); ScriptSetInteger('GameTime', GameTicks); ScriptSetInteger('TotalRounds', TotalRounds); ScriptSetInteger('WaterLine', cWaterLine); @@ -2924,6 +3214,7 @@ // It is inconsistent anyway to have some globals be read-only and others not with no indication whatsoever. // -- sheepluva TurnTimeLeft:= ScriptGetInteger('TurnTimeLeft'); +ReadyTimeLeft:= ScriptGetInteger('ReadyTimeLeft'); end; procedure ScriptCall(fname : shortstring); @@ -2983,10 +3274,10 @@ exit(0); SetGlobals; lua_getglobal(luaState, Str2PChar(fname)); -lua_pushinteger(luaState, par1); -lua_pushinteger(luaState, par2); -lua_pushinteger(luaState, par3); -lua_pushinteger(luaState, par4); +lua_pushnumber(luaState, par1); +lua_pushnumber(luaState, par2); +lua_pushnumber(luaState, par3); +lua_pushnumber(luaState, par4); ScriptCall:= 0; if lua_pcall(luaState, 4, 1, 0) <> 0 then begin @@ -2995,7 +3286,7 @@ end else begin - ScriptCall:= lua_tointeger(luaState, -1); + ScriptCall:= Trunc(lua_tonumber(luaState, -1)); lua_pop(luaState, 1) end; GetGlobals; @@ -3010,7 +3301,7 @@ end; lua_getglobal(luaState, Str2PChar(fname)); ScriptExists:= not lua_isnoneornil(luaState, -1); -lua_pop(luaState, -1) +lua_pop(luaState, 1) end; procedure ScriptPrepareAmmoStore; @@ -3117,6 +3408,7 @@ cg : TCapGroup; spr: TSprite; mg : TMapGen; + we : TWorldEdge; begin // initialize lua luaState:= lua_open; @@ -3212,6 +3504,9 @@ for mg:= Low(TMapGen) to High(TMapGen) do ScriptSetInteger(EnumToStr(mg), ord(mg)); +for we:= Low(TWorldEdge) to High(TWorldEdge) do + ScriptSetInteger(EnumToStr(we), ord(we)); + ScriptSetInteger('gstDrowning' , gstDrowning); ScriptSetInteger('gstHHDriven' , gstHHDriven); ScriptSetInteger('gstMoving' , gstMoving); @@ -3265,6 +3560,7 @@ lua_register(luaState, _P'DeleteGear', @lc_deletegear); lua_register(luaState, _P'AddVisualGear', @lc_addvisualgear); lua_register(luaState, _P'DeleteVisualGear', @lc_deletevisualgear); +lua_register(luaState, _P'GetVisualGearType', @lc_getvisualgeartype); lua_register(luaState, _P'GetVisualGearValues', @lc_getvisualgearvalues); lua_register(luaState, _P'SetVisualGearValues', @lc_setvisualgearvalues); lua_register(luaState, _P'GetGearValues', @lc_getgearvalues); @@ -3278,7 +3574,12 @@ lua_register(luaState, _P'WriteLnToConsole', @lc_writelntoconsole); lua_register(luaState, _P'GetGearType', @lc_getgeartype); lua_register(luaState, _P'EndGame', @lc_endgame); +lua_register(luaState, _P'EndTurn', @lc_endturn); +lua_register(luaState, _P'GetTeamStats', @lc_getteamstats); lua_register(luaState, _P'SendStat', @lc_sendstat); +lua_register(luaState, _P'SendGameResultOff', @lc_sendgameresultoff); +lua_register(luaState, _P'SendRankingStatsOff', @lc_sendrankingstatsoff); +lua_register(luaState, _P'SendAchievementsStatsOff', @lc_sendachievementsstatsoff); lua_register(luaState, _P'SendHealthStatsOff', @lc_sendhealthstatsoff); lua_register(luaState, _P'FindPlace', @lc_findplace); lua_register(luaState, _P'SetGearPosition', @lc_setgearposition); @@ -3290,10 +3591,11 @@ lua_register(luaState, _P'ParseCommand', @lc_parsecommand); lua_register(luaState, _P'ShowMission', @lc_showmission); lua_register(luaState, _P'HideMission', @lc_hidemission); +lua_register(luaState, _P'SetAmmoTexts', @lc_setammotexts); +lua_register(luaState, _P'SetAmmoDescriptionAppendix', @lc_setammodescriptionappendix); lua_register(luaState, _P'AddCaption', @lc_addcaption); lua_register(luaState, _P'SetAmmo', @lc_setammo); lua_register(luaState, _P'SetAmmoDelay', @lc_setammodelay); -lua_register(luaState, _P'SetAmmoStore', @lc_setammostore); lua_register(luaState, _P'PlaySound', @lc_playsound); lua_register(luaState, _P'AddTeam', @lc_addteam); lua_register(luaState, _P'AddHog', @lc_addhog); @@ -3308,7 +3610,9 @@ lua_register(luaState, _P'SetClanColor', @lc_setclancolor); lua_register(luaState, _P'GetHogVoicepack', @lc_gethogvoicepack); 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'IsHogLocal', @lc_ishoglocal); lua_register(luaState, _P'GetHogTeamName', @lc_gethogteamname); lua_register(luaState, _P'SetHogTeamName', @lc_sethogteamname); lua_register(luaState, _P'GetHogName', @lc_gethogname); @@ -3354,6 +3658,7 @@ lua_register(luaState, _P'EraseSprite', @lc_erasesprite); lua_register(luaState, _P'PlaceSprite', @lc_placesprite); lua_register(luaState, _P'PlaceGirder', @lc_placegirder); +lua_register(luaState, _P'PlaceRubber', @lc_placerubber); lua_register(luaState, _P'GetCurAmmoType', @lc_getcurammotype); lua_register(luaState, _P'TestRectForObstacle', @lc_testrectforobstacle); lua_register(luaState, _P'GetGravity', @lc_getgravity); @@ -3363,6 +3668,7 @@ lua_register(luaState, _P'SetWeapon', @lc_setweapon); lua_register(luaState, _P'SetCinematicMode', @lc_setcinematicmode); lua_register(luaState, _P'SetMaxBuildDistance', @lc_setmaxbuilddistance); +lua_register(luaState, _P'GetAmmoName', @lc_getammoname); // drawn map functions lua_register(luaState, _P'AddPoint', @lc_addPoint); lua_register(luaState, _P'FlushPoints', @lc_flushPoints); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uSound.pas --- a/hedgewars/uSound.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uSound.pas Sun Dec 17 00:09:24 2017 +0100 @@ -110,7 +110,7 @@ var Volume: LongInt; SoundTimerTicks: Longword; implementation -uses uVariables, uConsole, uCommands, uChat, uUtils, uDebug, uPhysFSLayer; +uses uVariables, uConsole, uCommands, uDebug, uPhysFSLayer; const chanTPU = 32; var cInitVolume: LongInt; @@ -133,133 +133,155 @@ ( snd: sndNone; voicepack: nil)); Soundz: array[TSound] of record FileName: string[31]; - Path : TPathType; + Path, AltPath : TPathType; end = ( - (FileName: ''; Path: ptNone ),// sndNone - (FileName: 'grenadeimpact.ogg'; Path: ptSounds),// sndGrenadeImpact - (FileName: 'explosion.ogg'; Path: ptSounds),// sndExplosion - (FileName: 'throwpowerup.ogg'; Path: ptSounds),// sndThrowPowerUp - (FileName: 'throwrelease.ogg'; Path: ptSounds),// sndThrowRelease - (FileName: 'splash.ogg'; Path: ptSounds),// sndSplash - (FileName: 'shotgunreload.ogg'; Path: ptSounds),// sndShotgunReload - (FileName: 'shotgunfire.ogg'; Path: ptSounds),// sndShotgunFire - (FileName: 'graveimpact.ogg'; Path: ptSounds),// sndGraveImpact - (FileName: 'mineimpact.ogg'; Path: ptSounds),// sndMineImpact - (FileName: 'minetick.ogg'; Path: ptSounds),// sndMineTicks - (FileName: 'Droplet1.ogg'; Path: ptSounds),// sndMudballImpact - (FileName: 'pickhammer.ogg'; Path: ptSounds),// sndPickhammer - (FileName: 'gun.ogg'; Path: ptSounds),// sndGun - (FileName: 'bee.ogg'; Path: ptSounds),// sndBee - (FileName: 'Jump1.ogg'; Path: ptVoices),// sndJump1 - (FileName: 'Jump2.ogg'; Path: ptVoices),// sndJump2 - (FileName: 'Jump3.ogg'; Path: ptVoices),// sndJump3 - (FileName: 'Yessir.ogg'; Path: ptVoices),// sndYesSir - (FileName: 'Laugh.ogg'; Path: ptVoices),// sndLaugh - (FileName: 'Illgetyou.ogg'; Path: ptVoices),// sndIllGetYou - (FileName: 'Justyouwait.ogg'; Path: ptVoices),// sndJustyouwait - (FileName: 'Incoming.ogg'; Path: ptVoices),// sndIncoming - (FileName: 'Missed.ogg'; Path: ptVoices),// sndMissed - (FileName: 'Stupid.ogg'; Path: ptVoices),// sndStupid - (FileName: 'Firstblood.ogg'; Path: ptVoices),// sndFirstBlood - (FileName: 'Boring.ogg'; Path: ptVoices),// sndBoring - (FileName: 'Byebye.ogg'; Path: ptVoices),// sndByeBye - (FileName: 'Sameteam.ogg'; Path: ptVoices),// sndSameTeam - (FileName: 'Nutter.ogg'; Path: ptVoices),// sndNutter - (FileName: 'Reinforcements.ogg'; Path: ptVoices),// sndReinforce - (FileName: 'Traitor.ogg'; Path: ptVoices),// sndTraitor - (FileName: 'Youllregretthat.ogg'; Path: ptVoices),// sndRegret - (FileName: 'Enemydown.ogg'; Path: ptVoices),// sndEnemyDown - (FileName: 'Coward.ogg'; Path: ptVoices),// sndCoward - (FileName: 'Hurry.ogg'; Path: ptVoices),// sndHurry - (FileName: 'Watchit.ogg'; Path: ptVoices),// sndWatchIt - (FileName: 'Kamikaze.ogg'; Path: ptVoices),// sndKamikaze - (FileName: 'cake2.ogg'; Path: ptSounds),// sndCake - (FileName: 'Ow1.ogg'; Path: ptVoices),// sndOw1 - (FileName: 'Ow2.ogg'; Path: ptVoices),// sndOw2 - (FileName: 'Ow3.ogg'; Path: ptVoices),// sndOw3 - (FileName: 'Ow4.ogg'; Path: ptVoices),// sndOw4 - (FileName: 'Firepunch1.ogg'; Path: ptVoices),// sndFirepunch1 - (FileName: 'Firepunch2.ogg'; Path: ptVoices),// sndFirepunch2 - (FileName: 'Firepunch3.ogg'; Path: ptVoices),// sndFirepunch3 - (FileName: 'Firepunch4.ogg'; Path: ptVoices),// sndFirepunch4 - (FileName: 'Firepunch5.ogg'; Path: ptVoices),// sndFirepunch5 - (FileName: 'Firepunch6.ogg'; Path: ptVoices),// sndFirepunch6 - (FileName: 'Melon.ogg'; Path: ptVoices),// sndMelon - (FileName: 'Hellish.ogg'; Path: ptSounds),// sndHellish - (FileName: 'Yoohoo.ogg'; Path: ptSounds),// sndYoohoo - (FileName: 'rcplane.ogg'; Path: ptSounds),// sndRCPlane - (FileName: 'whipcrack.ogg'; Path: ptSounds),// sndWhipCrack - (FileName:'ride_of_the_valkyries.ogg'; Path: ptSounds),// sndRideOfTheValkyries - (FileName: 'denied.ogg'; Path: ptSounds),// sndDenied - (FileName: 'placed.ogg'; Path: ptSounds),// sndPlaced - (FileName: 'baseballbat.ogg'; Path: ptSounds),// sndBaseballBat - (FileName: 'steam.ogg'; Path: ptSounds),// sndVaporize - (FileName: 'warp.ogg'; Path: ptSounds),// sndWarp - (FileName: 'suddendeath.ogg'; Path: ptSounds),// sndSuddenDeath - (FileName: 'mortar.ogg'; Path: ptSounds),// sndMortar - (FileName: 'shutterclick.ogg'; Path: ptSounds),// sndShutter - (FileName: 'homerun.ogg'; Path: ptSounds),// sndHomerun - (FileName: 'molotov.ogg'; Path: ptSounds),// sndMolotov - (FileName: 'Takecover.ogg'; Path: ptVoices),// sndCover - (FileName: 'Uh-oh.ogg'; Path: ptVoices),// sndUhOh - (FileName: 'Oops.ogg'; Path: ptVoices),// sndOops - (FileName: 'Nooo.ogg'; Path: ptVoices),// sndNooo - (FileName: 'Hello.ogg'; Path: ptVoices),// sndHello - (FileName: 'ropeshot.ogg'; Path: ptSounds),// sndRopeShot - (FileName: 'ropeattach.ogg'; Path: ptSounds),// sndRopeAttach - (FileName: 'roperelease.ogg'; Path: ptSounds),// sndRopeRelease - (FileName: 'switchhog.ogg'; Path: ptSounds),// sndSwitchHog - (FileName: 'Victory.ogg'; Path: ptVoices),// sndVictory - (FileName: 'Flawless.ogg'; Path: ptVoices),// sndFlawless - (FileName: 'sniperreload.ogg'; Path: ptSounds),// sndSniperReload - (FileName: 'steps.ogg'; Path: ptSounds),// sndSteps - (FileName: 'lowgravity.ogg'; Path: ptSounds),// sndLowGravity - (FileName: 'hell_growl.ogg'; Path: ptSounds),// sndHellishImpact1 - (FileName: 'hell_ooff.ogg'; Path: ptSounds),// sndHellishImpact2 - (FileName: 'hell_ow.ogg'; Path: ptSounds),// sndHellishImpact3 - (FileName: 'hell_ugh.ogg'; Path: ptSounds),// sndHellishImpact4 - (FileName: 'melonimpact.ogg'; Path: ptSounds),// sndMelonImpact - (FileName: 'Droplet1.ogg'; Path: ptSounds),// sndDroplet1 - (FileName: 'Droplet2.ogg'; Path: ptSounds),// sndDroplet2 - (FileName: 'Droplet3.ogg'; Path: ptSounds),// sndDroplet3 - (FileName: 'egg.ogg'; Path: ptSounds),// sndEggBreak - (FileName: 'drillgun.ogg'; Path: ptSounds),// sndDrillRocket - (FileName: 'PoisonCough.ogg'; Path: ptVoices),// sndPoisonCough - (FileName: 'PoisonMoan.ogg'; Path: ptVoices),// sndPoisonMoan - (FileName: 'BirdyLay.ogg'; Path: ptSounds),// sndBirdyLay - (FileName: 'Whistle.ogg'; Path: ptSounds),// sndWhistle - (FileName: 'beewater.ogg'; Path: ptSounds),// sndBeeWater - (FileName: '1C.ogg'; Path: ptSounds),// sndPiano0 - (FileName: '2D.ogg'; Path: ptSounds),// sndPiano1 - (FileName: '3E.ogg'; Path: ptSounds),// sndPiano2 - (FileName: '4F.ogg'; Path: ptSounds),// sndPiano3 - (FileName: '5G.ogg'; Path: ptSounds),// sndPiano4 - (FileName: '6A.ogg'; Path: ptSounds),// sndPiano5 - (FileName: '7B.ogg'; Path: ptSounds),// sndPiano6 - (FileName: '8C.ogg'; Path: ptSounds),// sndPiano7 - (FileName: '9D.ogg'; Path: ptSounds),// sndPiano8 - (FileName: 'skip.ogg'; Path: ptSounds),// sndSkip - (FileName: 'sinegun.ogg'; Path: ptSounds),// sndSineGun - (FileName: 'Ooff1.ogg'; Path: ptVoices),// sndOoff1 - (FileName: 'Ooff2.ogg'; Path: ptVoices),// sndOoff2 - (FileName: 'Ooff3.ogg'; Path: ptVoices),// sndOoff3 - (FileName: 'hammer.ogg'; Path: ptSounds),// sndWhack - (FileName: 'Comeonthen.ogg'; Path: ptVoices),// sndComeonthen - (FileName: 'parachute.ogg'; Path: ptSounds),// sndParachute - (FileName: 'bump.ogg'; Path: ptSounds),// sndBump - (FileName: 'hogchant3.ogg'; Path: ptSounds),// sndResurrector - (FileName: 'plane.ogg'; Path: ptSounds),// sndPlane - (FileName: 'TARDIS.ogg'; Path: ptSounds),// sndTardis - (FileName: 'frozen_hog_impact.ogg'; Path: ptSounds),// sndFrozenHogImpact - (FileName: 'ice_beam.ogg'; Path: ptSounds),// sndIceBeam - (FileName: 'hog_freeze.ogg'; Path: ptSounds),// sndHogFreeze - (FileName: 'airmine_impact.ogg'; Path: ptSounds),// sndAirMineImpact - (FileName: 'knife_impact.ogg'; Path: ptSounds),// sndKnifeImpact - (FileName: 'extratime.ogg'; Path: ptSounds) // sndExtraTime + (FileName: ''; Path: ptNone; AltPath: ptNone),// sndNone + (FileName: 'grenadeimpact.ogg'; Path: ptSounds; AltPath: ptNone),// sndGrenadeImpact + (FileName: 'explosion.ogg'; Path: ptSounds; AltPath: ptNone),// sndExplosion + (FileName: 'throwpowerup.ogg'; Path: ptSounds; AltPath: ptNone),// sndThrowPowerUp + (FileName: 'throwrelease.ogg'; Path: ptSounds; AltPath: ptNone),// sndThrowRelease + (FileName: 'splash.ogg'; Path: ptCurrTheme; AltPath: ptSounds),// sndSplash + (FileName: 'shotgunreload.ogg'; Path: ptSounds; AltPath: ptNone),// sndShotgunReload + (FileName: 'shotgunfire.ogg'; Path: ptSounds; AltPath: ptNone),// sndShotgunFire + (FileName: 'graveimpact.ogg'; Path: ptSounds; AltPath: ptNone),// sndGraveImpact + (FileName: 'mineimpact.ogg'; Path: ptSounds; AltPath: ptNone),// sndMineImpact + (FileName: 'minetick.ogg'; Path: ptSounds; AltPath: ptNone),// sndMineTicks + (FileName: 'Droplet1.ogg'; Path: ptSounds; AltPath: ptNone),// sndMudballImpact + (FileName: 'pickhammer.ogg'; Path: ptSounds; AltPath: ptNone),// sndPickhammer + (FileName: 'gun.ogg'; Path: ptSounds; AltPath: ptNone),// sndGun + (FileName: 'bee.ogg'; Path: ptSounds; AltPath: ptNone),// sndBee + (FileName: 'Jump1.ogg'; Path: ptVoices; AltPath: ptNone),// sndJump1 + (FileName: 'Jump2.ogg'; Path: ptVoices; AltPath: ptNone),// sndJump2 + (FileName: 'Jump3.ogg'; Path: ptVoices; AltPath: ptNone),// sndJump3 + (FileName: 'Yessir.ogg'; Path: ptVoices; AltPath: ptNone),// sndYesSir + (FileName: 'Laugh.ogg'; Path: ptVoices; AltPath: ptNone),// sndLaugh + (FileName: 'Illgetyou.ogg'; Path: ptVoices; AltPath: ptNone),// sndIllGetYou + (FileName: 'Justyouwait.ogg'; Path: ptVoices; AltPath: ptNone),// sndJustyouwait + (FileName: 'Incoming.ogg'; Path: ptVoices; AltPath: ptNone),// sndIncoming + (FileName: 'Missed.ogg'; Path: ptVoices; AltPath: ptNone),// sndMissed + (FileName: 'Stupid.ogg'; Path: ptVoices; AltPath: ptNone),// sndStupid + (FileName: 'Firstblood.ogg'; Path: ptVoices; AltPath: ptNone),// sndFirstBlood + (FileName: 'Boring.ogg'; Path: ptVoices; AltPath: ptNone),// sndBoring + (FileName: 'Byebye.ogg'; Path: ptVoices; AltPath: ptNone),// sndByeBye + (FileName: 'Sameteam.ogg'; Path: ptVoices; AltPath: ptNone),// sndSameTeam + (FileName: 'Nutter.ogg'; Path: ptVoices; AltPath: ptNone),// sndNutter + (FileName: 'Reinforcements.ogg'; Path: ptVoices; AltPath: ptNone),// sndReinforce + (FileName: 'Traitor.ogg'; Path: ptVoices; AltPath: ptNone),// sndTraitor + (FileName: 'Youllregretthat.ogg'; Path: ptVoices; AltPath: ptNone),// sndRegret + (FileName: 'Enemydown.ogg'; Path: ptVoices; AltPath: ptNone),// sndEnemyDown + (FileName: 'Coward.ogg'; Path: ptVoices; AltPath: ptNone),// sndCoward + (FileName: 'Hurry.ogg'; Path: ptVoices; AltPath: ptNone),// sndHurry + (FileName: 'Watchit.ogg'; Path: ptVoices; AltPath: ptNone),// sndWatchIt + (FileName: 'Kamikaze.ogg'; Path: ptVoices; AltPath: ptNone),// sndKamikaze + (FileName: 'cake2.ogg'; Path: ptSounds; AltPath: ptNone),// sndCake + (FileName: 'Ow1.ogg'; Path: ptVoices; AltPath: ptNone),// sndOw1 + (FileName: 'Ow2.ogg'; Path: ptVoices; AltPath: ptNone),// sndOw2 + (FileName: 'Ow3.ogg'; Path: ptVoices; AltPath: ptNone),// sndOw3 + (FileName: 'Ow4.ogg'; Path: ptVoices; AltPath: ptNone),// sndOw4 + (FileName: 'Firepunch1.ogg'; Path: ptVoices; AltPath: ptNone),// sndFirepunch1 + (FileName: 'Firepunch2.ogg'; Path: ptVoices; AltPath: ptNone),// sndFirepunch2 + (FileName: 'Firepunch3.ogg'; Path: ptVoices; AltPath: ptNone),// sndFirepunch3 + (FileName: 'Firepunch4.ogg'; Path: ptVoices; AltPath: ptNone),// sndFirepunch4 + (FileName: 'Firepunch5.ogg'; Path: ptVoices; AltPath: ptNone),// sndFirepunch5 + (FileName: 'Firepunch6.ogg'; Path: ptVoices; AltPath: ptNone),// sndFirepunch6 + (FileName: 'Melon.ogg'; Path: ptVoices; AltPath: ptNone),// sndMelon + (FileName: 'Hellish.ogg'; Path: ptSounds; AltPath: ptNone),// sndHellish + (FileName: 'Yoohoo.ogg'; Path: ptSounds; AltPath: ptNone),// sndYoohoo + (FileName: 'rcplane.ogg'; Path: ptSounds; AltPath: ptNone),// sndRCPlane + (FileName: 'whipcrack.ogg'; Path: ptSounds; AltPath: ptNone),// sndWhipCrack + (FileName:'ride_of_the_valkyries.ogg'; Path: ptSounds; AltPath: ptNone),// sndRideOfTheValkyries + (FileName: 'denied.ogg'; Path: ptSounds; AltPath: ptNone),// sndDenied + (FileName: 'placed.ogg'; Path: ptSounds; AltPath: ptNone),// sndPlaced + (FileName: 'baseballbat.ogg'; Path: ptSounds; AltPath: ptNone),// sndBaseballBat + (FileName: 'steam.ogg'; Path: ptSounds; AltPath: ptNone),// sndVaporize + (FileName: 'warp.ogg'; Path: ptSounds; AltPath: ptNone),// sndWarp + (FileName: 'suddendeath.ogg'; Path: ptSounds; AltPath: ptNone),// sndSuddenDeath + (FileName: 'mortar.ogg'; Path: ptSounds; AltPath: ptNone),// sndMortar + (FileName: 'shutterclick.ogg'; Path: ptSounds; AltPath: ptNone),// sndShutter + (FileName: 'homerun.ogg'; Path: ptSounds; AltPath: ptNone),// sndHomerun + (FileName: 'molotov.ogg'; Path: ptSounds; AltPath: ptNone),// sndMolotov + (FileName: 'Takecover.ogg'; Path: ptVoices; AltPath: ptNone),// sndCover + (FileName: 'Uh-oh.ogg'; Path: ptVoices; AltPath: ptNone),// sndUhOh + (FileName: 'Oops.ogg'; Path: ptVoices; AltPath: ptNone),// sndOops + (FileName: 'Nooo.ogg'; Path: ptVoices; AltPath: ptNone),// sndNooo + (FileName: 'Hello.ogg'; Path: ptVoices; AltPath: ptNone),// sndHello + (FileName: 'ropeshot.ogg'; Path: ptSounds; AltPath: ptNone),// sndRopeShot + (FileName: 'ropeattach.ogg'; Path: ptSounds; AltPath: ptNone),// sndRopeAttach + (FileName: 'roperelease.ogg'; Path: ptSounds; AltPath: ptNone),// sndRopeRelease + (FileName: 'switchhog.ogg'; Path: ptSounds; AltPath: ptNone),// sndSwitchHog + (FileName: 'Victory.ogg'; Path: ptVoices; AltPath: ptNone),// sndVictory + (FileName: 'Flawless.ogg'; Path: ptVoices; AltPath: ptNone),// sndFlawless + (FileName: 'sniperreload.ogg'; Path: ptSounds; AltPath: ptNone),// sndSniperReload + (FileName: 'steps.ogg'; Path: ptSounds; AltPath: ptNone),// sndSteps + (FileName: 'lowgravity.ogg'; Path: ptSounds; AltPath: ptNone),// sndLowGravity + (FileName: 'hell_growl.ogg'; Path: ptSounds; AltPath: ptNone),// sndHellishImpact1 + (FileName: 'hell_ooff.ogg'; Path: ptSounds; AltPath: ptNone),// sndHellishImpact2 + (FileName: 'hell_ow.ogg'; Path: ptSounds; AltPath: ptNone),// sndHellishImpact3 + (FileName: 'hell_ugh.ogg'; Path: ptSounds; AltPath: ptNone),// sndHellishImpact4 + (FileName: 'melonimpact.ogg'; Path: ptSounds; AltPath: ptNone),// sndMelonImpact + (FileName: 'Droplet1.ogg'; Path: ptCurrTheme; AltPath: ptSounds),// sndDroplet1 + (FileName: 'Droplet2.ogg'; Path: ptCurrTheme; AltPath: ptSounds),// sndDroplet2 + (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: 'BirdyLay.ogg'; Path: ptSounds; AltPath: ptNone),// sndBirdyLay + (FileName: 'Whistle.ogg'; Path: ptSounds; AltPath: ptNone),// sndWhistle + (FileName: 'beewater.ogg'; Path: ptSounds; AltPath: ptNone),// sndBeeWater + (FileName: '1C.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano0 + (FileName: '2D.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano1 + (FileName: '3E.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano2 + (FileName: '4F.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano3 + (FileName: '5G.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano4 + (FileName: '6A.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano5 + (FileName: '7B.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano6 + (FileName: '8C.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano7 + (FileName: '9D.ogg'; Path: ptSounds; AltPath: ptNone),// sndPiano8 + (FileName: 'skip.ogg'; Path: ptCurrTheme; AltPath: ptSounds),// sndSkip + (FileName: 'sinegun.ogg'; Path: ptSounds; AltPath: ptNone),// sndSineGun + (FileName: 'Ooff1.ogg'; Path: ptVoices; AltPath: ptNone),// sndOoff1 + (FileName: 'Ooff2.ogg'; Path: ptVoices; AltPath: ptNone),// sndOoff2 + (FileName: 'Ooff3.ogg'; Path: ptVoices; AltPath: ptNone),// sndOoff3 + (FileName: 'hammer.ogg'; Path: ptSounds; AltPath: ptNone),// sndWhack + (FileName: 'Comeonthen.ogg'; Path: ptVoices; AltPath: ptNone),// sndComeonthen + (FileName: 'parachute.ogg'; Path: ptSounds; AltPath: ptNone),// sndParachute + (FileName: 'bump.ogg'; Path: ptSounds; AltPath: ptNone),// sndBump + (FileName: 'hogchant3.ogg'; Path: ptSounds; AltPath: ptNone),// sndResurrector + (FileName: 'plane.ogg'; Path: ptSounds; AltPath: ptNone),// sndPlane + (FileName: 'TARDIS.ogg'; Path: ptSounds; AltPath: ptNone),// sndTardis + (FileName: 'frozen_hog_impact.ogg'; Path: ptSounds; AltPath: ptNone),// sndFrozenHogImpact + (FileName: 'ice_beam.ogg'; Path: ptSounds; AltPath: ptNone),// sndIceBeam + (FileName: 'hog_freeze.ogg'; Path: ptSounds; AltPath: ptNone), // sndHogFreeze + (FileName: 'airmine_impact.ogg'; Path: ptSounds; AltPath: ptNone),// sndAirMineImpact + (FileName: 'knife_impact.ogg'; Path: ptSounds; AltPath: ptNone),// sndKnifeImpact + (FileName: 'extratime.ogg'; Path: ptSounds; AltPath: ptNone),// sndExtraTime + (FileName: 'lasersight.ogg'; Path: ptSounds; AltPath: ptNone),// sndLaserSight + (FileName: 'invulnerable.ogg'; Path: ptSounds; AltPath: ptNone),// sndInvulnerable + (FileName: 'ufo.ogg'; Path: ptSounds; AltPath: ptNone),// sndJetpackLaunch + (FileName: 'jetpackboost.ogg'; Path: ptSounds; AltPath: ptNone),// sndJetpackBoost + (FileName: 'portalshot.ogg'; Path: ptSounds; AltPath: ptNone),// sndPortalShot + (FileName: 'portalswitch.ogg'; Path: ptSounds; AltPath: ptNone),// sndPortalSwitch + (FileName: 'portalopen.ogg'; Path: ptSounds; AltPath: ptNone),// sndPortalOpen + (FileName: 'blowtorch.ogg'; Path: ptSounds; AltPath: ptNone),// sndBlowTorch + (FileName: 'countdown1.ogg'; Path: ptSounds; AltPath: ptNone),// sndCountdown1 + (FileName: 'countdown2.ogg'; Path: ptSounds; AltPath: ptNone),// sndCountdown2 + (FileName: 'countdown3.ogg'; Path: ptSounds; AltPath: ptNone),// sndCountdown3 + (FileName: 'countdown4.ogg'; Path: ptSounds; AltPath: ptNone),// sndCountdown4 + (FileName: 'rubberduck_drop.ogg'; Path: ptSounds; AltPath: ptNone),// sndDuckDrop + (FileName: 'rubberduck_water.ogg'; Path: ptSounds; AltPath: ptNone),// sndDuckWater + (FileName: 'rubberduck_die.ogg'; Path: ptSounds; AltPath: ptNone),// sndDuckDie + (FileName: 'custom1.ogg'; Path: ptSounds; AltPath: ptNone),// sndCustom1 + (FileName: 'custom2.ogg'; Path: ptSounds; AltPath: ptNone),// sndCustom2 + (FileName: 'custom3.ogg'; Path: ptSounds; AltPath: ptNone),// sndCustom3 + (FileName: 'custom4.ogg'; Path: ptSounds; AltPath: ptNone),// sndCustom4 + (FileName: 'custom5.ogg'; Path: ptSounds; AltPath: ptNone),// sndCustom5 + (FileName: 'custom6.ogg'; Path: ptSounds; AltPath: ptNone),// sndCustom6 + (FileName: 'custom7.ogg'; Path: ptSounds; AltPath: ptNone),// sndCustom7 + (FileName: 'custom8.ogg'; Path: ptSounds; AltPath: ptNone) // sndCustom8 ); - function AskForVoicepack(name: shortstring): Pointer; var i: Longword; locName, path: shortstring; @@ -310,10 +332,14 @@ if not (isSoundEnabled or isMusicEnabled) then exit; WriteToConsole('Init sound...'); - success:= SDL_InitSubSystem(SDL_INIT_AUDIO) >= 0; + success:= SDL_InitSubSystem(SDL_INIT_AUDIO) = 0; if success then + begin + WriteLnToConsole(msgOK); + WriteToConsole('Open audio...'); success:= Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, channels, 1024) = 0; + end; if success then WriteLnToConsole(msgOK) @@ -398,6 +424,7 @@ procedure PlaySoundV(snd: TSound; voicepack: PVoicepack; keepPlaying: boolean); var s:shortstring; +rwops: PSDL_RWops; begin if (not isSoundEnabled) or fastUntilLag then exit; @@ -413,7 +440,16 @@ if (not pfsExists(s)) and (snd in [sndFirePunch2, sndFirePunch3, sndFirePunch4, sndFirePunch5, sndFirePunch6]) then s:= cPathz[Soundz[sndFirePunch1].Path] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; WriteToConsole(msgLoading + s + ' '); - voicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1); + rwops := rwopsOpenRead(s); + + if rwops = nil then + begin + s:= cPathz[Soundz[snd].AltPath] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; + WriteToConsole(msgLoading + s + ' ... '); + rwops := rwopsOpenRead(s); + end; + voicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwops, 1); + if voicepack^.chunks[snd] = nil then WriteLnToConsole(msgFailed) else @@ -427,7 +463,16 @@ begin s:= cPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName; WriteToConsole(msgLoading + s + ' '); - defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1); + rwops := rwopsOpenRead(s); + + if rwops = nil then + begin + s:= cPathz[Soundz[snd].AltPath] + '/' + Soundz[snd].FileName; + WriteToConsole(msgLoading + s + ' ... '); + rwops := rwopsOpenRead(s); + end; + + defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwops, 1); if SDLCheck(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true) then exit; WriteLnToConsole(msgOK); end; @@ -499,6 +544,7 @@ function LoopSoundV(snd: TSound; voicepack: PVoicepack; fadems: LongInt): LongInt; var s: shortstring; +rwops: PSDL_RWops; begin if (not isSoundEnabled) or fastUntilLag then begin @@ -512,7 +558,16 @@ begin s:= cPathz[Soundz[snd].Path] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; WriteToConsole(msgLoading + s + ' '); - voicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1); + rwops:=rwopsOpenRead(s); + + if rwops = nil then + begin + s:= cPathz[Soundz[snd].AltPath] + '/' + Soundz[snd].FileName; + WriteToConsole(msgLoading + s + ' ... '); + rwops:=rwopsOpenRead(s); + end; + + voicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwops, 1); if voicepack^.chunks[snd] = nil then WriteLnToConsole(msgFailed) else diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uStats.pas --- a/hedgewars/uStats.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uStats.pas Sun Dec 17 00:09:24 2017 +0100 @@ -24,13 +24,19 @@ var TotalRounds: LongInt; FinishedTurnsTotal: LongInt; + SendGameResultOn : boolean = true; + SendRankingStatsOn : boolean = true; + SendAchievementsStatsOn : boolean = true; SendHealthStatsOn : boolean = true; procedure initModule; procedure freeModule; procedure AmmoUsed(am: TAmmoType); +procedure HedgehogPoisoned(Gear: PGear; Attacker: PHedgehog); +procedure HedgehogSacrificed(Hedgehog: PHedgehog); procedure HedgehogDamaged(Gear: PGear; Attacker: PHedgehog; Damage: Longword; killed: boolean); +procedure TargetHit; procedure Skipped; procedure TurnReaction; procedure SendStats; @@ -45,9 +51,13 @@ var DamageClan : Longword = 0; DamageTotal : Longword = 0; DamageTurn : Longword = 0; + PoisonTurn : Longword = 0; // Poisoned enemies per turn + PoisonClan : Longword = 0; // Poisoned own clan members in turn + PoisonTotal : Longword = 0; // Poisoned hogs in whole round KillsClan : LongWord = 0; Kills : LongWord = 0; KillsTotal : LongWord = 0; + HitTargets : LongWord = 0; // Target (gtTarget) hits per turn AmmoUsedCount : Longword = 0; AmmoDamagingUsed : boolean = false; SkippedTurns: LongWord = 0; @@ -55,6 +65,27 @@ vpHurtSameClan: PVoicepack = nil; vpHurtEnemy: PVoicepack = nil; +procedure HedgehogPoisoned(Gear: PGear; Attacker: PHedgehog); +begin + if Attacker^.Team^.Clan = Gear^.HEdgehog^.Team^.Clan then + begin + vpHurtSameClan:= CurrentHedgehog^.Team^.voicepack; + inc(PoisonClan) + end + else + begin + vpHurtEnemy:= Gear^.Hedgehog^.Team^.voicepack; + inc(PoisonTurn) + end; + Gear^.Hedgehog^.stats.StepPoisoned:= true; + inc(PoisonTotal) +end; + +procedure HedgehogSacrificed(Hedgehog: PHedgehog); +begin + Hedgehog^.stats.Sacrificed:= true +end; + procedure HedgehogDamaged(Gear: PGear; Attacker: PHedgehog; Damage: Longword; killed: boolean); begin if Attacker^.Team^.Clan = Gear^.Hedgehog^.Team^.Clan then @@ -72,6 +103,7 @@ if killed then begin + Gear^.Hedgehog^.stats.StepDied:= true; inc(Attacker^.stats.StepKills); inc(Kills); inc(KillsTotal); @@ -91,6 +123,11 @@ inc(DamageTurn, Damage) end; +procedure TargetHit(); +begin + inc(HitTargets) +end; + procedure Skipped; begin inc(SkippedTurns); @@ -99,6 +136,7 @@ procedure TurnReaction; var i, t: LongInt; + killsCheck: LongInt; s: ansistring; begin //TryDo(not bBetweenTurns, 'Engine bug: TurnReaction between turns', true); @@ -108,19 +146,28 @@ 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 + if (CurrentHedgehog^.stats.Sacrificed) then + killsCheck:= 1 + else + killsCheck:= 0; - if (CurrentHedgehog^.stats.DamageGiven = DamageTotal) and (DamageTotal > 0) then + // 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) - else if CurrentHedgehog^.stats.StepDamageRecv > 0 then + // 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 begin AddVoice(sndStupid, PreviousTeam^.voicepack); - if CurrentHedgehog^.stats.DamageGiven = CurrentHedgehog^.stats.StepDamageRecv then + // Message for hurting itself only (not drowning) + if (CurrentHedgehog^.stats.DamageGiven = CurrentHedgehog^.stats.StepDamageRecv) and (CurrentHedgehog^.stats.StepDamageRecv >= 1) then AddCaption(FormatA(GetEventString(eidHurtSelf), s), cWhiteColor, capgrpMessage); end - else if DamageClan <> 0 then - if DamageTurn > DamageClan then + // 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 random(2) = 0 then AddVoice(sndNutter, CurrentTeam^.voicepack) else @@ -131,23 +178,35 @@ else AddVoice(sndTraitor, vpHurtSameClan) - else if CurrentHedgehog^.stats.StepDamageGiven <> 0 then - if Kills > 0 then + // Hog hurts, kills or poisons enemy + else if (CurrentHedgehog^.stats.StepDamageGiven <> 0) or (CurrentHedgehog^.stats.StepKills > killsCheck) or (PoisonTurn <> 0) then + if Kills > killsCheck then AddVoice(sndEnemyDown, CurrentTeam^.voicepack) else AddVoice(sndRegret, vpHurtEnemy) - else if AmmoDamagingUsed then - AddVoice(sndMissed, PreviousTeam^.voicepack) + // Missed shot + // A miss is defined as a shot with a damaging weapon with 0 kills, 0 damage, 0 hogs poisoned and 0 targets hit + else if AmmoDamagingUsed and (Kills <= killsCheck) and (PoisonTurn = 0) and (PoisonClan = 0) and (DamageTurn = 0) and (HitTargets = 0) then + // Chance to call hedgehog stupid if sacrificed for nothing + if CurrentHedgehog^.stats.Sacrificed then + if random(2) = 0 then + AddVoice(sndMissed, PreviousTeam^.voicepack) + else + AddVoice(sndStupid, PreviousTeam^.voicepack) + else + AddVoice(sndMissed, PreviousTeam^.voicepack) + + // Timeout else if (AmmoUsedCount > 0) and (not isTurnSkipped) then begin end// nothing ? - else if isTurnSkipped then + + // Turn skipped + else if isTurnSkipped and (not PlacingHogs) then begin - AddVoice(sndBoring, PreviousTeam^.voicepack); + AddVoice(sndCoward, PreviousTeam^.voicepack); AddCaption(FormatA(GetEventString(eidTurnSkipped), s), cWhiteColor, capgrpMessage); end - else if not PlacingHogs then - AddVoice(sndCoward, PreviousTeam^.voicepack); end; @@ -166,7 +225,9 @@ MaxStepKills:= StepKills; StepKills:= 0; StepDamageRecv:= 0; - StepDamageGiven:= 0 + StepDamageGiven:= 0; + StepPoisoned:= false; + StepDied:= false; end; if SendHealthStatsOn then @@ -180,6 +241,9 @@ KillsClan:= 0; DamageClan:= 0; DamageTurn:= 0; +HitTargets:= 0; +PoisonClan:= 0; +PoisonTurn:= 0; AmmoUsedCount:= 0; AmmoDamagingUsed:= false; isTurnSkipped:= false @@ -226,7 +290,7 @@ for t:= 0 to Pred(TeamsCount) do with TeamsArray[t]^ do begin - if not ExtDriven then + if (not ExtDriven) and SendRankingStatsOn then SendStat(siTeamStats, GetTeamStatString(TeamsArray[t])); for i:= 0 to cMaxHHIndex do begin @@ -250,8 +314,9 @@ if Clan^.ClanHealth > 0 then begin winnersClan:= Clan; - SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' + - IntToStr(stats.Kills) + ' ' + TeamName); + if SendRankingStatsOn then + SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' + + IntToStr(stats.Kills) + ' ' + TeamName); end; { determine maximum values of TeamKills, TurnSkips, TeamDamage } @@ -274,32 +339,37 @@ end; { now send player stats for loser teams } - for t:= 0 to Pred(TeamsCount) do - begin - with TeamsArray[t]^ do + if SendRankingStatsOn then + for t:= 0 to Pred(TeamsCount) do begin - if Clan^.ClanHealth = 0 then + with TeamsArray[t]^ do begin - SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' + - IntToStr(stats.Kills) + ' ' + TeamName); + if Clan^.ClanHealth = 0 then + begin + SendStat(siPlayerKills, IntToStr(Clan^.Color) + ' ' + + IntToStr(stats.Kills) + ' ' + TeamName); + end; end; end; - end; - if msdhh <> nil then - SendStat(siMaxStepDamage, IntToStr(msd) + ' ' + msdhh^.Name + ' (' + msdhh^.Team^.TeamName + ')'); - if mskcnt = 1 then - SendStat(siMaxStepKills, IntToStr(msk) + ' ' + mskhh^.Name + ' (' + mskhh^.Team^.TeamName + ')'); + // “Achievements” / Details part of stats screen + if SendAchievementsStatsOn then + begin + if msdhh <> nil then + SendStat(siMaxStepDamage, IntToStr(msd) + ' ' + msdhh^.Name + ' (' + msdhh^.Team^.TeamName + ')'); + if mskcnt = 1 then + SendStat(siMaxStepKills, IntToStr(msk) + ' ' + mskhh^.Name + ' (' + mskhh^.Team^.TeamName + ')'); - if maxTeamKills > 1 then - SendStat(siMaxTeamKills, IntToStr(maxTeamKills) + ' ' + maxTeamKillsName); - if maxTurnSkips > 2 then - SendStat(siMaxTurnSkips, IntToStr(maxTurnSkips) + ' ' + maxTurnSkipsName); - if maxTeamDamage > 30 then - SendStat(siMaxTeamDamage, IntToStr(maxTeamDamage) + ' ' + maxTeamDamageName); + if maxTeamKills > 1 then + SendStat(siMaxTeamKills, IntToStr(maxTeamKills) + ' ' + maxTeamKillsName); + if maxTurnSkips > 2 then + SendStat(siMaxTurnSkips, IntToStr(maxTurnSkips) + ' ' + maxTurnSkipsName); + if maxTeamDamage > 30 then + SendStat(siMaxTeamDamage, IntToStr(maxTeamDamage) + ' ' + maxTeamDamageName); - if KilledHHs > 0 then - SendStat(siKilledHHs, IntToStr(KilledHHs)); + if KilledHHs > 0 then + SendStat(siKilledHHs, IntToStr(KilledHHs)); + end; // now to console if winnersClan <> nil then @@ -342,9 +412,12 @@ DamageClan := 0; DamageTotal := 0; DamageTurn := 0; + PoisonClan := 0; + PoisonTurn := 0; KillsClan := 0; Kills := 0; KillsTotal := 0; + HitTargets := 0; AmmoUsedCount := 0; AmmoDamagingUsed := false; SkippedTurns:= 0; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uStore.pas Sun Dec 17 00:09:24 2017 +0100 @@ -26,6 +26,7 @@ procedure initModule; procedure freeModule; +procedure LoadFonts(); procedure StoreLoad(reload: boolean); procedure StoreRelease(reload: boolean); procedure RenderHealth(var Hedgehog: THedgehog); @@ -61,17 +62,16 @@ implementation uses uMisc, uConsole, uVariables, uUtils, uTextures, uRender, uRenderUtils, - uCommands, uPhysFSLayer, uDebug + uCommands, uPhysFSLayer, uDebug, adler32 {$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF}; //type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple); var - SDLwindow: PSDL_Window; - SDLGLcontext: PSDL_GLContext; squaresize : LongInt; numsquares : LongInt; ProgrTex: PTexture; + LoadingText: PTexture; prevHat: shortstring; tmpHatSurf: PSDL_Surface; @@ -150,7 +150,7 @@ texsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, RMask, GMask, BMask, AMask); if not checkFails(texsurf <> nil, errmsgCreateSurface, true) then - checkFails(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); + checkFails(SDL_SetColorKey(texsurf, SDL_TRUE, 0) = 0, errmsgTransparentSet, true); if not allOK then exit(nil); @@ -199,7 +199,7 @@ r.h:= 32; texsurf:= SDL_CreateRGBSurface(SDL_SWSURFACE, r.w, r.h, 32, RMask, GMask, BMask, AMask); if not checkFails(texsurf <> nil, errmsgCreateSurface, true) then - checkFails(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true); + checkFails(SDL_SetColorKey(texsurf, SDL_TRUE, 0) = 0, errmsgTransparentSet, true); if not allOK then exit; r.w:= 26; @@ -342,23 +342,19 @@ begin if GraveName = '' then GraveName:= 'Statue'; - texsurf:= LoadDataImageAltFile(ptGraves, GraveName, 'Statue', ifCritical or ifTransparent); + texsurf:= LoadDataImageAltFile(ptGraves, GraveName, 'Statue', ifCritical or ifColorKey); GraveTex:= Surface2Tex(texsurf, false); SDL_FreeSurface(texsurf) end end; -procedure StoreLoad(reload: boolean); +procedure LoadFonts(); var s: shortstring; - ii: TSprite; fi: THWFont; - ai: TAmmoType; - tmpsurf: PSDL_Surface; - i, imflags: LongInt; begin -AddFileLog('StoreLoad()'); +AddFileLog('LoadFonts();'); -if (not reload) and (not cOnlyStats) then +if (not cOnlyStats) then for fi:= Low(THWFont) to High(THWFont) do with Fontz[fi] do begin @@ -369,6 +365,15 @@ TTF_SetFontStyle(Handle, style); WriteLnToConsole(msgOK) end; +end; + +procedure StoreLoad(reload: boolean); +var ii: TSprite; + ai: TAmmoType; + tmpsurf, tmpoverlay: PSDL_Surface; + i, y, imflags: LongInt; +begin +AddFileLog('StoreLoad()'); if not cOnlyStats then begin @@ -403,14 +408,17 @@ tmpsurf:= Surface else begin - imflags := (ifAlpha or ifTransparent); + imflags := (ifAlpha or ifColorKey); // these sprites are optional - if not (ii in [sprHorizont, sprHorizontL, sprHorizontR, sprSky, sprSkyL, sprSkyR, sprChunk]) then // FIXME: hack + if critical then imflags := (imflags or ifCritical); // load the image - tmpsurf := LoadDataImageAltPath(Path, AltPath, FileName, imflags) + tmpsurf := LoadDataImageAltPath(Path, AltPath, FileName, imflags); + if (tmpsurf <> nil) and checkSum then + for y := 0 to tmpsurf^.h-1 do + syncedPixelDigest:= Adler32Update(syncedPixelDigest, @PByteArray(tmpsurf^.pixels)^[y*tmpsurf^.pitch], tmpsurf^.w*4) end; if tmpsurf <> nil then @@ -421,9 +429,29 @@ imageHeight:= tmpsurf^.h end; if getDimensions then + if Height = -1 then //BlueWater + begin + Width:= tmpsurf^.w; + Height:= tmpsurf^.h div watFrames; + end + else if Height = -2 then //SDWater + begin + Width:= tmpsurf^.w; + Height:= tmpsurf^.h div watSDFrames; + end + else + begin + Width:= tmpsurf^.w; + Height:= tmpsurf^.h + end; + if (ii in [sprAMAmmos, sprAMAmmosBW]) then begin - Width:= tmpsurf^.w; - Height:= tmpsurf^.h + tmpoverlay := LoadDataImage(Path, copy(FileName, 1, length(FileName)-5), (imflags and (not ifCritical))); + if tmpoverlay <> nil then + begin + copyToXY(tmpoverlay, tmpsurf, 0, 0); + SDL_FreeSurface(tmpoverlay) + end end; if (ii in [sprSky, sprSkyL, sprSkyR, sprHorizont, sprHorizontL, sprHorizontR]) then begin @@ -462,7 +490,7 @@ if not reload then AddProgress; - tmpsurf:= LoadDataImage(ptGraphics, cHHFileName, ifAlpha or ifCritical or ifTransparent); + tmpsurf:= LoadDataImage(ptGraphics, cHHFileName, ifAlpha or ifCritical or ifColorKey); HHTexture:= Surface2Tex(tmpsurf, false); SDL_FreeSurface(tmpsurf); @@ -634,8 +662,8 @@ tmpsurf:= doSurfaceConversion(tmpsurf); - if (imageFlags and ifTransparent) <> 0 then - if checkFails(SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true) then exit; + if (imageFlags and ifColorKey) <> 0 then + if checkFails(SDL_SetColorKey(tmpsurf, SDL_TRUE, 0) = 0, errmsgTransparentSet, true) then exit; WriteLnToConsole(msgOK + ' (' + inttostr(tmpsurf^.w) + 'x' + inttostr(tmpsurf^.h) + ')'); @@ -770,13 +798,16 @@ if Step = 0 then begin WriteToConsole(msgLoading + 'progress sprite: '); - texsurf:= LoadDataImage(ptGraphics, 'Progress', ifCritical or ifTransparent); + texsurf:= LoadDataImage(ptGraphics, 'Progress', ifCritical or ifColorKey); ProgrTex:= Surface2Tex(texsurf, false); + LoadingText:= RenderStringTex(trmsg[sidLoading], $FFF39EE8, fntBig); + squaresize:= texsurf^.w shr 1; numsquares:= texsurf^.h div squaresize; SDL_FreeSurface(texsurf); + {$IFNDEF PAS2C} with mobileRecord do if GameLoading <> nil then @@ -797,6 +828,7 @@ r.h:= squaresize; DrawTextureFromRect( -squaresize div 2, (cScreenHeight - squaresize) shr 1, @r, ProgrTex); + DrawTexture( -LoadingText^.w div 2, (cScreenHeight - LoadingText^.h) shr 1 - (squaresize div 2) - (LoadingText^.h div 2) - 8, LoadingText); SwapBuffers; @@ -810,8 +842,9 @@ if GameLoaded <> nil then GameLoaded(); {$ENDIF} - WriteLnToConsole('Freeing progress surface... '); + WriteLnToConsole('Freeing progress textures... '); FreeAndNilTexture(ProgrTex); + FreeAndNilTexture(LoadingText); Step:= 0 end; @@ -928,7 +961,7 @@ r.y:= cFontBorder + 4; r.w:= 32; r.h:= 32; -SDL_FillRect(tmpsurf, @r, $ffffffff); +SDL_FillRect(tmpsurf, @r, $ff000000); SDL_UpperBlit(iconsurf, iconrect, tmpsurf, @r); RenderHelpWindow:= Surface2Tex(tmpsurf, true); @@ -938,6 +971,9 @@ procedure RenderWeaponTooltip(atype: TAmmoType); var r: TSDL_Rect; i: LongInt; + ammoname: ansistring; + ammocap: ansistring; + ammodesc: ansistring; extra: ansistring; extracolor: LongInt; begin @@ -964,7 +1000,10 @@ if (CurrentTeam <> nil) and (Ammoz[atype].SkipTurns >= CurrentTeam^.Clan^.TurnNumber) then // weapon or utility is not yet available begin - extra:= trmsg[sidNotYetAvailable]; + if (atype = amTardis) and (suddenDeathDmg) then + extra:= trmsg[sidNotAvailableInSD] + else + extra:= trmsg[sidNotYetAvailable]; extracolor:= LongInt($ffc77070); end else if (Ammoz[atype].Ammo.Propz and ammoprop_NoRoundEnd) <> 0 then // weapon or utility will not end your turn @@ -978,8 +1017,26 @@ extracolor:= 0; end; +if length(trluaammo[Ammoz[atype].NameId]) > 0 then + ammoname := trluaammo[Ammoz[atype].NameId] +else + ammoname := trammo[Ammoz[atype].NameId]; + +if length(trluaammoc[Ammoz[atype].NameId]) > 0 then + ammocap := trluaammoc[Ammoz[atype].NameId] +else + ammocap := trammoc[Ammoz[atype].NameId]; + +if length(trluaammod[Ammoz[atype].NameId]) > 0 then + ammodesc := trluaammod[Ammoz[atype].NameId] +else + ammodesc := trammod[Ammoz[atype].NameId]; + +if length(trluaammoa[Ammoz[atype].NameId]) > 0 then + ammodesc := ammodesc + '|' + trluaammoa[Ammoz[atype].NameId]; + // render window and return the texture -WeaponTooltipTex:= RenderHelpWindow(trammo[Ammoz[atype].NameId], trammoc[Ammoz[atype].NameId], trammod[Ammoz[atype].NameId], extra, extracolor, SpritesData[sprAMAmmos].Surface, @r) +WeaponTooltipTex:= RenderHelpWindow(ammoname, ammocap, ammodesc, extra, extracolor, SpritesData[sprAMAmmos].Surface, @r) end; procedure ShowWeaponTooltip(x, y: LongInt); @@ -1131,7 +1188,7 @@ // clean the window from any previous content RenderClear(); if SuddenDeathDmg then - SetSkyColor(SDSkyColor.r * (SDTint/255) / 255, SDSkyColor.g * (SDTint/255) / 255, SDSkyColor.b * (SDTint/255) / 255) + SetSkyColor(SDSkyColor.r * (SDTint.r/255) / 255, SDSkyColor.g * (SDTint.g/255) / 255, SDSkyColor.b * (SDTint.b/255) / 255) else if ((cReducedQuality and rqNoBackground) = 0) then SetSkyColor(SkyColor.r / 255, SkyColor.g / 255, SkyColor.b / 255) else diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uTeams.pas Sun Dec 17 00:09:24 2017 +0100 @@ -49,12 +49,12 @@ uGearsUtils, uGearsList, uVisualGearsList, uTextures {$IFDEF USE_TOUCH_INTERFACE}, uTouch{$ENDIF}; -var GameOver: boolean; +var TeamsGameOver: boolean; NextClan: boolean; function CheckForWin: boolean; var AliveClan: PClan; - s, ts: ansistring; + s, ts, cap: ansistring; t, AliveCount, i, j: LongInt; begin CheckForWin:= false; @@ -77,22 +77,47 @@ if (not bBetweenTurns) and isInMultiShoot then TurnReaction(); -if not GameOver then +if not TeamsGameOver then begin if AliveCount = 0 then begin // draw - AddCaption(trmsg[sidDraw], cWhiteColor, capgrpGameState); - SendStat(siGameResult, shortstring(trmsg[sidDraw])); - AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000) + AddCaption(GetEventString(eidRoundDraw), cWhiteColor, capgrpGameState); + if SendGameResultOn then + SendStat(siGameResult, shortstring(trmsg[sidDraw])); + AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000); end else // win + begin with AliveClan^ do begin ts:= ansistring(Teams[0]^.TeamName); - if TeamsNumber = 1 then - s:= FormatA(trmsg[sidWinner], ts) // team wins - else - s:= FormatA(trmsg[sidWinner], ts); // clan wins + if TeamsNumber = 1 then // team wins + begin + s:= FormatA(trmsg[sidWinner], ts); + cap:= FormatA(GetEventString(eidRoundWin), ts); + AddCaption(cap, cWhiteColor, capgrpGameState); + end + else // clan wins + begin + s:= ''; + for j:= 0 to Pred(TeamsNumber) do + begin + (* + Currently, the game result string is just the victory + string concatenated multiple times. This assumes that + sidWinner is a complete sentence. + This might not work well for some languages. + + FIXME/TODO: Add event strings for 2, 3, 4 and >4 teams winning. + This requires FormatA to work with multiple parameters. *) + ts:= Teams[j]^.TeamName; + s:= s + ' ' + FormatA(trmsg[sidWinner], ts); + + // FIXME: Show victory captions one-by-one, not all at once + cap:= FormatA(GetEventString(eidRoundWin), ts); + AddCaption(cap, cWhiteColor, capgrpGameState); + end; + end; for j:= 0 to Pred(TeamsNumber) do with Teams[j]^ do @@ -104,13 +129,15 @@ AddVoice(sndFlawless, Teams[0]^.voicepack) else AddVoice(sndVictory, Teams[0]^.voicepack); + end; - AddCaption(s, cWhiteColor, capgrpGameState); + if SendGameResultOn then SendStat(siGameResult, shortstring(s)); - AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000) - end; + AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000) + end; SendStats; end; +TeamsGameOver:= true; GameOver:= true end; @@ -320,6 +347,7 @@ TagTurnTimeLeft:= 0; NextClan:= false; end; +IsGetAwayTime:= false; if (TurnTimeLeft > 0) and (CurrentHedgehog^.BotLevel = 0) then begin @@ -732,25 +760,6 @@ end; -procedure chFinish(var s:shortstring); -var t: LongInt; -begin -// avoid compiler hint -s:= s; - -isPaused:= false; - -t:= 0; -while t < TeamsCount do - begin - TeamsArray[t]^.hasGone:= true; - inc(t) - end; - -AddChatString(#7 + '* Good-bye!'); -RecountAllTeamsHealth(); -end; - procedure SwitchCurrentHedgehog(newHog: PHedgehog); var oldCI, newCI: boolean; oldHH: PHedgehog; @@ -832,7 +841,6 @@ RegisterVariable('bind', @chBind, true ); RegisterVariable('teamgone', @chTeamGone, true ); RegisterVariable('teamback', @chTeamBack, true ); -RegisterVariable('finish', @chFinish, true ); // all teams gone RegisterVariable('fort' , @chFort , false); RegisterVariable('grave' , @chGrave , false); RegisterVariable('hat' , @chSetHat , false); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uTextures.pas --- a/hedgewars/uTextures.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uTextures.pas Sun Dec 17 00:09:24 2017 +0100 @@ -78,7 +78,6 @@ new(NewTexture); NewTexture^.PrevTexture:= nil; NewTexture^.NextTexture:= nil; -NewTexture^.Scale:= 1; if TextureList <> nil then begin TextureList^.PrevTexture:= NewTexture; @@ -86,6 +85,8 @@ end; TextureList:= NewTexture; +NewTexture^.Scale:= 1; +NewTexture^.Priority:= 0; NewTexture^.w:= width; NewTexture^.h:= height; NewTexture^.rx:= 1.0; @@ -224,6 +225,8 @@ end; TextureList:= Surface2Tex; +Surface2Tex^.Scale:= 1; +Surface2Tex^.Priority:= 0; Surface2Tex^.w:= surf^.w; Surface2Tex^.h:= surf^.h; @@ -244,9 +247,11 @@ fromP4:= Surf^.pixels; +// FIXME move out of surface2tex if GrayScale then Surface2GrayScale(Surf); +// FIXME move out of surface2tex PrettifySurfaceAlpha(surf, fromP4); if (not SupportNPOTT) and (not (isPowerOf2(Surf^.w) and isPowerOf2(Surf^.h))) then diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uTypes.pas Sun Dec 17 00:09:24 2017 +0100 @@ -42,14 +42,14 @@ TGameType = (gmtLocal, gmtDemo, gmtNet, gmtSave, gmtLandPreview, gmtSyntax, gmtRecord); // Different files are stored in different folders, this enumeration is used to tell which folder to use - TPathType = (ptNone, ptData, ptGraphics, ptThemes, ptCurrTheme, ptTeams, ptMaps, + 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, ptConfig); + ptSuddenDeath, ptButtons, ptShaders); // Available sprites for displaying stuff - TSprite = (sprWater, sprCloud, sprBomb, sprBigDigit, sprFrame, - sprLag, sprArrow, sprBazookaShell, sprTargetP, sprBee, + TSprite = (sprWater, sprCloud, sprBomb, sprBigDigit, sprBigDigitGray, sprBigDigitGreen, + sprBigDigitRed, sprFrame, sprLag, sprArrow, sprBazookaShell, sprTargetP, sprBee, sprSmokeTrace, sprRopeHook, sprExplosion50, sprMineOff, sprMineOn, sprMineDead, sprCase, sprFAid, sprDynamite, sprPower, sprClusterBomb, sprClusterParticle, sprFlame, @@ -89,7 +89,9 @@ sprBulletHit, sprSnowball, sprHandSnowball, sprSnow, sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet, sprTardis, sprSlider, sprBotlevels, sprHandKnife, sprKnife, sprStar, sprIceTexture, sprIceGun, - sprFrozenHog, sprAmRubber, sprBoing, sprCustom1, sprCustom2, sprAirMine, sprHandAirMine + sprFrozenHog, sprAmRubber, sprBoing, sprCustom1, sprCustom2, sprCustom3, sprCustom4, + sprCustom5, sprCustom6, sprCustom7, sprCustom8, sprAirMine, sprHandAirMine, + sprFlakeL, sprSDFlakeL, sprCloudL, sprSDCloudL, sprDuck, sprHandDuck ); // Gears that interact with other Gears and/or Land @@ -107,7 +109,7 @@ gtEgg, gtPortal, gtPiano, gtGasBomb, gtSineGunShot, gtFlamethrower, // 51 gtSMine, gtPoisonCloud, gtHammer, gtHammerHit, gtResurrector, // 56 gtNapalmBomb, gtSnowball, gtFlake, {gtStructure,} gtLandGun, gtTardis, // 61 - gtIceGun, gtAddAmmo, gtGenericFaller, gtKnife); // 65 + gtIceGun, gtAddAmmo, gtGenericFaller, gtKnife, gtDuck); // 66 // Gears that are _only_ of visual nature (e.g. background stuff, visual effects, speechbubbles, etc.) TVisualGearType = (vgtFlake, vgtCloud, vgtExplPart, vgtExplPart2, vgtFire, @@ -145,8 +147,11 @@ sndPiano0, sndPiano1, sndPiano2, sndPiano3, sndPiano4, sndPiano5, sndPiano6, sndPiano7, sndPiano8, sndSkip, sndSineGun, sndOoff1, sndOoff2, sndOoff3, sndWhack, sndComeonthen, sndParachute, sndBump, sndResurrector, sndPlane, sndTardis, sndFrozenHogImpact, - sndIceBeam, sndHogFreeze, sndAirMineImpact, sndKnifeImpact, sndExtraTime - ); + sndIceBeam, sndHogFreeze, sndAirMineImpact, sndKnifeImpact, sndExtraTime, sndLaserSight, + sndInvulnerable, sndJetpackLaunch, sndJetpackBoost, sndPortalShot, sndPortalSwitch, + sndPortalOpen, sndBlowTorch, sndCountdown1, sndCountdown2, sndCountdown3, sndCountdown4, + sndDuckDrop, sndDuckWater, sndDuckDie, sndCustom1, sndCustom2, sndCustom3, sndCustom4, + sndCustom5, sndCustom6, sndCustom7, sndCustom8); // Available ammo types to be used by hedgehogs TAmmoType = (amNothing, amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, amPickHammer, // 6 @@ -158,7 +163,7 @@ amLaserSight, amVampiric, amSniperRifle, amJetpack, amMolotov, amBirdy, amPortalGun, // 42 amPiano, amGasBomb, amSineGun, amFlamethrower, amSMine, amHammer, // 48 amResurrector, amDrillStrike, amSnowball, amTardis, {amStructure,} amLandGun, // 53 - amIceGun, amKnife, amRubber, amAirMine); // 57 + amIceGun, amKnife, amRubber, amAirMine, amDuck); // 58 // Different kind of crates that e.g. hedgehogs can pick up TCrateType = (HealthCrate, AmmoCrate, UtilityCrate); @@ -273,7 +278,7 @@ // DirAngle is a 'real' - if you do not need it for rotation of sprite in uGearsRender, you can use it for any visual-only value DirAngle: real; // These are frequently overridden to serve some other purpose - Boom: Longword; // amount of damage caused by the gear + Boom: Longword; // amount of damage caused by the gear Pos: Longword; // Commonly overridden. Example use is posCase values in uConsts. Angle, Power : Longword; // Used for hog aiming/firing. Angle is rarely used as an Angle otherwise. Timer, WDTimer : LongWord; // Typically used for some sort of gear timer. Time to explosion, remaining fuel... @@ -326,6 +331,9 @@ StepDamageRecv, StepDamageGiven, StepKills: Longword; + StepPoisoned, + StepDied, + Sacrificed: boolean; MaxStepDamageRecv, MaxStepDamageGiven, MaxStepKills: Longword; @@ -451,24 +459,27 @@ sidMolotov, sidBirdy, sidPortalGun, sidPiano, sidGasBomb, sidSineGun, sidFlamethrower,sidSMine, sidHammer, sidResurrector, sidDrillStrike, sidSnowball, sidNothing, sidTardis, - {sidStructure,} sidLandGun, sidIceGun, sidKnife, sidRubber, sidAirMine); + {sidStructure,} sidLandGun, sidIceGun, sidKnife, sidRubber, sidAirMine, + sidDuck); - TMsgStrId = (sidStartFight, sidDraw, sidWinner, sidVolume, sidPaused, + TMsgStrId = (sidLoading, sidDraw, sidWinner, sidVolume, sidPaused, sidConfirm, sidSuddenDeath, sidRemaining, sidFuel, sidSync, sidNoEndTurn, sidNotYetAvailable, sidRoundSD, sidRoundsSD, sidReady, sidBounce1, sidBounce2, sidBounce3, sidBounce4, sidBounce5, sidBounce, - sidMute, sidAFK, sidAutoCameraOff, sidAutoCameraOn, sidPressTarget); + sidMute, sidAFK, sidAutoCameraOff, sidAutoCameraOn, sidPressTarget, + sidNotAvailableInSD, sidHealthGain, sidEmptyCrate); // Events that are important for the course of the game or at least interesting for other reasons TEventId = (eidDied, eidDrowned, eidRoundStart, eidRoundWin, eidRoundDraw, eidNewHealthPack, eidNewAmmoPack, eidNewUtilityPack, eidTurnSkipped, - eidHurtSelf, eidHomerun, eidGone); + eidHurtSelf, eidHomerun, eidGone, eidPoisoned, eidResurrected, + eidKamikaze, eidTimeTravelEnd, eidTimeout, eidKingDied); - TGoalStrId = (gidCaption, gidSubCaption, gidForts, gidLowGravity, gidInvulnerable, + TGoalStrId = (gidCaption, gidSubCaption, gidPlaceKing, gidLowGravity, gidInvulnerable, gidVampiric, gidKarma, gidKing, gidPlaceHog, gidArtillery, gidSolidLand, gidSharedAmmo, gidMineTimer, gidNoMineTimer, gidRandomMineTimer, gidDamageModifier, gidResetHealth, gidAISurvival, - gidInfAttack, gidResetWeps, gidPerHogAmmo, gidTagTeam); + gidInfAttack, gidResetWeps, gidPerHogAmmo, gidTagTeam, gidMoreWind); TLandArray = packed array of array of LongWord; @@ -515,6 +526,8 @@ Surface: PSDL_Surface; Width, Height, imageWidth, imageHeight: LongInt; saveSurf: boolean; + critical: boolean; + checkSum: boolean; // use for images where if they are missing a desync can occur. priority: GLfloat; getDimensions, getImageDimensions: boolean; end; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uUtils.pas --- a/hedgewars/uUtils.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uUtils.pas Sun Dec 17 00:09:24 2017 +0100 @@ -42,6 +42,7 @@ function EnumToStr(const en : TCapGroup) : shortstring; overload; function EnumToStr(const en : TSprite) : shortstring; overload; function EnumToStr(const en : TMapGen) : shortstring; overload; +function EnumToStr(const en : TWorldEdge) : shortstring; overload; function Min(a, b: LongInt): LongInt; inline; function MinD(a, b: double) : double; inline; @@ -76,6 +77,8 @@ function GetLaunchX(at: TAmmoType; dir: LongInt; angle: LongInt): LongInt; function GetLaunchY(at: TAmmoType; angle: LongInt): LongInt; +function CalcWorldWrap(X, radius: LongInt): LongInt; + function read1stLn(filePath: shortstring): shortstring; function readValueFromINI(key, filePath: shortstring): shortstring; @@ -296,6 +299,11 @@ EnumToStr := GetEnumName(TypeInfo(TMapGen), ord(en)) end; +function EnumToStr(const en: TWorldEdge) : shortstring; overload; +begin +EnumToStr := GetEnumName(TypeInfo(TWorldEdge), ord(en)) +end; + function Min(a, b: LongInt): LongInt; begin @@ -530,6 +538,7 @@ function GetLaunchX(at: TAmmoType; dir: LongInt; angle: LongInt): LongInt; begin +at:= at; dir:= dir; angle:= angle; // parameter hint suppression because code below is currently disabled GetLaunchX:= 0 (* if (Ammoz[at].ejectX <> 0) or (Ammoz[at].ejectY <> 0) then @@ -540,6 +549,7 @@ function GetLaunchY(at: TAmmoType; angle: LongInt): LongInt; begin +at:= at; angle:= angle; // parameter hint suppression because code below is currently disabled GetLaunchY:= 0 (* if (Ammoz[at].ejectX <> 0) or (Ammoz[at].ejectY <> 0) then @@ -548,6 +558,31 @@ GetLaunchY:= 0*) end; +// Takes an X coordinate and corrects if according to the world edge rules +// Wrap-around: X will be wrapped +// Bouncy: X will be kept inside the legal land (taking radius into account) +// Other world edges: Just returns X +// radius is a radius (gear radius) tolerance for an appropriate distance from bouncy world edges. +// Set radius to 0 if you don't care. +function CalcWorldWrap(X, radius: LongInt): LongInt; +begin + if WorldEdge = weWrap then + begin + if X < leftX then + X:= X + (rightX - leftX) + else if X > rightX then + X:= X - (rightX - leftX); + end + else if WorldEdge = weBounce then + begin + if (X + radius) < leftX then + X:= leftX + radius + else if (X - radius) > rightX then + X:= rightX - radius; + end; + CalcWorldWrap:= X; +end; + function CheckNoTeamOrHH: boolean; begin CheckNoTeamOrHH:= (CurrentTeam = nil) or (CurrentHedgehog^.Gear = nil); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uVariables.pas Sun Dec 17 00:09:24 2017 +0100 @@ -66,7 +66,8 @@ cAudioCodec : shortstring; {$ENDIF} ////////////////////////// - cMapName : shortstring; + cMapName : shortstring; + syncedPixelDigest : LongInt; isCursorVisible : boolean; isInLag : boolean; isPaused : boolean; @@ -93,6 +94,8 @@ TurnClockActive : boolean; TagTurnTimeLeft : Longword; ReadyTimeLeft : Longword; + IsGetAwayTime : boolean; + GameOver : boolean; cSuddenDTurns : LongInt; cDamagePercent : LongInt; cMineDudPercent : LongWord; @@ -178,9 +181,11 @@ cElastic : hwFloat; cGravity : hwFloat; cGravityf : real; + cLowGravity : boolean; cBuildMaxDist : LongInt; cDamageModifier : hwFloat; cLaserSighting : boolean; + cLaserSightingSniper : boolean; cVampiric : boolean; cArtillery : boolean; WeaponTooltipTex: PTexture; @@ -202,7 +207,6 @@ WaterColorArray : array[0..7] of HwColor4f; SDWaterColorArray : array[0..7] of HwColor4f; - SDTint : LongInt; TargetCursorPoint : TPoint; CursorPoint : TPoint; @@ -237,16 +241,23 @@ hiTicks: Word; - LuaGoals : shortstring; + LuaGoals : ansistring; LuaTemplateNumber : LongWord; + // for EndTurn Lua call + LuaEndTurnRequested: boolean; + LuaNoEndTurnTaunts: boolean; + LastVoice : TVoice; mobileRecord: TMobileRecord; MaxTextureSize: LongInt; + SDLwindow: PSDL_Window; + SDLGLcontext: PSDL_GLContext; + ///////////////////////////////////// //Buttons {$IFDEF USE_TOUCH_INTERFACE} @@ -269,6 +280,7 @@ '/Graphics', // ptGraphics '/Themes', // ptThemes '/Themes/Bamboo', // ptCurrTheme + '/Config', // ptConfig '/Config/Teams', // ptTeams '/Maps', // ptMaps '', // ptMapCurrent @@ -286,8 +298,7 @@ '/Missions/Maps', // ptMissionMaps '/Graphics/SuddenDeath', // ptSuddenDeath '/Graphics/Buttons', // ptButton - '/Shaders', // ptShaders - '/Config' // ptConfig + '/Shaders' // ptShaders ); var @@ -329,406 +340,436 @@ const SpritesDataInit: array[TSprite] of TSpriteData = ( (FileName: 'BlueWater'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprWater + Width: 0; Height: -1; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprWater (FileName: 'Clouds'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 256; Height:128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCloud + Width: 256; Height:128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCloud (FileName: 'Bomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBomb + Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBomb (FileName: 'BigDigits'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBigDigit + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBigDigit + (FileName: 'BigDigitsGray'; 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),// sprBigDigitGray + (FileName: 'BigDigitsGreen'; 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),// sprBigDigitGreen + (FileName: 'BigDigitsRed'; 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),// sprBigDigitRed (FileName: 'Frame'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 4; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFrame + Width: 4; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFrame (FileName: 'Lag'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 65; Height: 65; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprLag + Width: 65; Height: 65; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprLag (FileName: 'Arrow'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCursor + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCursor (FileName:'BazookaShell'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBazookaShell + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBazookaShell (FileName: 'Targetp'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetP + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetP (FileName: 'Bee'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBee + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBee (FileName: 'SmokeTrace'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmokeTrace + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmokeTrace (FileName: 'RopeHook'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprRopeHook + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprRopeHook (FileName: 'Expl50'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosion50 + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosion50 (FileName: 'MineOff'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineOff + Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineOff (FileName: 'MineOn'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineOn + Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineOn (FileName: 'MineDead'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineDead + Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMineDead (FileName: 'Case'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCase + Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCase (FileName: 'FirstAid'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprFAid + Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprFAid (FileName: 'dynamite'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDynamite + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDynamite (FileName: 'Power'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprPower + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprPower (FileName: 'ClBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprClusterBomb + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprClusterBomb (FileName: 'ClParticle'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprClusterParticle + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprClusterParticle (FileName: 'Flame'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlame + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlame (FileName: 'horizont'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizont + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizont (FileName: 'horizontL'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizontL + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizontL (FileName: 'horizontR'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizontR + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprHorizontR (FileName: 'Sky'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSky + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSky (FileName: 'SkyL'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSkyL + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSkyL (FileName: 'SkyR'; Path: ptCurrTheme;AltPath: ptNone; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSkyR + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHigh; getDimensions: true; getImageDimensions: true),// sprSkyR (FileName: 'Slot'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMSlot - (FileName: 'Ammos'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMAmmos - (FileName: 'Ammos_bw'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprAMAmmosBW + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMSlot + (FileName: 'Ammos_base'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMAmmos + (FileName: 'Ammos_bw_base'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprAMAmmosBW (FileName: 'SlotKeys'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMSlotKeys + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMSlotKeys (FileName: 'Corners'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 2; Height: 2; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMCorners + Width: 2; Height: 2; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAMCorners (FileName: 'Finger'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFinger + Width: 32; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprFinger (FileName: 'AirBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirBomb + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirBomb (FileName: 'Airplane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 256; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirplane + Width: 256; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirplane (FileName: 'amAirplane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmAirplane + Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmAirplane (FileName: 'amGirder'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 160; Height:160; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmGirder + Width: 160; Height:160; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmGirder (FileName: 'hhMask'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHHTelepMask + 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; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSwitch + Width: 32; Height: 32; 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; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprParachute + 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; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTarget + 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; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprRopeNode + Width: 6; Height: 6; 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; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprQuestion + 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; - Width: 256; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPowerBar + Width: 256; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPowerBar (FileName: 'WindBar'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 151; Height: 17; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindBar + Width: 151; Height: 17; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindBar (FileName: 'WindL'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 80; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindL + Width: 80; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindL (FileName: 'WindR'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 80; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindR + Width: 80; Height: 13; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWindR {$IFDEF USE_TOUCH_INTERFACE} (FileName: 'firebutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprFireButton + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprFireButton (FileName: 'arrowup'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowUp + Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowUp (FileName: 'arrowdown'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowDown + Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowDown (FileName: 'arrowleft'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowLeft + Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowLeft (FileName: 'arrowright'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowRight + Width: 100; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprArrowRight (FileName: 'forwardjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprAMWidget + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprAMWidget (FileName: 'backjump'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprJumpWidget + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprJumpWidget (FileName: 'pause'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 120; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprPauseButton + Width: 120; Height: 100; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprPauseButton (FileName: 'timerbutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTimerButton + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTimerButton (FileName: 'targetbutton'; Path: ptButtons; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprTargetButton + 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; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprSwitchButton + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true), // sprSwitchButton {$ENDIF} (FileName: 'Flake'; Path:ptCurrTheme; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlake + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlake (FileName: 'amRope'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandRope + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandRope (FileName: 'amBazooka'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBazooka + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBazooka (FileName: 'amShotgun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandShotgun + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandShotgun (FileName: 'amDEagle'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDEagle + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDEagle (FileName:'amAirAttack'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandAirAttack + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandAirAttack (FileName: 'amBaseball'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBaseball + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBaseball (FileName: 'Hammer'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPHammer + Width: 32; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPHammer (FileName: 'amBTorch_i'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBlowTorch + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBlowTorch (FileName: 'amBTorch_w'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBlowTorch + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBlowTorch (FileName: 'Teleport'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTeleport + Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTeleport (FileName: 'HHDeath'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprHHDeath + Width: 32; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprHHDeath (FileName:'amShotgun_w'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprShotgun + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprShotgun (FileName: 'amDEagle_w'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDEagle + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDEagle (FileName: 'Idle'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprHHIdle + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprHHIdle (FileName: 'Mortar'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMortar + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMortar (FileName: 'TurnsLeft'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTurnsLeft + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTurnsLeft (FileName: 'amKamikaze'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprKamikaze + Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprKamikaze (FileName: 'amWhip'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWhip + Width: 128; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWhip (FileName: 'Kowtow'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprKowtow + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprKowtow (FileName: 'Sad'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSad + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSad (FileName: 'Wave'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprWave + Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprWave (FileName: 'Hurrah'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprHurrah + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprHurrah (FileName:'ILoveLemonade';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprLemonade + Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprLemonade (FileName: 'Shrug'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShrug + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShrug (FileName: 'Juggle'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprJuggle + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprJuggle (FileName: 'ExplPart'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplPart + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplPart (FileName: 'ExplPart2'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplPart2 + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplPart2 (FileName: 'Cake_walk'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCakeWalk + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCakeWalk (FileName: 'Cake_down'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCakeDown + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCakeDown (FileName: 'Watermelon'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWatermelon + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprWatermelon (FileName: 'EvilTrace'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprEvilTrace + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprEvilTrace (FileName:'HellishBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHellishBomb + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHellishBomb (FileName: 'Seduction'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSeduction + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSeduction (FileName: 'HHDress'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprDress + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprDress (FileName: 'Censored'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprCensored + Width: 64; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprCensored (FileName: 'Drill'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDrill + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprDrill (FileName: 'amDrill'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDrill + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDrill (FileName: 'amBallgun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBallgun + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBallgun (FileName: 'Balls'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 20; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprBalls + Width: 32; Height: 20; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprBalls (FileName: 'RCPlane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPlane + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPlane (FileName: 'amRCPlane'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandPlane + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandPlane (FileName: 'Utility'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprUtility + Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprUtility (FileName:'Invulnerable';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprInvulnerable + Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprInvulnerable (FileName: 'Vampiric'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprVampiric + Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprVampiric (FileName: 'amGirder'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 512; Height:512; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprGirder + Width: 512; Height:512; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprGirder (FileName:'SpeechCorner';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 12; Height: 9; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechCorner + Width: 12; Height: 9; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechCorner (FileName: 'SpeechEdge'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 25; Height: 9; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechEdge + Width: 25; Height: 9; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechEdge (FileName: 'SpeechTail'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 25; Height: 26; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechTail + Width: 25; Height: 26; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprSpeechTail (FileName:'ThoughtCorner';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 49; Height: 37; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtCorner + Width: 49; Height: 37; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtCorner (FileName:'ThoughtEdge'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 23; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtEdge + Width: 23; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtEdge (FileName:'ThoughtTail'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 45; Height: 65; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtTail + Width: 45; Height: 65; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprThoughtTail (FileName:'ShoutCorner'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 34; Height: 23; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutCorner + Width: 34; Height: 23; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutCorner (FileName: 'ShoutEdge'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 30; Height: 20; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutEdge + Width: 30; Height: 20; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutEdge (FileName: 'ShoutTail'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 30; Height: 37; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutTail + Width: 30; Height: 37; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: false; priority: tpLowest; getDimensions: false; getImageDimensions: true),// sprShoutTail (FileName:'amSniperRifle';Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSniperRifle + Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSniperRifle (FileName: 'Bubbles'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprBubbles + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprBubbles (FileName: 'amJetpack'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprJetpack + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprJetpack (FileName: 'Health'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprHealth + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprHealth (FileName: 'amMolotov'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),//sprHandMolotov + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),//sprHandMolotov (FileName: 'Molotov'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMolotov + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprMolotov (FileName: 'Smoke'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmoke + Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmoke (FileName: 'SmokeWhite'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmokeWhite + Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSmokeWhite (FileName: 'Shells'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: true),// sprShell + Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: true),// sprShell (FileName: 'Dust'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprDust + Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprDust (FileName: 'SnowDust'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSnowDust + Width: 22; Height: 22; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSnowDust (FileName: 'Explosives'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosives + Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosives (FileName: 'ExplosivesRoll'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosivesRoll + Width: 48; Height: 48; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprExplosivesRoll (FileName: 'amTeleport'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmTeleport + Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmTeleport (FileName: 'Splash'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 80; Height: 50; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSplash + Width: 80; Height: 50; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSplash (FileName: 'Droplet'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprDroplet + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprDroplet (FileName: 'Birdy'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 75; Height: 75; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBirdy + Width: 75; Height: 75; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBirdy (FileName: 'amCake'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCake + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCake (FileName: 'amConstruction'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandConstruction + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandConstruction (FileName: 'amGrenade'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandGrenade + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandGrenade (FileName: 'amMelon'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMelon + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMelon (FileName: 'amMortar'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMortar + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMortar (FileName: 'amSkip'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSkip + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSkip (FileName: 'amCluster'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCluster + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCluster (FileName: 'amDynamite'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDynamite + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandDynamite (FileName: 'amHellish'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandHellish + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandHellish (FileName: 'amMine'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMine + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandMine (FileName: 'amSeduction'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSeduction + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSeduction (FileName: 'amVamp'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandVamp + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandVamp (FileName: 'BigExplosion'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 385; Height: 385; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBigExplosion + Width: 385; Height: 385; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprBigExplosion (FileName: 'SmokeRing'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 200; Height: 200; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSmokeRing + Width: 200; Height: 200; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSmokeRing (FileName: 'BeeTrace'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprBeeTrace + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprBeeTrace (FileName: 'Egg'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprEgg + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprEgg (FileName: 'TargetBee'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetBee + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprTargetBee (FileName: 'amBee'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBee + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandBee (FileName: 'Feather'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 15; Height: 25; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFeather + Width: 15; Height: 25; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFeather (FileName: 'Piano'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPiano + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPiano (FileName: 'amSineGun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSineGun + Width: 128; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSineGun (FileName: 'amPortalGun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPortalGun + Width: 128; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPortalGun (FileName: 'Portal'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPortal + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprPortal (FileName: 'cheese'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCheese + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprCheese (FileName: 'amCheese'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCheese + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandCheese (FileName: 'amFlamethrower'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandFlamethrower + Width: 128; Height: 128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandFlamethrower (FileName: 'Chunk'; Path: ptCurrTheme; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprChunk + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprChunk (FileName: 'Note'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprNote + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprNote (FileName: 'SMineOff'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOff + Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOff (FileName: 'SMineOn'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOn + Width: 8; Height: 8; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSMineOn (FileName: 'amSMine'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSMine + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSMine (FileName: 'amHammer'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprHammer + Width: 128; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprHammer (FileName: 'amResurrector'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; Width: 32; Height: 32; - imageWidth: 0; imageHeight: 0; saveSurf: false; priority: + imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), //sprHandResurrector (FileName: 'Cross'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 108; Height: 138; - imageWidth: 0; imageHeight: 0; saveSurf: false; priority: + imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), //sprCross (FileName: 'AirDrill'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 16; Height: 16; - imageWidth: 0; imageHeight: 0; saveSurf: false; priority: + imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprAirDrill (FileName: 'NapalmBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 16; Height: 16; - imageWidth: 0; imageHeight: 0; saveSurf: false; priority: + imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprNapalmBomb (FileName: 'BulletHit'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 32; Height: 32; - imageWidth: 0; imageHeight: 0; saveSurf: false; priority: + imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprNapalmBomb (FileName: 'Snowball'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnowball + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnowball (FileName: 'amSnowball'; Path: ptCurrTheme; AltPath: ptHedgehog; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSnowball + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSnowball (FileName: 'Snow'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 4; Height: 4; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnow + Width: 4; Height: 4; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnow (FileName: 'SDFlake'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDFlake + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDFlake (FileName: 'SDWater'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprSDWater + Width: 0; Height: -2; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: true; getImageDimensions: true),// sprSDWater (FileName: 'SDClouds'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil; - Width: 256; Height:128; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprSDCloud + Width: 256; Height:128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprSDCloud (FileName: 'SDSplash'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil; - Width: 80; Height: 50; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSDSplash + Width: 80; Height: 50; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSDSplash (FileName: 'SDDroplet'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDDroplet + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDDroplet (FileName: 'Timebox'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 50; Height: 81; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprTardis + Width: 50; Height: 81; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprTardis (FileName: 'slider'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 3; Height: 17; imageWidth: 3; imageHeight: 17; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprSlider + Width: 3; Height: 17; imageWidth: 3; imageHeight: 17; saveSurf: false; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprSlider (FileName: 'botlevels'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 22; Height: 15; imageWidth: 22; imageHeight: 15; saveSurf: true; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprBotlevels + 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; priority: tpMedium; getDimensions: false; getImageDimensions: false),// sprHandKnife + Width: 64; Height: 64; imageWidth: 64; imageHeight: 64; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: false),// sprHandKnife (FileName: 'cleaver'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 64; imageHeight: 128; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprKnife + 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; - Width: 12; Height: 12; imageWidth: 12; imageHeight: 12; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprStar + Width: 12; Height: 12; imageWidth: 12; imageHeight: 12; saveSurf: false; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprStar (FileName: 'icetexture'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 128; Height: 128; imageWidth: 128; imageHeight: 128; saveSurf: true; priority: tpLow; getDimensions: false; getImageDimensions: true), // sprIceTexture + Width: 128; Height: 128; imageWidth: 128; imageHeight: 128; saveSurf: true; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: true), // sprIceTexture (FileName: 'amIceGun'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 32; imageHeight: 32; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprIceGun + Width: 32; Height: 32; imageWidth: 32; imageHeight: 32; saveSurf: false; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprIceGun (FileName: 'amFrozenHog'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 64; imageHeight: 64; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprFrozenHog + Width: 64; Height: 64; imageWidth: 64; imageHeight: 64; saveSurf: false; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprFrozenHog (FileName: 'amRubber'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 160; Height:160; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprAmRubber + Width: 160; Height:160; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprAmRubber (FileName: 'boing'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 101; Height: 97; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprBoing + Width: 101; Height: 97; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprBoing (FileName: 'custom1'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom1 + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom1 (FileName: 'custom2'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; - Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom2 + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom2 + (FileName: 'custom3'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom3 + (FileName: 'custom4'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom4 + (FileName: 'custom5'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom5 + (FileName: 'custom6'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom6 + (FileName: 'custom7'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom7 + (FileName: 'custom8'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: true; critical: true; checkSum: true; priority: tpLow; getDimensions: true; getImageDimensions: true), // sprCustom8 (FileName: 'AirMine'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true), // sprAirMine + Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true), // sprAirMine (FileName: 'amAirMine'; Path: ptHedgehog; AltPath: ptNone; Texture: nil; Surface: nil; - Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true) // sprHandAirMine + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: true; checkSum: false; priority: tpMedium; getDimensions: false; getImageDimensions: true), // sprHandAirMine + (FileName: 'FlakeL'; Path:ptCurrTheme; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprFlakeL + (FileName: 'SDFlakeL'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil; + Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDFlakeL + (FileName: 'CloudsL'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; + Width: 256; Height:128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprCloudL + (FileName: 'SDCloudsL'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Surface: nil; + Width: 256; Height:128; imageWidth: 0; imageHeight: 0; saveSurf: false; critical: false; checkSum: false; priority: tpHigh; getDimensions: false; getImageDimensions: true),// sprSDCloudL + (FileName: 'Duck'; 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),// sprDuck + (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) // sprHandDuck ); const @@ -782,7 +823,7 @@ AmmoType: amNothing; AttackVoice: sndNone; Bounciness: 1000); - Slot: 0; + Slot: cHiddenSlotIndex; TimeAfterTurn: 0; minAngle: 0; maxAngle: 0; @@ -882,6 +923,7 @@ NumberInCase: 1; Ammo: (Propz: ammoprop_Power or ammoprop_NeedTarget or + ammoprop_NoTargetAfter or ammoprop_DontHold or ammoprop_NeedUpDown; Count: 2; @@ -936,7 +978,8 @@ Ammo: (Propz: ammoprop_ForwMsgs or ammoprop_AttackInMove or ammoprop_NoCrosshair or - ammoprop_DontHold; + ammoprop_DontHold or + ammoprop_DoesntStopTimerWhileAttackingInInfAttackMode; Count: 2; NumPerTurn: 0; Timer: 0; @@ -962,7 +1005,8 @@ NumberInCase: 1; Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_AttackInMove or - ammoprop_DontHold; + ammoprop_DontHold or + ammoprop_ForceTurnEnd; Count: AMMO_INFINITE; NumPerTurn: 0; Timer: 0; @@ -1258,7 +1302,8 @@ Probability: 100; NumberInCase: 2; Ammo: (Propz: ammoprop_ForwMsgs or - ammoprop_NeedUpDown; + ammoprop_NeedUpDown or + ammoprop_DoesntStopTimerWhileAttackingInInfAttackMode; Count: 1; NumPerTurn: 0; Timer: 0; @@ -1394,7 +1439,8 @@ Ammo: (Propz: ammoprop_ForwMsgs or ammoprop_DontHold or ammoprop_NeedUpDown or - ammoprop_AttackInMove; + ammoprop_AttackInMove or + ammoprop_ForceTurnEnd; Count: 1; NumPerTurn: 0; Timer: 0; @@ -1946,9 +1992,11 @@ NumberInCase: 1; Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_NeedTarget or + ammoprop_NoTargetAfter or ammoprop_AttackingPut or ammoprop_DontHold or - ammoprop_NotBorder; + ammoprop_NotBorder or + ammoprop_ForceTurnEnd; Count: 1; NumPerTurn: 0; Timer: 0; @@ -2186,7 +2234,8 @@ Ammo: (Propz: ammoprop_ForwMsgs or ammoprop_NoCrosshair or ammoprop_Utility or - ammoprop_DontHold; + ammoprop_DontHold or + ammoprop_ForceTurnEnd; Count: 2; NumPerTurn: 0; Timer: 0; @@ -2360,7 +2409,33 @@ PosCount: 1; PosSprite: sprWater; ejectX: 0; - ejectY: 0) + ejectY: 0), +// Rubber duck + (NameId: sidDuck; + NameTex: nil; + Probability: 100; + NumberInCase: 1; + Ammo: (Propz: ammoprop_NoCrosshair or + ammoprop_AttackInMove or + ammoprop_DontHold or + ammoprop_AltUse; + Count: 2; + NumPerTurn: 0; + Timer: 15000; + Pos: 0; + AmmoType: amDuck; + AttackVoice: sndNone; + Bounciness: 1000); + Slot: 0; + TimeAfterTurn: 3000; + minAngle: 0; + maxAngle: 0; + isDamaging: true; + SkipTurns: 0; + PosCount: 1; + PosSprite: sprWater; + ejectX: 15; + ejectY: -7) ); var @@ -2404,7 +2479,7 @@ bShowFinger: boolean; Frames: Longword; WaterColor, DeepWaterColor: TSDL_Color; - SkyColor, RQSkyColor, SDSkyColor: TSDL_Color; + SDTint, SkyColor, RQSkyColor, SDSkyColor: TSDL_Color; SkyOffset: LongInt; {$IFDEF COUNTTICKS} cntTicks: LongWord; @@ -2435,6 +2510,10 @@ vobVelocity, vobFallSpeed: LongInt; vobSDFrameTicks, vobSDFramesCount, vobSDCount: Longword; vobSDVelocity, vobSDFallSpeed: LongInt; + watFrames, watFrameTicks: Longword; + watMove: LongInt; + watSDFrames, watSDFrameTicks: Longword; + watSDMove: LongInt; DefaultBinds : TBinds; @@ -2460,6 +2539,10 @@ 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 + trluaammo: array[TAmmoStrId] of ansistring; // name of the weapon (Lua overwrite) + trluaammoc: array[TAmmoStrId] of ansistring; // caption of the weapon (Lua overwrite) + trluaammod: array[TAmmoStrId] of ansistring; // description of the weapon (Lua overwrite) + trluaammoa: array[TAmmoStrId] of ansistring; // description appendix of the weapon (Lua only) trmsg: array[TMsgStrId] of ansistring; // message of the event trgoal: array[TGoalStrId] of ansistring; // message of the goal cTestLua : Boolean; @@ -2482,7 +2565,7 @@ cScreenHeight := cWindowedHeight; cShowFPS := false; - cAltDamage := true; + cAltDamage := false; cTimerInterval := 8; cReducedQuality := rqNone; cLocaleFName := 'en.txt'; @@ -2565,6 +2648,25 @@ LAND_HEIGHT_MASK:= $FFFFF800 end; + // default water + WaterColorArray[0].r := 52; + WaterColorArray[0].g := 60; + WaterColorArray[0].b := 125; + WaterColorArray[0].a := 255; + WaterColorArray[2]:= WaterColorArray[0]; + WaterColorArray[4]:= WaterColorArray[0]; + WaterColorArray[6]:= WaterColorArray[0]; + // water surface + WaterColorArray[1].r := 84; + WaterColorArray[1].g := 92; + WaterColorArray[1].b := 157; + WaterColorArray[1].a := 255; + WaterColorArray[3]:= WaterColorArray[1]; + WaterColorArray[5]:= WaterColorArray[1]; + WaterColorArray[7]:= WaterColorArray[1]; + + WaterOpacity:= $80; + // default sudden death water // deep water @@ -2586,7 +2688,11 @@ SDWaterOpacity:= $80; - SDTint:= $80; + SDTint.r := $80; + SDTint.g := $80; + SDTint.b := $80; + SDTint.a := $FF; + ExplosionBorderColorR:= 80; ExplosionBorderColorG:= 80; ExplosionBorderColorB:= 80; @@ -2606,6 +2712,7 @@ cElastic := _0_9; cGravity := cMaxWindSpeed * 2; cGravityf := 0.00025 * 2; + cLowGravity := false; cBuildMaxDist := cDefaultBuildMaxDist; cDamageModifier := _1; TargetPoint := cTargetPointRef; @@ -2636,6 +2743,8 @@ LeftImpactTimer := 0; RightImpactTimer := 0; TurnTimeLeft := 0; + IsGetAwayTime := false; + GameOver := false; TurnClockActive := true; TagTurnTimeLeft := 0; cSuddenDTurns := 15; @@ -2670,6 +2779,7 @@ ZoomValue := cDefaultZoomLevel; WeaponTooltipTex:= nil; cLaserSighting := false; + cLaserSightingSniper := false; cVampiric := false; cArtillery := false; flagMakeCapture := false; @@ -2708,12 +2818,18 @@ vobCount:= 0; vobVelocity:= 10; vobFallSpeed:= 100; + watFrames:= 1; + watFrameTicks:= 0; + watMove:= 100; vobSDFrameTicks:= 0; vobSDFramesCount:= 4; vobSDCount:= 30 * cScreenSpace div LAND_WIDTH; vobSDVelocity:= 15; vobSDFallSpeed:= 250; + watSDFrames:= 1; + watSDFrameTicks:= 0; + watSDMove:= 100; {$IFDEF MOBILE} cMinScreenWidth := min(cScreenWidth, 480); @@ -2737,9 +2853,13 @@ LuaGoals:= ''; cMapName:= ''; + syncedPixelDigest:= 1; LuaTemplateNumber:= 0; + LuaEndTurnRequested:= false; + LuaNoEndTurnTaunts:= false; + UIDisplay:= uiAll; LocalMessage:= 0; @@ -2768,6 +2888,9 @@ MissionIcons:= nil; ropeIconTex:= nil; + SDLWindow:= nil; + SDLGLContext:= nil; + for i:= Low(ClansArray) to High(ClansArray) do begin ClansArray[i]:= nil; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uVideoRec.pas --- a/hedgewars/uVideoRec.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uVideoRec.pas Sun Dec 17 00:09:24 2017 +0100 @@ -67,8 +67,7 @@ zoom: single; end; -var YCbCr_Planes: array[0..2] of PByte; - RGB_Buffer: PByte; +var RGB_Buffer: PByte; cameraFile: File of TFrame; audioFile: File; numPixels: LongWord; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uVisualGears.pas --- a/hedgewars/uVisualGears.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uVisualGears.pas Sun Dec 17 00:09:24 2017 +0100 @@ -125,6 +125,14 @@ exit(sprite); end; +function GetSpriteByWind(sprite, Lsprite: TSprite): TSprite; inline; +begin + if (SpritesData[Lsprite].Texture <> nil) and (cWindSpeedf<0) then + exit(Lsprite) + else + exit(sprite); +end; + function GetSpriteData(sprite, SDsprite: TSprite): PSpriteData; inline; begin exit(@SpritesData[GetSprite(sprite, SDsprite)]); @@ -152,11 +160,11 @@ if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint); case Gear^.Kind of vgtCloud: begin - spriteData:= GetSpriteData(sprCloud, sprSDCloud); + spriteData:= GetSpriteData(GetSpriteByWind(sprCloud, sprCloudL), GetSpriteByWind(sprSDCloud, sprSDCloudL)); DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height) end; vgtFlake: begin - sprite:= GetSprite(sprFlake, sprSDFlake); + sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL)); if cFlattenFlakes then begin if speedlessFlakes then @@ -188,7 +196,7 @@ Tint(Gear^.Tint); case Gear^.Kind of vgtFlake: begin - sprite:= GetSprite(sprFlake, sprSDFlake); + sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL)); if speedlessFlakes then DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) else @@ -331,7 +339,8 @@ tinted:= true; Tint($FF, $FF, $FF, round(Gear^.alpha * $FF)); DrawTextureF(ropeIconTex, Gear^.scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 32, 32); - DrawTextureF(SpritesData[sprAMAmmos].Texture, Gear^.scale * 0.90, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame - 1, 1, 32, 32); + if Gear^.Frame <> ord(amNothing) then + DrawTextureF(SpritesData[sprAMAmmos].Texture, Gear^.scale * 0.90, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame - 1, 1, 32, 32); end; vgtShell: begin if Gear^.FrameTicks < $FF then @@ -360,7 +369,7 @@ end; case Gear^.Kind of vgtFlake: begin - spriteData:= GetSpriteData(sprFlake, sprSDFlake); + spriteData:= GetSpriteData(GetSpriteByWind(sprFlake, sprFlakeL), GetSpriteByWind(sprSDFlake, sprSDFlakeL)); if speedlessFlakes then DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height) else @@ -388,11 +397,11 @@ Tint(Gear^.Tint); case Gear^.Kind of vgtCloud: begin - spriteData:= GetSpriteData(sprCloud, sprSDCloud); + spriteData:= GetSpriteData(GetSpriteByWind(sprCloud, sprCloudL), GetSpriteByWind(sprSDCloud, sprSDCloudL)); DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height); end; vgtFlake: begin - spriteData:= GetSpriteData(sprFlake, sprSDFlake); + spriteData:= GetSpriteData(GetSpriteByWind(sprFlake, sprFlakeL), GetSpriteByWind(sprSDFlake, sprSDFlakeL)); if speedlessFlakes then DrawTextureF(spriteData^.Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, spriteData^.Width, spriteData^.Height) else @@ -413,11 +422,11 @@ Tint(Gear^.Tint); case Gear^.Kind of vgtCloud: begin - sprite:= GetSprite(sprCloud, sprSDCloud); + sprite:= GetSpriteByWind(GetSprite(sprCloud, sprSDCloud), GetSprite(sprCloudL, sprSDCloudL)); DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame); end; vgtFlake: begin - sprite:= GetSprite(sprFlake, sprSDFlake); + sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL)); if speedlessFlakes then DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) else @@ -438,7 +447,7 @@ Tint(Gear^.Tint); case Gear^.Kind of vgtFlake: begin - sprite:= GetSprite(sprFlake, sprSDFlake); + sprite:= GetSpriteByWind(GetSprite(sprFlake, sprSDFlake), GetSprite(sprFlakeL, sprSDFlakeL)); if speedlessFlakes then DrawSprite(sprite, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame) else @@ -463,22 +472,25 @@ end; procedure ChangeToSDClouds; -var i: LongInt; +var i, j: LongInt; vg, tmp: PVisualGear; begin if cCloudsNumber = cSDCloudsNumber then exit; -vg:= VisualGearLayers[0]; -while vg <> nil do - if vg^.Kind = vgtCloud then - begin - tmp:= vg^.NextGear; - DeleteVisualGear(vg); - vg:= tmp - end - else vg:= vg^.NextGear; -for i:= 0 to cSDCloudsNumber - 1 do - AddVisualGear(cLeftScreenBorder + i * LongInt(cScreenSpace div (cSDCloudsNumber + 1)), LAND_HEIGHT-1184, vgtCloud) +for i:= 0 to 6 do + begin + vg:= VisualGearLayers[i]; + while vg <> nil do + if vg^.Kind = vgtCloud then + begin + tmp:= vg^.NextGear; + DeleteVisualGear(vg); + vg:= tmp + end + else vg:= vg^.NextGear; + for j:= 0 to cSDCloudsNumber - 1 do + AddVisualGear(cLeftScreenBorder + j * LongInt(cScreenSpace div (cSDCloudsNumber + 1)), LAND_HEIGHT-1184, vgtCloud) + end; end; procedure AddFlakes; diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uVisualGearsHandlers.pas --- a/hedgewars/uVisualGearsHandlers.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uVisualGearsHandlers.pas Sun Dec 17 00:09:24 2017 +0100 @@ -79,8 +79,11 @@ procedure doStepFlake(Gear: PVisualGear; Steps: Longword); var sign: real; - moved: boolean; + moved, rising, outside: boolean; vfc, vft: LongWord; + spawnMargin: LongInt; +const + randMargin = 50; begin if SuddenDeathDmg then begin @@ -162,28 +165,34 @@ X:= X - cScreenSpace; moved:= true end; - // if round(Y) < (LAND_HEIGHT - 1024 - 75) then Y:= Y + 25.0; // For if flag is set for flakes rising upwards? - if (Gear^.Layer = 2) and (round(Y) - 400 > LAND_HEIGHT) and (cGravityf >= 0) then - begin - X:= cLeftScreenBorder + random(cScreenSpace); - Y:= Y-(1024 + 400 + random(50)); // TODO - configure in theme (jellies for example could use limited range) - moved:= true - end - else if (Gear^.Layer <> 2) and (round(Y) - 150 > LAND_HEIGHT) and (cGravityf >= 0) then + + // it's possible for flakes to move upwards + if SuddenDeathDmg then + rising:= (cGravityf * vobSDFallSpeed) < 0 + else + rising:= (cGravityf * vobFallSpeed) < 0; + + if gear^.layer = 2 then + spawnMargin:= 400 + else + spawnMargin:= 200; + + // flake fell far below map? + outside:= (not rising) and (round(Y) - spawnMargin + randMargin > LAND_HEIGHT); + // if not, did it rise far above map? + outside:= outside or (rising and (round(Y) < LAND_HEIGHT - 1024 - spawnMargin - randMargin)); + + // if flake left acceptable vertical area, respawn it opposite side + if outside then begin X:= cLeftScreenBorder + random(cScreenSpace); - Y:= Y-(1024 + 200 + random(50)); - moved:= true - end - else if (round(Y) < LAND_HEIGHT-1200) and (cGravityf < 0) then // gravity can make flakes move upwards - begin - X:= cLeftScreenBorder + random(cScreenSpace); - if Gear^.Layer = 2 then - Y:= Y+(1024 + 150 + random(100)) + if rising then + Y:= Y + (1024 + spawnMargin + random(50)) else - Y:= Y+(1024 + random(50)); - moved:= true + Y:= Y - (1024 + spawnMargin + random(50)); + moved:= true; end; + if moved then begin Angle:= random(360); diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uVisualGearsList.pas --- a/hedgewars/uVisualGearsList.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uVisualGearsList.pas Sun Dec 17 00:09:24 2017 +0100 @@ -36,7 +36,7 @@ VisualGearLayers: array[0..6] of PVisualGear; implementation -uses uCollisions, uFloat, uVariables, uConsts, uTextures, uVisualGearsHandlers; +uses uCollisions, uFloat, uVariables, uConsts, uTextures, uVisualGearsHandlers, uScript; function AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear; inline; begin @@ -230,8 +230,16 @@ end; vgtDroplet: begin - dx:= 0.001 * (random(180) - 90); - dy:= -0.001 * (random(160) + 40); + // 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 + Frame:= 129 + random(1791); // angle + dy:= -dx * hwFloat2Float(AngleSin(Frame)); + // divide by 2 to create an eliptic shape + dx:= dx * hwFloat2Float(AngleCos(Frame)) / 2; FrameTicks:= 250 + random(1751); Frame:= random(3) end; @@ -341,9 +349,8 @@ gear^.State:= State; case Gear^.Kind of - vgtFlake: if cFlattenFlakes then - gear^.Layer:= 0 - else if random(3) = 0 then + vgtFlake: + if random(3) = 0 then begin gear^.Scale:= 0.5; gear^.Layer:= 0 // 33% - far back @@ -355,13 +362,17 @@ end else if random(3) <> 0 then gear^.Layer:= 5 // 30% - just behind land - else if random(2) = 0 then + else if (not cFlattenFlakes) and (random(2) = 0) then gear^.Layer:= 6 // 7% - just in front of land - else + else if not cFlattenFlakes then begin gear^.Scale:= 1.5; - gear^.Layer:= 2; // 7% - close up - end; + gear^.Layer:= 2 // 7% - close up + end + else begin + gear^.Layer:= 0; + gear^.Scale:= 0.5 + end; vgtCloud: if cFlattenClouds then gear^.Layer:= 5 else if random(3) = 0 then @@ -429,10 +440,12 @@ VisualGearLayers[gear^.Layer]:= gear; AddVisualGear:= gear; +ScriptCall('onVisualGearAdd', gear^.uid); end; procedure DeleteVisualGear(Gear: PVisualGear); begin + ScriptCall('onVisualGearDelete', Gear^.uid); FreeAndNilTexture(Gear^.Tex); if Gear^.NextGear <> nil then diff -r 01f88c3b7b66 -r 1b2b84315d27 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Thu Aug 11 23:05:14 2016 +0300 +++ b/hedgewars/uWorld.pas Sun Dec 17 00:09:24 2017 +0100 @@ -32,6 +32,7 @@ procedure DrawWorldStereo(Lag: LongInt; RM: TRenderMode); procedure ShowMission(caption, subcaption, text: ansistring; icon, time : LongInt); procedure HideMission; +procedure SetAmmoTexts(ammoType: TAmmoType; name: ansistring; caption: ansistring; description: ansistring); procedure ShakeCamera(amount: LongInt); procedure InitCameraBorders; procedure InitTouchInterface; @@ -60,6 +61,7 @@ , uCursor , uCommands , uTeams + , uDebug {$IFDEF USE_VIDEO_RECORDING} , uVideoRec {$ENDIF} @@ -169,28 +171,28 @@ g:= ''; // no text/things to note yet // add custom goals from lua script if there are any -if LuaGoals <> '' then +if LuaGoals <> ansistring('') then g:= LuaGoals + '|'; -// check different game flags (goals/game modes first for now) +// 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, gfTagTeam, gidTagTeam); // tag team mode? - -// other important flags -g:= AddGoal(g, gfForts, gidForts); // forts? +g:= AddGoal(g, gfSharedAmmo, gidSharedAmmo); // shared ammo? +g:= AddGoal(g, gfPerHogAmmo, gidPerHogAmmo); +g:= AddGoal(g, gfMoreWind, gidMoreWind); g:= AddGoal(g, gfLowGravity, gidLowGravity); // low gravity? -g:= AddGoal(g, gfInvulnerable, gidInvulnerable); // invulnerability? -g:= AddGoal(g, gfVampiric, gidVampiric); // vampirism? -g:= AddGoal(g, gfKarma, gidKarma); // karma? -g:= AddGoal(g, gfPlaceHog, gidPlaceHog); // placement? +g:= AddGoal(g, gfSolidLand, gidSolidLand); // solid land? g:= AddGoal(g, gfArtillery, gidArtillery); // artillery? -g:= AddGoal(g, gfSolidLand, gidSolidLand); // solid land? -g:= AddGoal(g, gfSharedAmmo, gidSharedAmmo); // shared ammo? -g:= AddGoal(g, gfResetHealth, gidResetHealth); -g:= AddGoal(g, gfAISurvival, gidAISurvival); g:= AddGoal(g, gfInfAttack, gidInfAttack); g:= AddGoal(g, gfResetWeps, gidResetWeps); -g:= AddGoal(g, gfPerHogAmmo, gidPerHogAmmo); +g:= AddGoal(g, gfResetHealth, gidResetHealth); +g:= AddGoal(g, gfKarma, gidKarma); // karma? +g:= AddGoal(g, gfVampiric, gidVampiric); // vampirism? +g:= AddGoal(g, gfInvulnerable, gidInvulnerable); // invulnerability? +g:= AddGoal(g, gfAISurvival, gidAISurvival); // modified damage modificator? if cDamagePercent <> 100 then @@ -422,7 +424,7 @@ SlotsNum:= 0; for i:= 0 to cMaxSlotIndex do - if((i = 0) and (Ammo^[i,1].Count > 0)) or ((i <> 0) and (Ammo^[i,0].Count > 0)) then + if (i <> cHiddenSlotIndex) and (Ammo^[i, 0].Count > 0) then inc(SlotsNum); {$IFDEF USE_LANDSCAPE_AMMOMENU} SlotsNumX:= SlotsNum; @@ -453,7 +455,7 @@ x:= AMRect.x; y:= AMRect.y; for i:= 0 to cMaxSlotIndex do - if ((i = 0) and (Ammo^[i, 1].Count > 0)) or ((i <> 0) and (Ammo^[i, 0].Count > 0)) then + if (i <> cHiddenSlotIndex) and (Ammo^[i, 0].Count > 0) then begin {$IFDEF USE_LANDSCAPE_AMMOMENU} y:= AMRect.y; @@ -660,7 +662,7 @@ {$IFDEF USE_LANDSCAPE_AMMOMENU} c:= -1; for i:= 0 to cMaxSlotIndex do - if ((i = 0) and (Ammo^[i, 1].Count > 0)) or ((i <> 0) and (Ammo^[i, 0].Count > 0)) then + if (i <> cHiddenSlotIndex) and (Ammo^[i, 0].Count > 0) then begin inc(c); {$IFDEF USE_AM_NUMCOLUMN} @@ -690,7 +692,7 @@ {$ELSE} c:= -1; for i:= 0 to cMaxSlotIndex do - if ((i = 0) and (Ammo^[i, 1].Count > 0)) or ((i <> 0) and (Ammo^[i, 0].Count > 0)) then + if (i <> cHiddenSlotIndex) and (Ammo^[i, 0].Count > 0) then begin inc(c); {$IFDEF USE_AM_NUMCOLUMN} @@ -718,7 +720,7 @@ end; end; {$ENDIF} - if (Pos >= 0) and (Pos <= cMaxSlotAmmoIndex) and (Slot >= 0) and (Slot <= cMaxSlotIndex)then + if (Pos >= 0) and (Pos <= cMaxSlotAmmoIndex) and (Slot >= 0) and (Slot <= cMaxSlotIndex) and (Slot <> cHiddenSlotIndex) then begin if (AMShiftX = 0) and (AMShiftY = 0) then if (Ammo^[Slot, Pos].Count > 0) and (Ammo^[Slot, Pos].AmmoType <> amNothing) then @@ -1025,7 +1027,7 @@ procedure RenderTeamsHealth; -var t, i, h, smallScreenOffset, TeamHealthBarWidth : LongInt; +var t, i, h, smallScreenOffset, TeamHealthBarWidth : LongInt; r: TSDL_Rect; highlight: boolean; htex: PTexture; @@ -1159,12 +1161,15 @@ procedure DrawWorldStereo(Lag: LongInt; RM: TRenderMode); var i, t: LongInt; + spr: TSprite; r: TSDL_Rect; tdx, tdy: Double; s: shortstring; offsetX, offsetY, screenBottom: LongInt; replicateToLeft, replicateToRight, tmp: boolean; +{$IFDEF USE_VIDEO_RECORDING} a: Byte; +{$ENDIF} begin if WorldEdge <> weWrap then begin @@ -1193,7 +1198,7 @@ // background ChangeDepth(RM, cStereo_Sky); if SuddenDeathDmg then - Tint(SDTint, SDTint, SDTint, $FF); + Tint(SDTint.r, SDTint.g, SDTint.b, SDTint.a); DrawRepeated(sprSky, sprSkyL, sprSkyR, (WorldDx + LAND_WIDTH div 2) * 3 div 8, SkyOffset); ChangeDepth(RM, -cStereo_Horizon); DrawRepeated(sprHorizont, sprHorizontL, sprHorizontR, (WorldDx + LAND_WIDTH div 2) * 3 div 5, HorizontOffset); @@ -1323,6 +1328,8 @@ else DrawWaves(-1, 50, cWaveHeight div 2, cWaveHeight div 2, 0); +DrawGearsTimers; + // everything after this ChangeDepth will be drawn outside the screen // note: negative parallax gears should last very little for a smooth stereo effect ChangeDepth(RM, cStereo_Outside); @@ -1424,7 +1431,7 @@ offsetX:= 48; {$ENDIF} offsetY:= cOffsetY; - if ((TurnTimeLeft <> 0) and (TurnTimeLeft < 1000000)) or (ReadyTimeLeft <> 0) then + if ((TurnTimeLeft <> 0) and (TurnTimeLeft < 999000)) or (ReadyTimeLeft <> 0) then begin if ReadyTimeLeft <> 0 then i:= Succ(Pred(ReadyTimeLeft) div 1000) @@ -1441,7 +1448,15 @@ while i > 0 do begin dec(t, 32); - DrawSprite(sprBigDigit, -(cScreenWidth shr 1) + t + offsetY, cScreenHeight - offsetX, i mod 10); + if isPaused or (not IsClockRunning()) then + spr := sprBigDigitGray + else if (ReadyTimeLeft <> 0) then + spr := sprBigDigitGreen + else if IsGetAwayTime then + spr := sprBigDigitRed + else + spr := sprBigDigit; + DrawSprite(spr, -(cScreenWidth shr 1) + t + offsetY, cScreenHeight - offsetX, i mod 10); i:= i div 10 end; DrawSprite(sprFrame, -(cScreenWidth shr 1) + t - 4 + offsetY, cScreenHeight - offsetX, 0); @@ -1506,6 +1521,28 @@ end end; +{$IFNDEF USE_TOUCH_INTERFACE} +// Indicators for global effects (extra damage, low gravity) +// TODO: Add support for touch interface (need to find out correct offset) +if UIDisplay <> uiNone then + begin + offsetX:= 45; + offsetY:= 51; + + if cDamageModifier = _1_5 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(amExtraDamage) - 1, 1, 32, 32); + offsetX := offsetX + 33 + end; + if (cLowGravity) or ((GameFlags and gfLowGravity) <> 0) 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(amLowGravity) - 1, 1, 32, 32); + end; + end; +{$ENDIF} + // AmmoMenu if bShowAmmoMenu and ((AMState = AMHidden) or (AMState = AMHiding)) then begin @@ -1917,6 +1954,33 @@ missionTimer:= 0; end; +procedure SetAmmoTexts(ammoType: TAmmoType; name: ansistring; caption: ansistring; description: ansistring); +var + ammoStrId: TAmmoStrId; + ammoStr: ansistring; + tmpsurf: PSDL_Surface; +begin + ammoStrId := Ammoz[ammoType].NameId; + + trluaammo[ammoStrId] := name; + if length(trluaammo[ammoStrId]) > 0 then + ammoStr:= trluaammo[ammoStrId] + else + ammoStr:= trammo[ammoStrId]; + + if checkFails(length(ammoStr) > 0,'No default text/translation found for ammo type #' + intToStr(ord(ammoType)) + '!',true) then exit; + + tmpsurf:= TTF_RenderUTF8_Blended(Fontz[CheckCJKFont(ammoStr,fnt16)].Handle, PChar(ammoStr), cWhiteColorChannels); + if checkFails(tmpsurf <> nil,'Name-texture creation for ammo type #' + intToStr(ord(ammoType)) + ' failed!',true) then exit; + tmpsurf:= doSurfaceConversion(tmpsurf); + FreeAndNilTexture(Ammoz[ammoType].NameTex); + Ammoz[ammoType].NameTex:= Surface2Tex(tmpsurf, false); + SDL_FreeSurface(tmpsurf); + + trluaammoc[ammoStrId] := caption; + trluaammod[ammoStrId] := description; +end; + procedure ShakeCamera(amount: LongInt); begin if isCursorVisible then diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/hats_js_anim.xhtml --- a/misc/hats_js_anim.xhtml Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/hats_js_anim.xhtml Sun Dec 17 00:09:24 2017 +0100 @@ -8,7 +8,7 @@ * {padding: 0; margin: 0; } body { - background: url('http://hedgewars.googlecode.com/hg/share/hedgewars/Data/Themes/Nature/Sky.png') fixed no-repeat bottom left; + background: url('//hg.hedgewars.org/hedgewars/raw-file/tip/share/hedgewars/Data/Themes/Nature/Sky.png') fixed no-repeat bottom left; -moz-background-size: 200%; background-size: 100% 100%; font-family: sans-serif; @@ -22,14 +22,14 @@ height: 32px; width: 32px; color: transparent; - background-image: url("http://hedgewars.googlecode.com/hg/share/hedgewars/Data/Graphics/Hedgehog/Idle.png"); + background-image: url("//hg.hedgewars.org/hedgewars/raw-file/tip/share/hedgewars/Data/Graphics/Hedgehog/Idle.png"); } .girder { width: 100%; height: 30px; clear: left; - background-image: url('http://hedgewars.googlecode.com/hg/share/hedgewars/Data/Themes/Nature/Girder.png'); + background-image: url('//hg.hedgewars.org/hedgewars/raw-file/tip/share/hedgewars/Data/Themes/Nature/Girder.png'); background-repeat: repeat-x; } .hide { visibility: hidden; } @@ -82,7 +82,7 @@ window.onload = function() { var xml=new XMLHttpRequest(); - xml.open("GET", "/hg/share/hedgewars/Data/Graphics/Hats/", false); + xml.open("GET", "/hedgewars/file/tip/share/hedgewars/Data/Graphics/Hats/", false); xml.send(null); /*var resp = xml.responseXML; unfortunately not served as XHTML var a = resp.getElementsByTagName("a"); @@ -126,7 +126,7 @@ for (var i=0;i diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_dir.c --- a/misc/libphysfs/archiver_dir.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_dir.c Sun Dec 17 00:09:24 2017 +0100 @@ -43,10 +43,9 @@ char *retval = NULL; const size_t namelen = strlen(name); const size_t seplen = 1; - int exists = 0; assert(io == NULL); /* shouldn't create an Io for these. */ - BAIL_IF_MACRO(!__PHYSFS_platformStat(name, &exists, &st), ERRPASS, NULL); + BAIL_IF_MACRO(!__PHYSFS_platformStat(name, &st), ERRPASS, NULL); if (st.filetype != PHYSFS_FILETYPE_DIRECTORY) BAIL_MACRO(PHYSFS_ERR_UNSUPPORTED, NULL); @@ -66,8 +65,8 @@ } /* DIR_openArchive */ -static void DIR_enumerateFiles(PHYSFS_Dir *opaque, const char *dname, - int omitSymLinks, PHYSFS_EnumFilesCallback cb, +static void DIR_enumerateFiles(void *opaque, const char *dname, + PHYSFS_EnumFilesCallback cb, const char *origdir, void *callbackdata) { char *d; @@ -75,38 +74,28 @@ CVT_TO_DEPENDENT(d, opaque, dname); if (d != NULL) { - __PHYSFS_platformEnumerateFiles(d, omitSymLinks, cb, - origdir, callbackdata); + __PHYSFS_platformEnumerateFiles(d, cb, origdir, callbackdata); __PHYSFS_smallFree(d); } /* if */ } /* DIR_enumerateFiles */ -static PHYSFS_Io *doOpen(PHYSFS_Dir *opaque, const char *name, - const int mode, int *fileExists) +static PHYSFS_Io *doOpen(void *opaque, const char *name, const int mode) { - char *f; PHYSFS_Io *io = NULL; - int existtmp = 0; + char *f = NULL; CVT_TO_DEPENDENT(f, opaque, name); BAIL_IF_MACRO(!f, ERRPASS, NULL); - if (fileExists == NULL) - fileExists = &existtmp; - io = __PHYSFS_createNativeIo(f, mode); if (io == NULL) { const PHYSFS_ErrorCode err = PHYSFS_getLastErrorCode(); PHYSFS_Stat statbuf; - __PHYSFS_platformStat(f, fileExists, &statbuf); - __PHYSFS_setError(err); + __PHYSFS_platformStat(f, &statbuf); + PHYSFS_setErrorCode(err); } /* if */ - else - { - *fileExists = 1; - } /* else */ __PHYSFS_smallFree(f); @@ -114,25 +103,25 @@ } /* doOpen */ -static PHYSFS_Io *DIR_openRead(PHYSFS_Dir *opaque, const char *fnm, int *exist) +static PHYSFS_Io *DIR_openRead(void *opaque, const char *filename) { - return doOpen(opaque, fnm, 'r', exist); + return doOpen(opaque, filename, 'r'); } /* DIR_openRead */ -static PHYSFS_Io *DIR_openWrite(PHYSFS_Dir *opaque, const char *filename) +static PHYSFS_Io *DIR_openWrite(void *opaque, const char *filename) { - return doOpen(opaque, filename, 'w', NULL); + return doOpen(opaque, filename, 'w'); } /* DIR_openWrite */ -static PHYSFS_Io *DIR_openAppend(PHYSFS_Dir *opaque, const char *filename) +static PHYSFS_Io *DIR_openAppend(void *opaque, const char *filename) { - return doOpen(opaque, filename, 'a', NULL); + return doOpen(opaque, filename, 'a'); } /* DIR_openAppend */ -static int DIR_remove(PHYSFS_Dir *opaque, const char *name) +static int DIR_remove(void *opaque, const char *name) { int retval; char *f; @@ -145,7 +134,7 @@ } /* DIR_remove */ -static int DIR_mkdir(PHYSFS_Dir *opaque, const char *name) +static int DIR_mkdir(void *opaque, const char *name) { int retval; char *f; @@ -158,21 +147,20 @@ } /* DIR_mkdir */ -static void DIR_closeArchive(PHYSFS_Dir *opaque) +static void DIR_closeArchive(void *opaque) { allocator.Free(opaque); } /* DIR_closeArchive */ -static int DIR_stat(PHYSFS_Dir *opaque, const char *name, - int *exists, PHYSFS_Stat *stat) +static int DIR_stat(void *opaque, const char *name, PHYSFS_Stat *stat) { int retval = 0; char *d; CVT_TO_DEPENDENT(d, opaque, name); BAIL_IF_MACRO(!d, ERRPASS, 0); - retval = __PHYSFS_platformStat(d, exists, stat); + retval = __PHYSFS_platformStat(d, stat); __PHYSFS_smallFree(d); return retval; } /* DIR_stat */ @@ -180,22 +168,24 @@ const PHYSFS_Archiver __PHYSFS_Archiver_DIR = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "", "Non-archive, direct filesystem I/O", "Ryan C. Gordon ", - "http://icculus.org/physfs/", + "https://icculus.org/physfs/", + 1, /* supportsSymlinks */ }, - DIR_openArchive, /* openArchive() method */ - DIR_enumerateFiles, /* enumerateFiles() method */ - DIR_openRead, /* openRead() method */ - DIR_openWrite, /* openWrite() method */ - DIR_openAppend, /* openAppend() method */ - DIR_remove, /* remove() method */ - DIR_mkdir, /* mkdir() method */ - DIR_closeArchive, /* closeArchive() method */ - DIR_stat /* stat() method */ + DIR_openArchive, + DIR_enumerateFiles, + DIR_openRead, + DIR_openWrite, + DIR_openAppend, + DIR_remove, + DIR_mkdir, + DIR_stat, + DIR_closeArchive }; -/* end of dir.c ... */ +/* end of archiver_dir.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_grp.c --- a/misc/libphysfs/archiver_grp.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_grp.c Sun Dec 17 00:09:24 2017 +0100 @@ -87,24 +87,26 @@ const PHYSFS_Archiver __PHYSFS_Archiver_GRP = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "GRP", "Build engine Groupfile format", "Ryan C. Gordon ", - "http://icculus.org/physfs/", + "https://icculus.org/physfs/", + 0, /* supportsSymlinks */ }, - GRP_openArchive, /* openArchive() method */ - UNPK_enumerateFiles, /* enumerateFiles() method */ - UNPK_openRead, /* openRead() method */ - UNPK_openWrite, /* openWrite() method */ - UNPK_openAppend, /* openAppend() method */ - UNPK_remove, /* remove() method */ - UNPK_mkdir, /* mkdir() method */ - UNPK_closeArchive, /* closeArchive() method */ - UNPK_stat /* stat() method */ + GRP_openArchive, + UNPK_enumerateFiles, + UNPK_openRead, + UNPK_openWrite, + UNPK_openAppend, + UNPK_remove, + UNPK_mkdir, + UNPK_stat, + UNPK_closeArchive }; #endif /* defined PHYSFS_SUPPORTS_GRP */ -/* end of grp.c ... */ +/* end of archiver_grp.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_hog.c --- a/misc/libphysfs/archiver_hog.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_hog.c Sun Dec 17 00:09:24 2017 +0100 @@ -93,24 +93,26 @@ const PHYSFS_Archiver __PHYSFS_Archiver_HOG = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "HOG", "Descent I/II HOG file format", "Bradley Bell ", - "http://icculus.org/physfs/", + "https://icculus.org/physfs/", + 0, /* supportsSymlinks */ }, - HOG_openArchive, /* openArchive() method */ - UNPK_enumerateFiles, /* enumerateFiles() method */ - UNPK_openRead, /* openRead() method */ - UNPK_openWrite, /* openWrite() method */ - UNPK_openAppend, /* openAppend() method */ - UNPK_remove, /* remove() method */ - UNPK_mkdir, /* mkdir() method */ - UNPK_closeArchive, /* closeArchive() method */ - UNPK_stat /* stat() method */ + HOG_openArchive, + UNPK_enumerateFiles, + UNPK_openRead, + UNPK_openWrite, + UNPK_openAppend, + UNPK_remove, + UNPK_mkdir, + UNPK_stat, + UNPK_closeArchive }; #endif /* defined PHYSFS_SUPPORTS_HOG */ -/* end of hog.c ... */ +/* end of archiver_hog.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_iso9660.c --- a/misc/libphysfs/archiver_iso9660.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_iso9660.c Sun Dec 17 00:09:24 2017 +0100 @@ -291,8 +291,8 @@ for(;pos < descriptor->filenamelen; pos++) if (descriptor->filename[pos] == ';') lastfound = pos; - BAIL_IF_MACRO(lastfound < 1, PHYSFS_ERR_NO_SUCH_PATH /* !!! FIXME: PHYSFS_ERR_BAD_FILENAME */, -1); - BAIL_IF_MACRO(lastfound == (descriptor->filenamelen -1), PHYSFS_ERR_NO_SUCH_PATH /* !!! PHYSFS_ERR_BAD_FILENAME */, -1); + BAIL_IF_MACRO(lastfound < 1, PHYSFS_ERR_NOT_FOUND /* !!! FIXME: PHYSFS_ERR_BAD_FILENAME */, -1); + BAIL_IF_MACRO(lastfound == (descriptor->filenamelen -1), PHYSFS_ERR_NOT_FOUND /* !!! PHYSFS_ERR_BAD_FILENAME */, -1); strncpy(filename, descriptor->filename, lastfound); if (filename[lastfound - 1] == '.') filename[lastfound - 1] = '\0'; /* consume trailing ., as done in all implementations */ @@ -398,7 +398,7 @@ * a file needs to branch to the directory extent sooner or later. */ static int iso_find_dir_entry(ISO9660Handle *handle,const char *path, - ISO9660FileDescriptor *descriptor, int *exists) + ISO9660FileDescriptor *descriptor) { char *subpath = 0; PHYSFS_uint64 readpos, end_of_dir; @@ -409,7 +409,6 @@ strcpy(pathcopy, path); mypath = pathcopy; - *exists = 0; readpos = handle->rootdirstart; end_of_dir = handle->rootdirstart + handle->rootdirsize; @@ -442,10 +441,7 @@ if (strcmp(filename, mypath) == 0) { if ( (subpath == 0) || (subpath[0] == 0) ) - { - *exists = 1; return 0; /* no subpaths left and we found the entry */ - } /* if */ if (descriptor->flags.directory) { @@ -458,12 +454,14 @@ } /* if */ else { + /* !!! FIXME: set PHYSFS_ERR_NOT_FOUND? */ /* we're at a file but have a remaining subpath -> no match */ return 0; } /* else */ } /* if */ } /* while */ + /* !!! FIXME: set PHYSFS_ERR_NOT_FOUND? */ return 0; } /* iso_find_dir_entry */ @@ -555,7 +553,7 @@ /* Skip system area to magic number in Volume descriptor */ BAIL_IF_MACRO(!io->seek(io, 32769), ERRPASS, NULL); - BAIL_IF_MACRO(!io->read(io, magicnumber, 5) != 5, ERRPASS, NULL); + BAIL_IF_MACRO(io->read(io, magicnumber, 5) != 5, ERRPASS, NULL); if (memcmp(magicnumber, "CD001", 6) != 0) BAIL_MACRO(PHYSFS_ERR_UNSUPPORTED, NULL); @@ -638,7 +636,7 @@ } /* ISO9660_openArchive */ -static void ISO9660_closeArchive(PHYSFS_Dir *opaque) +static void ISO9660_closeArchive(void *opaque) { ISO9660Handle *handle = (ISO9660Handle*) opaque; handle->io->destroy(handle->io); @@ -766,8 +764,7 @@ } /* iso_file_open_foreign */ -static PHYSFS_Io *ISO9660_openRead(PHYSFS_Dir *opaque, const char *filename, - int *exists) +static PHYSFS_Io *ISO9660_openRead(void *opaque, const char *filename) { PHYSFS_Io *retval = NULL; ISO9660Handle *handle = (ISO9660Handle*) opaque; @@ -783,9 +780,8 @@ GOTO_IF_MACRO(retval == 0, PHYSFS_ERR_OUT_OF_MEMORY, errorhandling); /* find file descriptor */ - rc = iso_find_dir_entry(handle, filename, &descriptor, exists); + rc = iso_find_dir_entry(handle, filename, &descriptor); GOTO_IF_MACRO(rc, ERRPASS, errorhandling); - GOTO_IF_MACRO(!*exists, PHYSFS_ERR_NO_SUCH_PATH, errorhandling); fhandle->startblock = descriptor.extentpos + descriptor.extattributelen; fhandle->filesize = descriptor.datalen; @@ -816,8 +812,7 @@ * Information gathering functions ******************************************************************************/ -static void ISO9660_enumerateFiles(PHYSFS_Dir *opaque, const char *dname, - int omitSymLinks, +static void ISO9660_enumerateFiles(void *opaque, const char *dname, PHYSFS_EnumFilesCallback cb, const char *origdir, void *callbackdata) { @@ -836,9 +831,7 @@ else { printf("pfad %s\n",dname); - int exists = 0; - BAIL_IF_MACRO(iso_find_dir_entry(handle,dname, &descriptor, &exists), ERRPASS,); - BAIL_IF_MACRO(!exists, ERRPASS, ); + BAIL_IF_MACRO(iso_find_dir_entry(handle,dname, &descriptor), ERRPASS,); BAIL_IF_MACRO(!descriptor.flags.directory, ERRPASS,); readpos = descriptor.extentpos * 2048; @@ -873,15 +866,12 @@ } /* ISO9660_enumerateFiles */ -static int ISO9660_stat(PHYSFS_Dir *opaque, const char *name, int *exists, - PHYSFS_Stat *stat) +static int ISO9660_stat(void *opaque, const char *name, PHYSFS_Stat *stat) { ISO9660Handle *handle = (ISO9660Handle*) opaque; ISO9660FileDescriptor descriptor; ISO9660ExtAttributeRec extattr; - BAIL_IF_MACRO(iso_find_dir_entry(handle, name, &descriptor, exists), ERRPASS, -1); - if (!*exists) - return 0; + BAIL_IF_MACRO(iso_find_dir_entry(handle, name, &descriptor), ERRPASS, -1); stat->readonly = 1; @@ -920,25 +910,25 @@ * Not supported functions ******************************************************************************/ -static PHYSFS_Io *ISO9660_openWrite(PHYSFS_Dir *opaque, const char *name) +static PHYSFS_Io *ISO9660_openWrite(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL); } /* ISO9660_openWrite */ -static PHYSFS_Io *ISO9660_openAppend(PHYSFS_Dir *opaque, const char *name) +static PHYSFS_Io *ISO9660_openAppend(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL); } /* ISO9660_openAppend */ -static int ISO9660_remove(PHYSFS_Dir *opaque, const char *name) +static int ISO9660_remove(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0); } /* ISO9660_remove */ -static int ISO9660_mkdir(PHYSFS_Dir *opaque, const char *name) +static int ISO9660_mkdir(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0); } /* ISO9660_mkdir */ @@ -946,21 +936,23 @@ const PHYSFS_Archiver __PHYSFS_Archiver_ISO9660 = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "ISO", "ISO9660 image file", "Christoph Nelles ", - "http://www.evilazrael.de/", + "https://www.evilazrael.de/", + 0, /* supportsSymlinks */ }, - ISO9660_openArchive, /* openArchive() method */ - ISO9660_enumerateFiles, /* enumerateFiles() method */ - ISO9660_openRead, /* openRead() method */ - ISO9660_openWrite, /* openWrite() method */ - ISO9660_openAppend, /* openAppend() method */ - ISO9660_remove, /* remove() method */ - ISO9660_mkdir, /* mkdir() method */ - ISO9660_closeArchive, /* closeArchive() method */ - ISO9660_stat /* stat() method */ + ISO9660_openArchive, + ISO9660_enumerateFiles, + ISO9660_openRead, + ISO9660_openWrite, + ISO9660_openAppend, + ISO9660_remove, + ISO9660_mkdir, + ISO9660_stat, + ISO9660_closeArchive }; #endif /* defined PHYSFS_SUPPORTS_ISO9660 */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_lzma.c --- a/misc/libphysfs/archiver_lzma.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_lzma.c Sun Dec 17 00:09:24 2017 +0100 @@ -124,7 +124,7 @@ SZ_RESULT SzFileReadImp(void *object, void *buffer, size_t size, size_t *processedSize) { - FileInputStream *s = (FileInputStream *)((unsigned long)object - offsetof(FileInputStream, inStream)); /* HACK! */ + FileInputStream *s = (FileInputStream *)((size_t)object - offsetof(FileInputStream, inStream)); /* HACK! */ const size_t processedSizeLoc = s->io->read(s->io, buffer, size); if (processedSize != NULL) *processedSize = processedSizeLoc; @@ -139,7 +139,7 @@ */ SZ_RESULT SzFileSeekImp(void *object, CFileSize pos) { - FileInputStream *s = (FileInputStream *)((unsigned long)object - offsetof(FileInputStream, inStream)); /* HACK! */ + FileInputStream *s = (FileInputStream *)((size_t)object - offsetof(FileInputStream, inStream)); /* HACK! */ if (s->io->seek(s->io, (PHYSFS_uint64) pos)) return SZ_OK; return SZE_FAIL; @@ -205,7 +205,7 @@ { LZMAfile *file = bsearch(name, archive->files, archive->db.Database.NumFiles, sizeof(*archive->files), lzma_file_cmp_stdlib); /* FIXME: Should become __PHYSFS_search!!! */ - BAIL_IF_MACRO(file == NULL, PHYSFS_ERR_NO_SUCH_PATH, NULL); + BAIL_IF_MACRO(file == NULL, PHYSFS_ERR_NOT_FOUND, NULL); return file; } /* lzma_find_file */ @@ -291,25 +291,25 @@ case SZ_OK: /* Same as LZMA_RESULT_OK */ break; case SZE_DATA_ERROR: /* Same as LZMA_RESULT_DATA_ERROR */ - __PHYSFS_setError(PHYSFS_ERR_CORRUPT); /*!!!FIXME: was "PHYSFS_ERR_DATA_ERROR" */ + PHYSFS_setErrorCode(PHYSFS_ERR_CORRUPT); /*!!!FIXME: was "PHYSFS_ERR_DATA_ERROR" */ break; case SZE_OUTOFMEMORY: - __PHYSFS_setError(PHYSFS_ERR_OUT_OF_MEMORY); + PHYSFS_setErrorCode(PHYSFS_ERR_OUT_OF_MEMORY); break; case SZE_CRC_ERROR: - __PHYSFS_setError(PHYSFS_ERR_CORRUPT); + PHYSFS_setErrorCode(PHYSFS_ERR_CORRUPT); break; case SZE_NOTIMPL: - __PHYSFS_setError(PHYSFS_ERR_UNSUPPORTED); + PHYSFS_setErrorCode(PHYSFS_ERR_UNSUPPORTED); break; case SZE_FAIL: - __PHYSFS_setError(PHYSFS_ERR_OTHER_ERROR); /* !!! FIXME: right? */ + PHYSFS_setErrorCode(PHYSFS_ERR_OTHER_ERROR); /* !!! FIXME: right? */ break; case SZE_ARCHIVE_ERROR: - __PHYSFS_setError(PHYSFS_ERR_CORRUPT); /* !!! FIXME: right? */ + PHYSFS_setErrorCode(PHYSFS_ERR_CORRUPT); /* !!! FIXME: right? */ break; default: - __PHYSFS_setError(PHYSFS_ERR_OTHER_ERROR); + PHYSFS_setErrorCode(PHYSFS_ERR_OTHER_ERROR); } /* switch */ return rc; @@ -531,8 +531,8 @@ } /* doEnumCallback */ -static void LZMA_enumerateFiles(PHYSFS_Dir *opaque, const char *dname, - int omitSymLinks, PHYSFS_EnumFilesCallback cb, +static void LZMA_enumerateFiles(void *opaque, const char *dname, + PHYSFS_EnumFilesCallback cb, const char *origdir, void *callbackdata) { size_t dlen = strlen(dname), @@ -551,7 +551,7 @@ file = archive->files; } - BAIL_IF_MACRO(file == NULL, PHYSFS_ERR_NO_SUCH_PATH, ); + BAIL_IF_MACRO(file == NULL, PHYSFS_ERR_NOT_FOUND, ); while (file < lastFile) { @@ -575,15 +575,13 @@ } /* LZMA_enumerateFiles */ -static PHYSFS_Io *LZMA_openRead(PHYSFS_Dir *opaque, const char *name, - int *fileExists) +static PHYSFS_Io *LZMA_openRead(void *opaque, const char *name) { LZMAarchive *archive = (LZMAarchive *) opaque; LZMAfile *file = lzma_find_file(archive, name); PHYSFS_Io *io = NULL; - *fileExists = (file != NULL); - BAIL_IF_MACRO(file == NULL, PHYSFS_ERR_NO_SUCH_PATH, NULL); + BAIL_IF_MACRO(file == NULL, PHYSFS_ERR_NOT_FOUND, NULL); BAIL_IF_MACRO(file->folder == NULL, PHYSFS_ERR_NOT_A_FILE, NULL); file->position = 0; @@ -598,19 +596,19 @@ } /* LZMA_openRead */ -static PHYSFS_Io *LZMA_openWrite(PHYSFS_Dir *opaque, const char *filename) +static PHYSFS_Io *LZMA_openWrite(void *opaque, const char *filename) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL); } /* LZMA_openWrite */ -static PHYSFS_Io *LZMA_openAppend(PHYSFS_Dir *opaque, const char *filename) +static PHYSFS_Io *LZMA_openAppend(void *opaque, const char *filename) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL); } /* LZMA_openAppend */ -static void LZMA_closeArchive(PHYSFS_Dir *opaque) +static void LZMA_closeArchive(void *opaque) { LZMAarchive *archive = (LZMAarchive *) opaque; @@ -628,24 +626,22 @@ } /* LZMA_closeArchive */ -static int LZMA_remove(PHYSFS_Dir *opaque, const char *name) +static int LZMA_remove(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0); } /* LZMA_remove */ -static int LZMA_mkdir(PHYSFS_Dir *opaque, const char *name) +static int LZMA_mkdir(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0); } /* LZMA_mkdir */ -static int LZMA_stat(PHYSFS_Dir *opaque, const char *filename, - int *exists, PHYSFS_Stat *stat) +static int LZMA_stat(void *opaque, const char *filename, PHYSFS_Stat *stat) { const LZMAarchive *archive = (const LZMAarchive *) opaque; const LZMAfile *file = lzma_find_file(archive, filename); - *exists = (file != 0); if (!file) return 0; @@ -678,24 +674,26 @@ const PHYSFS_Archiver __PHYSFS_Archiver_LZMA = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "7Z", "LZMA (7zip) format", "Dennis Schridde ", - "http://icculus.org/physfs/", + "https://icculus.org/physfs/", + 0, /* supportsSymlinks */ }, - LZMA_openArchive, /* openArchive() method */ - LZMA_enumerateFiles, /* enumerateFiles() method */ - LZMA_openRead, /* openRead() method */ - LZMA_openWrite, /* openWrite() method */ - LZMA_openAppend, /* openAppend() method */ - LZMA_remove, /* remove() method */ - LZMA_mkdir, /* mkdir() method */ - LZMA_closeArchive, /* closeArchive() method */ - LZMA_stat /* stat() method */ + LZMA_openArchive, + LZMA_enumerateFiles, + LZMA_openRead, + LZMA_openWrite, + LZMA_openAppend, + LZMA_remove, + LZMA_mkdir, + LZMA_stat, + LZMA_closeArchive }; #endif /* defined PHYSFS_SUPPORTS_7Z */ -/* end of lzma.c ... */ +/* end of archiver_lzma.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_mvl.c --- a/misc/libphysfs/archiver_mvl.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_mvl.c Sun Dec 17 00:09:24 2017 +0100 @@ -80,24 +80,26 @@ const PHYSFS_Archiver __PHYSFS_Archiver_MVL = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "MVL", "Descent II Movielib format", "Bradley Bell ", - "http://icculus.org/physfs/", + "https://icculus.org/physfs/", + 0, /* supportsSymlinks */ }, - MVL_openArchive, /* openArchive() method */ - UNPK_enumerateFiles, /* enumerateFiles() method */ - UNPK_openRead, /* openRead() method */ - UNPK_openWrite, /* openWrite() method */ - UNPK_openAppend, /* openAppend() method */ - UNPK_remove, /* remove() method */ - UNPK_mkdir, /* mkdir() method */ - UNPK_closeArchive, /* closeArchive() method */ - UNPK_stat /* stat() method */ + MVL_openArchive, + UNPK_enumerateFiles, + UNPK_openRead, + UNPK_openWrite, + UNPK_openAppend, + UNPK_remove, + UNPK_mkdir, + UNPK_stat, + UNPK_closeArchive }; #endif /* defined PHYSFS_SUPPORTS_MVL */ -/* end of mvl.c ... */ +/* end of archiver_mvl.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_qpak.c --- a/misc/libphysfs/archiver_qpak.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_qpak.c Sun Dec 17 00:09:24 2017 +0100 @@ -96,24 +96,26 @@ const PHYSFS_Archiver __PHYSFS_Archiver_QPAK = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "PAK", "Quake I/II format", "Ryan C. Gordon ", - "http://icculus.org/physfs/", + "https://icculus.org/physfs/", + 0, /* supportsSymlinks */ }, - QPAK_openArchive, /* openArchive() method */ - UNPK_enumerateFiles, /* enumerateFiles() method */ - UNPK_openRead, /* openRead() method */ - UNPK_openWrite, /* openWrite() method */ - UNPK_openAppend, /* openAppend() method */ - UNPK_remove, /* remove() method */ - UNPK_mkdir, /* mkdir() method */ - UNPK_closeArchive, /* closeArchive() method */ - UNPK_stat /* stat() method */ + QPAK_openArchive, + UNPK_enumerateFiles, + UNPK_openRead, + UNPK_openWrite, + UNPK_openAppend, + UNPK_remove, + UNPK_mkdir, + UNPK_stat, + UNPK_closeArchive }; #endif /* defined PHYSFS_SUPPORTS_QPAK */ -/* end of qpak.c ... */ +/* end of archiver_qpak.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_slb.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/archiver_slb.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,126 @@ +/* + * SLB support routines for PhysicsFS. + * + * This driver handles SLB archives ("slab files"). This uncompressed format + * is used in I-War / Independence War and Independence War: Defiance. + * + * The format begins with four zero bytes (version?), the file count and the + * location of the table of contents. Each ToC entry contains a 64-byte buffer + * containing a zero-terminated filename, the offset of the data, and its size. + * All the filenames begin with the separator character '\'. + * + * Please see the file LICENSE.txt in the source's root directory. + * + * This file written by Aleksi Nurmi, based on the GRP archiver by + * Ryan C. Gordon. + */ + +#define __PHYSICSFS_INTERNAL__ +#include "physfs_internal.h" + +#if PHYSFS_SUPPORTS_SLB + +static UNPKentry *slbLoadEntries(PHYSFS_Io *io, PHYSFS_uint32 fileCount) +{ + UNPKentry *entries = NULL; + UNPKentry *entry = NULL; + + entries = (UNPKentry *) allocator.Malloc(sizeof (UNPKentry) * fileCount); + BAIL_IF_MACRO(entries == NULL, PHYSFS_ERR_OUT_OF_MEMORY, NULL); + + for (entry = entries; fileCount > 0; fileCount--, entry++) + { + char *ptr; + + /* don't include the '\' in the beginning */ + char backslash; + GOTO_IF_MACRO(!__PHYSFS_readAll(io, &backslash, 1), ERRPASS, failed); + GOTO_IF_MACRO(backslash != '\\', ERRPASS, failed); + + /* read the rest of the buffer, 63 bytes */ + GOTO_IF_MACRO(!__PHYSFS_readAll(io, &entry->name, 63), ERRPASS, failed); + entry->name[63] = '\0'; /* in case the name lacks the null terminator */ + + /* convert backslashes */ + for (ptr = entry->name; *ptr; ptr++) + { + if (*ptr == '\\') + *ptr = '/'; + } /* for */ + + GOTO_IF_MACRO(!__PHYSFS_readAll(io, &entry->startPos, 4), + ERRPASS, failed); + entry->startPos = PHYSFS_swapULE32(entry->startPos); + + GOTO_IF_MACRO(!__PHYSFS_readAll(io, &entry->size, 4), ERRPASS, failed); + entry->size = PHYSFS_swapULE32(entry->size); + } /* for */ + + return entries; + +failed: + allocator.Free(entries); + return NULL; + +} /* slbLoadEntries */ + + +static void *SLB_openArchive(PHYSFS_Io *io, const char *name, int forWriting) +{ + PHYSFS_uint32 version; + PHYSFS_uint32 count = 0; + PHYSFS_uint32 tocPos = 0; + UNPKentry *entries = NULL; + + assert(io != NULL); /* shouldn't ever happen. */ + + BAIL_IF_MACRO(forWriting, PHYSFS_ERR_READ_ONLY, NULL); + + BAIL_IF_MACRO(!__PHYSFS_readAll(io, &version, sizeof(version)), + ERRPASS, NULL); + version = PHYSFS_swapULE32(version); + BAIL_IF_MACRO(version != 0, ERRPASS, NULL); + + BAIL_IF_MACRO(!__PHYSFS_readAll(io, &count, sizeof(count)), ERRPASS, NULL); + count = PHYSFS_swapULE32(count); + + /* offset of the table of contents */ + BAIL_IF_MACRO(!__PHYSFS_readAll(io, &tocPos, sizeof(tocPos)), + ERRPASS, NULL); + tocPos = PHYSFS_swapULE32(tocPos); + + /* seek to the table of contents */ + BAIL_IF_MACRO(!io->seek(io, tocPos), ERRPASS, NULL); + + entries = slbLoadEntries(io, count); + BAIL_IF_MACRO(!entries, ERRPASS, NULL); + + return UNPK_openArchive(io, entries, count); +} /* SLB_openArchive */ + + +const PHYSFS_Archiver __PHYSFS_Archiver_SLB = +{ + CURRENT_PHYSFS_ARCHIVER_API_VERSION, + { + "SLB", + "I-War / Independence War Slab file", + "Aleksi Nurmi ", + "https://bitbucket.org/ahnurmi/", + 0, /* supportsSymlinks */ + }, + SLB_openArchive, + UNPK_enumerateFiles, + UNPK_openRead, + UNPK_openWrite, + UNPK_openAppend, + UNPK_remove, + UNPK_mkdir, + UNPK_stat, + UNPK_closeArchive +}; + +#endif /* defined PHYSFS_SUPPORTS_SLB */ + +/* end of archiver_slb.c ... */ + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_unpacked.c --- a/misc/libphysfs/archiver_unpacked.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_unpacked.c Sun Dec 17 00:09:24 2017 +0100 @@ -7,7 +7,7 @@ * * RULES: Archive entries must be uncompressed, must not have separate subdir * entries (but can have subdirs), must be case insensitive LOW ASCII - * filenames <= 56 bytes. No symlinks, etc. We can relax some of these rules + * filenames <= 64 bytes. No symlinks, etc. We can relax some of these rules * as necessary. * * Please see the file LICENSE.txt in the source's root directory. @@ -34,7 +34,7 @@ } UNPKfileinfo; -void UNPK_closeArchive(PHYSFS_Dir *opaque) +void UNPK_closeArchive(void *opaque) { UNPKinfo *info = ((UNPKinfo *) opaque); info->io->destroy(info->io); @@ -200,7 +200,7 @@ rc = -1; else if (ch > '/') rc = 1; - else + else { if (stop_on_first_find) /* Just checking dir's existance? */ return middle; @@ -242,8 +242,8 @@ } /* doEnumCallback */ -void UNPK_enumerateFiles(PHYSFS_Dir *opaque, const char *dname, - int omitSymLinks, PHYSFS_EnumFilesCallback cb, +void UNPK_enumerateFiles(void *opaque, const char *dname, + PHYSFS_EnumFilesCallback cb, const char *origdir, void *callbackdata) { UNPKinfo *info = ((UNPKinfo *) opaque); @@ -293,7 +293,7 @@ /* * This will find the UNPKentry associated with a path in platform-independent - * notation. Directories don't have UNPKentries associated with them, but + * notation. Directories don't have UNPKentries associated with them, but * (*isDir) will be set to non-zero if a dir was hit. */ static UNPKentry *findEntry(const UNPKinfo *info, const char *path, int *isDir) @@ -340,19 +340,18 @@ if (isDir != NULL) *isDir = 0; - BAIL_MACRO(PHYSFS_ERR_NO_SUCH_PATH, NULL); + BAIL_MACRO(PHYSFS_ERR_NOT_FOUND, NULL); } /* findEntry */ -PHYSFS_Io *UNPK_openRead(PHYSFS_Dir *opaque, const char *fnm, int *fileExists) +PHYSFS_Io *UNPK_openRead(void *opaque, const char *name) { PHYSFS_Io *retval = NULL; UNPKinfo *info = (UNPKinfo *) opaque; UNPKfileinfo *finfo = NULL; int isdir = 0; - UNPKentry *entry = findEntry(info, fnm, &isdir); + UNPKentry *entry = findEntry(info, name, &isdir); - *fileExists = (entry != NULL); GOTO_IF_MACRO(isdir, PHYSFS_ERR_NOT_A_FILE, UNPK_openRead_failed); GOTO_IF_MACRO(!entry, ERRPASS, UNPK_openRead_failed); @@ -390,32 +389,31 @@ } /* UNPK_openRead */ -PHYSFS_Io *UNPK_openWrite(PHYSFS_Dir *opaque, const char *name) +PHYSFS_Io *UNPK_openWrite(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL); } /* UNPK_openWrite */ -PHYSFS_Io *UNPK_openAppend(PHYSFS_Dir *opaque, const char *name) +PHYSFS_Io *UNPK_openAppend(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL); } /* UNPK_openAppend */ -int UNPK_remove(PHYSFS_Dir *opaque, const char *name) +int UNPK_remove(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0); } /* UNPK_remove */ -int UNPK_mkdir(PHYSFS_Dir *opaque, const char *name) +int UNPK_mkdir(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0); } /* UNPK_mkdir */ -int UNPK_stat(PHYSFS_Dir *opaque, const char *filename, - int *exists, PHYSFS_Stat *stat) +int UNPK_stat(void *opaque, const char *filename, PHYSFS_Stat *stat) { int isDir = 0; const UNPKinfo *info = (const UNPKinfo *) opaque; @@ -423,19 +421,16 @@ if (isDir) { - *exists = 1; stat->filetype = PHYSFS_FILETYPE_DIRECTORY; stat->filesize = 0; } /* if */ else if (entry != NULL) { - *exists = 1; stat->filetype = PHYSFS_FILETYPE_REGULAR; stat->filesize = entry->size; } /* else if */ else { - *exists = 0; return 0; } /* else */ @@ -448,8 +443,7 @@ } /* UNPK_stat */ -PHYSFS_Dir *UNPK_openArchive(PHYSFS_Io *io, UNPKentry *e, - const PHYSFS_uint32 num) +void *UNPK_openArchive(PHYSFS_Io *io, UNPKentry *e, const PHYSFS_uint32 num) { UNPKinfo *info = (UNPKinfo *) allocator.Malloc(sizeof (UNPKinfo)); if (info == NULL) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_wad.c --- a/misc/libphysfs/archiver_wad.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_wad.c Sun Dec 17 00:09:24 2017 +0100 @@ -1,7 +1,7 @@ /* * WAD support routines for PhysicsFS. * - * This driver handles DOOM engine archives ("wads"). + * This driver handles DOOM engine archives ("wads"). * This format (but not this driver) was designed by id Software for use * with the DOOM engine. * The specs of the format are from the unofficial doom specs v1.666 @@ -28,7 +28,7 @@ * (c) an 8-byte ASCII string, the name of the lump, padded with zeros. * For example, the "DEMO1" entry in hexadecimal would be * (44 45 4D 4F 31 00 00 00) - * + * * Note that there is no way to tell if an opened WAD archive is a * IWAD or PWAD with this archiver. * I couldn't think of a way to provide that information, without being too @@ -104,24 +104,26 @@ const PHYSFS_Archiver __PHYSFS_Archiver_WAD = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "WAD", "DOOM engine format", "Travis Wells ", "http://www.3dmm2.com/doom/", + 0, /* supportsSymlinks */ }, - WAD_openArchive, /* openArchive() method */ - UNPK_enumerateFiles, /* enumerateFiles() method */ - UNPK_openRead, /* openRead() method */ - UNPK_openWrite, /* openWrite() method */ - UNPK_openAppend, /* openAppend() method */ - UNPK_remove, /* remove() method */ - UNPK_mkdir, /* mkdir() method */ - UNPK_closeArchive, /* closeArchive() method */ - UNPK_stat /* stat() method */ + WAD_openArchive, + UNPK_enumerateFiles, + UNPK_openRead, + UNPK_openWrite, + UNPK_openAppend, + UNPK_remove, + UNPK_mkdir, + UNPK_stat, + UNPK_closeArchive }; #endif /* defined PHYSFS_SUPPORTS_WAD */ -/* end of wad.c ... */ +/* end of archiver_wad.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/archiver_zip.c --- a/misc/libphysfs/archiver_zip.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/archiver_zip.c Sun Dec 17 00:09:24 2017 +0100 @@ -15,12 +15,7 @@ #include #include -#define USE_MINIZ 1 -#if USE_MINIZ #include "physfs_miniz.h" -#else -#include -#endif /* * A buffer of ZIP_READBUFSIZE is allocated for each compressed file opened, @@ -51,6 +46,7 @@ ZIP_UNRESOLVED_SYMLINK, ZIP_RESOLVING, ZIP_RESOLVED, + ZIP_DIRECTORY, ZIP_BROKEN_FILE, ZIP_BROKEN_SYMLINK } ZipResolveType; @@ -67,11 +63,16 @@ PHYSFS_uint64 offset; /* offset of data in archive */ PHYSFS_uint16 version; /* version made by */ PHYSFS_uint16 version_needed; /* version needed to extract */ + PHYSFS_uint16 general_bits; /* general purpose bits */ PHYSFS_uint16 compression_method; /* compression method */ PHYSFS_uint32 crc; /* crc-32 */ PHYSFS_uint64 compressed_size; /* compressed size */ PHYSFS_uint64 uncompressed_size; /* uncompressed size */ PHYSFS_sint64 last_mod_time; /* last file mod time */ + PHYSFS_uint32 dos_mod_time; /* original MS-DOS style mod time */ + struct _ZIPentry *hashnext; /* next item in this hash bucket */ + struct _ZIPentry *children; /* linked list of kids, if dir */ + struct _ZIPentry *sibling; /* next item in same dir */ } ZIPentry; /* @@ -79,10 +80,12 @@ */ typedef struct { - PHYSFS_Io *io; - int zip64; /* non-zero if this is a Zip64 archive. */ - PHYSFS_uint64 entryCount; /* Number of files in ZIP. */ - ZIPentry *entries; /* info on all files in ZIP. */ + PHYSFS_Io *io; /* the i/o interface for this archive. */ + ZIPentry root; /* root of directory tree. */ + ZIPentry **hash; /* all entries hashed for fast lookup. */ + size_t hashBuckets; /* number of buckets in hash. */ + int zip64; /* non-zero if this is a Zip64 archive. */ + int has_crypto; /* non-zero if any entry uses encryption. */ } ZIPinfo; /* @@ -95,6 +98,8 @@ PHYSFS_uint32 compressed_position; /* offset in compressed data. */ PHYSFS_uint32 uncompressed_position; /* tell() position. */ PHYSFS_uint8 *buffer; /* decompression buffer. */ + PHYSFS_uint32 crypto_keys[3]; /* for "traditional" crypto. */ + PHYSFS_uint32 initial_crypto_keys[3]; /* for "traditional" crypto. */ z_stream stream; /* zlib stream state. */ } ZIPfileinfo; @@ -115,6 +120,103 @@ #define UNIX_FILETYPE_MASK 0170000 #define UNIX_FILETYPE_SYMLINK 0120000 +#define ZIP_GENERAL_BITS_TRADITIONAL_CRYPTO (1 << 0) +#define ZIP_GENERAL_BITS_IGNORE_LOCAL_HEADER (1 << 3) + +/* support for "traditional" PKWARE encryption. */ +static int zip_entry_is_tradional_crypto(const ZIPentry *entry) +{ + return (entry->general_bits & ZIP_GENERAL_BITS_TRADITIONAL_CRYPTO) != 0; +} /* zip_entry_is_traditional_crypto */ + +static int zip_entry_ignore_local_header(const ZIPentry *entry) +{ + return (entry->general_bits & ZIP_GENERAL_BITS_IGNORE_LOCAL_HEADER) != 0; +} /* zip_entry_is_traditional_crypto */ + +static PHYSFS_uint32 zip_crypto_crc32(const PHYSFS_uint32 crc, const PHYSFS_uint8 val) +{ + int i; + PHYSFS_uint32 xorval = (crc ^ ((PHYSFS_uint32) val)) & 0xFF; + for (i = 0; i < 8; i++) + xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1)); + return xorval ^ (crc >> 8); +} /* zip_crc32 */ + +static void zip_update_crypto_keys(PHYSFS_uint32 *keys, const PHYSFS_uint8 val) +{ + keys[0] = zip_crypto_crc32(keys[0], val); + keys[1] = keys[1] + (keys[0] & 0x000000FF); + keys[1] = (keys[1] * 134775813) + 1; + keys[2] = zip_crypto_crc32(keys[2], (PHYSFS_uint8) ((keys[1] >> 24) & 0xFF)); +} /* zip_update_crypto_keys */ + +static PHYSFS_uint8 zip_decrypt_byte(const PHYSFS_uint32 *keys) +{ + const PHYSFS_uint16 tmp = keys[2] | 2; + return (PHYSFS_uint8) ((tmp * (tmp ^ 1)) >> 8); +} /* zip_decrypt_byte */ + +static PHYSFS_sint64 zip_read_decrypt(ZIPfileinfo *finfo, void *buf, PHYSFS_uint64 len) +{ + PHYSFS_Io *io = finfo->io; + const PHYSFS_sint64 br = io->read(io, buf, len); + + /* Decompression the new data if necessary. */ + if (zip_entry_is_tradional_crypto(finfo->entry) && (br > 0)) + { + PHYSFS_uint32 *keys = finfo->crypto_keys; + PHYSFS_uint8 *ptr = (PHYSFS_uint8 *) buf; + PHYSFS_sint64 i; + for (i = 0; i < br; i++, ptr++) + { + const PHYSFS_uint8 ch = *ptr ^ zip_decrypt_byte(keys); + zip_update_crypto_keys(keys, ch); + *ptr = ch; + } /* for */ + } /* if */ + + return br; +} /* zip_read_decrypt */ + +static int zip_prep_crypto_keys(ZIPfileinfo *finfo, const PHYSFS_uint8 *crypto_header, const PHYSFS_uint8 *password) +{ + /* It doesn't appear to be documented in PKWare's APPNOTE.TXT, but you + need to use a different byte in the header to verify the password + if general purpose bit 3 is set. Discovered this from Info-Zip. + That's what the (verifier) value is doing, below. */ + + PHYSFS_uint32 *keys = finfo->crypto_keys; + const ZIPentry *entry = finfo->entry; + const int usedate = zip_entry_ignore_local_header(entry); + const PHYSFS_uint8 verifier = (PHYSFS_uint8) ((usedate ? (entry->dos_mod_time >> 8) : (entry->crc >> 24)) & 0xFF); + PHYSFS_uint8 finalbyte = 0; + int i = 0; + + /* initialize vector with defaults, then password, then header. */ + keys[0] = 305419896; + keys[1] = 591751049; + keys[2] = 878082192; + + while (*password) + zip_update_crypto_keys(keys, *(password++)); + + for (i = 0; i < 12; i++) + { + const PHYSFS_uint8 c = crypto_header[i] ^ zip_decrypt_byte(keys); + zip_update_crypto_keys(keys, c); + finalbyte = c; + } /* for */ + + /* you have a 1/256 chance of passing this test incorrectly. :/ */ + if (finalbyte != verifier) + BAIL_MACRO(PHYSFS_ERR_BAD_PASSWORD, 0); + + /* save the initial vector for seeking purposes. Not secure!! */ + memcpy(finfo->initial_crypto_keys, finfo->crypto_keys, 12); + return 1; +} /* zip_prep_crypto_keys */ + /* * Bridge physfs allocation functions to zlib's format... @@ -163,10 +265,17 @@ */ static int zlib_err(const int rc) { - __PHYSFS_setError(zlib_error_code(rc)); + PHYSFS_setErrorCode(zlib_error_code(rc)); return rc; } /* zlib_err */ +/* + * Hash a string for lookup an a ZIPinfo hashtable. + */ +static inline PHYSFS_uint32 zip_hash_string(const ZIPinfo *info, const char *s) +{ + return __PHYSFS_hashString(s, strlen(s)) % info->hashBuckets; +} /* zip_hash_string */ /* * Read an unsigned 64-bit int and swap to native byte order. @@ -206,7 +315,6 @@ static PHYSFS_sint64 ZIP_read(PHYSFS_Io *_io, void *buf, PHYSFS_uint64 len) { ZIPfileinfo *finfo = (ZIPfileinfo *) _io->opaque; - PHYSFS_Io *io = finfo->io; ZIPentry *entry = finfo->entry; PHYSFS_sint64 retval = 0; PHYSFS_sint64 maxread = (PHYSFS_sint64) len; @@ -219,7 +327,7 @@ BAIL_IF_MACRO(maxread == 0, ERRPASS, 0); /* quick rejection. */ if (entry->compression_method == COMPMETH_NONE) - retval = io->read(io, buf, maxread); + retval = zip_read_decrypt(finfo, buf, maxread); else { finfo->stream.next_out = buf; @@ -240,7 +348,7 @@ if (br > ZIP_READBUFSIZE) br = ZIP_READBUFSIZE; - br = io->read(io, finfo->buffer, (PHYSFS_uint64) br); + br = zip_read_decrypt(finfo, finfo->buffer, (PHYSFS_uint64) br); if (br <= 0) break; @@ -282,12 +390,13 @@ ZIPfileinfo *finfo = (ZIPfileinfo *) _io->opaque; ZIPentry *entry = finfo->entry; PHYSFS_Io *io = finfo->io; + const int encrypted = zip_entry_is_tradional_crypto(entry); BAIL_IF_MACRO(offset > entry->uncompressed_size, PHYSFS_ERR_PAST_EOF, 0); - if (entry->compression_method == COMPMETH_NONE) + if (!encrypted && (entry->compression_method == COMPMETH_NONE)) { - const PHYSFS_sint64 newpos = offset + entry->offset; + PHYSFS_sint64 newpos = offset + entry->offset; BAIL_IF_MACRO(!io->seek(io, newpos), ERRPASS, 0); finfo->uncompressed_position = (PHYSFS_uint32) offset; } /* if */ @@ -308,12 +417,15 @@ if (zlib_err(inflateInit2(&str, -MAX_WBITS)) != Z_OK) return 0; - if (!io->seek(io, entry->offset)) + if (!io->seek(io, entry->offset + (encrypted ? 12 : 0))) return 0; inflateEnd(&finfo->stream); memcpy(&finfo->stream, &str, sizeof (z_stream)); finfo->uncompressed_position = finfo->compressed_position = 0; + + if (encrypted) + memcpy(finfo->crypto_keys, finfo->initial_crypto_keys, 12); } /* if */ while (finfo->uncompressed_position != offset) @@ -434,7 +546,7 @@ int found = 0; filelen = io->length(io); - BAIL_IF_MACRO(filelen == -1, ERRPASS, 0); + BAIL_IF_MACRO(filelen == -1, ERRPASS, -1); /* * Jump to the end of the file and start reading backwards. @@ -488,7 +600,7 @@ (buf[i + 3] == 0x06) ) { found = 1; /* that's the signature! */ - break; + break; } /* if */ } /* for */ @@ -536,71 +648,35 @@ } /* isZip */ -static void zip_free_entries(ZIPentry *entries, PHYSFS_uint64 max) +/* Find the ZIPentry for a path in platform-independent notation. */ +static ZIPentry *zip_find_entry(ZIPinfo *info, const char *path) { - PHYSFS_uint64 i; - for (i = 0; i < max; i++) + PHYSFS_uint32 hashval; + ZIPentry *prev = NULL; + ZIPentry *retval; + + if (*path == '\0') + return &info->root; + + hashval = zip_hash_string(info, path); + for (retval = info->hash[hashval]; retval; retval = retval->hashnext) { - ZIPentry *entry = &entries[i]; - if (entry->name != NULL) - allocator.Free(entry->name); + if (strcmp(retval->name, path) == 0) + { + if (prev != NULL) /* move this to the front of the list */ + { + prev->hashnext = retval->hashnext; + retval->hashnext = info->hash[hashval]; + info->hash[hashval] = retval; + } /* if */ + + return retval; + } /* if */ + + prev = retval; } /* for */ - allocator.Free(entries); -} /* zip_free_entries */ - - -/* - * This will find the ZIPentry associated with a path in platform-independent - * notation. Directories don't have ZIPentries associated with them, but - * (*isDir) will be set to non-zero if a dir was hit. - */ -static ZIPentry *zip_find_entry(const ZIPinfo *info, const char *path, - int *isDir) -{ - ZIPentry *a = info->entries; - PHYSFS_sint32 pathlen = (PHYSFS_sint32) strlen(path); - PHYSFS_sint64 lo = 0; - PHYSFS_sint64 hi = (PHYSFS_sint64) (info->entryCount - 1); - PHYSFS_sint64 middle; - const char *thispath = NULL; - int rc; - - while (lo <= hi) - { - middle = lo + ((hi - lo) / 2); - thispath = a[middle].name; - rc = strncmp(path, thispath, pathlen); - - if (rc > 0) - lo = middle + 1; - - else if (rc < 0) - hi = middle - 1; - - else /* substring match...might be dir or entry or nothing. */ - { - if (isDir != NULL) - { - *isDir = (thispath[pathlen] == '/'); - if (*isDir) - return NULL; - } /* if */ - - if (thispath[pathlen] == '\0') /* found entry? */ - return &a[middle]; - /* adjust search params, try again. */ - else if (thispath[pathlen] > '/') - hi = middle - 1; - else - lo = middle + 1; - } /* if */ - } /* while */ - - if (isDir != NULL) - *isDir = 0; - - BAIL_MACRO(PHYSFS_ERR_NO_SUCH_PATH, NULL); + BAIL_MACRO(PHYSFS_ERR_NOT_FOUND, NULL); } /* zip_find_entry */ @@ -692,7 +768,7 @@ ZIPentry *entry; zip_expand_symlink_path(path); - entry = zip_find_entry(info, path, NULL); + entry = zip_find_entry(info, path); if (entry != NULL) { if (!zip_resolve(io, info, entry)) /* recursive! */ @@ -724,7 +800,7 @@ path = (char *) __PHYSFS_smallAlloc(size + 1); BAIL_IF_MACRO(!path, PHYSFS_ERR_OUT_OF_MEMORY, 0); - + if (entry->compression_method == COMPMETH_NONE) rc = __PHYSFS_readAll(io, path, size); @@ -787,6 +863,10 @@ * possible that's a Zip64 thing. */ + /* !!! FIXME: apparently these are zero if general purpose bit 3 is set, + !!! FIXME: which is probably true for Jar files, fwiw, but we don't + !!! FIXME: care about these values anyhow. */ + BAIL_IF_MACRO(!io->seek(io, entry->offset), ERRPASS, 0); BAIL_IF_MACRO(!readui32(io, &ui32), ERRPASS, 0); BAIL_IF_MACRO(ui32 != ZIP_LOCAL_FILE_SIG, PHYSFS_ERR_CORRUPT, 0); @@ -818,7 +898,10 @@ static int zip_resolve(PHYSFS_Io *io, ZIPinfo *info, ZIPentry *entry) { int retval = 1; - ZipResolveType resolve_type = entry->resolved; + const ZipResolveType resolve_type = entry->resolved; + + if (resolve_type == ZIP_DIRECTORY) + return 1; /* we're good. */ /* Don't bother if we've failed to resolve this entry before. */ BAIL_IF_MACRO(resolve_type == ZIP_BROKEN_FILE, PHYSFS_ERR_CORRUPT, 0); @@ -860,6 +943,77 @@ } /* zip_resolve */ +static int zip_hash_entry(ZIPinfo *info, ZIPentry *entry); + +/* Fill in missing parent directories. */ +static ZIPentry *zip_hash_ancestors(ZIPinfo *info, char *name) +{ + ZIPentry *retval = &info->root; + char *sep = strrchr(name, '/'); + + if (sep) + { + const size_t namelen = (sep - name) + 1; + + *sep = '\0'; /* chop off last piece. */ + retval = zip_find_entry(info, name); + *sep = '/'; + + if (retval != NULL) + { + if (retval->resolved != ZIP_DIRECTORY) + BAIL_MACRO(PHYSFS_ERR_CORRUPT, NULL); + return retval; /* already hashed. */ + } /* if */ + + /* okay, this is a new dir. Build and hash us. */ + retval = (ZIPentry *) allocator.Malloc(sizeof (ZIPentry) + namelen); + BAIL_IF_MACRO(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL); + memset(retval, '\0', sizeof (*retval)); + retval->name = ((char *) retval) + sizeof (ZIPentry); + memcpy(retval->name, name, namelen - 1); + retval->name[namelen - 1] = '\0'; + retval->resolved = ZIP_DIRECTORY; + if (!zip_hash_entry(info, retval)) + { + allocator.Free(retval); + return NULL; + } /* if */ + } /* else */ + + return retval; +} /* zip_hash_ancestors */ + + +static int zip_hash_entry(ZIPinfo *info, ZIPentry *entry) +{ + PHYSFS_uint32 hashval; + ZIPentry *parent; + + assert(!zip_find_entry(info, entry->name)); /* checked elsewhere */ + + parent = zip_hash_ancestors(info, entry->name); + if (!parent) + return 0; + + hashval = zip_hash_string(info, entry->name); + entry->hashnext = info->hash[hashval]; + info->hash[hashval] = entry; + + entry->sibling = parent->children; + parent->children = entry; + return 1; +} /* zip_hash_entry */ + + +static int zip_entry_is_symlink(const ZIPentry *entry) +{ + return ((entry->resolved == ZIP_UNRESOLVED_SYMLINK) || + (entry->resolved == ZIP_BROKEN_SYMLINK) || + (entry->symlink)); +} /* zip_entry_is_symlink */ + + static int zip_version_does_symlinks(PHYSFS_uint32 version) { int retval = 0; @@ -892,14 +1046,6 @@ } /* zip_version_does_symlinks */ -static int zip_entry_is_symlink(const ZIPentry *entry) -{ - return ((entry->resolved == ZIP_UNRESOLVED_SYMLINK) || - (entry->resolved == ZIP_BROKEN_SYMLINK) || - (entry->symlink)); -} /* zip_entry_is_symlink */ - - static int zip_has_symlink_attr(ZIPentry *entry, PHYSFS_uint32 extern_attr) { PHYSFS_uint16 xattr = ((extern_attr >> 16) & 0xFFFF); @@ -935,9 +1081,11 @@ } /* zip_dos_time_to_physfs_time */ -static int zip_load_entry(PHYSFS_Io *io, const int zip64, ZIPentry *entry, - PHYSFS_uint64 ofs_fixup) +static ZIPentry *zip_load_entry(PHYSFS_Io *io, const int zip64, + const PHYSFS_uint64 ofs_fixup) { + ZIPentry entry; + ZIPentry *retval = NULL; PHYSFS_uint16 fnamelen, extralen, commentlen; PHYSFS_uint32 external_attr; PHYSFS_uint32 starting_disk; @@ -946,43 +1094,57 @@ PHYSFS_uint32 ui32; PHYSFS_sint64 si64; + memset(&entry, '\0', sizeof (entry)); + /* sanity check with central directory signature... */ - BAIL_IF_MACRO(!readui32(io, &ui32), ERRPASS, 0); - BAIL_IF_MACRO(ui32 != ZIP_CENTRAL_DIR_SIG, PHYSFS_ERR_CORRUPT, 0); + if (!readui32(io, &ui32)) return NULL; + BAIL_IF_MACRO(ui32 != ZIP_CENTRAL_DIR_SIG, PHYSFS_ERR_CORRUPT, NULL); /* Get the pertinent parts of the record... */ - BAIL_IF_MACRO(!readui16(io, &entry->version), ERRPASS, 0); - BAIL_IF_MACRO(!readui16(io, &entry->version_needed), ERRPASS, 0); - BAIL_IF_MACRO(!readui16(io, &ui16), ERRPASS, 0); /* general bits */ - BAIL_IF_MACRO(!readui16(io, &entry->compression_method), ERRPASS, 0); - BAIL_IF_MACRO(!readui32(io, &ui32), ERRPASS, 0); - entry->last_mod_time = zip_dos_time_to_physfs_time(ui32); - BAIL_IF_MACRO(!readui32(io, &entry->crc), ERRPASS, 0); - BAIL_IF_MACRO(!readui32(io, &ui32), ERRPASS, 0); - entry->compressed_size = (PHYSFS_uint64) ui32; - BAIL_IF_MACRO(!readui32(io, &ui32), ERRPASS, 0); - entry->uncompressed_size = (PHYSFS_uint64) ui32; - BAIL_IF_MACRO(!readui16(io, &fnamelen), ERRPASS, 0); - BAIL_IF_MACRO(!readui16(io, &extralen), ERRPASS, 0); - BAIL_IF_MACRO(!readui16(io, &commentlen), ERRPASS, 0); - BAIL_IF_MACRO(!readui16(io, &ui16), ERRPASS, 0); + if (!readui16(io, &entry.version)) return NULL; + if (!readui16(io, &entry.version_needed)) return NULL; + if (!readui16(io, &entry.general_bits)) return NULL; /* general bits */ + if (!readui16(io, &entry.compression_method)) return NULL; + if (!readui32(io, &entry.dos_mod_time)) return NULL; + entry.last_mod_time = zip_dos_time_to_physfs_time(entry.dos_mod_time); + if (!readui32(io, &entry.crc)) return NULL; + if (!readui32(io, &ui32)) return NULL; + entry.compressed_size = (PHYSFS_uint64) ui32; + if (!readui32(io, &ui32)) return NULL; + entry.uncompressed_size = (PHYSFS_uint64) ui32; + if (!readui16(io, &fnamelen)) return NULL; + if (!readui16(io, &extralen)) return NULL; + if (!readui16(io, &commentlen)) return NULL; + if (!readui16(io, &ui16)) return NULL; starting_disk = (PHYSFS_uint32) ui16; - BAIL_IF_MACRO(!readui16(io, &ui16), ERRPASS, 0); /* internal file attribs */ - BAIL_IF_MACRO(!readui32(io, &external_attr), ERRPASS, 0); - BAIL_IF_MACRO(!readui32(io, &ui32), ERRPASS, 0); + if (!readui16(io, &ui16)) return NULL; /* internal file attribs */ + if (!readui32(io, &external_attr)) return NULL; + if (!readui32(io, &ui32)) return NULL; offset = (PHYSFS_uint64) ui32; - entry->symlink = NULL; /* will be resolved later, if necessary. */ - entry->resolved = (zip_has_symlink_attr(entry, external_attr)) ? - ZIP_UNRESOLVED_SYMLINK : ZIP_UNRESOLVED_FILE; + retval = (ZIPentry *) allocator.Malloc(sizeof (ZIPentry) + fnamelen + 1); + BAIL_IF_MACRO(retval == NULL, PHYSFS_ERR_OUT_OF_MEMORY, 0); + memcpy(retval, &entry, sizeof (*retval)); + retval->name = ((char *) retval) + sizeof (ZIPentry); - entry->name = (char *) allocator.Malloc(fnamelen + 1); - BAIL_IF_MACRO(entry->name == NULL, PHYSFS_ERR_OUT_OF_MEMORY, 0); - if (!__PHYSFS_readAll(io, entry->name, fnamelen)) + if (!__PHYSFS_readAll(io, retval->name, fnamelen)) goto zip_load_entry_puked; - entry->name[fnamelen] = '\0'; /* null-terminate the filename. */ - zip_convert_dos_path(entry, entry->name); + retval->name[fnamelen] = '\0'; /* null-terminate the filename. */ + zip_convert_dos_path(retval, retval->name); + + retval->symlink = NULL; /* will be resolved later, if necessary. */ + + if (retval->name[fnamelen - 1] == '/') + { + retval->name[fnamelen - 1] = '\0'; + retval->resolved = ZIP_DIRECTORY; + } /* if */ + else + { + retval->resolved = (zip_has_symlink_attr(&entry, external_attr)) ? + ZIP_UNRESOLVED_SYMLINK : ZIP_UNRESOLVED_FILE; + } /* else */ si64 = io->tell(io); if (si64 == -1) @@ -995,8 +1157,8 @@ if ( (zip64) && ((offset == 0xFFFFFFFF) || (starting_disk == 0xFFFFFFFF) || - (entry->compressed_size == 0xFFFFFFFF) || - (entry->uncompressed_size == 0xFFFFFFFF)) ) + (retval->compressed_size == 0xFFFFFFFF) || + (retval->uncompressed_size == 0xFFFFFFFF)) ) { int found = 0; PHYSFS_uint16 sig, len; @@ -1022,18 +1184,18 @@ GOTO_IF_MACRO(!found, PHYSFS_ERR_CORRUPT, zip_load_entry_puked); - if (entry->uncompressed_size == 0xFFFFFFFF) + if (retval->uncompressed_size == 0xFFFFFFFF) { GOTO_IF_MACRO(len < 8, PHYSFS_ERR_CORRUPT, zip_load_entry_puked); - if (!readui64(io, &entry->uncompressed_size)) + if (!readui64(io, &retval->uncompressed_size)) goto zip_load_entry_puked; len -= 8; } /* if */ - if (entry->compressed_size == 0xFFFFFFFF) + if (retval->compressed_size == 0xFFFFFFFF) { GOTO_IF_MACRO(len < 8, PHYSFS_ERR_CORRUPT, zip_load_entry_puked); - if (!readui64(io, &entry->compressed_size)) + if (!readui64(io, &retval->compressed_size)) goto zip_load_entry_puked; len -= 8; } /* if */ @@ -1059,69 +1221,74 @@ GOTO_IF_MACRO(starting_disk != 0, PHYSFS_ERR_CORRUPT, zip_load_entry_puked); - entry->offset = offset + ofs_fixup; + retval->offset = offset + ofs_fixup; /* seek to the start of the next entry in the central directory... */ if (!io->seek(io, si64 + extralen + commentlen)) goto zip_load_entry_puked; - return 1; /* success. */ + return retval; /* success. */ zip_load_entry_puked: - allocator.Free(entry->name); - return 0; /* failure. */ + allocator.Free(retval); + return NULL; /* failure. */ } /* zip_load_entry */ -static int zip_entry_cmp(void *_a, size_t one, size_t two) -{ - if (one != two) - { - const ZIPentry *a = (const ZIPentry *) _a; - return strcmp(a[one].name, a[two].name); - } /* if */ - - return 0; -} /* zip_entry_cmp */ - - -static void zip_entry_swap(void *_a, size_t one, size_t two) +/* This leaves things allocated on error; the caller will clean up the mess. */ +static int zip_load_entries(ZIPinfo *info, + const PHYSFS_uint64 data_ofs, + const PHYSFS_uint64 central_ofs, + const PHYSFS_uint64 entry_count) { - if (one != two) - { - ZIPentry tmp; - ZIPentry *first = &(((ZIPentry *) _a)[one]); - ZIPentry *second = &(((ZIPentry *) _a)[two]); - memcpy(&tmp, first, sizeof (ZIPentry)); - memcpy(first, second, sizeof (ZIPentry)); - memcpy(second, &tmp, sizeof (ZIPentry)); - } /* if */ -} /* zip_entry_swap */ - - -static int zip_load_entries(PHYSFS_Io *io, ZIPinfo *info, - const PHYSFS_uint64 data_ofs, - const PHYSFS_uint64 central_ofs) -{ - const PHYSFS_uint64 max = info->entryCount; + PHYSFS_Io *io = info->io; const int zip64 = info->zip64; PHYSFS_uint64 i; - BAIL_IF_MACRO(!io->seek(io, central_ofs), ERRPASS, 0); + if (!io->seek(io, central_ofs)) + return 0; - info->entries = (ZIPentry *) allocator.Malloc(sizeof (ZIPentry) * max); - BAIL_IF_MACRO(!info->entries, PHYSFS_ERR_OUT_OF_MEMORY, 0); + for (i = 0; i < entry_count; i++) + { + ZIPentry *entry = zip_load_entry(io, zip64, data_ofs); + ZIPentry *find; + + if (!entry) + return 0; - for (i = 0; i < max; i++) - { - if (!zip_load_entry(io, zip64, &info->entries[i], data_ofs)) + find = zip_find_entry(info, entry->name); + if (find != NULL) /* duplicate? */ { - zip_free_entries(info->entries, i); + if (find->last_mod_time != 0) /* duplicate? */ + { + allocator.Free(entry); + BAIL_MACRO(PHYSFS_ERR_CORRUPT, 0); + } /* if */ + else /* we filled this in as a placeholder. Update it. */ + { + find->offset = entry->offset; + find->version = entry->version; + find->version_needed = entry->version_needed; + find->compression_method = entry->compression_method; + find->crc = entry->crc; + find->compressed_size = entry->compressed_size; + find->uncompressed_size = entry->uncompressed_size; + find->last_mod_time = entry->last_mod_time; + allocator.Free(entry); + continue; + } /* else */ + } /* if */ + + if (!zip_hash_entry(info, entry)) + { + allocator.Free(entry); return 0; } /* if */ + + if (zip_entry_is_tradional_crypto(entry)) + info->has_crypto = 1; } /* for */ - __PHYSFS_sort(info->entries, (size_t) max, zip_entry_cmp, zip_entry_swap); return 1; } /* zip_load_entries */ @@ -1181,36 +1348,47 @@ /* Just try moving back at most 256k. Oh well. */ if ((offset < pos) && (pos > 4)) { - /* we assume you can eat this stack if you handle Zip64 files. */ - PHYSFS_uint8 buf[256 * 1024]; + const PHYSFS_uint64 maxbuflen = 256 * 1024; PHYSFS_uint64 len = pos - offset; + PHYSFS_uint8 *buf = NULL; PHYSFS_sint32 i; - if (len > sizeof (buf)) - len = sizeof (buf); + if (len > maxbuflen) + len = maxbuflen; + + buf = (PHYSFS_uint8 *) __PHYSFS_smallAlloc(len); + BAIL_IF_MACRO(!buf, PHYSFS_ERR_OUT_OF_MEMORY, -1); - BAIL_IF_MACRO(!io->seek(io, pos - len), ERRPASS, -1); - BAIL_IF_MACRO(!__PHYSFS_readAll(io, buf, len), ERRPASS, -1); + if (!io->seek(io, pos - len) || !__PHYSFS_readAll(io, buf, len)) + { + __PHYSFS_smallFree(buf); + return -1; /* error was set elsewhere. */ + } /* if */ + for (i = (PHYSFS_sint32) (len - 4); i >= 0; i--) { - if (buf[i] != 0x50) - continue; - if ( (buf[i+1] == 0x4b) && - (buf[i+2] == 0x06) && - (buf[i+3] == 0x06) ) + if ( (buf[i] == 0x50) && (buf[i+1] == 0x4b) && + (buf[i+2] == 0x06) && (buf[i+3] == 0x06) ) + { + __PHYSFS_smallFree(buf); return pos - (len - i); + } /* if */ } /* for */ + + __PHYSFS_smallFree(buf); } /* if */ BAIL_MACRO(PHYSFS_ERR_CORRUPT, -1); /* didn't find it. */ } /* zip64_find_end_of_central_dir */ -static int zip64_parse_end_of_central_dir(PHYSFS_Io *io, ZIPinfo *info, +static int zip64_parse_end_of_central_dir(ZIPinfo *info, PHYSFS_uint64 *data_start, PHYSFS_uint64 *dir_ofs, + PHYSFS_uint64 *entry_count, PHYSFS_sint64 pos) { + PHYSFS_Io *io = info->io; PHYSFS_uint64 ui64; PHYSFS_uint32 ui32; PHYSFS_uint16 ui16; @@ -1278,8 +1456,8 @@ BAIL_IF_MACRO(!readui64(io, &ui64), ERRPASS, 0); /* total number of entries in the central dir */ - BAIL_IF_MACRO(!readui64(io, &info->entryCount), ERRPASS, 0); - BAIL_IF_MACRO(ui64 != info->entryCount, PHYSFS_ERR_CORRUPT, 0); + BAIL_IF_MACRO(!readui64(io, entry_count), ERRPASS, 0); + BAIL_IF_MACRO(ui64 != *entry_count, PHYSFS_ERR_CORRUPT, 0); /* size of the central directory */ BAIL_IF_MACRO(!readui64(io, &ui64), ERRPASS, 0); @@ -1299,10 +1477,12 @@ } /* zip64_parse_end_of_central_dir */ -static int zip_parse_end_of_central_dir(PHYSFS_Io *io, ZIPinfo *info, +static int zip_parse_end_of_central_dir(ZIPinfo *info, PHYSFS_uint64 *data_start, - PHYSFS_uint64 *dir_ofs) + PHYSFS_uint64 *dir_ofs, + PHYSFS_uint64 *entry_count) { + PHYSFS_Io *io = info->io; PHYSFS_uint16 entryCount16; PHYSFS_uint32 offset32; PHYSFS_uint32 ui32; @@ -1322,10 +1502,12 @@ /* Seek back to see if "Zip64 end of central directory locator" exists. */ /* this record is 20 bytes before end-of-central-dir */ - rc = zip64_parse_end_of_central_dir(io, info, data_start, dir_ofs, pos-20); - BAIL_IF_MACRO(rc == 0, ERRPASS, 0); - if (rc == 1) - return 1; /* we're done here. */ + rc = zip64_parse_end_of_central_dir(info, data_start, dir_ofs, + entry_count, pos - 20); + + /* Error or success? Bounce out of here. Keep going if not zip64. */ + if ((rc == 0) || (rc == 1)) + return rc; assert(rc == -1); /* no error, just not a Zip64 archive. */ @@ -1347,7 +1529,7 @@ BAIL_IF_MACRO(!readui16(io, &entryCount16), ERRPASS, 0); BAIL_IF_MACRO(ui16 != entryCount16, PHYSFS_ERR_CORRUPT, 0); - info->entryCount = entryCount16; + *entry_count = entryCount16; /* size of the central directory */ BAIL_IF_MACRO(!readui32(io, &ui32), ERRPASS, 0); @@ -1384,11 +1566,30 @@ } /* zip_parse_end_of_central_dir */ +static int zip_alloc_hashtable(ZIPinfo *info, const PHYSFS_uint64 entry_count) +{ + size_t alloclen; + + info->hashBuckets = (size_t) (entry_count / 5); + if (!info->hashBuckets) + info->hashBuckets = 1; + + alloclen = info->hashBuckets * sizeof (ZIPentry *); + info->hash = (ZIPentry **) allocator.Malloc(alloclen); + BAIL_IF_MACRO(!info->hash, PHYSFS_ERR_OUT_OF_MEMORY, 0); + memset(info->hash, '\0', alloclen); + + return 1; +} /* zip_alloc_hashtable */ + +static void ZIP_closeArchive(void *opaque); + static void *ZIP_openArchive(PHYSFS_Io *io, const char *name, int forWriting) { ZIPinfo *info = NULL; - PHYSFS_uint64 data_start; - PHYSFS_uint64 cent_dir_ofs; + PHYSFS_uint64 dstart; /* data start */ + PHYSFS_uint64 cdir_ofs; /* central dir offset */ + PHYSFS_uint64 entry_count; assert(io != NULL); /* shouldn't ever happen. */ @@ -1398,138 +1599,40 @@ info = (ZIPinfo *) allocator.Malloc(sizeof (ZIPinfo)); BAIL_IF_MACRO(!info, PHYSFS_ERR_OUT_OF_MEMORY, NULL); memset(info, '\0', sizeof (ZIPinfo)); + info->root.resolved = ZIP_DIRECTORY; info->io = io; - if (!zip_parse_end_of_central_dir(io, info, &data_start, ¢_dir_ofs)) + if (!zip_parse_end_of_central_dir(info, &dstart, &cdir_ofs, &entry_count)) + goto ZIP_openarchive_failed; + else if (!zip_alloc_hashtable(info, entry_count)) + goto ZIP_openarchive_failed; + else if (!zip_load_entries(info, dstart, cdir_ofs, entry_count)) goto ZIP_openarchive_failed; - if (!zip_load_entries(io, info, data_start, cent_dir_ofs)) - goto ZIP_openarchive_failed; - + assert(info->root.sibling == NULL); return info; ZIP_openarchive_failed: - if (info != NULL) - allocator.Free(info); - + info->io = NULL; /* don't let ZIP_closeArchive destroy (io). */ + ZIP_closeArchive(info); return NULL; } /* ZIP_openArchive */ -static PHYSFS_sint64 zip_find_start_of_dir(ZIPinfo *info, const char *path, - int stop_on_first_find) -{ - PHYSFS_sint64 lo = 0; - PHYSFS_sint64 hi = (PHYSFS_sint64) (info->entryCount - 1); - PHYSFS_sint64 middle; - PHYSFS_uint32 dlen = (PHYSFS_uint32) strlen(path); - PHYSFS_sint64 retval = -1; - const char *name; - int rc; - - if (*path == '\0') /* root dir? */ - return 0; - - if ((dlen > 0) && (path[dlen - 1] == '/')) /* ignore trailing slash. */ - dlen--; - - while (lo <= hi) - { - middle = lo + ((hi - lo) / 2); - name = info->entries[middle].name; - rc = strncmp(path, name, dlen); - if (rc == 0) - { - char ch = name[dlen]; - if ('/' < ch) /* make sure this isn't just a substr match. */ - rc = -1; - else if ('/' > ch) - rc = 1; - else - { - if (stop_on_first_find) /* Just checking dir's existance? */ - return middle; - - if (name[dlen + 1] == '\0') /* Skip initial dir entry. */ - return (middle + 1); - - /* there might be more entries earlier in the list. */ - retval = middle; - hi = middle - 1; - } /* else */ - } /* if */ - - if (rc > 0) - lo = middle + 1; - else - hi = middle - 1; - } /* while */ - - return retval; -} /* zip_find_start_of_dir */ - - -/* - * Moved to seperate function so we can use alloca then immediately throw - * away the allocated stack space... - */ -static void doEnumCallback(PHYSFS_EnumFilesCallback cb, void *callbackdata, - const char *odir, const char *str, PHYSFS_sint32 ln) -{ - char *newstr = __PHYSFS_smallAlloc(ln + 1); - if (newstr == NULL) - return; - - memcpy(newstr, str, ln); - newstr[ln] = '\0'; - cb(callbackdata, odir, newstr); - __PHYSFS_smallFree(newstr); -} /* doEnumCallback */ - - -static void ZIP_enumerateFiles(PHYSFS_Dir *opaque, const char *dname, - int omitSymLinks, PHYSFS_EnumFilesCallback cb, +static void ZIP_enumerateFiles(void *opaque, const char *dname, + PHYSFS_EnumFilesCallback cb, const char *origdir, void *callbackdata) { ZIPinfo *info = ((ZIPinfo *) opaque); - PHYSFS_sint32 dlen, dlen_inc; - PHYSFS_sint64 i, max; - - i = zip_find_start_of_dir(info, dname, 0); - if (i == -1) /* no such directory. */ - return; - - dlen = (PHYSFS_sint32) strlen(dname); - if ((dlen > 0) && (dname[dlen - 1] == '/')) /* ignore trailing slash. */ - dlen--; - - dlen_inc = ((dlen > 0) ? 1 : 0) + dlen; - max = (PHYSFS_sint64) info->entryCount; - while (i < max) + const ZIPentry *entry = zip_find_entry(info, dname); + if (entry && (entry->resolved == ZIP_DIRECTORY)) { - char *e = info->entries[i].name; - if ((dlen) && ((strncmp(e, dname, dlen) != 0) || (e[dlen] != '/'))) - break; /* past end of this dir; we're done. */ - - if ((omitSymLinks) && (zip_entry_is_symlink(&info->entries[i]))) - i++; - else + for (entry = entry->children; entry; entry = entry->sibling) { - char *add = e + dlen_inc; - char *ptr = strchr(add, '/'); - PHYSFS_sint32 ln = (PHYSFS_sint32) ((ptr) ? ptr-add : strlen(add)); - doEnumCallback(cb, callbackdata, origdir, add, ln); - ln += dlen_inc; /* point past entry to children... */ - - /* increment counter and skip children of subdirs... */ - while ((++i < max) && (ptr != NULL)) - { - char *e_new = info->entries[i].name; - if ((strncmp(e, e_new, ln) != 0) || (e_new[ln] != '/')) - break; - } /* while */ - } /* else */ - } /* while */ + const char *ptr = strrchr(entry->name, '/'); + cb(callbackdata, origdir, ptr ? ptr + 1 : entry->name); + } /* for */ + } /* if */ } /* ZIP_enumerateFiles */ @@ -1560,15 +1663,33 @@ } /* zip_get_io */ -static PHYSFS_Io *ZIP_openRead(PHYSFS_Dir *opaque, const char *fnm, - int *fileExists) +static PHYSFS_Io *ZIP_openRead(void *opaque, const char *filename) { PHYSFS_Io *retval = NULL; ZIPinfo *info = (ZIPinfo *) opaque; - ZIPentry *entry = zip_find_entry(info, fnm, NULL); + ZIPentry *entry = zip_find_entry(info, filename); ZIPfileinfo *finfo = NULL; + PHYSFS_Io *io = NULL; + PHYSFS_uint8 *password = NULL; + int i; - *fileExists = (entry != NULL); + /* if not found, see if maybe "$PASSWORD" is appended. */ + if ((!entry) && (info->has_crypto)) + { + const char *ptr = strrchr(filename, '$'); + if (ptr != NULL) + { + const PHYSFS_uint64 len = (PHYSFS_uint64) (ptr - filename); + char *str = (char *) __PHYSFS_smallAlloc(len + 1); + BAIL_IF_MACRO(!str, PHYSFS_ERR_OUT_OF_MEMORY, NULL); + memcpy(str, filename, len); + str[len] = '\0'; + entry = zip_find_entry(info, str); + __PHYSFS_smallFree(str); + password = (PHYSFS_uint8 *) (ptr + 1); + } /* if */ + } /* if */ + BAIL_IF_MACRO(!entry, ERRPASS, NULL); retval = (PHYSFS_Io *) allocator.Malloc(sizeof (PHYSFS_Io)); @@ -1578,8 +1699,9 @@ GOTO_IF_MACRO(!finfo, PHYSFS_ERR_OUT_OF_MEMORY, ZIP_openRead_failed); memset(finfo, '\0', sizeof (ZIPfileinfo)); - finfo->io = zip_get_io(info->io, info, entry); - GOTO_IF_MACRO(!finfo->io, ERRPASS, ZIP_openRead_failed); + io = zip_get_io(info->io, info, entry); + GOTO_IF_MACRO(!io, ERRPASS, ZIP_openRead_failed); + finfo->io = io; finfo->entry = ((entry->symlink != NULL) ? entry->symlink : entry); initializeZStream(&finfo->stream); @@ -1592,6 +1714,18 @@ goto ZIP_openRead_failed; } /* if */ + if (!zip_entry_is_tradional_crypto(entry)) + GOTO_IF_MACRO(password != NULL, PHYSFS_ERR_BAD_PASSWORD, ZIP_openRead_failed); + else + { + PHYSFS_uint8 crypto_header[12]; + GOTO_IF_MACRO(password == NULL, PHYSFS_ERR_BAD_PASSWORD, ZIP_openRead_failed); + if (io->read(io, crypto_header, 12) != 12) + goto ZIP_openRead_failed; + else if (!zip_prep_crypto_keys(finfo, crypto_header, password)) + goto ZIP_openRead_failed; + } /* if */ + memcpy(retval, &ZIP_Io, sizeof (PHYSFS_Io)); retval->opaque = finfo; @@ -1619,53 +1753,74 @@ } /* ZIP_openRead */ -static PHYSFS_Io *ZIP_openWrite(PHYSFS_Dir *opaque, const char *filename) +static PHYSFS_Io *ZIP_openWrite(void *opaque, const char *filename) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL); } /* ZIP_openWrite */ -static PHYSFS_Io *ZIP_openAppend(PHYSFS_Dir *opaque, const char *filename) +static PHYSFS_Io *ZIP_openAppend(void *opaque, const char *filename) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, NULL); } /* ZIP_openAppend */ -static void ZIP_closeArchive(PHYSFS_Dir *opaque) +static void ZIP_closeArchive(void *opaque) { - ZIPinfo *zi = (ZIPinfo *) (opaque); - zi->io->destroy(zi->io); - zip_free_entries(zi->entries, zi->entryCount); - allocator.Free(zi); + ZIPinfo *info = (ZIPinfo *) (opaque); + + if (!info) + return; + + if (info->io) + info->io->destroy(info->io); + + assert(info->root.sibling == NULL); + assert(info->hash || (info->root.children == NULL)); + + if (info->hash) + { + size_t i; + for (i = 0; i < info->hashBuckets; i++) + { + ZIPentry *entry; + ZIPentry *next; + for (entry = info->hash[i]; entry; entry = next) + { + next = entry->hashnext; + allocator.Free(entry); + } /* for */ + } /* for */ + allocator.Free(info->hash); + } /* if */ + + allocator.Free(info); } /* ZIP_closeArchive */ -static int ZIP_remove(PHYSFS_Dir *opaque, const char *name) +static int ZIP_remove(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0); } /* ZIP_remove */ -static int ZIP_mkdir(PHYSFS_Dir *opaque, const char *name) +static int ZIP_mkdir(void *opaque, const char *name) { BAIL_MACRO(PHYSFS_ERR_READ_ONLY, 0); } /* ZIP_mkdir */ -static int ZIP_stat(PHYSFS_Dir *opaque, const char *filename, int *exists, - PHYSFS_Stat *stat) +static int ZIP_stat(void *opaque, const char *filename, PHYSFS_Stat *stat) { - int isDir = 0; - const ZIPinfo *info = (const ZIPinfo *) opaque; - const ZIPentry *entry = zip_find_entry(info, filename, &isDir); + ZIPinfo *info = (ZIPinfo *) opaque; + const ZIPentry *entry = zip_find_entry(info, filename); /* !!! FIXME: does this need to resolve entries here? */ - *exists = isDir || (entry != 0); - if (!*exists) + if (entry == NULL) return 0; - if (isDir) + else if (entry->resolved == ZIP_DIRECTORY) { stat->filesize = 0; stat->filetype = PHYSFS_FILETYPE_DIRECTORY; @@ -1694,24 +1849,26 @@ const PHYSFS_Archiver __PHYSFS_Archiver_ZIP = { + CURRENT_PHYSFS_ARCHIVER_API_VERSION, { "ZIP", "PkZip/WinZip/Info-Zip compatible", "Ryan C. Gordon ", - "http://icculus.org/physfs/", + "https://icculus.org/physfs/", + 1, /* supportsSymlinks */ }, - ZIP_openArchive, /* openArchive() method */ - ZIP_enumerateFiles, /* enumerateFiles() method */ - ZIP_openRead, /* openRead() method */ - ZIP_openWrite, /* openWrite() method */ - ZIP_openAppend, /* openAppend() method */ - ZIP_remove, /* remove() method */ - ZIP_mkdir, /* mkdir() method */ - ZIP_closeArchive, /* closeArchive() method */ - ZIP_stat /* stat() method */ + ZIP_openArchive, + ZIP_enumerateFiles, + ZIP_openRead, + ZIP_openWrite, + ZIP_openAppend, + ZIP_remove, + ZIP_mkdir, + ZIP_stat, + ZIP_closeArchive }; #endif /* defined PHYSFS_SUPPORTS_ZIP */ -/* end of zip.c ... */ +/* end of archiver_zip.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/7zC.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/7zC.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,237 @@ +7z ANSI-C Decoder 4.48 +---------------------- + +7z ANSI-C Decoder 4.48 Copyright (C) 1999-2006 Igor Pavlov + +7z ANSI-C provides 7z/LZMA decoding. +7z ANSI-C version is simplified version ported from C++ code. + +LZMA is default and general compression method of 7z format +in 7-Zip compression program (www.7-zip.org). LZMA provides high +compression ratio and very fast decompression. + + +LICENSE +------- + +Read lzma.txt for information about license. + + +Files +--------------------- + +7zAlloc.* - Allocate and Free +7zBuffer.* - Buffer structure +7zCrc.* - CRC32 code +7zDecode.* - Low level memory->memory decoding +7zExtract.* - High level stream->memory decoding +7zHeader.* - .7z format constants +7zIn.* - .7z archive opening +7zItem.* - .7z structures +7zMain.c - Test application +7zMethodID.* - MethodID structure +7zTypes.h - Base types and constants + + +How To Use +---------- + +You must download 7-Zip program from www.7-zip.org. + +You can create .7z archive with 7z.exe or 7za.exe: + + 7za.exe a archive.7z *.htm -r -mx -m0fb=255 + +If you have big number of files in archive, and you need fast extracting, +you can use partly-solid archives: + + 7za.exe a archive.7z *.htm -ms=512K -r -mx -m0fb=255 -m0d=512K + +In that example 7-Zip will use 512KB solid blocks. So it needs to decompress only +512KB for extracting one file from such archive. + + +Limitations of current version of 7z ANSI-C Decoder +--------------------------------------------------- + + - It reads only "FileName", "Size", "LastWriteTime" and "CRC" information for each file in archive. + - It supports only LZMA and Copy (no compression) methods with BCJ or BCJ2 filters. + - It converts original UTF-16 Unicode file names to UTF-8 Unicode file names. + +These limitations will be fixed in future versions. + + +Using 7z ANSI-C Decoder Test application: +----------------------------------------- + +Usage: 7zDec + +: + e: Extract files from archive + l: List contents of archive + t: Test integrity of archive + +Example: + + 7zDec l archive.7z + +lists contents of archive.7z + + 7zDec e archive.7z + +extracts files from archive.7z to current folder. + + +How to use .7z Decoder +---------------------- + +.7z Decoder can be compiled in one of two modes: + +1) Default mode. In that mode 7z Decoder will read full compressed + block to RAM before decompressing. + +2) Mode with defined _LZMA_IN_CB. In that mode 7z Decoder can read + compressed block by parts. And you can specify desired buffer size. + So memory requirements can be reduced. But decompressing speed will + be 5-10% lower and code size is slightly larger. + + +Memory allocation +~~~~~~~~~~~~~~~~~ + +7z Decoder uses two memory pools: +1) Temporary pool +2) Main pool +Such scheme can allow you to avoid fragmentation of allocated blocks. + +Steps for using 7z decoder +-------------------------- + +Use code at 7zMain.c as example. + +1) Declare variables: + inStream /* implements ISzInStream interface */ + CArchiveDatabaseEx db; /* 7z archive database structure */ + ISzAlloc allocImp; /* memory functions for main pool */ + ISzAlloc allocTempImp; /* memory functions for temporary pool */ + +2) call InitCrcTable(); function to initialize CRC structures. + +3) call SzArDbExInit(&db); function to initialize db structures. + +4) call SzArchiveOpen(inStream, &db, &allocMain, &allocTemp) to open archive + +This function opens archive "inStream" and reads headers to "db". +All items in "db" will be allocated with "allocMain" functions. +SzArchiveOpen function allocates and frees temporary structures by "allocTemp" functions. + +5) List items or Extract items + + Listing code: + ~~~~~~~~~~~~~ + { + UInt32 i; + for (i = 0; i < db.Database.NumFiles; i++) + { + CFileItem *f = db.Database.Files + i; + printf("%10d %s\n", (int)f->Size, f->Name); + } + } + + Extracting code: + ~~~~~~~~~~~~~~~~ + + SZ_RESULT SzExtract( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + + If you need to decompress more than one file, you can send these values from previous call: + blockIndex, + outBuffer, + outBufferSize, + You can consider "outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + After decompressing you must free "outBuffer": + allocImp.Free(outBuffer); + +6) call SzArDbExFree(&db, allocImp.Free) to free allocated items in "db". + + + + +Memory requirements for .7z decoding +------------------------------------ + +Memory usage for Archive opening: + - Temporary pool: + - Memory for compressed .7z headers (if _LZMA_IN_CB is not defined) + - Memory for uncompressed .7z headers + - some other temporary blocks + - Main pool: + - Memory for database: + Estimated size of one file structures in solid archive: + - Size (4 or 8 Bytes) + - CRC32 (4 bytes) + - LastWriteTime (8 bytes) + - Some file information (4 bytes) + - File Name (variable length) + pointer + allocation structures + +Memory usage for archive Decompressing: + - Temporary pool: + - Memory for compressed solid block (if _LZMA_IN_CB is not defined) + - Memory for LZMA decompressing structures + - Main pool: + - Memory for decompressed solid block + - Memory for temprorary buffers, if BCJ2 fileter is used. Usually these + temprorary buffers can be about 15% of solid block size. + + +If _LZMA_IN_CB is defined, 7z Decoder will not allocate memory for +compressed blocks. Instead of this, you must allocate buffer with desired +size before calling 7z Decoder. Use 7zMain.c as example. + + + +EXIT codes +----------- + +7z Decoder functions can return one of the following codes: + +#define SZ_OK (0) +#define SZE_DATA_ERROR (1) +#define SZE_OUTOFMEMORY (2) +#define SZE_CRC_ERROR (3) + +#define SZE_NOTIMPL (4) +#define SZE_FAIL (5) + +#define SZE_ARCHIVE_ERROR (6) + + + +LZMA Defines +------------ + +_LZMA_IN_CB - Use special callback mode for input stream to reduce memory requirements + +_SZ_FILE_SIZE_32 - define it if you need only support for files smaller than 4 GB +_SZ_NO_INT_64 - define it if your compiler doesn't support long long int or __int64. + +_LZMA_PROB32 - it can increase LZMA decompressing speed on some 32-bit CPUs. + +_SZ_ALLOC_DEBUG - define it if you want to debug alloc/free operations to stderr. + + +--- + +http://www.7-zip.org +http://www.7-zip.org/support.html diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/7zFormat.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/7zFormat.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,471 @@ +7z Format description (2.30 Beta 25) +----------------------------------- + +This file contains description of 7z archive format. +7z archive can contain files compressed with any method. +See "Methods.txt" for description for defined compressing methods. + + +Format structure Overview +------------------------- + +Some fields can be optional. + +Archive structure +~~~~~~~~~~~~~~~~~ +SignatureHeader +[PackedStreams] +[PackedStreamsForHeaders] +[ + Header + or + { + Packed Header + HeaderInfo + } +] + + + +Header structure +~~~~~~~~~~~~~~~~ +{ + ArchiveProperties + AdditionalStreams + { + PackInfo + { + PackPos + NumPackStreams + Sizes[NumPackStreams] + CRCs[NumPackStreams] + } + CodersInfo + { + NumFolders + Folders[NumFolders] + { + NumCoders + CodersInfo[NumCoders] + { + ID + NumInStreams; + NumOutStreams; + PropertiesSize + Properties[PropertiesSize] + } + NumBindPairs + BindPairsInfo[NumBindPairs] + { + InIndex; + OutIndex; + } + PackedIndices + } + UnPackSize[Folders][Folders.NumOutstreams] + CRCs[NumFolders] + } + SubStreamsInfo + { + NumUnPackStreamsInFolders[NumFolders]; + UnPackSizes[] + CRCs[] + } + } + MainStreamsInfo + { + (Same as in AdditionalStreams) + } + FilesInfo + { + NumFiles + Properties[] + { + ID + Size + Data + } + } +} + +HeaderInfo structure +~~~~~~~~~~~~~~~~~~~~ +{ + (Same as in AdditionalStreams) +} + + + +Notes about Notation and encoding +--------------------------------- + +7z uses little endian encoding. + +7z archive format has optional headers that are marked as +[] +Header +[] + +REAL_UINT64 means real UINT64. + +UINT64 means real UINT64 encoded with the following scheme: + + Size of encoding sequence depends from first byte: + First_Byte Extra_Bytes Value + (binary) + 0xxxxxxx : ( xxxxxxx ) + 10xxxxxx BYTE y[1] : ( xxxxxx << (8 * 1)) + y + 110xxxxx BYTE y[2] : ( xxxxx << (8 * 2)) + y + ... + 1111110x BYTE y[6] : ( x << (8 * 6)) + y + 11111110 BYTE y[7] : y + 11111111 BYTE y[8] : y + + + +Property IDs +------------ + +0x00 = kEnd, + +0x01 = kHeader, + +0x02 = kArchiveProperties, + +0x03 = kAdditionalStreamsInfo, +0x04 = kMainStreamsInfo, +0x05 = kFilesInfo, + +0x06 = kPackInfo, +0x07 = kUnPackInfo, +0x08 = kSubStreamsInfo, + +0x09 = kSize, +0x0A = kCRC, + +0x0B = kFolder, + +0x0C = kCodersUnPackSize, +0x0D = kNumUnPackStream, + +0x0E = kEmptyStream, +0x0F = kEmptyFile, +0x10 = kAnti, + +0x11 = kName, +0x12 = kCreationTime, +0x13 = kLastAccessTime, +0x14 = kLastWriteTime, +0x15 = kWinAttributes, +0x16 = kComment, + +0x17 = kEncodedHeader, + + +7z format headers +----------------- + +SignatureHeader +~~~~~~~~~~~~~~~ + BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; + + ArchiveVersion + { + BYTE Major; // now = 0 + BYTE Minor; // now = 2 + }; + + UINT32 StartHeaderCRC; + + StartHeader + { + REAL_UINT64 NextHeaderOffset + REAL_UINT64 NextHeaderSize + UINT32 NextHeaderCRC + } + + +........................... + + +ArchiveProperties +~~~~~~~~~~~~~~~~~ +BYTE NID::kArchiveProperties (0x02) +for (;;) +{ + BYTE PropertyType; + if (aType == 0) + break; + UINT64 PropertySize; + BYTE PropertyData[PropertySize]; +} + + +Digests (NumStreams) +~~~~~~~~~~~~~~~~~~~~~ + BYTE AllAreDefined + if (AllAreDefined == 0) + { + for(NumStreams) + BIT Defined + } + UINT32 CRCs[NumDefined] + + +PackInfo +~~~~~~~~~~~~ + BYTE NID::kPackInfo (0x06) + UINT64 PackPos + UINT64 NumPackStreams + + [] + BYTE NID::kSize (0x09) + UINT64 PackSizes[NumPackStreams] + [] + + [] + BYTE NID::kCRC (0x0A) + PackStreamDigests[NumPackStreams] + [] + + BYTE NID::kEnd + + +Folder +~~~~~~ + UINT64 NumCoders; + for (NumCoders) + { + BYTE + { + 0:3 DecompressionMethod.IDSize + 4: + 0 - IsSimple + 1 - Is not simple + 5: + 0 - No Attributes + 1 - There Are Attributes + 7: + 0 - Last Method in Alternative_Method_List + 1 - There are more alternative methods + } + BYTE DecompressionMethod.ID[DecompressionMethod.IDSize] + if (!IsSimple) + { + UINT64 NumInStreams; + UINT64 NumOutStreams; + } + if (DecompressionMethod[0] != 0) + { + UINT64 PropertiesSize + BYTE Properties[PropertiesSize] + } + } + + NumBindPairs = NumOutStreamsTotal - 1; + + for (NumBindPairs) + { + UINT64 InIndex; + UINT64 OutIndex; + } + + NumPackedStreams = NumInStreamsTotal - NumBindPairs; + if (NumPackedStreams > 1) + for(NumPackedStreams) + { + UINT64 Index; + }; + + + + +Coders Info +~~~~~~~~~~~ + + BYTE NID::kUnPackInfo (0x07) + + + BYTE NID::kFolder (0x0B) + UINT64 NumFolders + BYTE External + switch(External) + { + case 0: + Folders[NumFolders] + case 1: + UINT64 DataStreamIndex + } + + + BYTE ID::kCodersUnPackSize (0x0C) + for(Folders) + for(Folder.NumOutStreams) + UINT64 UnPackSize; + + + [] + BYTE NID::kCRC (0x0A) + UnPackDigests[NumFolders] + [] + + + + BYTE NID::kEnd + + + +SubStreams Info +~~~~~~~~~~~~~~ + BYTE NID::kSubStreamsInfo; (0x08) + + [] + BYTE NID::kNumUnPackStream; (0x0D) + UINT64 NumUnPackStreamsInFolders[NumFolders]; + [] + + + [] + BYTE NID::kSize (0x09) + UINT64 UnPackSizes[] + [] + + + [] + BYTE NID::kCRC (0x0A) + Digests[Number of streams with unknown CRC] + [] + + + BYTE NID::kEnd + + +Streams Info +~~~~~~~~~~~~ + + [] + PackInfo + [] + + + [] + CodersInfo + [] + + + [] + SubStreamsInfo + [] + + BYTE NID::kEnd + + +FilesInfo +~~~~~~~~~ + BYTE NID::kFilesInfo; (0x05) + UINT64 NumFiles + + for (;;) + { + BYTE PropertyType; + if (aType == 0) + break; + + UINT64 Size; + + switch(PropertyType) + { + kEmptyStream: (0x0E) + for(NumFiles) + BIT IsEmptyStream + + kEmptyFile: (0x0F) + for(EmptyStreams) + BIT IsEmptyFile + + kAnti: (0x10) + for(EmptyStreams) + BIT IsAntiFile + + case kCreationTime: (0x12) + case kLastAccessTime: (0x13) + case kLastWriteTime: (0x14) + BYTE AllAreDefined + if (AllAreDefined == 0) + { + for(NumFiles) + BIT TimeDefined + } + BYTE External; + if(External != 0) + UINT64 DataIndex + [] + for(Definded Items) + UINT32 Time + [] + + kNames: (0x11) + BYTE External; + if(External != 0) + UINT64 DataIndex + [] + for(Files) + { + wchar_t Names[NameSize]; + wchar_t 0; + } + [] + + kAttributes: (0x15) + BYTE AllAreDefined + if (AllAreDefined == 0) + { + for(NumFiles) + BIT AttributesAreDefined + } + BYTE External; + if(External != 0) + UINT64 DataIndex + [] + for(Definded Attributes) + UINT32 Attributes + [] + } + } + + +Header +~~~~~~ + BYTE NID::kHeader (0x01) + + [] + ArchiveProperties + [] + + [] + BYTE NID::kAdditionalStreamsInfo; (0x03) + StreamsInfo + [] + + [] + BYTE NID::kMainStreamsInfo; (0x04) + StreamsInfo + [] + + [] + FilesInfo + [] + + BYTE NID::kEnd + + +HeaderInfo +~~~~~~~~~~ + [] + BYTE NID::kEncodedHeader; (0x17) + StreamsInfo for Encoded Header + [] + + +--- +End of document diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/7zCrc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/7zCrc.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,32 @@ +/* 7zCrc.c */ + +#include "7zCrc.h" + +#define kCrcPoly 0xEDB88320 +UInt32 g_CrcTable[256]; + +void MY_FAST_CALL CrcGenerateTable(void) +{ + UInt32 i; + for (i = 0; i < 256; i++) + { + UInt32 r = i; + int j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + g_CrcTable[i] = r; + } +} + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size) +{ + const Byte *p = (const Byte *)data; + for (; size > 0 ; size--, p++) + v = CRC_UPDATE_BYTE(v, *p); + return v; +} + +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size) +{ + return CrcUpdate(CRC_INIT_VAL, data, size) ^ 0xFFFFFFFF; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/7zCrc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/7zCrc.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,21 @@ +/* 7zCrc.h */ + +#ifndef __7Z_CRC_H +#define __7Z_CRC_H + +#include + +#include "Types.h" + +extern UInt32 g_CrcTable[]; + +void MY_FAST_CALL CrcGenerateTable(void); + +#define CRC_INIT_VAL 0xFFFFFFFF +#define CRC_GET_DIGEST(crc) ((crc) ^ 0xFFFFFFFF) +#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size); +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/7zCrcT8.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/7zCrcT8.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,40 @@ +/* 7zCrcT8.c */ + +#include "7zCrc.h" + +#define kCrcPoly 0xEDB88320 +#define CRC_NUM_TABLES 8 + +UInt32 g_CrcTable[256 * CRC_NUM_TABLES]; + +void MY_FAST_CALL CrcGenerateTable() +{ + UInt32 i; + for (i = 0; i < 256; i++) + { + UInt32 r = i; + int j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + g_CrcTable[i] = r; + } + #if CRC_NUM_TABLES > 1 + for (; i < 256 * CRC_NUM_TABLES; i++) + { + UInt32 r = g_CrcTable[i - 256]; + g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8); + } + #endif +} + +UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size) +{ + return CrcUpdateT8(v, data, size, g_CrcTable); +} + +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size) +{ + return CrcUpdateT8(CRC_INIT_VAL, data, size, g_CrcTable) ^ 0xFFFFFFFF; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Alloc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Alloc.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,119 @@ +/* Alloc.c */ + +#ifdef _WIN32 +#include +#endif +#include + +#include "Alloc.h" + +/* #define _SZ_ALLOC_DEBUG */ + +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ +#ifdef _SZ_ALLOC_DEBUG +#include +int g_allocCount = 0; +int g_allocCountMid = 0; +int g_allocCountBig = 0; +#endif + +void *MyAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc %10d bytes; count = %10d", size, g_allocCount++); + #endif + return malloc(size); +} + +void MyFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree; count = %10d", --g_allocCount); + #endif + free(address); +} + +#ifdef _WIN32 + +void *MidAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); + #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); +} + +void MidFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); + #endif + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#ifndef MEM_LARGE_PAGES +#undef _7ZIP_LARGE_PAGES +#endif + +#ifdef _7ZIP_LARGE_PAGES +SIZE_T g_LargePageSize = 0; +typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); +#endif + +void SetLargePageSize() +{ + #ifdef _7ZIP_LARGE_PAGES + SIZE_T size = 0; + GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) + GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); + if (largePageMinimum == 0) + return; + size = largePageMinimum(); + if (size == 0 || (size & (size - 1)) != 0) + return; + g_LargePageSize = size; + #endif +} + + +void *BigAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); + #endif + + #ifdef _7ZIP_LARGE_PAGES + if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) + { + void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), + MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); + if (res != 0) + return res; + } + #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); +} + +void BigFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); + #endif + + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Alloc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Alloc.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,29 @@ +/* Alloc.h */ + +#ifndef __COMMON_ALLOC_H +#define __COMMON_ALLOC_H + +#include + +void *MyAlloc(size_t size); +void MyFree(void *address); + +#ifdef _WIN32 + +void SetLargePageSize(); + +void *MidAlloc(size_t size); +void MidFree(void *address); +void *BigAlloc(size_t size); +void BigFree(void *address); + +#else + +#define MidAlloc(size) MyAlloc(size) +#define MidFree(address) MyFree(address) +#define BigAlloc(size) MyAlloc(size) +#define BigFree(address) MyFree(address) + +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zAlloc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zAlloc.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,70 @@ +/* 7zAlloc.c */ + +#include +#include "7zAlloc.h" + +/* #define _SZ_ALLOC_DEBUG */ +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ + +#ifdef _SZ_ALLOC_DEBUG + +#ifdef _WIN32 +#include +#endif +#include +int g_allocCount = 0; +int g_allocCountTemp = 0; +#endif + +void *SzAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc %10d bytes; count = %10d", size, g_allocCount); + g_allocCount++; + #endif + return malloc(size); +} + +void SzFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCount--; + fprintf(stderr, "\nFree; count = %10d", g_allocCount); + } + #endif + free(address); +} + +void *SzAllocTemp(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_temp %10d bytes; count = %10d", size, g_allocCountTemp); + g_allocCountTemp++; + #ifdef _WIN32 + return HeapAlloc(GetProcessHeap(), 0, size); + #endif + #endif + return malloc(size); +} + +void SzFreeTemp(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCountTemp--; + fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp); + } + #ifdef _WIN32 + HeapFree(GetProcessHeap(), 0, address); + return; + #endif + #endif + free(address); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zAlloc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zAlloc.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,20 @@ +/* 7zAlloc.h */ + +#ifndef __7Z_ALLOC_H +#define __7Z_ALLOC_H + +#include + +typedef struct _ISzAlloc +{ + void *(*Alloc)(size_t size); + void (*Free)(void *address); /* address can be 0 */ +} ISzAlloc; + +void *SzAlloc(size_t size); +void SzFree(void *address); + +void *SzAllocTemp(size_t size); +void SzFreeTemp(void *address); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zBuffer.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zBuffer.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,29 @@ +/* 7zBuffer.c */ + +#include "7zBuffer.h" +#include "7zAlloc.h" + +void SzByteBufferInit(CSzByteBuffer *buffer) +{ + buffer->Capacity = 0; + buffer->Items = 0; +} + +int SzByteBufferCreate(CSzByteBuffer *buffer, size_t newCapacity, void * (*allocFunc)(size_t size)) +{ + buffer->Capacity = newCapacity; + if (newCapacity == 0) + { + buffer->Items = 0; + return 1; + } + buffer->Items = (Byte *)allocFunc(newCapacity); + return (buffer->Items != 0); +} + +void SzByteBufferFree(CSzByteBuffer *buffer, void (*freeFunc)(void *)) +{ + freeFunc(buffer->Items); + buffer->Items = 0; + buffer->Capacity = 0; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zBuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zBuffer.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,19 @@ +/* 7zBuffer.h */ + +#ifndef __7Z_BUFFER_H +#define __7Z_BUFFER_H + +#include +#include "../../Types.h" + +typedef struct _CSzByteBuffer +{ + size_t Capacity; + Byte *Items; +}CSzByteBuffer; + +void SzByteBufferInit(CSzByteBuffer *buffer); +int SzByteBufferCreate(CSzByteBuffer *buffer, size_t newCapacity, void * (*allocFunc)(size_t size)); +void SzByteBufferFree(CSzByteBuffer *buffer, void (*freeFunc)(void *)); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zDecode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zDecode.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,345 @@ +/* 7zDecode.c */ + +#include + +/* BEGIN PHYSFS CHANGE */ +#include +/* END PHYSFS CHANGE */ + +#include "7zDecode.h" +#ifdef _SZ_ONE_DIRECTORY +#include "LzmaDecode.h" +#else +#include "../../Compress/Lzma/LzmaDecode.h" +#include "../../Compress/Branch/BranchX86.h" +#include "../../Compress/Branch/BranchX86_2.h" +#endif + +#define k_Copy 0 +#define k_LZMA 0x30101 +#define k_BCJ 0x03030103 +#define k_BCJ2 0x0303011B + +#ifdef _LZMA_IN_CB + +typedef struct _CLzmaInCallbackImp +{ + ILzmaInCallback InCallback; + ISzInStream *InStream; + CFileSize Size; +} CLzmaInCallbackImp; + +int LzmaReadImp(void *object, const unsigned char **buffer, SizeT *size) +{ + CLzmaInCallbackImp *cb = (CLzmaInCallbackImp *)object; + size_t processedSize; + SZ_RESULT res; + size_t curSize = (1 << 20); + if (curSize > cb->Size) + curSize = (size_t)cb->Size; + *size = 0; + res = cb->InStream->Read((void *)cb->InStream, (void **)buffer, curSize, &processedSize); + *size = (SizeT)processedSize; + if (processedSize > curSize) + return (int)SZE_FAIL; + cb->Size -= processedSize; + if (res == SZ_OK) + return 0; + return (int)res; +} + +#endif + +SZ_RESULT SzDecodeLzma(CCoderInfo *coder, CFileSize inSize, + #ifdef _LZMA_IN_CB + ISzInStream *inStream, + #else + const Byte *inBuffer, + #endif + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain) +{ + #ifdef _LZMA_IN_CB + CLzmaInCallbackImp lzmaCallback; + #else + SizeT inProcessed; + #endif + + CLzmaDecoderState state; /* it's about 24-80 bytes structure, if int is 32-bit */ + int result; + SizeT outSizeProcessedLoc; + + #ifdef _LZMA_IN_CB + lzmaCallback.Size = inSize; + lzmaCallback.InStream = inStream; + lzmaCallback.InCallback.Read = LzmaReadImp; + #endif + + if (LzmaDecodeProperties(&state.Properties, coder->Properties.Items, + (unsigned)coder->Properties.Capacity) != LZMA_RESULT_OK) + return SZE_FAIL; + + state.Probs = (CProb *)allocMain->Alloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); + if (state.Probs == 0) + return SZE_OUTOFMEMORY; + + #ifdef _LZMA_OUT_READ + if (state.Properties.DictionarySize == 0) + state.Dictionary = 0; + else + { + state.Dictionary = (unsigned char *)allocMain->Alloc(state.Properties.DictionarySize); + if (state.Dictionary == 0) + { + allocMain->Free(state.Probs); + return SZE_OUTOFMEMORY; + } + } + LzmaDecoderInit(&state); + #endif + + result = LzmaDecode(&state, + #ifdef _LZMA_IN_CB + &lzmaCallback.InCallback, + #else + inBuffer, (SizeT)inSize, &inProcessed, + #endif + outBuffer, (SizeT)outSize, &outSizeProcessedLoc); + allocMain->Free(state.Probs); + #ifdef _LZMA_OUT_READ + allocMain->Free(state.Dictionary); + #endif + if (result == LZMA_RESULT_DATA_ERROR) + return SZE_DATA_ERROR; + if (result != LZMA_RESULT_OK) + return SZE_FAIL; + return (outSizeProcessedLoc == outSize) ? SZ_OK : SZE_DATA_ERROR; +} + +#ifdef _LZMA_IN_CB +SZ_RESULT SzDecodeCopy(CFileSize inSize, ISzInStream *inStream, Byte *outBuffer) +{ + while (inSize > 0) + { + void *inBuffer; + size_t processedSize, curSize = (1 << 18); + if (curSize > inSize) + curSize = (size_t)(inSize); + RINOK(inStream->Read((void *)inStream, (void **)&inBuffer, curSize, &processedSize)); + if (processedSize == 0) + return SZE_DATA_ERROR; + if (processedSize > curSize) + return SZE_FAIL; + memcpy(outBuffer, inBuffer, processedSize); + outBuffer += processedSize; + inSize -= processedSize; + } + return SZ_OK; +} +#endif + +#define IS_UNSUPPORTED_METHOD(m) ((m) != k_Copy && (m) != k_LZMA) +#define IS_UNSUPPORTED_CODER(c) (IS_UNSUPPORTED_METHOD(c.MethodID) || c.NumInStreams != 1 || c.NumOutStreams != 1) +#define IS_NO_BCJ(c) (c.MethodID != k_BCJ || c.NumInStreams != 1 || c.NumOutStreams != 1) +#define IS_NO_BCJ2(c) (c.MethodID != k_BCJ2 || c.NumInStreams != 4 || c.NumOutStreams != 1) + +SZ_RESULT CheckSupportedFolder(const CFolder *f) +{ + if (f->NumCoders < 1 || f->NumCoders > 4) + return SZE_NOTIMPL; + if (IS_UNSUPPORTED_CODER(f->Coders[0])) + return SZE_NOTIMPL; + if (f->NumCoders == 1) + { + if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBindPairs != 0) + return SZE_NOTIMPL; + return SZ_OK; + } + if (f->NumCoders == 2) + { + if (IS_NO_BCJ(f->Coders[1]) || + f->NumPackStreams != 1 || f->PackStreams[0] != 0 || + f->NumBindPairs != 1 || + f->BindPairs[0].InIndex != 1 || f->BindPairs[0].OutIndex != 0) + return SZE_NOTIMPL; + return SZ_OK; + } + if (f->NumCoders == 4) + { + if (IS_UNSUPPORTED_CODER(f->Coders[1]) || + IS_UNSUPPORTED_CODER(f->Coders[2]) || + IS_NO_BCJ2(f->Coders[3])) + return SZE_NOTIMPL; + if (f->NumPackStreams != 4 || + f->PackStreams[0] != 2 || + f->PackStreams[1] != 6 || + f->PackStreams[2] != 1 || + f->PackStreams[3] != 0 || + f->NumBindPairs != 3 || + f->BindPairs[0].InIndex != 5 || f->BindPairs[0].OutIndex != 0 || + f->BindPairs[1].InIndex != 4 || f->BindPairs[1].OutIndex != 1 || + f->BindPairs[2].InIndex != 3 || f->BindPairs[2].OutIndex != 2) + return SZE_NOTIMPL; + return SZ_OK; + } + return SZE_NOTIMPL; +} + +CFileSize GetSum(const CFileSize *values, UInt32 index) +{ + CFileSize sum = 0; + UInt32 i; + for (i = 0; i < index; i++) + sum += values[i]; + return sum; +} + +SZ_RESULT SzDecode2(const CFileSize *packSizes, const CFolder *folder, + #ifdef _LZMA_IN_CB + ISzInStream *inStream, CFileSize startPos, + #else + const Byte *inBuffer, + #endif + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain, + Byte *tempBuf[]) +{ + UInt32 ci; + size_t tempSizes[3] = { 0, 0, 0}; + size_t tempSize3 = 0; + Byte *tempBuf3 = 0; + + RINOK(CheckSupportedFolder(folder)); + + for (ci = 0; ci < folder->NumCoders; ci++) + { + CCoderInfo *coder = &folder->Coders[ci]; + + if (coder->MethodID == k_Copy || coder->MethodID == k_LZMA) + { + UInt32 si = 0; + CFileSize offset; + CFileSize inSize; + Byte *outBufCur = outBuffer; + size_t outSizeCur = outSize; + if (folder->NumCoders == 4) + { + UInt32 indices[] = { 3, 2, 0 }; + CFileSize unpackSize = folder->UnPackSizes[ci]; + si = indices[ci]; + if (ci < 2) + { + Byte *temp; + outSizeCur = (size_t)unpackSize; + if (outSizeCur != unpackSize) + return SZE_OUTOFMEMORY; + temp = (Byte *)allocMain->Alloc(outSizeCur); + if (temp == 0 && outSizeCur != 0) + return SZE_OUTOFMEMORY; + outBufCur = tempBuf[1 - ci] = temp; + tempSizes[1 - ci] = outSizeCur; + } + else if (ci == 2) + { + if (unpackSize > outSize) + return SZE_OUTOFMEMORY; + tempBuf3 = outBufCur = outBuffer + (outSize - (size_t)unpackSize); + tempSize3 = outSizeCur = (size_t)unpackSize; + } + else + return SZE_NOTIMPL; + } + offset = GetSum(packSizes, si); + inSize = packSizes[si]; + #ifdef _LZMA_IN_CB + RINOK(inStream->Seek(inStream, startPos + offset)); + #endif + + if (coder->MethodID == k_Copy) + { + if (inSize != outSizeCur) + return SZE_DATA_ERROR; + + #ifdef _LZMA_IN_CB + RINOK(SzDecodeCopy(inSize, inStream, outBufCur)); + #else + memcpy(outBufCur, inBuffer + (size_t)offset, (size_t)inSize); + #endif + } + else + { + SZ_RESULT res = SzDecodeLzma(coder, inSize, + #ifdef _LZMA_IN_CB + inStream, + #else + inBuffer + (size_t)offset, + #endif + outBufCur, outSizeCur, allocMain); + RINOK(res) + } + } + else if (coder->MethodID == k_BCJ) + { + UInt32 state; + if (ci != 1) + return SZE_NOTIMPL; + x86_Convert_Init(state); + x86_Convert(outBuffer, outSize, 0, &state, 0); + } + else if (coder->MethodID == k_BCJ2) + { + CFileSize offset = GetSum(packSizes, 1); + CFileSize s3Size = packSizes[1]; + SZ_RESULT res; + if (ci != 3) + return SZE_NOTIMPL; + + #ifdef _LZMA_IN_CB + RINOK(inStream->Seek(inStream, startPos + offset)); + tempSizes[2] = (size_t)s3Size; + if (tempSizes[2] != s3Size) + return SZE_OUTOFMEMORY; + tempBuf[2] = (Byte *)allocMain->Alloc(tempSizes[2]); + if (tempBuf[2] == 0 && tempSizes[2] != 0) + return SZE_OUTOFMEMORY; + res = SzDecodeCopy(s3Size, inStream, tempBuf[2]); + RINOK(res) + #endif + + res = x86_2_Decode( + tempBuf3, tempSize3, + tempBuf[0], tempSizes[0], + tempBuf[1], tempSizes[1], + #ifdef _LZMA_IN_CB + tempBuf[2], tempSizes[2], + #else + inBuffer + (size_t)offset, (size_t)s3Size, + #endif + outBuffer, outSize); + RINOK(res) + } + else + return SZE_NOTIMPL; + } + return SZ_OK; +} + +SZ_RESULT SzDecode(const CFileSize *packSizes, const CFolder *folder, + #ifdef _LZMA_IN_CB + ISzInStream *inStream, CFileSize startPos, + #else + const Byte *inBuffer, + #endif + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain) +{ + Byte *tempBuf[3] = { 0, 0, 0}; + int i; + SZ_RESULT res = SzDecode2(packSizes, folder, + #ifdef _LZMA_IN_CB + inStream, startPos, + #else + inBuffer, + #endif + outBuffer, outSize, allocMain, tempBuf); + for (i = 0; i < 3; i++) + allocMain->Free(tempBuf[i]); + return res; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zDecode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zDecode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,20 @@ +/* 7zDecode.h */ + +#ifndef __7Z_DECODE_H +#define __7Z_DECODE_H + +#include "7zItem.h" +#include "7zAlloc.h" +#ifdef _LZMA_IN_CB +#include "7zIn.h" +#endif + +SZ_RESULT SzDecode(const CFileSize *packSizes, const CFolder *folder, + #ifdef _LZMA_IN_CB + ISzInStream *stream, CFileSize startPos, + #else + const Byte *inBuffer, + #endif + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zExtract.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zExtract.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,119 @@ +/* 7zExtract.c */ + +#include "7zExtract.h" +#include "7zDecode.h" +#include "../../7zCrc.h" + +SZ_RESULT SzExtract( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + UInt32 fileIndex, + UInt32 *blockIndex, + Byte **outBuffer, + size_t *outBufferSize, + size_t *offset, + size_t *outSizeProcessed, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt32 folderIndex = db->FileIndexToFolderIndexMap[fileIndex]; + SZ_RESULT res = SZ_OK; + *offset = 0; + *outSizeProcessed = 0; + if (folderIndex == (UInt32)-1) + { + allocMain->Free(*outBuffer); + *blockIndex = folderIndex; + *outBuffer = 0; + *outBufferSize = 0; + return SZ_OK; + } + + if (*outBuffer == 0 || *blockIndex != folderIndex) + { + CFolder *folder = db->Database.Folders + folderIndex; + CFileSize unPackSizeSpec = SzFolderGetUnPackSize(folder); + size_t unPackSize = (size_t)unPackSizeSpec; + CFileSize startOffset = SzArDbGetFolderStreamPos(db, folderIndex, 0); + #ifndef _LZMA_IN_CB + Byte *inBuffer = 0; + size_t processedSize; + CFileSize packSizeSpec; + size_t packSize; + RINOK(SzArDbGetFolderFullPackSize(db, folderIndex, &packSizeSpec)); + packSize = (size_t)packSizeSpec; + if (packSize != packSizeSpec) + return SZE_OUTOFMEMORY; + #endif + if (unPackSize != unPackSizeSpec) + return SZE_OUTOFMEMORY; + *blockIndex = folderIndex; + allocMain->Free(*outBuffer); + *outBuffer = 0; + + RINOK(inStream->Seek(inStream, startOffset)); + + #ifndef _LZMA_IN_CB + if (packSize != 0) + { + inBuffer = (Byte *)allocTemp->Alloc(packSize); + if (inBuffer == 0) + return SZE_OUTOFMEMORY; + } + res = inStream->Read(inStream, inBuffer, packSize, &processedSize); + if (res == SZ_OK && processedSize != packSize) + res = SZE_FAIL; + #endif + if (res == SZ_OK) + { + *outBufferSize = unPackSize; + if (unPackSize != 0) + { + *outBuffer = (Byte *)allocMain->Alloc(unPackSize); + if (*outBuffer == 0) + res = SZE_OUTOFMEMORY; + } + if (res == SZ_OK) + { + res = SzDecode(db->Database.PackSizes + + db->FolderStartPackStreamIndex[folderIndex], folder, + #ifdef _LZMA_IN_CB + inStream, startOffset, + #else + inBuffer, + #endif + *outBuffer, unPackSize, allocTemp); + if (res == SZ_OK) + { + if (folder->UnPackCRCDefined) + { + if (CrcCalc(*outBuffer, unPackSize) != folder->UnPackCRC) + res = SZE_CRC_ERROR; + } + } + } + } + #ifndef _LZMA_IN_CB + allocTemp->Free(inBuffer); + #endif + } + if (res == SZ_OK) + { + UInt32 i; + CFileItem *fileItem = db->Database.Files + fileIndex; + *offset = 0; + for(i = db->FolderStartFileIndex[folderIndex]; i < fileIndex; i++) + *offset += (UInt32)db->Database.Files[i].Size; + *outSizeProcessed = (size_t)fileItem->Size; + if (*offset + *outSizeProcessed > *outBufferSize) + return SZE_FAIL; + { + if (fileItem->IsFileCRCDefined) + { + if (CrcCalc(*outBuffer + *offset, *outSizeProcessed) != fileItem->FileCRC) + res = SZE_CRC_ERROR; + } + } + } + return res; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zExtract.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zExtract.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,40 @@ +/* 7zExtract.h */ + +#ifndef __7Z_EXTRACT_H +#define __7Z_EXTRACT_H + +#include "7zIn.h" + +/* + SzExtract extracts file from archive + + *outBuffer must be 0 before first call for each new archive. + + Extracting cache: + If you need to decompress more than one file, you can send + these values from previous call: + *blockIndex, + *outBuffer, + *outBufferSize + You can consider "*outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + If you use external function, you can declare these 3 cache variables + (blockIndex, outBuffer, outBufferSize) as static in that external function. + + Free *outBuffer and set *outBuffer to 0, if you want to flush cache. +*/ + +SZ_RESULT SzExtract( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zHeader.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zHeader.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,5 @@ +/* 7zHeader.c */ + +#include "7zHeader.h" + +Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zHeader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zHeader.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,55 @@ +/* 7zHeader.h */ + +#ifndef __7Z_HEADER_H +#define __7Z_HEADER_H + +#include "../../Types.h" + +#define k7zSignatureSize 6 +extern Byte k7zSignature[k7zSignatureSize]; + +#define k7zMajorVersion 0 + +#define k7zStartHeaderSize 0x20 + +enum EIdEnum +{ + k7zIdEnd, + + k7zIdHeader, + + k7zIdArchiveProperties, + + k7zIdAdditionalStreamsInfo, + k7zIdMainStreamsInfo, + k7zIdFilesInfo, + + k7zIdPackInfo, + k7zIdUnPackInfo, + k7zIdSubStreamsInfo, + + k7zIdSize, + k7zIdCRC, + + k7zIdFolder, + + k7zIdCodersUnPackSize, + k7zIdNumUnPackStream, + + k7zIdEmptyStream, + k7zIdEmptyFile, + k7zIdAnti, + + k7zIdName, + k7zIdCreationTime, + k7zIdLastAccessTime, + k7zIdLastWriteTime, + k7zIdWinAttributes, + k7zIdComment, + + k7zIdEncodedHeader, + + k7zIdStartPos +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zIn.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zIn.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1314 @@ +/* 7zIn.c */ + +#include "7zIn.h" +#include "7zDecode.h" +#include "../../7zCrc.h" + +#define RINOM(x) { if((x) == 0) return SZE_OUTOFMEMORY; } + +void SzArDbExInit(CArchiveDatabaseEx *db) +{ + SzArchiveDatabaseInit(&db->Database); + db->FolderStartPackStreamIndex = 0; + db->PackStreamStartPositions = 0; + db->FolderStartFileIndex = 0; + db->FileIndexToFolderIndexMap = 0; +} + +void SzArDbExFree(CArchiveDatabaseEx *db, void (*freeFunc)(void *)) +{ + freeFunc(db->FolderStartPackStreamIndex); + freeFunc(db->PackStreamStartPositions); + freeFunc(db->FolderStartFileIndex); + freeFunc(db->FileIndexToFolderIndexMap); + SzArchiveDatabaseFree(&db->Database, freeFunc); + SzArDbExInit(db); +} + +/* +CFileSize GetFolderPackStreamSize(int folderIndex, int streamIndex) const +{ + return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex]; +} + +CFileSize GetFilePackSize(int fileIndex) const +{ + int folderIndex = FileIndexToFolderIndexMap[fileIndex]; + if (folderIndex >= 0) + { + const CFolder &folderInfo = Folders[folderIndex]; + if (FolderStartFileIndex[folderIndex] == fileIndex) + return GetFolderFullPackSize(folderIndex); + } + return 0; +} +*/ + +#define MY_ALLOC(T, p, size, allocFunc) { if ((size) == 0) p = 0; else \ + if ((p = (T *)allocFunc((size) * sizeof(T))) == 0) return SZE_OUTOFMEMORY; } + +SZ_RESULT SzArDbExFill(CArchiveDatabaseEx *db, void * (*allocFunc)(size_t size)) +{ + UInt32 startPos = 0; + CFileSize startPosSize = 0; + UInt32 i; + UInt32 folderIndex = 0; + UInt32 indexInFolder = 0; + MY_ALLOC(UInt32, db->FolderStartPackStreamIndex, db->Database.NumFolders, allocFunc); + for(i = 0; i < db->Database.NumFolders; i++) + { + db->FolderStartPackStreamIndex[i] = startPos; + startPos += db->Database.Folders[i].NumPackStreams; + } + + MY_ALLOC(CFileSize, db->PackStreamStartPositions, db->Database.NumPackStreams, allocFunc); + + for(i = 0; i < db->Database.NumPackStreams; i++) + { + db->PackStreamStartPositions[i] = startPosSize; + startPosSize += db->Database.PackSizes[i]; + } + + MY_ALLOC(UInt32, db->FolderStartFileIndex, db->Database.NumFolders, allocFunc); + MY_ALLOC(UInt32, db->FileIndexToFolderIndexMap, db->Database.NumFiles, allocFunc); + + for (i = 0; i < db->Database.NumFiles; i++) + { + CFileItem *file = db->Database.Files + i; + int emptyStream = !file->HasStream; + if (emptyStream && indexInFolder == 0) + { + db->FileIndexToFolderIndexMap[i] = (UInt32)-1; + continue; + } + if (indexInFolder == 0) + { + /* + v3.13 incorrectly worked with empty folders + v4.07: Loop for skipping empty folders + */ + for (;;) + { + if (folderIndex >= db->Database.NumFolders) + return SZE_ARCHIVE_ERROR; + db->FolderStartFileIndex[folderIndex] = i; + if (db->Database.Folders[folderIndex].NumUnPackStreams != 0) + break; + folderIndex++; + } + } + db->FileIndexToFolderIndexMap[i] = folderIndex; + if (emptyStream) + continue; + indexInFolder++; + if (indexInFolder >= db->Database.Folders[folderIndex].NumUnPackStreams) + { + folderIndex++; + indexInFolder = 0; + } + } + return SZ_OK; +} + + +CFileSize SzArDbGetFolderStreamPos(CArchiveDatabaseEx *db, UInt32 folderIndex, UInt32 indexInFolder) +{ + return db->ArchiveInfo.DataStartPosition + + db->PackStreamStartPositions[db->FolderStartPackStreamIndex[folderIndex] + indexInFolder]; +} + +int SzArDbGetFolderFullPackSize(CArchiveDatabaseEx *db, UInt32 folderIndex, CFileSize *resSize) +{ + UInt32 packStreamIndex = db->FolderStartPackStreamIndex[folderIndex]; + CFolder *folder = db->Database.Folders + folderIndex; + CFileSize size = 0; + UInt32 i; + for (i = 0; i < folder->NumPackStreams; i++) + { + CFileSize t = size + db->Database.PackSizes[packStreamIndex + i]; + if (t < size) + return SZE_FAIL; + size = t; + } + *resSize = size; + return SZ_OK; +} + + +/* +SZ_RESULT SzReadTime(const CObjectVector &dataVector, + CObjectVector &files, UInt64 type) +{ + CBoolVector boolVector; + RINOK(ReadBoolVector2(files.Size(), boolVector)) + + CStreamSwitch streamSwitch; + RINOK(streamSwitch.Set(this, &dataVector)); + + for(int i = 0; i < files.Size(); i++) + { + CFileItem &file = files[i]; + CArchiveFileTime fileTime; + bool defined = boolVector[i]; + if (defined) + { + UInt32 low, high; + RINOK(SzReadUInt32(low)); + RINOK(SzReadUInt32(high)); + fileTime.dwLowDateTime = low; + fileTime.dwHighDateTime = high; + } + switch(type) + { + case k7zIdCreationTime: + file.IsCreationTimeDefined = defined; + if (defined) + file.CreationTime = fileTime; + break; + case k7zIdLastWriteTime: + file.IsLastWriteTimeDefined = defined; + if (defined) + file.LastWriteTime = fileTime; + break; + case k7zIdLastAccessTime: + file.IsLastAccessTimeDefined = defined; + if (defined) + file.LastAccessTime = fileTime; + break; + } + } + return SZ_OK; +} +*/ + +SZ_RESULT SafeReadDirect(ISzInStream *inStream, Byte *data, size_t size) +{ + #ifdef _LZMA_IN_CB + while (size > 0) + { + void *inBufferSpec; + size_t processedSize; + const Byte *inBuffer; + RINOK(inStream->Read(inStream, (void **)&inBufferSpec, size, &processedSize)); + inBuffer = (const Byte *)inBufferSpec; + if (processedSize == 0 || processedSize > size) + return SZE_FAIL; + size -= processedSize; + do + { + *data++ = *inBuffer++; + } + while (--processedSize != 0); + } + #else + size_t processedSize; + RINOK(inStream->Read(inStream, data, size, &processedSize)); + if (processedSize != size) + return SZE_FAIL; + #endif + return SZ_OK; +} + +SZ_RESULT SafeReadDirectByte(ISzInStream *inStream, Byte *data) +{ + return SafeReadDirect(inStream, data, 1); +} + +SZ_RESULT SafeReadDirectUInt32(ISzInStream *inStream, UInt32 *value, UInt32 *crc) +{ + int i; + *value = 0; + for (i = 0; i < 4; i++) + { + Byte b; + RINOK(SafeReadDirectByte(inStream, &b)); + *value |= ((UInt32)b << (8 * i)); + *crc = CRC_UPDATE_BYTE(*crc, b); + } + return SZ_OK; +} + +SZ_RESULT SafeReadDirectUInt64(ISzInStream *inStream, UInt64 *value, UInt32 *crc) +{ + int i; + *value = 0; + for (i = 0; i < 8; i++) + { + Byte b; + RINOK(SafeReadDirectByte(inStream, &b)); + *value |= ((UInt64)b << (8 * i)); + *crc = CRC_UPDATE_BYTE(*crc, b); + } + return SZ_OK; +} + +int TestSignatureCandidate(Byte *testBytes) +{ + size_t i; + for (i = 0; i < k7zSignatureSize; i++) + if (testBytes[i] != k7zSignature[i]) + return 0; + return 1; +} + +typedef struct _CSzState +{ + Byte *Data; + size_t Size; +}CSzData; + +SZ_RESULT SzReadByte(CSzData *sd, Byte *b) +{ + if (sd->Size == 0) + return SZE_ARCHIVE_ERROR; + sd->Size--; + *b = *sd->Data++; + return SZ_OK; +} + +SZ_RESULT SzReadBytes(CSzData *sd, Byte *data, size_t size) +{ + size_t i; + for (i = 0; i < size; i++) + { + RINOK(SzReadByte(sd, data + i)); + } + return SZ_OK; +} + +SZ_RESULT SzReadUInt32(CSzData *sd, UInt32 *value) +{ + int i; + *value = 0; + for (i = 0; i < 4; i++) + { + Byte b; + RINOK(SzReadByte(sd, &b)); + *value |= ((UInt32)(b) << (8 * i)); + } + return SZ_OK; +} + +SZ_RESULT SzReadNumber(CSzData *sd, UInt64 *value) +{ + Byte firstByte; + Byte mask = 0x80; + int i; + RINOK(SzReadByte(sd, &firstByte)); + *value = 0; + for (i = 0; i < 8; i++) + { + Byte b; + if ((firstByte & mask) == 0) + { + UInt64 highPart = firstByte & (mask - 1); + *value += (highPart << (8 * i)); + return SZ_OK; + } + RINOK(SzReadByte(sd, &b)); + *value |= ((UInt64)b << (8 * i)); + mask >>= 1; + } + return SZ_OK; +} + +SZ_RESULT SzReadSize(CSzData *sd, CFileSize *value) +{ + UInt64 value64; + RINOK(SzReadNumber(sd, &value64)); + *value = (CFileSize)value64; + return SZ_OK; +} + +SZ_RESULT SzReadNumber32(CSzData *sd, UInt32 *value) +{ + UInt64 value64; + RINOK(SzReadNumber(sd, &value64)); + if (value64 >= 0x80000000) + return SZE_NOTIMPL; + if (value64 >= ((UInt64)(1) << ((sizeof(size_t) - 1) * 8 + 2))) + return SZE_NOTIMPL; + *value = (UInt32)value64; + return SZ_OK; +} + +SZ_RESULT SzReadID(CSzData *sd, UInt64 *value) +{ + return SzReadNumber(sd, value); +} + +SZ_RESULT SzSkeepDataSize(CSzData *sd, UInt64 size) +{ + if (size > sd->Size) + return SZE_ARCHIVE_ERROR; + sd->Size -= (size_t)size; + sd->Data += (size_t)size; + return SZ_OK; +} + +SZ_RESULT SzSkeepData(CSzData *sd) +{ + UInt64 size; + RINOK(SzReadNumber(sd, &size)); + return SzSkeepDataSize(sd, size); +} + +SZ_RESULT SzReadArchiveProperties(CSzData *sd) +{ + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + SzSkeepData(sd); + } + return SZ_OK; +} + +SZ_RESULT SzWaitAttribute(CSzData *sd, UInt64 attribute) +{ + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == attribute) + return SZ_OK; + if (type == k7zIdEnd) + return SZE_ARCHIVE_ERROR; + RINOK(SzSkeepData(sd)); + } +} + +SZ_RESULT SzReadBoolVector(CSzData *sd, size_t numItems, Byte **v, void * (*allocFunc)(size_t size)) +{ + Byte b = 0; + Byte mask = 0; + size_t i; + MY_ALLOC(Byte, *v, numItems, allocFunc); + for (i = 0; i < numItems; i++) + { + if (mask == 0) + { + RINOK(SzReadByte(sd, &b)); + mask = 0x80; + } + (*v)[i] = (Byte)(((b & mask) != 0) ? 1 : 0); + mask >>= 1; + } + return SZ_OK; +} + +SZ_RESULT SzReadBoolVector2(CSzData *sd, size_t numItems, Byte **v, void * (*allocFunc)(size_t size)) +{ + Byte allAreDefined; + size_t i; + RINOK(SzReadByte(sd, &allAreDefined)); + if (allAreDefined == 0) + return SzReadBoolVector(sd, numItems, v, allocFunc); + MY_ALLOC(Byte, *v, numItems, allocFunc); + for(i = 0; i < numItems; i++) + (*v)[i] = 1; + return SZ_OK; +} + +SZ_RESULT SzReadHashDigests( + CSzData *sd, + size_t numItems, + Byte **digestsDefined, + UInt32 **digests, + void * (*allocFunc)(size_t size)) +{ + size_t i; + RINOK(SzReadBoolVector2(sd, numItems, digestsDefined, allocFunc)); + MY_ALLOC(UInt32, *digests, numItems, allocFunc); + for(i = 0; i < numItems; i++) + if ((*digestsDefined)[i]) + { + RINOK(SzReadUInt32(sd, (*digests) + i)); + } + return SZ_OK; +} + +SZ_RESULT SzReadPackInfo( + CSzData *sd, + CFileSize *dataOffset, + UInt32 *numPackStreams, + CFileSize **packSizes, + Byte **packCRCsDefined, + UInt32 **packCRCs, + void * (*allocFunc)(size_t size)) +{ + UInt32 i; + RINOK(SzReadSize(sd, dataOffset)); + RINOK(SzReadNumber32(sd, numPackStreams)); + + RINOK(SzWaitAttribute(sd, k7zIdSize)); + + MY_ALLOC(CFileSize, *packSizes, (size_t)*numPackStreams, allocFunc); + + for(i = 0; i < *numPackStreams; i++) + { + RINOK(SzReadSize(sd, (*packSizes) + i)); + } + + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + if (type == k7zIdCRC) + { + RINOK(SzReadHashDigests(sd, (size_t)*numPackStreams, packCRCsDefined, packCRCs, allocFunc)); + continue; + } + RINOK(SzSkeepData(sd)); + } + if (*packCRCsDefined == 0) + { + MY_ALLOC(Byte, *packCRCsDefined, (size_t)*numPackStreams, allocFunc); + MY_ALLOC(UInt32, *packCRCs, (size_t)*numPackStreams, allocFunc); + for(i = 0; i < *numPackStreams; i++) + { + (*packCRCsDefined)[i] = 0; + (*packCRCs)[i] = 0; + } + } + return SZ_OK; +} + +SZ_RESULT SzReadSwitch(CSzData *sd) +{ + Byte external; + RINOK(SzReadByte(sd, &external)); + return (external == 0) ? SZ_OK: SZE_ARCHIVE_ERROR; +} + +SZ_RESULT SzGetNextFolderItem(CSzData *sd, CFolder *folder, void * (*allocFunc)(size_t size)) +{ + UInt32 numCoders; + UInt32 numBindPairs; + UInt32 numPackedStreams; + UInt32 i; + UInt32 numInStreams = 0; + UInt32 numOutStreams = 0; + RINOK(SzReadNumber32(sd, &numCoders)); + folder->NumCoders = numCoders; + + MY_ALLOC(CCoderInfo, folder->Coders, (size_t)numCoders, allocFunc); + + for (i = 0; i < numCoders; i++) + SzCoderInfoInit(folder->Coders + i); + + for (i = 0; i < numCoders; i++) + { + Byte mainByte; + CCoderInfo *coder = folder->Coders + i; + { + unsigned idSize, j; + Byte longID[15]; + RINOK(SzReadByte(sd, &mainByte)); + idSize = (unsigned)(mainByte & 0xF); + RINOK(SzReadBytes(sd, longID, idSize)); + if (idSize > sizeof(coder->MethodID)) + return SZE_NOTIMPL; + coder->MethodID = 0; + for (j = 0; j < idSize; j++) + coder->MethodID |= (CMethodID)longID[idSize - 1 - j] << (8 * j); + + if ((mainByte & 0x10) != 0) + { + RINOK(SzReadNumber32(sd, &coder->NumInStreams)); + RINOK(SzReadNumber32(sd, &coder->NumOutStreams)); + } + else + { + coder->NumInStreams = 1; + coder->NumOutStreams = 1; + } + if ((mainByte & 0x20) != 0) + { + UInt64 propertiesSize = 0; + RINOK(SzReadNumber(sd, &propertiesSize)); + if (!SzByteBufferCreate(&coder->Properties, (size_t)propertiesSize, allocFunc)) + return SZE_OUTOFMEMORY; + RINOK(SzReadBytes(sd, coder->Properties.Items, (size_t)propertiesSize)); + } + } + while ((mainByte & 0x80) != 0) + { + RINOK(SzReadByte(sd, &mainByte)); + RINOK(SzSkeepDataSize(sd, (mainByte & 0xF))); + if ((mainByte & 0x10) != 0) + { + UInt32 n; + RINOK(SzReadNumber32(sd, &n)); + RINOK(SzReadNumber32(sd, &n)); + } + if ((mainByte & 0x20) != 0) + { + UInt64 propertiesSize = 0; + RINOK(SzReadNumber(sd, &propertiesSize)); + RINOK(SzSkeepDataSize(sd, propertiesSize)); + } + } + numInStreams += (UInt32)coder->NumInStreams; + numOutStreams += (UInt32)coder->NumOutStreams; + } + + numBindPairs = numOutStreams - 1; + folder->NumBindPairs = numBindPairs; + + + MY_ALLOC(CBindPair, folder->BindPairs, (size_t)numBindPairs, allocFunc); + + for (i = 0; i < numBindPairs; i++) + { + CBindPair *bindPair = folder->BindPairs + i;; + RINOK(SzReadNumber32(sd, &bindPair->InIndex)); + RINOK(SzReadNumber32(sd, &bindPair->OutIndex)); + } + + numPackedStreams = numInStreams - (UInt32)numBindPairs; + + folder->NumPackStreams = numPackedStreams; + MY_ALLOC(UInt32, folder->PackStreams, (size_t)numPackedStreams, allocFunc); + + if (numPackedStreams == 1) + { + UInt32 j; + UInt32 pi = 0; + for (j = 0; j < numInStreams; j++) + if (SzFolderFindBindPairForInStream(folder, j) < 0) + { + folder->PackStreams[pi++] = j; + break; + } + } + else + for(i = 0; i < numPackedStreams; i++) + { + RINOK(SzReadNumber32(sd, folder->PackStreams + i)); + } + return SZ_OK; +} + +SZ_RESULT SzReadUnPackInfo( + CSzData *sd, + UInt32 *numFolders, + CFolder **folders, /* for allocFunc */ + void * (*allocFunc)(size_t size), + ISzAlloc *allocTemp) +{ + UInt32 i; + RINOK(SzWaitAttribute(sd, k7zIdFolder)); + RINOK(SzReadNumber32(sd, numFolders)); + { + RINOK(SzReadSwitch(sd)); + + MY_ALLOC(CFolder, *folders, (size_t)*numFolders, allocFunc); + + for(i = 0; i < *numFolders; i++) + SzFolderInit((*folders) + i); + + for(i = 0; i < *numFolders; i++) + { + RINOK(SzGetNextFolderItem(sd, (*folders) + i, allocFunc)); + } + } + + RINOK(SzWaitAttribute(sd, k7zIdCodersUnPackSize)); + + for(i = 0; i < *numFolders; i++) + { + UInt32 j; + CFolder *folder = (*folders) + i; + UInt32 numOutStreams = SzFolderGetNumOutStreams(folder); + + MY_ALLOC(CFileSize, folder->UnPackSizes, (size_t)numOutStreams, allocFunc); + + for(j = 0; j < numOutStreams; j++) + { + RINOK(SzReadSize(sd, folder->UnPackSizes + j)); + } + } + + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + return SZ_OK; + if (type == k7zIdCRC) + { + SZ_RESULT res; + Byte *crcsDefined = 0; + UInt32 *crcs = 0; + res = SzReadHashDigests(sd, *numFolders, &crcsDefined, &crcs, allocTemp->Alloc); + if (res == SZ_OK) + { + for(i = 0; i < *numFolders; i++) + { + CFolder *folder = (*folders) + i; + folder->UnPackCRCDefined = crcsDefined[i]; + folder->UnPackCRC = crcs[i]; + } + } + allocTemp->Free(crcs); + allocTemp->Free(crcsDefined); + RINOK(res); + continue; + } + RINOK(SzSkeepData(sd)); + } +} + +SZ_RESULT SzReadSubStreamsInfo( + CSzData *sd, + UInt32 numFolders, + CFolder *folders, + UInt32 *numUnPackStreams, + CFileSize **unPackSizes, + Byte **digestsDefined, + UInt32 **digests, + ISzAlloc *allocTemp) +{ + UInt64 type = 0; + UInt32 i; + UInt32 si = 0; + UInt32 numDigests = 0; + + for(i = 0; i < numFolders; i++) + folders[i].NumUnPackStreams = 1; + *numUnPackStreams = numFolders; + + for (;;) + { + RINOK(SzReadID(sd, &type)); + if (type == k7zIdNumUnPackStream) + { + *numUnPackStreams = 0; + for(i = 0; i < numFolders; i++) + { + UInt32 numStreams; + RINOK(SzReadNumber32(sd, &numStreams)); + folders[i].NumUnPackStreams = numStreams; + *numUnPackStreams += numStreams; + } + continue; + } + if (type == k7zIdCRC || type == k7zIdSize) + break; + if (type == k7zIdEnd) + break; + RINOK(SzSkeepData(sd)); + } + + if (*numUnPackStreams == 0) + { + *unPackSizes = 0; + *digestsDefined = 0; + *digests = 0; + } + else + { + *unPackSizes = (CFileSize *)allocTemp->Alloc((size_t)*numUnPackStreams * sizeof(CFileSize)); + RINOM(*unPackSizes); + *digestsDefined = (Byte *)allocTemp->Alloc((size_t)*numUnPackStreams * sizeof(Byte)); + RINOM(*digestsDefined); + *digests = (UInt32 *)allocTemp->Alloc((size_t)*numUnPackStreams * sizeof(UInt32)); + RINOM(*digests); + } + + for(i = 0; i < numFolders; i++) + { + /* + v3.13 incorrectly worked with empty folders + v4.07: we check that folder is empty + */ + CFileSize sum = 0; + UInt32 j; + UInt32 numSubstreams = folders[i].NumUnPackStreams; + if (numSubstreams == 0) + continue; + if (type == k7zIdSize) + for (j = 1; j < numSubstreams; j++) + { + CFileSize size; + RINOK(SzReadSize(sd, &size)); + (*unPackSizes)[si++] = size; + sum += size; + } + (*unPackSizes)[si++] = SzFolderGetUnPackSize(folders + i) - sum; + } + if (type == k7zIdSize) + { + RINOK(SzReadID(sd, &type)); + } + + for(i = 0; i < *numUnPackStreams; i++) + { + (*digestsDefined)[i] = 0; + (*digests)[i] = 0; + } + + + for(i = 0; i < numFolders; i++) + { + UInt32 numSubstreams = folders[i].NumUnPackStreams; + if (numSubstreams != 1 || !folders[i].UnPackCRCDefined) + numDigests += numSubstreams; + } + + + si = 0; + for (;;) + { + if (type == k7zIdCRC) + { + int digestIndex = 0; + Byte *digestsDefined2 = 0; + UInt32 *digests2 = 0; + SZ_RESULT res = SzReadHashDigests(sd, numDigests, &digestsDefined2, &digests2, allocTemp->Alloc); + if (res == SZ_OK) + { + for (i = 0; i < numFolders; i++) + { + CFolder *folder = folders + i; + UInt32 numSubstreams = folder->NumUnPackStreams; + if (numSubstreams == 1 && folder->UnPackCRCDefined) + { + (*digestsDefined)[si] = 1; + (*digests)[si] = folder->UnPackCRC; + si++; + } + else + { + UInt32 j; + for (j = 0; j < numSubstreams; j++, digestIndex++) + { + (*digestsDefined)[si] = digestsDefined2[digestIndex]; + (*digests)[si] = digests2[digestIndex]; + si++; + } + } + } + } + allocTemp->Free(digestsDefined2); + allocTemp->Free(digests2); + RINOK(res); + } + else if (type == k7zIdEnd) + return SZ_OK; + else + { + RINOK(SzSkeepData(sd)); + } + RINOK(SzReadID(sd, &type)); + } +} + + +SZ_RESULT SzReadStreamsInfo( + CSzData *sd, + CFileSize *dataOffset, + CArchiveDatabase *db, + UInt32 *numUnPackStreams, + CFileSize **unPackSizes, /* allocTemp */ + Byte **digestsDefined, /* allocTemp */ + UInt32 **digests, /* allocTemp */ + void * (*allocFunc)(size_t size), + ISzAlloc *allocTemp) +{ + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if ((UInt64)(int)type != type) + return SZE_FAIL; + switch((int)type) + { + case k7zIdEnd: + return SZ_OK; + case k7zIdPackInfo: + { + RINOK(SzReadPackInfo(sd, dataOffset, &db->NumPackStreams, + &db->PackSizes, &db->PackCRCsDefined, &db->PackCRCs, allocFunc)); + break; + } + case k7zIdUnPackInfo: + { + RINOK(SzReadUnPackInfo(sd, &db->NumFolders, &db->Folders, allocFunc, allocTemp)); + break; + } + case k7zIdSubStreamsInfo: + { + RINOK(SzReadSubStreamsInfo(sd, db->NumFolders, db->Folders, + numUnPackStreams, unPackSizes, digestsDefined, digests, allocTemp)); + break; + } + default: + return SZE_FAIL; + } + } +} + +Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +SZ_RESULT SzReadFileNames(CSzData *sd, UInt32 numFiles, CFileItem *files, + void * (*allocFunc)(size_t size)) +{ + UInt32 i; + for(i = 0; i < numFiles; i++) + { + UInt32 len = 0; + UInt32 pos = 0; + CFileItem *file = files + i; + while(pos + 2 <= sd->Size) + { + int numAdds; + UInt32 value = (UInt32)(sd->Data[pos] | (((UInt32)sd->Data[pos + 1]) << 8)); + pos += 2; + len++; + if (value == 0) + break; + if (value < 0x80) + continue; + if (value >= 0xD800 && value < 0xE000) + { + UInt32 c2; + if (value >= 0xDC00) + return SZE_ARCHIVE_ERROR; + if (pos + 2 > sd->Size) + return SZE_ARCHIVE_ERROR; + c2 = (UInt32)(sd->Data[pos] | (((UInt32)sd->Data[pos + 1]) << 8)); + pos += 2; + if (c2 < 0xDC00 || c2 >= 0xE000) + return SZE_ARCHIVE_ERROR; + value = ((value - 0xD800) << 10) | (c2 - 0xDC00); + } + for (numAdds = 1; numAdds < 5; numAdds++) + if (value < (((UInt32)1) << (numAdds * 5 + 6))) + break; + len += numAdds; + } + + MY_ALLOC(char, file->Name, (size_t)len, allocFunc); + + len = 0; + while(2 <= sd->Size) + { + int numAdds; + UInt32 value = (UInt32)(sd->Data[0] | (((UInt32)sd->Data[1]) << 8)); + SzSkeepDataSize(sd, 2); + if (value < 0x80) + { + file->Name[len++] = (char)value; + if (value == 0) + break; + continue; + } + if (value >= 0xD800 && value < 0xE000) + { + UInt32 c2 = (UInt32)(sd->Data[0] | (((UInt32)sd->Data[1]) << 8)); + SzSkeepDataSize(sd, 2); + value = ((value - 0xD800) << 10) | (c2 - 0xDC00); + } + for (numAdds = 1; numAdds < 5; numAdds++) + if (value < (((UInt32)1) << (numAdds * 5 + 6))) + break; + file->Name[len++] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds))); + do + { + numAdds--; + file->Name[len++] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F)); + } + while(numAdds > 0); + + len += numAdds; + } + } + return SZ_OK; +} + +SZ_RESULT SzReadHeader2( + CSzData *sd, + CArchiveDatabaseEx *db, /* allocMain */ + CFileSize **unPackSizes, /* allocTemp */ + Byte **digestsDefined, /* allocTemp */ + UInt32 **digests, /* allocTemp */ + Byte **emptyStreamVector, /* allocTemp */ + Byte **emptyFileVector, /* allocTemp */ + Byte **lwtVector, /* allocTemp */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt64 type; + UInt32 numUnPackStreams = 0; + UInt32 numFiles = 0; + CFileItem *files = 0; + UInt32 numEmptyStreams = 0; + UInt32 i; + + RINOK(SzReadID(sd, &type)); + + if (type == k7zIdArchiveProperties) + { + RINOK(SzReadArchiveProperties(sd)); + RINOK(SzReadID(sd, &type)); + } + + + if (type == k7zIdMainStreamsInfo) + { + RINOK(SzReadStreamsInfo(sd, + &db->ArchiveInfo.DataStartPosition, + &db->Database, + &numUnPackStreams, + unPackSizes, + digestsDefined, + digests, allocMain->Alloc, allocTemp)); + db->ArchiveInfo.DataStartPosition += db->ArchiveInfo.StartPositionAfterHeader; + RINOK(SzReadID(sd, &type)); + } + + if (type == k7zIdEnd) + return SZ_OK; + if (type != k7zIdFilesInfo) + return SZE_ARCHIVE_ERROR; + + RINOK(SzReadNumber32(sd, &numFiles)); + db->Database.NumFiles = numFiles; + + MY_ALLOC(CFileItem, files, (size_t)numFiles, allocMain->Alloc); + + db->Database.Files = files; + for(i = 0; i < numFiles; i++) + SzFileInit(files + i); + + for (;;) + { + UInt64 type; + UInt64 size; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + RINOK(SzReadNumber(sd, &size)); + + if ((UInt64)(int)type != type) + { + RINOK(SzSkeepDataSize(sd, size)); + } + else + switch((int)type) + { + case k7zIdName: + { + RINOK(SzReadSwitch(sd)); + RINOK(SzReadFileNames(sd, numFiles, files, allocMain->Alloc)) + break; + } + case k7zIdEmptyStream: + { + RINOK(SzReadBoolVector(sd, numFiles, emptyStreamVector, allocTemp->Alloc)); + numEmptyStreams = 0; + for (i = 0; i < numFiles; i++) + if ((*emptyStreamVector)[i]) + numEmptyStreams++; + break; + } + case k7zIdEmptyFile: + { + RINOK(SzReadBoolVector(sd, numEmptyStreams, emptyFileVector, allocTemp->Alloc)); + break; + } + case k7zIdLastWriteTime: + { + RINOK(SzReadBoolVector2(sd, numFiles, lwtVector, allocTemp->Alloc)); + RINOK(SzReadSwitch(sd)); + for (i = 0; i < numFiles; i++) + { + CFileItem *f = &files[i]; + Byte defined = (*lwtVector)[i]; + f->IsLastWriteTimeDefined = defined; + f->LastWriteTime.Low = f->LastWriteTime.High = 0; + if (defined) + { + RINOK(SzReadUInt32(sd, &f->LastWriteTime.Low)); + RINOK(SzReadUInt32(sd, &f->LastWriteTime.High)); + } + } + break; + } + default: + { + RINOK(SzSkeepDataSize(sd, size)); + } + } + } + + { + UInt32 emptyFileIndex = 0; + UInt32 sizeIndex = 0; + for(i = 0; i < numFiles; i++) + { + CFileItem *file = files + i; + file->IsAnti = 0; + if (*emptyStreamVector == 0) + file->HasStream = 1; + else + file->HasStream = (Byte)((*emptyStreamVector)[i] ? 0 : 1); + if(file->HasStream) + { + file->IsDirectory = 0; + file->Size = (*unPackSizes)[sizeIndex]; + file->FileCRC = (*digests)[sizeIndex]; + file->IsFileCRCDefined = (Byte)(*digestsDefined)[sizeIndex]; + sizeIndex++; + } + else + { + if (*emptyFileVector == 0) + file->IsDirectory = 1; + else + file->IsDirectory = (Byte)((*emptyFileVector)[emptyFileIndex] ? 0 : 1); + emptyFileIndex++; + file->Size = 0; + file->IsFileCRCDefined = 0; + } + } + } + return SzArDbExFill(db, allocMain->Alloc); +} + +SZ_RESULT SzReadHeader( + CSzData *sd, + CArchiveDatabaseEx *db, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + CFileSize *unPackSizes = 0; + Byte *digestsDefined = 0; + UInt32 *digests = 0; + Byte *emptyStreamVector = 0; + Byte *emptyFileVector = 0; + Byte *lwtVector = 0; + SZ_RESULT res = SzReadHeader2(sd, db, + &unPackSizes, &digestsDefined, &digests, + &emptyStreamVector, &emptyFileVector, &lwtVector, + allocMain, allocTemp); + allocTemp->Free(unPackSizes); + allocTemp->Free(digestsDefined); + allocTemp->Free(digests); + allocTemp->Free(emptyStreamVector); + allocTemp->Free(emptyFileVector); + allocTemp->Free(lwtVector); + return res; +} + +SZ_RESULT SzReadAndDecodePackedStreams2( + ISzInStream *inStream, + CSzData *sd, + CSzByteBuffer *outBuffer, + CFileSize baseOffset, + CArchiveDatabase *db, + CFileSize **unPackSizes, + Byte **digestsDefined, + UInt32 **digests, + #ifndef _LZMA_IN_CB + Byte **inBuffer, + #endif + ISzAlloc *allocTemp) +{ + + UInt32 numUnPackStreams = 0; + CFileSize dataStartPos; + CFolder *folder; + #ifndef _LZMA_IN_CB + CFileSize packSize = 0; + UInt32 i = 0; + #endif + CFileSize unPackSize; + SZ_RESULT res; + + RINOK(SzReadStreamsInfo(sd, &dataStartPos, db, + &numUnPackStreams, unPackSizes, digestsDefined, digests, + allocTemp->Alloc, allocTemp)); + + dataStartPos += baseOffset; + if (db->NumFolders != 1) + return SZE_ARCHIVE_ERROR; + + folder = db->Folders; + unPackSize = SzFolderGetUnPackSize(folder); + + RINOK(inStream->Seek(inStream, dataStartPos)); + + #ifndef _LZMA_IN_CB + for (i = 0; i < db->NumPackStreams; i++) + packSize += db->PackSizes[i]; + + MY_ALLOC(Byte, *inBuffer, (size_t)packSize, allocTemp->Alloc); + + RINOK(SafeReadDirect(inStream, *inBuffer, (size_t)packSize)); + #endif + + if (!SzByteBufferCreate(outBuffer, (size_t)unPackSize, allocTemp->Alloc)) + return SZE_OUTOFMEMORY; + + res = SzDecode(db->PackSizes, folder, + #ifdef _LZMA_IN_CB + inStream, dataStartPos, + #else + *inBuffer, + #endif + outBuffer->Items, (size_t)unPackSize, allocTemp); + RINOK(res) + if (folder->UnPackCRCDefined) + if (CrcCalc(outBuffer->Items, (size_t)unPackSize) != folder->UnPackCRC) + return SZE_FAIL; + return SZ_OK; +} + +SZ_RESULT SzReadAndDecodePackedStreams( + ISzInStream *inStream, + CSzData *sd, + CSzByteBuffer *outBuffer, + CFileSize baseOffset, + ISzAlloc *allocTemp) +{ + CArchiveDatabase db; + CFileSize *unPackSizes = 0; + Byte *digestsDefined = 0; + UInt32 *digests = 0; + #ifndef _LZMA_IN_CB + Byte *inBuffer = 0; + #endif + SZ_RESULT res; + SzArchiveDatabaseInit(&db); + res = SzReadAndDecodePackedStreams2(inStream, sd, outBuffer, baseOffset, + &db, &unPackSizes, &digestsDefined, &digests, + #ifndef _LZMA_IN_CB + &inBuffer, + #endif + allocTemp); + SzArchiveDatabaseFree(&db, allocTemp->Free); + allocTemp->Free(unPackSizes); + allocTemp->Free(digestsDefined); + allocTemp->Free(digests); + #ifndef _LZMA_IN_CB + allocTemp->Free(inBuffer); + #endif + return res; +} + +SZ_RESULT SzArchiveOpen2( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + Byte signature[k7zSignatureSize]; + Byte version; + UInt32 crcFromArchive; + UInt64 nextHeaderOffset; + UInt64 nextHeaderSize; + UInt32 nextHeaderCRC; + UInt32 crc = 0; + CFileSize pos = 0; + CSzByteBuffer buffer; + CSzData sd; + SZ_RESULT res; + + RINOK(SafeReadDirect(inStream, signature, k7zSignatureSize)); + + if (!TestSignatureCandidate(signature)) + return SZE_ARCHIVE_ERROR; + + /* + db.Clear(); + db.ArchiveInfo.StartPosition = _arhiveBeginStreamPosition; + */ + RINOK(SafeReadDirectByte(inStream, &version)); + if (version != k7zMajorVersion) + return SZE_ARCHIVE_ERROR; + RINOK(SafeReadDirectByte(inStream, &version)); + + RINOK(SafeReadDirectUInt32(inStream, &crcFromArchive, &crc)); + + crc = CRC_INIT_VAL; + RINOK(SafeReadDirectUInt64(inStream, &nextHeaderOffset, &crc)); + RINOK(SafeReadDirectUInt64(inStream, &nextHeaderSize, &crc)); + RINOK(SafeReadDirectUInt32(inStream, &nextHeaderCRC, &crc)); + + pos = k7zStartHeaderSize; + db->ArchiveInfo.StartPositionAfterHeader = pos; + + if (CRC_GET_DIGEST(crc) != crcFromArchive) + return SZE_ARCHIVE_ERROR; + + if (nextHeaderSize == 0) + return SZ_OK; + + RINOK(inStream->Seek(inStream, (CFileSize)(pos + nextHeaderOffset))); + + if (!SzByteBufferCreate(&buffer, (size_t)nextHeaderSize, allocTemp->Alloc)) + return SZE_OUTOFMEMORY; + + res = SafeReadDirect(inStream, buffer.Items, (size_t)nextHeaderSize); + if (res == SZ_OK) + { + res = SZE_ARCHIVE_ERROR; + if (CrcCalc(buffer.Items, (UInt32)nextHeaderSize) == nextHeaderCRC) + { + for (;;) + { + UInt64 type; + sd.Data = buffer.Items; + sd.Size = buffer.Capacity; + res = SzReadID(&sd, &type); + if (res != SZ_OK) + break; + if (type == k7zIdHeader) + { + res = SzReadHeader(&sd, db, allocMain, allocTemp); + break; + } + if (type != k7zIdEncodedHeader) + { + res = SZE_ARCHIVE_ERROR; + break; + } + { + CSzByteBuffer outBuffer; + res = SzReadAndDecodePackedStreams(inStream, &sd, &outBuffer, + db->ArchiveInfo.StartPositionAfterHeader, + allocTemp); + if (res != SZ_OK) + { + SzByteBufferFree(&outBuffer, allocTemp->Free); + break; + } + SzByteBufferFree(&buffer, allocTemp->Free); + buffer.Items = outBuffer.Items; + buffer.Capacity = outBuffer.Capacity; + } + } + } + } + SzByteBufferFree(&buffer, allocTemp->Free); + return res; +} + +SZ_RESULT SzArchiveOpen( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + SZ_RESULT res = SzArchiveOpen2(inStream, db, allocMain, allocTemp); + if (res != SZ_OK) + SzArDbExFree(db, allocMain->Free); + return res; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zIn.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zIn.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,55 @@ +/* 7zIn.h */ + +#ifndef __7Z_IN_H +#define __7Z_IN_H + +#include "7zHeader.h" +#include "7zItem.h" +#include "7zAlloc.h" + +typedef struct _CInArchiveInfo +{ + CFileSize StartPositionAfterHeader; + CFileSize DataStartPosition; +}CInArchiveInfo; + +typedef struct _CArchiveDatabaseEx +{ + CArchiveDatabase Database; + CInArchiveInfo ArchiveInfo; + UInt32 *FolderStartPackStreamIndex; + CFileSize *PackStreamStartPositions; + UInt32 *FolderStartFileIndex; + UInt32 *FileIndexToFolderIndexMap; +}CArchiveDatabaseEx; + +void SzArDbExInit(CArchiveDatabaseEx *db); +void SzArDbExFree(CArchiveDatabaseEx *db, void (*freeFunc)(void *)); +CFileSize SzArDbGetFolderStreamPos(CArchiveDatabaseEx *db, UInt32 folderIndex, UInt32 indexInFolder); +int SzArDbGetFolderFullPackSize(CArchiveDatabaseEx *db, UInt32 folderIndex, CFileSize *resSize); + +typedef struct _ISzInStream +{ + #ifdef _LZMA_IN_CB + SZ_RESULT (*Read)( + void *object, /* pointer to ISzInStream itself */ + void **buffer, /* out: pointer to buffer with data */ + size_t maxRequiredSize, /* max required size to read */ + size_t *processedSize); /* real processed size. + processedSize can be less than maxRequiredSize. + If processedSize == 0, then there are no more + bytes in stream. */ + #else + SZ_RESULT (*Read)(void *object, void *buffer, size_t size, size_t *processedSize); + #endif + SZ_RESULT (*Seek)(void *object, CFileSize pos); +} ISzInStream; + + +int SzArchiveOpen( + ISzInStream *inStream, + CArchiveDatabaseEx *db, + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zItem.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zItem.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,134 @@ +/* 7zItem.c */ + +#include "7zItem.h" +#include "7zAlloc.h" + +void SzCoderInfoInit(CCoderInfo *coder) +{ + SzByteBufferInit(&coder->Properties); +} + +void SzCoderInfoFree(CCoderInfo *coder, void (*freeFunc)(void *p)) +{ + SzByteBufferFree(&coder->Properties, freeFunc); + SzCoderInfoInit(coder); +} + +void SzFolderInit(CFolder *folder) +{ + folder->NumCoders = 0; + folder->Coders = 0; + folder->NumBindPairs = 0; + folder->BindPairs = 0; + folder->NumPackStreams = 0; + folder->PackStreams = 0; + folder->UnPackSizes = 0; + folder->UnPackCRCDefined = 0; + folder->UnPackCRC = 0; + folder->NumUnPackStreams = 0; +} + +void SzFolderFree(CFolder *folder, void (*freeFunc)(void *p)) +{ + UInt32 i; + for (i = 0; i < folder->NumCoders; i++) + SzCoderInfoFree(&folder->Coders[i], freeFunc); + freeFunc(folder->Coders); + freeFunc(folder->BindPairs); + freeFunc(folder->PackStreams); + freeFunc(folder->UnPackSizes); + SzFolderInit(folder); +} + +UInt32 SzFolderGetNumOutStreams(CFolder *folder) +{ + UInt32 result = 0; + UInt32 i; + for (i = 0; i < folder->NumCoders; i++) + result += folder->Coders[i].NumOutStreams; + return result; +} + +int SzFolderFindBindPairForInStream(CFolder *folder, UInt32 inStreamIndex) +{ + UInt32 i; + for(i = 0; i < folder->NumBindPairs; i++) + if (folder->BindPairs[i].InIndex == inStreamIndex) + return i; + return -1; +} + + +int SzFolderFindBindPairForOutStream(CFolder *folder, UInt32 outStreamIndex) +{ + UInt32 i; + for(i = 0; i < folder->NumBindPairs; i++) + if (folder->BindPairs[i].OutIndex == outStreamIndex) + return i; + return -1; +} + +CFileSize SzFolderGetUnPackSize(CFolder *folder) +{ + int i = (int)SzFolderGetNumOutStreams(folder); + if (i == 0) + return 0; + for (i--; i >= 0; i--) + if (SzFolderFindBindPairForOutStream(folder, i) < 0) + return folder->UnPackSizes[i]; + /* throw 1; */ + return 0; +} + +/* +int FindPackStreamArrayIndex(int inStreamIndex) const +{ + for(int i = 0; i < PackStreams.Size(); i++) + if (PackStreams[i] == inStreamIndex) + return i; + return -1; +} +*/ + +void SzFileInit(CFileItem *fileItem) +{ + fileItem->IsFileCRCDefined = 0; + fileItem->HasStream = 1; + fileItem->IsDirectory = 0; + fileItem->IsAnti = 0; + fileItem->IsLastWriteTimeDefined = 0; + fileItem->Name = 0; +} + +void SzFileFree(CFileItem *fileItem, void (*freeFunc)(void *p)) +{ + freeFunc(fileItem->Name); + SzFileInit(fileItem); +} + +void SzArchiveDatabaseInit(CArchiveDatabase *db) +{ + db->NumPackStreams = 0; + db->PackSizes = 0; + db->PackCRCsDefined = 0; + db->PackCRCs = 0; + db->NumFolders = 0; + db->Folders = 0; + db->NumFiles = 0; + db->Files = 0; +} + +void SzArchiveDatabaseFree(CArchiveDatabase *db, void (*freeFunc)(void *)) +{ + UInt32 i; + for (i = 0; i < db->NumFolders; i++) + SzFolderFree(&db->Folders[i], freeFunc); + for (i = 0; i < db->NumFiles; i++) + SzFileFree(&db->Files[i], freeFunc); + freeFunc(db->PackSizes); + freeFunc(db->PackCRCsDefined); + freeFunc(db->PackCRCs); + freeFunc(db->Folders); + freeFunc(db->Files); + SzArchiveDatabaseInit(db); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zItem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zItem.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,95 @@ +/* 7zItem.h */ + +#ifndef __7Z_ITEM_H +#define __7Z_ITEM_H + +#include "7zMethodID.h" +#include "7zHeader.h" +#include "7zBuffer.h" + +typedef struct _CCoderInfo +{ + UInt32 NumInStreams; + UInt32 NumOutStreams; + CMethodID MethodID; + CSzByteBuffer Properties; +}CCoderInfo; + +void SzCoderInfoInit(CCoderInfo *coder); +void SzCoderInfoFree(CCoderInfo *coder, void (*freeFunc)(void *p)); + +typedef struct _CBindPair +{ + UInt32 InIndex; + UInt32 OutIndex; +}CBindPair; + +typedef struct _CFolder +{ + UInt32 NumCoders; + CCoderInfo *Coders; + UInt32 NumBindPairs; + CBindPair *BindPairs; + UInt32 NumPackStreams; + UInt32 *PackStreams; + CFileSize *UnPackSizes; + int UnPackCRCDefined; + UInt32 UnPackCRC; + + UInt32 NumUnPackStreams; +}CFolder; + +void SzFolderInit(CFolder *folder); +CFileSize SzFolderGetUnPackSize(CFolder *folder); +int SzFolderFindBindPairForInStream(CFolder *folder, UInt32 inStreamIndex); +UInt32 SzFolderGetNumOutStreams(CFolder *folder); +CFileSize SzFolderGetUnPackSize(CFolder *folder); + +typedef struct _CArchiveFileTime +{ + UInt32 Low; + UInt32 High; +} CArchiveFileTime; + +typedef struct _CFileItem +{ + CArchiveFileTime LastWriteTime; + /* + CFileSize StartPos; + UInt32 Attributes; + */ + CFileSize Size; + UInt32 FileCRC; + char *Name; + + Byte IsFileCRCDefined; + Byte HasStream; + Byte IsDirectory; + Byte IsAnti; + Byte IsLastWriteTimeDefined; + /* + int AreAttributesDefined; + int IsLastWriteTimeDefined; + int IsStartPosDefined; + */ +}CFileItem; + +void SzFileInit(CFileItem *fileItem); + +typedef struct _CArchiveDatabase +{ + UInt32 NumPackStreams; + CFileSize *PackSizes; + Byte *PackCRCsDefined; + UInt32 *PackCRCs; + UInt32 NumFolders; + CFolder *Folders; + UInt32 NumFiles; + CFileItem *Files; +}CArchiveDatabase; + +void SzArchiveDatabaseInit(CArchiveDatabase *db); +void SzArchiveDatabaseFree(CArchiveDatabase *db, void (*freeFunc)(void *)); + + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zMain.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zMain.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,428 @@ +/* +7zMain.c +Test application for 7z Decoder +LZMA SDK 4.43 Copyright (c) 1999-2006 Igor Pavlov (2006-06-04) +*/ + +#include +#include +#include + +#ifdef _WIN32 +#define USE_WINDOWS_FUNCTIONS +#endif + +#ifdef USE_WINDOWS_FUNCTIONS +#include +#endif + +#include "7zIn.h" +#include "7zExtract.h" + +#include "../../7zCrc.h" + + +#ifdef USE_WINDOWS_FUNCTIONS +typedef HANDLE MY_FILE_HANDLE; +#else +typedef FILE *MY_FILE_HANDLE; +#endif + +void ConvertNumberToString(CFileSize value, char *s) +{ + char temp[32]; + int pos = 0; + do + { + temp[pos++] = (char)('0' + (int)(value % 10)); + value /= 10; + } + while (value != 0); + do + *s++ = temp[--pos]; + while(pos > 0); + *s = '\0'; +} + +#define PERIOD_4 (4 * 365 + 1) +#define PERIOD_100 (PERIOD_4 * 25 - 1) +#define PERIOD_400 (PERIOD_100 * 4 + 1) + +void ConvertFileTimeToString(CArchiveFileTime *ft, char *s) +{ + unsigned year, mon, day, hour, min, sec; + UInt64 v64 = ft->Low | ((UInt64)ft->High << 32); + Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + unsigned temp; + UInt32 v; + v64 /= 10000000; + sec = (unsigned)(v64 % 60); + v64 /= 60; + min = (unsigned)(v64 % 60); + v64 /= 60; + hour = (unsigned)(v64 % 24); + v64 /= 24; + + v = (UInt32)v64; + + year = (unsigned)(1601 + v / PERIOD_400 * 400); + v %= PERIOD_400; + + temp = (unsigned)(v / PERIOD_100); + if (temp == 4) + temp = 3; + year += temp * 100; + v -= temp * PERIOD_100; + + temp = v / PERIOD_4; + if (temp == 25) + temp = 24; + year += temp * 4; + v -= temp * PERIOD_4; + + temp = v / 365; + if (temp == 4) + temp = 3; + year += temp; + v -= temp * 365; + + if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) + ms[1] = 29; + for (mon = 1; mon <= 12; mon++) + { + unsigned s = ms[mon - 1]; + if (v < s) + break; + v -= s; + } + day = (unsigned)v + 1; + sprintf(s, "%04d-%02d-%02d %02d:%02d:%02d", year, mon, day, hour, min, sec); +} + + +#ifdef USE_WINDOWS_FUNCTIONS +/* + ReadFile and WriteFile functions in Windows have BUG: + If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) + from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES + (Insufficient system resources exist to complete the requested service). +*/ +#define kChunkSizeMax (1 << 24) +#endif + +size_t MyReadFile(MY_FILE_HANDLE file, void *data, size_t size) +{ + if (size == 0) + return 0; + #ifdef USE_WINDOWS_FUNCTIONS + { + size_t processedSize = 0; + do + { + DWORD curSize = (size > kChunkSizeMax) ? kChunkSizeMax : (DWORD)size; + DWORD processedLoc = 0; + BOOL res = ReadFile(file, data, curSize, &processedLoc, NULL); + data = (void *)((unsigned char *)data + processedLoc); + size -= processedLoc; + processedSize += processedLoc; + if (!res || processedLoc == 0) + break; + } + while (size > 0); + return processedSize; + } + #else + return fread(data, 1, size, file); + #endif +} + +size_t MyWriteFile(MY_FILE_HANDLE file, void *data, size_t size) +{ + if (size == 0) + return 0; + #ifdef USE_WINDOWS_FUNCTIONS + { + size_t processedSize = 0; + do + { + DWORD curSize = (size > kChunkSizeMax) ? kChunkSizeMax : (DWORD)size; + DWORD processedLoc = 0; + BOOL res = WriteFile(file, data, curSize, &processedLoc, NULL); + data = (void *)((unsigned char *)data + processedLoc); + size -= processedLoc; + processedSize += processedLoc; + if (!res) + break; + } + while (size > 0); + return processedSize; + } + #else + return fwrite(data, 1, size, file); + #endif +} + +int MyCloseFile(MY_FILE_HANDLE file) +{ + #ifdef USE_WINDOWS_FUNCTIONS + return (CloseHandle(file) != FALSE) ? 0 : 1; + #else + return fclose(file); + #endif +} + +typedef struct _CFileInStream +{ + ISzInStream InStream; + MY_FILE_HANDLE File; +} CFileInStream; + +#ifdef _LZMA_IN_CB + +#define kBufferSize (1 << 12) +Byte g_Buffer[kBufferSize]; + +SZ_RESULT SzFileReadImp(void *object, void **buffer, size_t maxRequiredSize, size_t *processedSize) +{ + CFileInStream *s = (CFileInStream *)object; + size_t processedSizeLoc; + if (maxRequiredSize > kBufferSize) + maxRequiredSize = kBufferSize; + processedSizeLoc = MyReadFile(s->File, g_Buffer, maxRequiredSize); + *buffer = g_Buffer; + if (processedSize != 0) + *processedSize = processedSizeLoc; + return SZ_OK; +} + +#else + +SZ_RESULT SzFileReadImp(void *object, void *buffer, size_t size, size_t *processedSize) +{ + CFileInStream *s = (CFileInStream *)object; + size_t processedSizeLoc = MyReadFile(s->File, buffer, size); + if (processedSize != 0) + *processedSize = processedSizeLoc; + return SZ_OK; +} + +#endif + +SZ_RESULT SzFileSeekImp(void *object, CFileSize pos) +{ + CFileInStream *s = (CFileInStream *)object; + + #ifdef USE_WINDOWS_FUNCTIONS + { + LARGE_INTEGER value; + value.LowPart = (DWORD)pos; + value.HighPart = (LONG)((UInt64)pos >> 32); + #ifdef _SZ_FILE_SIZE_32 + /* VC 6.0 has bug with >> 32 shifts. */ + value.HighPart = 0; + #endif + value.LowPart = SetFilePointer(s->File, value.LowPart, &value.HighPart, FILE_BEGIN); + if (value.LowPart == 0xFFFFFFFF) + if(GetLastError() != NO_ERROR) + return SZE_FAIL; + return SZ_OK; + } + #else + int res = fseek(s->File, (long)pos, SEEK_SET); + if (res == 0) + return SZ_OK; + return SZE_FAIL; + #endif +} + +void PrintError(char *sz) +{ + printf("\nERROR: %s\n", sz); +} + +int main(int numargs, char *args[]) +{ + CFileInStream archiveStream; + CArchiveDatabaseEx db; + SZ_RESULT res; + ISzAlloc allocImp; + ISzAlloc allocTempImp; + + printf("\n7z ANSI-C Decoder 4.48 Copyright (c) 1999-2007 Igor Pavlov 2007-06-21\n"); + if (numargs == 1) + { + printf( + "\nUsage: 7zDec \n\n" + "\n" + " e: Extract files from archive\n" + " l: List contents of archive\n" + " t: Test integrity of archive\n"); + return 0; + } + if (numargs < 3) + { + PrintError("incorrect command"); + return 1; + } + + archiveStream.File = + #ifdef USE_WINDOWS_FUNCTIONS + CreateFile(args[2], GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (archiveStream.File == INVALID_HANDLE_VALUE) + #else + archiveStream.File = fopen(args[2], "rb"); + if (archiveStream.File == 0) + #endif + { + PrintError("can not open input file"); + return 1; + } + + archiveStream.InStream.Read = SzFileReadImp; + archiveStream.InStream.Seek = SzFileSeekImp; + + allocImp.Alloc = SzAlloc; + allocImp.Free = SzFree; + + allocTempImp.Alloc = SzAllocTemp; + allocTempImp.Free = SzFreeTemp; + + CrcGenerateTable(); + + SzArDbExInit(&db); + res = SzArchiveOpen(&archiveStream.InStream, &db, &allocImp, &allocTempImp); + if (res == SZ_OK) + { + char *command = args[1]; + int listCommand = 0; + int testCommand = 0; + int extractCommand = 0; + if (strcmp(command, "l") == 0) + listCommand = 1; + if (strcmp(command, "t") == 0) + testCommand = 1; + else if (strcmp(command, "e") == 0) + extractCommand = 1; + + if (listCommand) + { + UInt32 i; + for (i = 0; i < db.Database.NumFiles; i++) + { + CFileItem *f = db.Database.Files + i; + char s[32], t[32]; + ConvertNumberToString(f->Size, s); + if (f->IsLastWriteTimeDefined) + ConvertFileTimeToString(&f->LastWriteTime, t); + else + strcpy(t, " "); + + printf("%10s %s %s\n", s, t, f->Name); + } + } + else if (testCommand || extractCommand) + { + UInt32 i; + + /* + if you need cache, use these 3 variables. + if you use external function, you can make these variable as static. + */ + UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ + Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ + size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ + + printf("\n"); + for (i = 0; i < db.Database.NumFiles; i++) + { + size_t offset; + size_t outSizeProcessed; + CFileItem *f = db.Database.Files + i; + if (f->IsDirectory) + printf("Directory "); + else + printf(testCommand ? + "Testing ": + "Extracting"); + printf(" %s", f->Name); + if (f->IsDirectory) + { + printf("\n"); + continue; + } + res = SzExtract(&archiveStream.InStream, &db, i, + &blockIndex, &outBuffer, &outBufferSize, + &offset, &outSizeProcessed, + &allocImp, &allocTempImp); + if (res != SZ_OK) + break; + if (!testCommand) + { + MY_FILE_HANDLE outputHandle; + size_t processedSize; + char *fileName = f->Name; + size_t nameLen = strlen(f->Name); + for (; nameLen > 0; nameLen--) + if (f->Name[nameLen - 1] == '/') + { + fileName = f->Name + nameLen; + break; + } + + outputHandle = + #ifdef USE_WINDOWS_FUNCTIONS + CreateFile(fileName, GENERIC_WRITE, FILE_SHARE_READ, + NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (outputHandle == INVALID_HANDLE_VALUE) + #else + fopen(fileName, "wb+"); + if (outputHandle == 0) + #endif + { + PrintError("can not open output file"); + res = SZE_FAIL; + break; + } + processedSize = MyWriteFile(outputHandle, outBuffer + offset, outSizeProcessed); + if (processedSize != outSizeProcessed) + { + PrintError("can not write output file"); + res = SZE_FAIL; + break; + } + if (MyCloseFile(outputHandle)) + { + PrintError("can not close output file"); + res = SZE_FAIL; + break; + } + } + printf("\n"); + } + allocImp.Free(outBuffer); + } + else + { + PrintError("incorrect command"); + res = SZE_FAIL; + } + } + SzArDbExFree(&db, allocImp.Free); + + MyCloseFile(archiveStream.File); + if (res == SZ_OK) + { + printf("\nEverything is Ok\n"); + return 0; + } + if (res == (SZ_RESULT)SZE_NOTIMPL) + PrintError("decoder doesn't support this archive"); + else if (res == (SZ_RESULT)SZE_OUTOFMEMORY) + PrintError("can not allocate memory"); + else if (res == (SZ_RESULT)SZE_CRC_ERROR) + PrintError("CRC error"); + else + printf("\nERROR #%d\n", res); + return 1; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zMethodID.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zMethodID.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +/* 7zMethodID.c */ + +#include "7zMethodID.h" + +/* +int AreMethodsEqual(CMethodID *a1, CMethodID *a2) +{ + return (*a1 == *a2) ? 1 : 0; +} +*/ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7zMethodID.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7zMethodID.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +/* 7zMethodID.h */ + +#ifndef __7Z_METHOD_ID_H +#define __7Z_METHOD_ID_H + +#include "../../Types.h" + +typedef UInt64 CMethodID; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7z_C.dsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7z_C.dsp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,211 @@ +# Microsoft Developer Studio Project File - Name="7z_C" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=7z_C - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "7z_C.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "7z_C.mak" CFG="7z_C - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "7z_C - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "7z_C - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "7z_C - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W4 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_LZMA_PROB32" /D "_LZMA_IN_CB" /YX /FD /c +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"Release/7zDec.exe" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "7z_C - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W4 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_LZMA_PROB32" /D "_LZMA_IN_CB" /YX /FD /GZ /c +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/7zDec.exe" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "7z_C - Win32 Release" +# Name "7z_C - Win32 Debug" +# Begin Group "LZMA" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\Lzma\LzmaDecode.c +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Lzma\LzmaDecode.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Lzma\LzmaTypes.h +# End Source File +# End Group +# Begin Group "Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\7zCrc.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zCrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\Types.h +# End Source File +# End Group +# Begin Group "Branch" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\Branch\BranchTypes.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\BranchX86.c +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\BranchX86.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\BranchX86_2.c +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\BranchX86_2.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\7zAlloc.c +# End Source File +# Begin Source File + +SOURCE=.\7zAlloc.h +# End Source File +# Begin Source File + +SOURCE=.\7zBuffer.c +# End Source File +# Begin Source File + +SOURCE=.\7zBuffer.h +# End Source File +# Begin Source File + +SOURCE=.\7zDecode.c +# End Source File +# Begin Source File + +SOURCE=.\7zDecode.h +# End Source File +# Begin Source File + +SOURCE=.\7zExtract.c +# End Source File +# Begin Source File + +SOURCE=.\7zExtract.h +# End Source File +# Begin Source File + +SOURCE=.\7zHeader.c +# End Source File +# Begin Source File + +SOURCE=.\7zHeader.h +# End Source File +# Begin Source File + +SOURCE=.\7zIn.c +# End Source File +# Begin Source File + +SOURCE=.\7zIn.h +# End Source File +# Begin Source File + +SOURCE=.\7zItem.c +# End Source File +# Begin Source File + +SOURCE=.\7zItem.h +# End Source File +# Begin Source File + +SOURCE=.\7zMain.c +# End Source File +# Begin Source File + +SOURCE=.\7zMethodID.c +# End Source File +# Begin Source File + +SOURCE=.\7zMethodID.h +# End Source File +# End Target +# End Project diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/7z_C.dsw --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/7z_C.dsw Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "7z_C"=.\7z_C.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/makefile Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,74 @@ +PROG = 7zDec.exe + +!IFDEF CPU +LIBS = $(LIBS) bufferoverflowU.lib +CFLAGS = $(CFLAGS) -GS- -Zc:forScope -WX -GS- -Gy -W4 +!ENDIF + +!IFNDEF O +!IFDEF CPU +O=$(CPU) +!ELSE +O=O +!ENDIF +!ENDIF + +CFLAGS = $(CFLAGS) -nologo -c -Fo$O/ -D_LZMA_IN_CB +CFLAGS_O1 = $(CFLAGS) -O1 +CFLAGS_O2 = $(CFLAGS) -O2 + +LFLAGS = $(LFLAGS) -nologo -OPT:NOWIN98 -OPT:REF + +PROGPATH = $O\$(PROG) + +COMPL_O1 = $(CPP) $(CFLAGS_O1) $** +COMPL_O2 = $(CPP) $(CFLAGS_O2) $** +COMPL = $(CPP) $(CFLAGS_O1) $** + +C_OBJS = \ + $O\7zCrc.obj \ + + +7Z_OBJS = \ + $O\7zAlloc.obj \ + $O\7zBuffer.obj \ + $O\7zDecode.obj \ + $O\7zExtract.obj \ + $O\7zHeader.obj \ + $O\7zIn.obj \ + $O\7zItem.obj \ + $O\7zMain.obj \ + $O\7zMethodID.obj \ + +OBJS = \ + $(7Z_OBJS) \ + $O\LzmaDecode.obj \ + $O\BranchX86.obj \ + $O\BranchX86_2.obj \ + $(C_OBJS) \ + +all: $(PROGPATH) + +clean: + -del /Q $(PROGPATH) $O\*.exe $O\*.dll $O\*.obj $O\*.lib $O\*.exp $O\*.res $O\*.pch + +$O: + if not exist "$O" mkdir "$O" + +$(PROGPATH): $O $(OBJS) + link $(LFLAGS) -out:$(PROGPATH) $(OBJS) $(LIBS) + + +$(7Z_OBJS): $(*B).c + $(COMPL) +$O\LzmaDecode.obj: ../../Compress/Lzma/$(*B).c + $(COMPL_O2) + +$O\BranchX86.obj: ../../Compress/Branch/$(*B).c + $(COMPL_O2) + +$O\BranchX86_2.obj: ../../Compress/Branch/$(*B).c + $(COMPL_O2) + +$(C_OBJS): ../../$(*B).c + $(COMPL_O2) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Archive/7z/makefile.gcc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Archive/7z/makefile.gcc Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,55 @@ +PROG = 7zDec +CXX = g++ +LIB = +RM = rm -f +CFLAGS = -c -O2 -Wall -D_LZMA_IN_CB + +OBJS = 7zAlloc.o 7zBuffer.o 7zCrc.o 7zDecode.o 7zExtract.o 7zHeader.o 7zIn.o 7zItem.o 7zMain.o 7zMethodID.o LzmaDecode.o BranchX86.o BranchX86_2.o + +all: $(PROG) + +$(PROG): $(OBJS) + $(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB) + +7zAlloc.o: 7zAlloc.c + $(CXX) $(CFLAGS) 7zAlloc.c + +7zBuffer.o: 7zBuffer.c + $(CXX) $(CFLAGS) 7zBuffer.c + +7zCrc.o: ../../7zCrc.c + $(CXX) $(CFLAGS) ../../7zCrc.c + +7zDecode.o: 7zDecode.c + $(CXX) $(CFLAGS) 7zDecode.c + +7zExtract.o: 7zExtract.c + $(CXX) $(CFLAGS) 7zExtract.c + +7zHeader.o: 7zHeader.c + $(CXX) $(CFLAGS) 7zHeader.c + +7zIn.o: 7zIn.c + $(CXX) $(CFLAGS) 7zIn.c + +7zItem.o: 7zItem.c + $(CXX) $(CFLAGS) 7zItem.c + +7zMain.o: 7zMain.c + $(CXX) $(CFLAGS) 7zMain.c + +7zMethodID.o: 7zMethodID.c + $(CXX) $(CFLAGS) 7zMethodID.c + +LzmaDecode.o: ../../Compress/Lzma/LzmaDecode.c + $(CXX) $(CFLAGS) ../../Compress/Lzma/LzmaDecode.c + +BranchX86.o: ../../Compress/Branch/BranchX86.c + $(CXX) $(CFLAGS) ../../Compress/Branch/BranchX86.c + +BranchX86_2.o: ../../Compress/Branch/BranchX86_2.c + $(CXX) $(CFLAGS) ../../Compress/Branch/BranchX86_2.c + +clean: + -$(RM) $(PROG) $(OBJS) + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchARM.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchARM.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,26 @@ +/* BranchARM.c */ + +#include "BranchARM.h" + +UInt32 ARM_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding) +{ + UInt32 i; + for (i = 0; i + 4 <= size; i += 4) + { + if (data[i + 3] == 0xEB) + { + UInt32 dest; + UInt32 src = (data[i + 2] << 16) | (data[i + 1] << 8) | (data[i + 0]); + src <<= 2; + if (encoding) + dest = nowPos + i + 8 + src; + else + dest = src - (nowPos + i + 8); + dest >>= 2; + data[i + 2] = (Byte)(dest >> 16); + data[i + 1] = (Byte)(dest >> 8); + data[i + 0] = (Byte)dest; + } + } + return i; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchARM.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchARM.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +/* BranchARM.h */ + +#ifndef __BRANCH_ARM_H +#define __BRANCH_ARM_H + +#include "BranchTypes.h" + +UInt32 ARM_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchARMThumb.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchARMThumb.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,35 @@ +/* BranchARMThumb.c */ + +#include "BranchARMThumb.h" + +UInt32 ARMThumb_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding) +{ + UInt32 i; + for (i = 0; i + 4 <= size; i += 2) + { + if ((data[i + 1] & 0xF8) == 0xF0 && + (data[i + 3] & 0xF8) == 0xF8) + { + UInt32 dest; + UInt32 src = + ((data[i + 1] & 0x7) << 19) | + (data[i + 0] << 11) | + ((data[i + 3] & 0x7) << 8) | + (data[i + 2]); + + src <<= 1; + if (encoding) + dest = nowPos + i + 4 + src; + else + dest = src - (nowPos + i + 4); + dest >>= 1; + + data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7)); + data[i + 0] = (Byte)(dest >> 11); + data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7)); + data[i + 2] = (Byte)dest; + i += 2; + } + } + return i; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchARMThumb.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchARMThumb.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +/* BranchARMThumb.h */ + +#ifndef __BRANCH_ARM_THUMB_H +#define __BRANCH_ARM_THUMB_H + +#include "BranchTypes.h" + +UInt32 ARMThumb_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchIA64.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchIA64.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,66 @@ +/* BranchIA64.c */ + +#include "BranchIA64.h" + +const Byte kBranchTable[32] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 6, 0, 0, 7, 7, + 4, 4, 0, 0, 4, 4, 0, 0 +}; + +UInt32 IA64_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding) +{ + UInt32 i; + for (i = 0; i + 16 <= size; i += 16) + { + UInt32 instrTemplate = data[i] & 0x1F; + UInt32 mask = kBranchTable[instrTemplate]; + UInt32 bitPos = 5; + int slot; + for (slot = 0; slot < 3; slot++, bitPos += 41) + { + UInt32 bytePos, bitRes; + UInt64 instruction, instNorm; + int j; + if (((mask >> slot) & 1) == 0) + continue; + bytePos = (bitPos >> 3); + bitRes = bitPos & 0x7; + instruction = 0; + for (j = 0; j < 6; j++) + instruction += (UInt64)(data[i + j + bytePos]) << (8 * j); + + instNorm = instruction >> bitRes; + if (((instNorm >> 37) & 0xF) == 0x5 + && ((instNorm >> 9) & 0x7) == 0 + /* && (instNorm & 0x3F)== 0 */ + ) + { + UInt32 src = (UInt32)((instNorm >> 13) & 0xFFFFF); + UInt32 dest; + src |= ((UInt32)(instNorm >> 36) & 1) << 20; + + src <<= 4; + + if (encoding) + dest = nowPos + i + src; + else + dest = src - (nowPos + i); + + dest >>= 4; + + instNorm &= ~((UInt64)(0x8FFFFF) << 13); + instNorm |= ((UInt64)(dest & 0xFFFFF) << 13); + instNorm |= ((UInt64)(dest & 0x100000) << (36 - 20)); + + instruction &= (1 << bitRes) - 1; + instruction |= (instNorm << bitRes); + for (j = 0; j < 6; j++) + data[i + j + bytePos] = (Byte)(instruction >> (8 * j)); + } + } + } + return i; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchIA64.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchIA64.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +/* BranchIA64.h */ + +#ifndef __BRANCH_IA64_H +#define __BRANCH_IA64_H + +#include "BranchTypes.h" + +UInt32 IA64_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchPPC.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchPPC.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,36 @@ +/* BranchPPC.c */ + +#include "BranchPPC.h" + +UInt32 PPC_B_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding) +{ + UInt32 i; + for (i = 0; i + 4 <= size; i += 4) + { + /* PowerPC branch 6(48) 24(Offset) 1(Abs) 1(Link) */ + if ((data[i] >> 2) == 0x12 && + ( + (data[i + 3] & 3) == 1 + /* || (data[i+3] & 3) == 3 */ + ) + ) + { + UInt32 src = ((data[i + 0] & 3) << 24) | + (data[i + 1] << 16) | + (data[i + 2] << 8) | + (data[i + 3] & (~3)); + + UInt32 dest; + if (encoding) + dest = nowPos + i + src; + else + dest = src - (nowPos + i); + data[i + 0] = (Byte)(0x48 | ((dest >> 24) & 0x3)); + data[i + 1] = (Byte)(dest >> 16); + data[i + 2] = (Byte)(dest >> 8); + data[i + 3] &= 0x3; + data[i + 3] |= dest; + } + } + return i; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchPPC.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchPPC.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +/* BranchPPC.h */ + +#ifndef __BRANCH_PPC_H +#define __BRANCH_PPC_H + +#include "BranchTypes.h" + +UInt32 PPC_B_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchSPARC.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchSPARC.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,36 @@ +/* BranchSPARC.c */ + +#include "BranchSPARC.h" + +UInt32 SPARC_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding) +{ + UInt32 i; + for (i = 0; i + 4 <= size; i += 4) + { + if (data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00 || + data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0) + { + UInt32 src = + ((UInt32)data[i + 0] << 24) | + ((UInt32)data[i + 1] << 16) | + ((UInt32)data[i + 2] << 8) | + ((UInt32)data[i + 3]); + UInt32 dest; + + src <<= 2; + if (encoding) + dest = nowPos + i + src; + else + dest = src - (nowPos + i); + dest >>= 2; + + dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000; + + data[i + 0] = (Byte)(dest >> 24); + data[i + 1] = (Byte)(dest >> 16); + data[i + 2] = (Byte)(dest >> 8); + data[i + 3] = (Byte)dest; + } + } + return i; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchSPARC.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchSPARC.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +/* BranchSPARC.h */ + +#ifndef __BRANCH_SPARC_H +#define __BRANCH_SPARC_H + +#include "BranchTypes.h" + +UInt32 SPARC_Convert(Byte *data, UInt32 size, UInt32 nowPos, int encoding); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchTypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchTypes.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,51 @@ +/* BranchTypes.h */ + +#ifndef __BRANCHTYPES_H +#define __BRANCHTYPES_H + +#ifndef _7ZIP_BYTE_DEFINED +#define _7ZIP_BYTE_DEFINED +typedef unsigned char Byte; +#endif + +#ifndef _7ZIP_UINT16_DEFINED +#define _7ZIP_UINT16_DEFINED +typedef unsigned short UInt16; +#endif + +#ifndef _7ZIP_UINT32_DEFINED +#define _7ZIP_UINT32_DEFINED +#ifdef _LZMA_UINT32_IS_ULONG +typedef unsigned long UInt32; +#else +typedef unsigned int UInt32; +#endif +#endif + +#ifndef _7ZIP_UINT64_DEFINED +#define _7ZIP_UINT64_DEFINED +#ifdef _SZ_NO_INT_64 +typedef unsigned long UInt64; +#else +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 UInt64; +#else +typedef unsigned long long int UInt64; +#endif +#endif +#endif + +/* #define _LZMA_NO_SYSTEM_SIZE_T */ +/* You can use it, if you don't want */ + +#ifndef _7ZIP_SIZET_DEFINED +#define _7ZIP_SIZET_DEFINED +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +#include +typedef size_t SizeT; +#endif +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchX86.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchX86.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,84 @@ +/* BranchX86.c */ + +#include "BranchX86.h" + +#define Test86MSByte(b) ((b) == 0 || (b) == 0xFF) + +const Byte kMaskToAllowedStatus[8] = {1, 1, 1, 0, 1, 0, 0, 0}; +const Byte kMaskToBitNumber[8] = {0, 1, 2, 2, 3, 3, 3, 3}; + +SizeT x86_Convert(Byte *buffer, SizeT endPos, UInt32 nowPos, UInt32 *prevMaskMix, int encoding) +{ + SizeT bufferPos = 0, prevPosT; + UInt32 prevMask = *prevMaskMix & 0x7; + if (endPos < 5) + return 0; + nowPos += 5; + prevPosT = (SizeT)0 - 1; + + for(;;) + { + Byte *p = buffer + bufferPos; + Byte *limit = buffer + endPos - 4; + for (; p < limit; p++) + if ((*p & 0xFE) == 0xE8) + break; + bufferPos = (SizeT)(p - buffer); + if (p >= limit) + break; + prevPosT = bufferPos - prevPosT; + if (prevPosT > 3) + prevMask = 0; + else + { + prevMask = (prevMask << ((int)prevPosT - 1)) & 0x7; + if (prevMask != 0) + { + Byte b = p[4 - kMaskToBitNumber[prevMask]]; + if (!kMaskToAllowedStatus[prevMask] || Test86MSByte(b)) + { + prevPosT = bufferPos; + prevMask = ((prevMask << 1) & 0x7) | 1; + bufferPos++; + continue; + } + } + } + prevPosT = bufferPos; + + if (Test86MSByte(p[4])) + { + UInt32 src = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); + UInt32 dest; + for (;;) + { + Byte b; + int index; + if (encoding) + dest = (nowPos + (UInt32)bufferPos) + src; + else + dest = src - (nowPos + (UInt32)bufferPos); + if (prevMask == 0) + break; + index = kMaskToBitNumber[prevMask] * 8; + b = (Byte)(dest >> (24 - index)); + if (!Test86MSByte(b)) + break; + src = dest ^ ((1 << (32 - index)) - 1); + } + p[4] = (Byte)(~(((dest >> 24) & 1) - 1)); + p[3] = (Byte)(dest >> 16); + p[2] = (Byte)(dest >> 8); + p[1] = (Byte)dest; + bufferPos += 5; + } + else + { + prevMask = ((prevMask << 1) & 0x7) | 1; + bufferPos++; + } + } + prevPosT = bufferPos - prevPosT; + *prevMaskMix = ((prevPosT > 3) ? 0 : ((prevMask << ((int)prevPosT - 1)) & 0x7)); + return bufferPos; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchX86.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchX86.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,12 @@ +/* BranchX86.h */ + +#ifndef __BRANCHX86_H +#define __BRANCHX86_H + +#include "BranchTypes.h" + +#define x86_Convert_Init(state) { state = 0; } + +SizeT x86_Convert(Byte *buffer, SizeT endPos, UInt32 nowPos, UInt32 *state, int encoding); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchX86_2.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchX86_2.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,135 @@ +// BranchX86_2.c + +#include "BranchX86_2.h" + +#include "../../Alloc.h" + +#ifdef _LZMA_PROB32 +#define CProb UInt32 +#else +#define CProb UInt16 +#endif + +#define IsJcc(b0, b1) ((b0) == 0x0F && ((b1) & 0xF0) == 0x80) +#define IsJ(b0, b1) ((b1 & 0xFE) == 0xE8 || IsJcc(b0, b1)) + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_READ_BYTE (*Buffer++) + +#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \ + { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }} + +#define RC_TEST { if (Buffer == BufferLim) return BCJ2_RESULT_DATA_ERROR; } + +#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2 + +#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; } + +#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound) +#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits; +#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits; +// #define UpdateBit0(p) Range = bound; *(p) = (CProb)(*(p) + ((kBitModelTotal - *(p)) >> kNumMoveBits)); +// #define UpdateBit1(p) Range -= bound; Code -= bound; *(p) = (CProb)(*(p) - (*(p) >> kNumMoveBits)); + +int x86_2_Decode( + const Byte *buf0, SizeT size0, + const Byte *buf1, SizeT size1, + const Byte *buf2, SizeT size2, + const Byte *buf3, SizeT size3, + Byte *outBuf, SizeT outSize) +{ + CProb p[256 + 2]; + SizeT inPos = 0, outPos = 0; + + const Byte *Buffer, *BufferLim; + UInt32 Range, Code; + Byte prevByte = 0; + + unsigned int i; + for (i = 0; i < sizeof(p) / sizeof(p[0]); i++) + p[i] = kBitModelTotal >> 1; + RC_INIT(buf3, size3); + + if (outSize == 0) + return BCJ2_RESULT_OK; + + for (;;) + { + Byte b; + CProb *prob; + UInt32 bound; + + SizeT limit = size0 - inPos; + if (outSize - outPos < limit) + limit = outSize - outPos; + while (limit != 0) + { + Byte b = buf0[inPos]; + outBuf[outPos++] = b; + if (IsJ(prevByte, b)) + break; + inPos++; + prevByte = b; + limit--; + } + + if (limit == 0 || outPos == outSize) + break; + + b = buf0[inPos++]; + + if (b == 0xE8) + prob = p + prevByte; + else if (b == 0xE9) + prob = p + 256; + else + prob = p + 257; + + IfBit0(prob) + { + UpdateBit0(prob) + prevByte = b; + } + else + { + UInt32 dest; + const Byte *v; + UpdateBit1(prob) + if (b == 0xE8) + { + v = buf1; + if (size1 < 4) + return BCJ2_RESULT_DATA_ERROR; + buf1 += 4; + size1 -= 4; + } + else + { + v = buf2; + if (size2 < 4) + return BCJ2_RESULT_DATA_ERROR; + buf2 += 4; + size2 -= 4; + } + dest = (((UInt32)v[0] << 24) | ((UInt32)v[1] << 16) | + ((UInt32)v[2] << 8) | ((UInt32)v[3])) - ((UInt32)outPos + 4); + outBuf[outPos++] = (Byte)dest; + if (outPos == outSize) + break; + outBuf[outPos++] = (Byte)(dest >> 8); + if (outPos == outSize) + break; + outBuf[outPos++] = (Byte)(dest >> 16); + if (outPos == outSize) + break; + outBuf[outPos++] = prevByte = (Byte)(dest >> 24); + } + } + return (outPos == outSize) ? BCJ2_RESULT_OK : BCJ2_RESULT_DATA_ERROR; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Branch/BranchX86_2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Branch/BranchX86_2.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,28 @@ +// BranchX86_2.h + +#ifndef __BRANCHX86_2_H +#define __BRANCHX86_2_H + +#include "BranchTypes.h" + +#define BCJ2_RESULT_OK 0 +#define BCJ2_RESULT_DATA_ERROR 1 + +/* +Conditions: + outSize <= FullOutputSize, + where FullOutputSize is full size of output stream of x86_2 filter. + +If buf0 overlaps outBuf, there are two required conditions: + 1) (buf0 >= outBuf) + 2) (buf0 + size0 >= outBuf + FullOutputSize). +*/ + +int x86_2_Decode( + const Byte *buf0, SizeT size0, + const Byte *buf1, SizeT size1, + const Byte *buf2, SizeT size2, + const Byte *buf3, SizeT size3, + Byte *outBuf, SizeT outSize); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Huffman/HuffmanEncode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Huffman/HuffmanEncode.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,146 @@ +/* Compress/HuffmanEncode.c */ + +#include "HuffmanEncode.h" +#include "../../Sort.h" + +#define kMaxLen 16 +#define NUM_BITS 10 +#define MASK ((1 << NUM_BITS) - 1) + +#define NUM_COUNTERS 64 + +/* use BLOCK_SORT_EXTERNAL_FLAGS if blockSize > 1M */ +#define HUFFMAN_SPEED_OPT + +void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 numSymbols, UInt32 maxLen) +{ + UInt32 num = 0; + /* if (maxLen > 10) maxLen = 10; */ + { + UInt32 i; + + #ifdef HUFFMAN_SPEED_OPT + + UInt32 counters[NUM_COUNTERS]; + for (i = 0; i < NUM_COUNTERS; i++) + counters[i] = 0; + for (i = 0; i < numSymbols; i++) + { + UInt32 freq = freqs[i]; + counters[(freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1]++; + } + + for (i = 1; i < NUM_COUNTERS; i++) + { + UInt32 temp = counters[i]; + counters[i] = num; + num += temp; + } + + for (i = 0; i < numSymbols; i++) + { + UInt32 freq = freqs[i]; + if (freq == 0) + lens[i] = 0; + else + p[counters[((freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1)]++] = i | (freq << NUM_BITS); + } + counters[0] = 0; + HeapSort(p + counters[NUM_COUNTERS - 2], counters[NUM_COUNTERS - 1] - counters[NUM_COUNTERS - 2]); + + #else + + for (i = 0; i < numSymbols; i++) + { + UInt32 freq = freqs[i]; + if (freq == 0) + lens[i] = 0; + else + p[num++] = i | (freq << NUM_BITS); + } + HeapSort(p, num); + + #endif + } + + if (num < 2) + { + int minCode = 0; + int maxCode = 1; + if (num == 1) + { + maxCode = p[0] & MASK; + if (maxCode == 0) + maxCode++; + } + p[minCode] = 0; + p[maxCode] = 1; + lens[minCode] = lens[maxCode] = 1; + return; + } + + { + UInt32 b, e, i; + + i = b = e = 0; + do + { + UInt32 n, m, freq; + n = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++; + freq = (p[n] & ~MASK); + p[n] = (p[n] & MASK) | (e << NUM_BITS); + m = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++; + freq += (p[m] & ~MASK); + p[m] = (p[m] & MASK) | (e << NUM_BITS); + p[e] = (p[e] & MASK) | freq; + e++; + } + while (num - e > 1); + + { + UInt32 lenCounters[kMaxLen + 1]; + for (i = 0; i <= kMaxLen; i++) + lenCounters[i] = 0; + + p[--e] &= MASK; + lenCounters[1] = 2; + while (e > 0) + { + UInt32 len = (p[p[--e] >> NUM_BITS] >> NUM_BITS) + 1; + p[e] = (p[e] & MASK) | (len << NUM_BITS); + if (len >= maxLen) + for (len = maxLen - 1; lenCounters[len] == 0; len--); + lenCounters[len]--; + lenCounters[len + 1] += 2; + } + + { + UInt32 len; + i = 0; + for (len = maxLen; len != 0; len--) + { + UInt32 num; + for (num = lenCounters[len]; num != 0; num--) + lens[p[i++] & MASK] = (Byte)len; + } + } + + { + UInt32 nextCodes[kMaxLen + 1]; + { + UInt32 code = 0; + UInt32 len; + for (len = 1; len <= kMaxLen; len++) + nextCodes[len] = code = (code + lenCounters[len - 1]) << 1; + } + /* if (code + lenCounters[kMaxLen] - 1 != (1 << kMaxLen) - 1) throw 1; */ + + { + UInt32 i; + for (i = 0; i < numSymbols; i++) + p[i] = nextCodes[lens[i]]++; + } + } + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Huffman/HuffmanEncode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Huffman/HuffmanEncode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,18 @@ +/* Compress/HuffmanEncode.h */ + +#ifndef __COMPRESS_HUFFMANENCODE_H +#define __COMPRESS_HUFFMANENCODE_H + +#include "../../Types.h" + +/* +Conditions: + num <= 1024 = 2 ^ NUM_BITS + Sum(freqs) < 4M = 2 ^ (32 - NUM_BITS) + maxLen <= 16 = kMaxLen + Num_Items(p) >= HUFFMAN_TEMP_SIZE(num) +*/ + +void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 num, UInt32 maxLen); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lz/LzHash.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lz/LzHash.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,53 @@ +/* LzHash.h */ + +#ifndef __C_LZHASH_H +#define __C_LZHASH_H + +#define kHash2Size (1 << 10) +#define kHash3Size (1 << 16) +#define kHash4Size (1 << 20) + +#define kFix3HashSize (kHash2Size) +#define kFix4HashSize (kHash2Size + kHash3Size) +#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) + +#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); + +#define HASH3_CALC { \ + UInt32 temp = g_CrcTable[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } + +#define HASH4_CALC { \ + UInt32 temp = g_CrcTable[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (g_CrcTable[cur[3]] << 5)) & p->hashMask; } + +#define HASH5_CALC { \ + UInt32 temp = g_CrcTable[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (g_CrcTable[cur[3]] << 5)); \ + hashValue = (hash4Value ^ (g_CrcTable[cur[4]] << 3)) & p->hashMask; \ + hash4Value &= (kHash4Size - 1); } + +/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ g_CrcTable[cur[2]]) & 0xFFFF; */ +#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ g_CrcTable[cur[1]]) & 0xFFFF; + + +#define MT_HASH2_CALC \ + hash2Value = (g_CrcTable[cur[0]] ^ cur[1]) & (kHash2Size - 1); + +#define MT_HASH3_CALC { \ + UInt32 temp = g_CrcTable[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +#define MT_HASH4_CALC { \ + UInt32 temp = g_CrcTable[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (g_CrcTable[cur[3]] << 5)) & (kHash4Size - 1); } + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lz/MatchFinder.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lz/MatchFinder.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,742 @@ +/* MatchFinder.c */ +/* Please call InitCrcTable before */ + +#include + +#include "MatchFinder.h" +#include "LzHash.h" + +#include "../../7zCrc.h" + +#define kEmptyHashValue 0 +#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) +#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ +#define kNormalizeMask (~(kNormalizeStepMin - 1)) +#define kMaxHistorySize ((UInt32)3 << 30) + +#define kStartMaxLen 3 + +void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) +{ + if (!p->directInput) + { + alloc->Free(p->bufferBase); + p->bufferBase = 0; + } +} + +/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ + +int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) +{ + UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; + if (p->directInput) + { + p->blockSize = blockSize; + return 1; + } + if (p->bufferBase == 0 || p->blockSize != blockSize) + { + LzInWindow_Free(p, alloc); + p->blockSize = blockSize; + p->bufferBase = (Byte *)alloc->Alloc(blockSize); + } + return (p->bufferBase != 0); +} + +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } +Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } + +UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } + +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) +{ + p->posLimit -= subValue; + p->pos -= subValue; + p->streamPos -= subValue; +} + +void MatchFinder_ReadBlock(CMatchFinder *p) +{ + if (p->streamEndWasReached || p->result != SZ_OK) + return; + for (;;) + { + Byte *dest = p->buffer + (p->streamPos - p->pos); + UInt32 numReadBytes; + UInt32 size = (UInt32)(p->bufferBase + p->blockSize - dest); + if (size == 0) + return; + p->result = p->stream->Read(p->stream, dest, size, &numReadBytes); + if (p->result != SZ_OK) + return; + if (numReadBytes == 0) + { + p->streamEndWasReached = 1; + return; + } + p->streamPos += numReadBytes; + if (p->streamPos - p->pos > p->keepSizeAfter) + return; + } +} + +void MatchFinder_MoveBlock(CMatchFinder *p) +{ + memmove(p->bufferBase, + p->buffer - p->keepSizeBefore, + p->streamPos - p->pos + p->keepSizeBefore); + p->buffer = p->bufferBase + p->keepSizeBefore; +} + +int MatchFinder_NeedMove(CMatchFinder *p) +{ + /* if (p->streamEndWasReached) return 0; */ + return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); +} + +void MatchFinder_ReadIfRequired(CMatchFinder *p) +{ + if (p->streamEndWasReached) + return; + if (p->keepSizeAfter >= p->streamPos - p->pos) + MatchFinder_ReadBlock(p); +} + +void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) +{ + if (MatchFinder_NeedMove(p)) + MatchFinder_MoveBlock(p); + MatchFinder_ReadBlock(p); +} + +void MatchFinder_SetDefaultSettings(CMatchFinder *p) +{ + p->cutValue = 32; + p->btMode = 1; + p->numHashBytes = 4; + /* p->skipModeBits = 0; */ + p->directInput = 0; + p->bigHash = 0; +} + +void MatchFinder_Construct(CMatchFinder *p) +{ + p->bufferBase = 0; + p->directInput = 0; + p->hash = 0; + MatchFinder_SetDefaultSettings(p); +} + +void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) +{ + alloc->Free(p->hash); + p->hash = 0; +} + +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) +{ + MatchFinder_FreeThisClassMemory(p, alloc); + LzInWindow_Free(p, alloc); +} + +CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc) +{ + size_t sizeInBytes = (size_t)num * sizeof(CLzRef); + if (sizeInBytes / sizeof(CLzRef) != num) + return 0; + return (CLzRef *)alloc->Alloc(sizeInBytes); +} + +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAlloc *alloc) +{ + UInt32 sizeReserv; + if (historySize > kMaxHistorySize) + { + MatchFinder_Free(p, alloc); + return 0; + } + sizeReserv = historySize >> 1; + if (historySize > ((UInt32)2 << 30)) + sizeReserv = historySize >> 2; + sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); + + p->keepSizeBefore = historySize + keepAddBufferBefore + 1; + p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; + /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ + if (LzInWindow_Create(p, sizeReserv, alloc)) + { + UInt32 newCyclicBufferSize = (historySize /* >> p->skipModeBits */) + 1; + UInt32 hs; + p->matchMaxLen = matchMaxLen; + { + p->fixedHashSize = 0; + if (p->numHashBytes == 2) + hs = (1 << 16) - 1; + else + { + hs = historySize - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + /* hs >>= p->skipModeBits; */ + hs |= 0xFFFF; /* don't change it! It's required for Deflate */ + if (hs > (1 << 24)) + { + if (p->numHashBytes == 3) + hs = (1 << 24) - 1; + else + hs >>= 1; + } + } + p->hashMask = hs; + hs++; + if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; + if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; + if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; + hs += p->fixedHashSize; + } + + { + UInt32 prevSize = p->hashSizeSum + p->numSons; + UInt32 newSize; + p->historySize = historySize; + p->hashSizeSum = hs; + p->cyclicBufferSize = newCyclicBufferSize; + p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize); + newSize = p->hashSizeSum + p->numSons; + if (p->hash != 0 && prevSize == newSize) + return 1; + MatchFinder_FreeThisClassMemory(p, alloc); + p->hash = AllocRefs(newSize, alloc); + if (p->hash != 0) + { + p->son = p->hash + p->hashSizeSum; + return 1; + } + } + } + MatchFinder_Free(p, alloc); + return 0; +} + +void MatchFinder_SetLimits(CMatchFinder *p) +{ + UInt32 limit = kMaxValForNormalize - p->pos; + UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; + if (limit2 < limit) + limit = limit2; + limit2 = p->streamPos - p->pos; + if (limit2 <= p->keepSizeAfter) + { + if (limit2 > 0) + limit2 = 1; + } + else + limit2 -= p->keepSizeAfter; + if (limit2 < limit) + limit = limit2; + { + UInt32 lenLimit = p->streamPos - p->pos; + if (lenLimit > p->matchMaxLen) + lenLimit = p->matchMaxLen; + p->lenLimit = lenLimit; + } + p->posLimit = p->pos + limit; +} + +void MatchFinder_Init(CMatchFinder *p) +{ + UInt32 i; + for(i = 0; i < p->hashSizeSum; i++) + p->hash[i] = kEmptyHashValue; + p->cyclicBufferPos = 0; + p->buffer = p->bufferBase; + p->pos = p->streamPos = p->cyclicBufferSize; + p->result = SZ_OK; + p->streamEndWasReached = 0; + MatchFinder_ReadBlock(p); + MatchFinder_SetLimits(p); +} + +UInt32 MatchFinder_GetSubValue(CMatchFinder *p) +{ + return (p->pos - p->historySize - 1) & kNormalizeMask; +} + +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) +{ + UInt32 i; + for (i = 0; i < numItems; i++) + { + UInt32 value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; + } +} + +void MatchFinder_Normalize(CMatchFinder *p) +{ + UInt32 subValue = MatchFinder_GetSubValue(p); + MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons); + MatchFinder_ReduceOffsets(p, subValue); +} + +void MatchFinder_CheckLimits(CMatchFinder *p) +{ + if (p->pos == kMaxValForNormalize) + MatchFinder_Normalize(p); + if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) + MatchFinder_CheckAndMoveAndRead(p); + if (p->cyclicBufferPos == p->cyclicBufferSize) + p->cyclicBufferPos = 0; + MatchFinder_SetLimits(p); +} + +UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) +{ + son[_cyclicBufferPos] = curMatch; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + return distances; + { + const Byte *pb = cur - delta; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + if (pb[maxLen] == cur[maxLen] && *pb == *cur) + { + UInt32 len = 0; + while(++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + return distances; + } + } + } + } +} + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) +{ + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + return distances; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + if (++len != lenLimit && pb[len] == cur[len]) + while(++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return distances; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) +{ + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + return; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + while(++len != lenLimit) + if (pb[len] != cur[len]) + break; + { + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +#define MOVE_POS \ + ++p->cyclicBufferPos; \ + p->buffer++; \ + if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); + +#define MOVE_POS_RET MOVE_POS return offset; + +void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } + +#define GET_MATCHES_HEADER2(minLen, ret_op) \ + UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ + lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + cur = p->buffer; + +#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) +#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) + +#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue + +#define GET_MATCHES_FOOTER(offset, maxLen) \ + offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ + distances + offset, maxLen) - distances); MOVE_POS_RET; + +#define SKIP_FOOTER \ + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; + +UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 1) +} + +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 2) +} + +UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 hash2Value, delta2, maxLen, offset; + GET_MATCHES_HEADER(3) + + HASH3_CALC; + + delta2 = p->pos - p->hash[hash2Value]; + curMatch = p->hash[kFix3HashSize + hashValue]; + + p->hash[hash2Value] = + p->hash[kFix3HashSize + hashValue] = p->pos; + + + maxLen = 2; + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) + { + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) + break; + distances[0] = maxLen; + distances[1] = delta2 - 1; + offset = 2; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + GET_MATCHES_FOOTER(offset, maxLen) +} + +UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + delta2 = p->pos - p->hash[ hash2Value]; + delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; + curMatch = p->hash[kFix4HashSize + hashValue]; + + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; + + maxLen = 1; + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = delta2 - 1; + offset = 2; + } + if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) + { + maxLen = 3; + distances[offset + 1] = delta3 - 1; + offset += 2; + delta2 = delta3; + } + if (offset != 0) + { + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) + break; + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + if (maxLen < 3) + maxLen = 3; + GET_MATCHES_FOOTER(offset, maxLen) +} + +UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + delta2 = p->pos - p->hash[ hash2Value]; + delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; + curMatch = p->hash[kFix4HashSize + hashValue]; + + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; + + maxLen = 1; + offset = 0; + if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = delta2 - 1; + offset = 2; + } + if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) + { + maxLen = 3; + distances[offset + 1] = delta3 - 1; + offset += 2; + delta2 = delta3; + } + if (offset != 0) + { + for (; maxLen != lenLimit; maxLen++) + if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) + break; + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + } + if (maxLen < 3) + maxLen = 3; + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances + offset, maxLen) - (distances)); + MOVE_POS_RET +} + +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances, 2) - (distances)); + MOVE_POS_RET +} + +void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 hash2Value; + SKIP_HEADER(3) + HASH3_CALC; + curMatch = p->hash[kFix3HashSize + hashValue]; + p->hash[hash2Value] = + p->hash[kFix3HashSize + hashValue] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 hash2Value, hash3Value; + SKIP_HEADER(4) + HASH4_CALC; + curMatch = p->hash[kFix4HashSize + hashValue]; + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = p->pos; + p->hash[kFix4HashSize + hashValue] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 hash2Value, hash3Value; + SKIP_HEADER(4) + HASH4_CALC; + curMatch = p->hash[kFix4HashSize + hashValue]; + p->hash[ hash2Value] = + p->hash[kFix3HashSize + hash3Value] = + p->hash[kFix4HashSize + hashValue] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} + +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hashValue]; + p->hash[hashValue] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) +{ + vTable->Init = (Mf_Init_Func)MatchFinder_Init; + vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; + if (!p->btMode) + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; + } + else if (p->numHashBytes == 2) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; + } + else if (p->numHashBytes == 3) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; + } + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lz/MatchFinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lz/MatchFinder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,106 @@ +/* MatchFinder.h */ + +#ifndef __MATCHFINDER_H +#define __MATCHFINDER_H + +#include "../../IStream.h" + +typedef UInt32 CLzRef; + +typedef struct _CMatchFinder +{ + Byte *buffer; + UInt32 pos; + UInt32 posLimit; + UInt32 streamPos; + UInt32 lenLimit; + + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ + + UInt32 matchMaxLen; + CLzRef *hash; + CLzRef *son; + UInt32 hashMask; + UInt32 cutValue; + + Byte *bufferBase; + ISeqInStream *stream; + int streamEndWasReached; + + UInt32 blockSize; + UInt32 keepSizeBefore; + UInt32 keepSizeAfter; + + UInt32 numHashBytes; + int directInput; + int btMode; + /* int skipModeBits; */ + int bigHash; + UInt32 historySize; + UInt32 fixedHashSize; + UInt32 hashSizeSum; + UInt32 numSons; + + HRes result; +} CMatchFinder; + +#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) +#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) + +#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) + +int MatchFinder_NeedMove(CMatchFinder *p); +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); +void MatchFinder_MoveBlock(CMatchFinder *p); +void MatchFinder_ReadIfRequired(CMatchFinder *p); + +void MatchFinder_Construct(CMatchFinder *p); + +/* Conditions: + historySize <= 3 GB + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB +*/ +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAlloc *alloc); +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems); +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, + UInt32 *distances, UInt32 maxLen); + +/* +Conditions: + Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. + Mf_GetPointerToCurrentPos_Func's result must be used only before any other function +*/ + +typedef void (*Mf_Init_Func)(void *object); +typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); +typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); +typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); +typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); +typedef void (*Mf_Skip_Func)(void *object, UInt32); + +typedef struct _IMatchFinder +{ + Mf_Init_Func Init; + Mf_GetIndexByte_Func GetIndexByte; + Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; + Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; + Mf_GetMatches_Func GetMatches; + Mf_Skip_Func Skip; +} IMatchFinder; + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); + +void MatchFinder_Init(CMatchFinder *p); +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lz/MatchFinderMt.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lz/MatchFinderMt.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,806 @@ +/* MatchFinderMt.c */ + +#ifdef _WIN32 +#define USE_ALLOCA +#endif + +#ifdef USE_ALLOCA +#ifdef _WIN32 +#include +#else +#include +#endif +#endif + +#include "../../7zCrc.h" +#include "LzHash.h" + +#include "MatchFinderMt.h" + +void MtSync_Construct(CMtSync *p) +{ + p->wasCreated = False; + p->csWasInitialized = False; + p->csWasEntered = False; + Thread_Construct(&p->thread); + Event_Construct(&p->canStart); + Event_Construct(&p->wasStarted); + Event_Construct(&p->wasStopped); + Semaphore_Construct(&p->freeSemaphore); + Semaphore_Construct(&p->filledSemaphore); +} + +void MtSync_GetNextBlock(CMtSync *p) +{ + if (p->needStart) + { + p->numProcessedBlocks = 1; + p->needStart = False; + p->stopWriting = False; + p->exit = False; + Event_Reset(&p->wasStarted); + Event_Reset(&p->wasStopped); + + Event_Set(&p->canStart); + Event_Wait(&p->wasStarted); + } + else + { + CriticalSection_Leave(&p->cs); + p->csWasEntered = False; + p->numProcessedBlocks++; + Semaphore_Release1(&p->freeSemaphore); + } + Semaphore_Wait(&p->filledSemaphore); + CriticalSection_Enter(&p->cs); + p->csWasEntered = True; +} + +/* MtSync_StopWriting must be called if Writing was started */ + +void MtSync_StopWriting(CMtSync *p) +{ + UInt32 myNumBlocks = p->numProcessedBlocks; + if (!Thread_WasCreated(&p->thread) || p->needStart) + return; + p->stopWriting = True; + if (p->csWasEntered) + { + CriticalSection_Leave(&p->cs); + p->csWasEntered = False; + } + Semaphore_Release1(&p->freeSemaphore); + + Event_Wait(&p->wasStopped); + + while (myNumBlocks++ != p->numProcessedBlocks) + { + Semaphore_Wait(&p->filledSemaphore); + Semaphore_Release1(&p->freeSemaphore); + } + p->needStart = True; +} + +void MtSync_Destruct(CMtSync *p) +{ + if (Thread_WasCreated(&p->thread)) + { + MtSync_StopWriting(p); + p->exit = True; + if (p->needStart) + Event_Set(&p->canStart); + Thread_Wait(&p->thread); + Thread_Close(&p->thread); + } + if (p->csWasInitialized) + { + CriticalSection_Delete(&p->cs); + p->csWasInitialized = False; + } + + Event_Close(&p->canStart); + Event_Close(&p->wasStarted); + Event_Close(&p->wasStopped); + Semaphore_Close(&p->freeSemaphore); + Semaphore_Close(&p->filledSemaphore); + + p->wasCreated = False; +} + +HRes MtSync_Create2(CMtSync *p, unsigned (StdCall *startAddress)(void *), void *obj, UInt32 numBlocks) +{ + if (p->wasCreated) + return SZ_OK; + + RINOK(CriticalSection_Init(&p->cs)); + p->csWasInitialized = True; + + RINOK(AutoResetEvent_CreateNotSignaled(&p->canStart)); + RINOK(AutoResetEvent_CreateNotSignaled(&p->wasStarted)); + RINOK(AutoResetEvent_CreateNotSignaled(&p->wasStopped)); + + RINOK(Semaphore_Create(&p->freeSemaphore, numBlocks, numBlocks)); + RINOK(Semaphore_Create(&p->filledSemaphore, 0, numBlocks)); + + p->needStart = True; + + RINOK(Thread_Create(&p->thread, startAddress, obj)); + p->wasCreated = True; + return SZ_OK; +} + +HRes MtSync_Create(CMtSync *p, unsigned (StdCall *startAddress)(void *), void *obj, UInt32 numBlocks) +{ + HRes res = MtSync_Create2(p, startAddress, obj, numBlocks); + if (res != SZ_OK) + MtSync_Destruct(p); + return res; +} + + +void MtSync_Init(CMtSync *p) { p->needStart = True; } + +#define kMtMaxValForNormalize 0xFFFFFFFF + +#define DEF_GetHeads(name, v) \ +static void GetHeads ## name(const Byte *p, UInt32 pos, \ +UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads) { \ +for (; numHeads != 0; numHeads--) { \ +const UInt32 value = (v); p++; *heads++ = pos - hash[value]; hash[value] = pos++; } } + +DEF_GetHeads(2, (p[0] | ((UInt32)p[1] << 8)) & hashMask) +DEF_GetHeads(3, (g_CrcTable[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8)) & hashMask) +DEF_GetHeads(4, (g_CrcTable[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (g_CrcTable[p[3]] << 5)) & hashMask) +DEF_GetHeads(4b, (g_CrcTable[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ ((UInt32)p[3] << 16)) & hashMask) +DEF_GetHeads(5, (g_CrcTable[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (g_CrcTable[p[3]] << 5) ^ (g_CrcTable[p[4]] << 3)) & hashMask) + +void HashThreadFunc(CMatchFinderMt *mt) +{ + CMtSync *p = &mt->hashSync; + for (;;) + { + UInt32 numProcessedBlocks = 0; + Event_Wait(&p->canStart); + Event_Set(&p->wasStarted); + for (;;) + { + if (p->exit) + return; + if (p->stopWriting) + { + p->numProcessedBlocks = numProcessedBlocks; + Event_Set(&p->wasStopped); + break; + } + + { + CMatchFinder *mf = mt->MatchFinder; + if (MatchFinder_NeedMove(mf)) + { + CriticalSection_Enter(&mt->btSync.cs); + CriticalSection_Enter(&mt->hashSync.cs); + { + const Byte *beforePtr = MatchFinder_GetPointerToCurrentPos(mf); + const Byte *afterPtr; + MatchFinder_MoveBlock(mf); + afterPtr = MatchFinder_GetPointerToCurrentPos(mf); + mt->pointerToCurPos -= beforePtr - afterPtr; + mt->buffer -= beforePtr - afterPtr; + } + CriticalSection_Leave(&mt->btSync.cs); + CriticalSection_Leave(&mt->hashSync.cs); + continue; + } + + Semaphore_Wait(&p->freeSemaphore); + + MatchFinder_ReadIfRequired(mf); + if (mf->pos > (kMtMaxValForNormalize - kMtHashBlockSize)) + { + UInt32 subValue = (mf->pos - mf->historySize - 1); + MatchFinder_ReduceOffsets(mf, subValue); + MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, mf->hashMask + 1); + } + { + UInt32 *heads = mt->hashBuf + ((numProcessedBlocks++) & kMtHashNumBlocksMask) * kMtHashBlockSize; + UInt32 num = mf->streamPos - mf->pos; + heads[0] = 2; + heads[1] = num; + if (num >= mf->numHashBytes) + { + num = num - mf->numHashBytes + 1; + if (num > kMtHashBlockSize - 2) + num = kMtHashBlockSize - 2; + mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num); + heads[0] += num; + } + mf->pos += num; + mf->buffer += num; + } + } + + Semaphore_Release1(&p->filledSemaphore); + } + } +} + +void MatchFinderMt_GetNextBlock_Hash(CMatchFinderMt *p) +{ + MtSync_GetNextBlock(&p->hashSync); + p->hashBufPosLimit = p->hashBufPos = ((p->hashSync.numProcessedBlocks - 1) & kMtHashNumBlocksMask) * kMtHashBlockSize; + p->hashBufPosLimit += p->hashBuf[p->hashBufPos++]; + p->hashNumAvail = p->hashBuf[p->hashBufPos++]; +} + +#define kEmptyHashValue 0 + +/* #define MFMT_GM_INLINE */ + +#ifdef MFMT_GM_INLINE + +#if _MSC_VER >= 1300 +#define NO_INLINE __declspec(noinline) __fastcall +#else +#ifdef _MSC_VER +#define NO_INLINE __fastcall +#endif +#endif + +Int32 NO_INLINE GetMatchesSpecN(UInt32 lenLimit, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, + UInt32 *_distances, UInt32 _maxLen, const UInt32 *hash, Int32 limit, UInt32 size, UInt32 *posRes) +{ + do + { + UInt32 *distances = _distances + 1; + UInt32 curMatch = pos - *hash++; + + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + UInt32 cutValue = _cutValue; + UInt32 maxLen = _maxLen; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + break; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + if (++len != lenLimit && pb[len] == cur[len]) + while(++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + break; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } + pos++; + _cyclicBufferPos++; + cur++; + { + UInt32 num = (UInt32)(distances - _distances); + *_distances = num - 1; + _distances += num; + limit -= num; + } + } + while (limit > 0 && --size != 0); + *posRes = pos; + return limit; +} + +#endif + +void BtGetMatches(CMatchFinderMt *p, UInt32 *distances) +{ + UInt32 numProcessed = 0; + UInt32 curPos = 2; + UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2); + distances[1] = p->hashNumAvail; + while (curPos < limit) + { + if (p->hashBufPos == p->hashBufPosLimit) + { + MatchFinderMt_GetNextBlock_Hash(p); + distances[1] = numProcessed + p->hashNumAvail; + if (p->hashNumAvail >= p->numHashBytes) + continue; + for (; p->hashNumAvail != 0; p->hashNumAvail--) + distances[curPos++] = 0; + break; + } + { + UInt32 size = p->hashBufPosLimit - p->hashBufPos; + UInt32 lenLimit = p->matchMaxLen; + UInt32 pos = p->pos; + UInt32 cyclicBufferPos = p->cyclicBufferPos; + if (lenLimit >= p->hashNumAvail) + lenLimit = p->hashNumAvail; + { + UInt32 size2 = p->hashNumAvail - lenLimit + 1; + if (size2 < size) + size = size2; + size2 = p->cyclicBufferSize - cyclicBufferPos; + if (size2 < size) + size = size2; + } + #ifndef MFMT_GM_INLINE + while (curPos < limit && size-- != 0) + { + UInt32 *startDistances = distances + curPos; + UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++], + pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, + startDistances + 1, p->numHashBytes - 1) - startDistances); + *startDistances = num - 1; + curPos += num; + cyclicBufferPos++; + pos++; + p->buffer++; + } + #else + { + UInt32 posRes; + curPos = limit - GetMatchesSpecN(lenLimit, pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, + distances + curPos, p->numHashBytes - 1, p->hashBuf + p->hashBufPos, (Int32)(limit - curPos) , size, &posRes); + p->hashBufPos += posRes - pos; + cyclicBufferPos += posRes - pos; + p->buffer += posRes - pos; + pos = posRes; + } + #endif + + numProcessed += pos - p->pos; + p->hashNumAvail -= pos - p->pos; + p->pos = pos; + if (cyclicBufferPos == p->cyclicBufferSize) + cyclicBufferPos = 0; + p->cyclicBufferPos = cyclicBufferPos; + } + } + distances[0] = curPos; +} + +void BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex) +{ + CMtSync *sync = &p->hashSync; + if (!sync->needStart) + { + CriticalSection_Enter(&sync->cs); + sync->csWasEntered = True; + } + + BtGetMatches(p, p->btBuf + (globalBlockIndex & kMtBtNumBlocksMask) * kMtBtBlockSize); + + if (p->pos > kMtMaxValForNormalize - kMtBtBlockSize) + { + UInt32 subValue = p->pos - p->cyclicBufferSize; + MatchFinder_Normalize3(subValue, p->son, p->cyclicBufferSize * 2); + p->pos -= subValue; + } + + if (!sync->needStart) + { + CriticalSection_Leave(&sync->cs); + sync->csWasEntered = False; + } +} + +void BtThreadFunc(CMatchFinderMt *mt) +{ + CMtSync *p = &mt->btSync; + for (;;) + { + UInt32 blockIndex = 0; + Event_Wait(&p->canStart); + Event_Set(&p->wasStarted); + for (;;) + { + if (p->exit) + return; + if (p->stopWriting) + { + p->numProcessedBlocks = blockIndex; + MtSync_StopWriting(&mt->hashSync); + Event_Set(&p->wasStopped); + break; + } + Semaphore_Wait(&p->freeSemaphore); + BtFillBlock(mt, blockIndex++); + Semaphore_Release1(&p->filledSemaphore); + } + } +} + +void MatchFinderMt_Construct(CMatchFinderMt *p) +{ + p->hashBuf = 0; + MtSync_Construct(&p->hashSync); + MtSync_Construct(&p->btSync); +} + +void MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAlloc *alloc) +{ + alloc->Free(p->hashBuf); + p->hashBuf = 0; +} + +void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc) +{ + MtSync_Destruct(&p->hashSync); + MtSync_Destruct(&p->btSync); + MatchFinderMt_FreeMem(p, alloc); +} + +#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks) +#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks) + +static unsigned StdCall HashThreadFunc2(void *p) { HashThreadFunc((CMatchFinderMt *)p); return 0; } +static unsigned StdCall BtThreadFunc2(void *p) +{ + #ifdef USE_ALLOCA + alloca(0x180); + #endif + BtThreadFunc((CMatchFinderMt *)p); + return 0; +} + +HRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc) +{ + CMatchFinder *mf = p->MatchFinder; + p->historySize = historySize; + if (kMtBtBlockSize <= matchMaxLen * 4) + return E_INVALIDARG; + if (p->hashBuf == 0) + { + p->hashBuf = (UInt32 *)alloc->Alloc((kHashBufferSize + kBtBufferSize) * sizeof(UInt32)); + if (p->hashBuf == 0) + return SZE_OUTOFMEMORY; + p->btBuf = p->hashBuf + kHashBufferSize; + } + keepAddBufferBefore += (kHashBufferSize + kBtBufferSize); + keepAddBufferAfter += kMtHashBlockSize; + if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc)) + return SZE_OUTOFMEMORY; + + RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p, kMtHashNumBlocks)); + RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p, kMtBtNumBlocks)); + return SZ_OK; +} + +/* Call it after ReleaseStream / SetStream */ +void MatchFinderMt_Init(CMatchFinderMt *p) +{ + CMatchFinder *mf = p->MatchFinder; + p->btBufPos = p->btBufPosLimit = 0; + p->hashBufPos = p->hashBufPosLimit = 0; + MatchFinder_Init(mf); + p->pointerToCurPos = MatchFinder_GetPointerToCurrentPos(mf); + p->btNumAvailBytes = 0; + p->lzPos = p->historySize + 1; + + p->hash = mf->hash; + p->fixedHashSize = mf->fixedHashSize; + + p->son = mf->son; + p->matchMaxLen = mf->matchMaxLen; + p->numHashBytes = mf->numHashBytes; + p->pos = mf->pos; + p->buffer = mf->buffer; + p->cyclicBufferPos = mf->cyclicBufferPos; + p->cyclicBufferSize = mf->cyclicBufferSize; + p->cutValue = mf->cutValue; +} + +/* ReleaseStream is required to finish multithreading */ +void MatchFinderMt_ReleaseStream(CMatchFinderMt *p) +{ + MtSync_StopWriting(&p->btSync); + /* p->MatchFinder->ReleaseStream(); */ +} + +void MatchFinderMt_Normalize(CMatchFinderMt *p) +{ + MatchFinder_Normalize3(p->lzPos - p->historySize - 1, p->hash, p->fixedHashSize); + p->lzPos = p->historySize + 1; +} + +void MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p) +{ + UInt32 blockIndex; + MtSync_GetNextBlock(&p->btSync); + blockIndex = ((p->btSync.numProcessedBlocks - 1) & kMtBtNumBlocksMask); + p->btBufPosLimit = p->btBufPos = blockIndex * kMtBtBlockSize; + p->btBufPosLimit += p->btBuf[p->btBufPos++]; + p->btNumAvailBytes = p->btBuf[p->btBufPos++]; + if (p->lzPos >= kMtMaxValForNormalize - kMtBtBlockSize) + MatchFinderMt_Normalize(p); +} + +const Byte * MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p) +{ + return p->pointerToCurPos; +} + +#define GET_NEXT_BLOCK_IF_REQUIRED if (p->btBufPos == p->btBufPosLimit) MatchFinderMt_GetNextBlock_Bt(p); + +UInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p) +{ + GET_NEXT_BLOCK_IF_REQUIRED; + return p->btNumAvailBytes; +} + +Byte MatchFinderMt_GetIndexByte(CMatchFinderMt *p, Int32 index) +{ + return p->pointerToCurPos[index]; +} + +UInt32 * MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) +{ + UInt32 hash2Value, curMatch2; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + UInt32 lzPos = p->lzPos; + MT_HASH2_CALC + + curMatch2 = hash[hash2Value]; + hash[hash2Value] = lzPos; + + if (curMatch2 >= matchMinPos) + if (cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) + { + *distances++ = 2; + *distances++ = lzPos - curMatch2 - 1; + } + return distances; +} + +UInt32 * MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) +{ + UInt32 hash2Value, hash3Value, curMatch2, curMatch3; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + UInt32 lzPos = p->lzPos; + MT_HASH3_CALC + + curMatch2 = hash[ hash2Value]; + curMatch3 = hash[kFix3HashSize + hash3Value]; + + hash[ hash2Value] = + hash[kFix3HashSize + hash3Value] = + lzPos; + + if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) + { + distances[1] = lzPos - curMatch2 - 1; + if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2]) + { + distances[0] = 3; + return distances + 2; + } + distances[0] = 2; + distances += 2; + } + if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0]) + { + *distances++ = 3; + *distances++ = lzPos - curMatch3 - 1; + } + return distances; +} + +/* +UInt32 *MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) +{ + UInt32 hash2Value, hash3Value, hash4Value, curMatch2, curMatch3, curMatch4; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + UInt32 lzPos = p->lzPos; + MT_HASH4_CALC + + curMatch2 = hash[ hash2Value]; + curMatch3 = hash[kFix3HashSize + hash3Value]; + curMatch4 = hash[kFix4HashSize + hash4Value]; + + hash[ hash2Value] = + hash[kFix3HashSize + hash3Value] = + hash[kFix4HashSize + hash4Value] = + lzPos; + + if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) + { + distances[1] = lzPos - curMatch2 - 1; + if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2]) + { + distances[0] = (cur[(ptrdiff_t)curMatch2 - lzPos + 3] == cur[3]) ? 4 : 3; + return distances + 2; + } + distances[0] = 2; + distances += 2; + } + if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0]) + { + distances[1] = lzPos - curMatch3 - 1; + if (cur[(ptrdiff_t)curMatch3 - lzPos + 3] == cur[3]) + { + distances[0] = 4; + return distances + 2; + } + distances[0] = 3; + distances += 2; + } + + if (curMatch4 >= matchMinPos) + if ( + cur[(ptrdiff_t)curMatch4 - lzPos] == cur[0] && + cur[(ptrdiff_t)curMatch4 - lzPos + 3] == cur[3] + ) + { + *distances++ = 4; + *distances++ = lzPos - curMatch4 - 1; + } + return distances; +} +*/ + +#define INCREASE_LZ_POS p->lzPos++; p->pointerToCurPos++; + +UInt32 MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *distances) +{ + const UInt32 *btBuf = p->btBuf + p->btBufPos; + UInt32 len = *btBuf++; + p->btBufPos += 1 + len; + p->btNumAvailBytes--; + { + UInt32 i; + for (i = 0; i < len; i += 2) + { + *distances++ = *btBuf++; + *distances++ = *btBuf++; + } + } + INCREASE_LZ_POS + return len; +} + +UInt32 MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *distances) +{ + const UInt32 *btBuf = p->btBuf + p->btBufPos; + UInt32 len = *btBuf++; + p->btBufPos += 1 + len; + + if (len == 0) + { + if (p->btNumAvailBytes-- >= 4) + len = (UInt32)(p->MixMatchesFunc(p, p->lzPos - p->historySize, distances) - (distances)); + } + else + { + /* Condition: there are matches in btBuf with length < p->numHashBytes */ + UInt32 *distances2; + p->btNumAvailBytes--; + distances2 = p->MixMatchesFunc(p, p->lzPos - btBuf[1], distances); + do + { + *distances2++ = *btBuf++; + *distances2++ = *btBuf++; + } + while ((len -= 2) != 0); + len = (UInt32)(distances2 - (distances)); + } + INCREASE_LZ_POS + return len; +} + +#define SKIP_HEADER2 do { GET_NEXT_BLOCK_IF_REQUIRED +#define SKIP_HEADER(n) SKIP_HEADER2 if (p->btNumAvailBytes-- >= (n)) { const Byte *cur = p->pointerToCurPos; UInt32 *hash = p->hash; +#define SKIP_FOOTER } INCREASE_LZ_POS p->btBufPos += p->btBuf[p->btBufPos] + 1; } while(--num != 0); + +void MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER2 { p->btNumAvailBytes--; + SKIP_FOOTER +} + +void MatchFinderMt2_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER(2) + UInt32 hash2Value; + MT_HASH2_CALC + hash[hash2Value] = p->lzPos; + SKIP_FOOTER +} + +void MatchFinderMt3_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER(3) + UInt32 hash2Value, hash3Value; + MT_HASH3_CALC + hash[kFix3HashSize + hash3Value] = + hash[ hash2Value] = + p->lzPos; + SKIP_FOOTER +} + +/* +void MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER(4) + UInt32 hash2Value, hash3Value, hash4Value; + MT_HASH4_CALC + hash[kFix4HashSize + hash4Value] = + hash[kFix3HashSize + hash3Value] = + hash[ hash2Value] = + p->lzPos; + SKIP_FOOTER +} +*/ + +void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable) +{ + vTable->Init = (Mf_Init_Func)MatchFinderMt_Init; + vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinderMt_GetIndexByte; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos; + vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches; + switch(p->MatchFinder->numHashBytes) + { + case 2: + p->GetHeadsFunc = GetHeads2; + p->MixMatchesFunc = (Mf_Mix_Matches)0; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip; + vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches; + break; + case 3: + p->GetHeadsFunc = GetHeads3; + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip; + break; + default: + /* case 4: */ + p->GetHeadsFunc = p->MatchFinder->bigHash ? GetHeads4b : GetHeads4; + /* p->GetHeadsFunc = GetHeads4; */ + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip; + break; + /* + default: + p->GetHeadsFunc = GetHeads5; + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt4_Skip; + break; + */ + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lz/MatchFinderMt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lz/MatchFinderMt.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,95 @@ +/* MatchFinderMt.h */ + +#ifndef __MATCHFINDERMT_H +#define __MATCHFINDERMT_H + +#include "../../Threads.h" +#include "MatchFinder.h" + +#define kMtHashBlockSize (1 << 13) +#define kMtHashNumBlocks (1 << 3) +#define kMtHashNumBlocksMask (kMtHashNumBlocks - 1) + +#define kMtBtBlockSize (1 << 14) +#define kMtBtNumBlocks (1 << 6) +#define kMtBtNumBlocksMask (kMtBtNumBlocks - 1) + +typedef struct _CMtSync +{ + Bool wasCreated; + Bool needStart; + Bool exit; + Bool stopWriting; + + CThread thread; + CAutoResetEvent canStart; + CAutoResetEvent wasStarted; + CAutoResetEvent wasStopped; + CSemaphore freeSemaphore; + CSemaphore filledSemaphore; + Bool csWasInitialized; + Bool csWasEntered; + CCriticalSection cs; + UInt32 numProcessedBlocks; +} CMtSync; + +typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances); + +/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ +#define kMtCacheLineDummy 128 + +typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, + UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads); + +typedef struct _CMatchFinderMt +{ + /* LZ */ + const Byte *pointerToCurPos; + UInt32 *btBuf; + UInt32 btBufPos; + UInt32 btBufPosLimit; + UInt32 lzPos; + UInt32 btNumAvailBytes; + + UInt32 *hash; + UInt32 fixedHashSize; + UInt32 historySize; + + Mf_Mix_Matches MixMatchesFunc; + + /* LZ + BT */ + CMtSync btSync; + Byte btDummy[kMtCacheLineDummy]; + + /* BT */ + UInt32 *hashBuf; + UInt32 hashBufPos; + UInt32 hashBufPosLimit; + UInt32 hashNumAvail; + + CLzRef *son; + UInt32 matchMaxLen; + UInt32 numHashBytes; + UInt32 pos; + Byte *buffer; + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be historySize + 1 */ + UInt32 cutValue; + + /* BT + Hash */ + CMtSync hashSync; + /* Byte hashDummy[kMtCacheLineDummy]; */ + + /* Hash */ + Mf_GetHeads GetHeadsFunc; + CMatchFinder *MatchFinder; +} CMatchFinderMt; + +void MatchFinderMt_Construct(CMatchFinderMt *p); +void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc); +HRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc); +void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable); +void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lzma/LzmaDecode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lzma/LzmaDecode.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,584 @@ +/* + LzmaDecode.c + LZMA Decoder (optimized for Speed version) + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + http://www.7-zip.org/ + + LZMA SDK is licensed under two licenses: + 1) GNU Lesser General Public License (GNU LGPL) + 2) Common Public License (CPL) + It means that you can select one of these two licenses and + follow rules of that license. + + SPECIAL EXCEPTION: + Igor Pavlov, as the author of this Code, expressly permits you to + statically or dynamically link your Code (or bind by name) to the + interfaces of this file without subjecting your linked Code to the + terms of the CPL or GNU LGPL. Any modifications or additions + to this file, however, are subject to the LGPL or CPL terms. +*/ + +#include "LzmaDecode.h" + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_READ_BYTE (*Buffer++) + +#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \ + { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }} + +#ifdef _LZMA_IN_CB + +#define RC_TEST { if (Buffer == BufferLim) \ + { SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \ + BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }} + +#define RC_INIT Buffer = BufferLim = 0; RC_INIT2 + +#else + +#define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; } + +#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2 + +#endif + +#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; } + +#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound) +#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits; +#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits; + +#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \ + { UpdateBit0(p); mi <<= 1; A0; } else \ + { UpdateBit1(p); mi = (mi + mi) + 1; A1; } + +#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;) + +#define RangeDecoderBitTreeDecode(probs, numLevels, res) \ + { int i = numLevels; res = 1; \ + do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \ + res -= (1 << numLevels); } + + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + + +#define kNumStates 12 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 + +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG +#endif + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size) +{ + unsigned char prop0; + if (size < LZMA_PROPERTIES_SIZE) + return LZMA_RESULT_DATA_ERROR; + prop0 = propsData[0]; + if (prop0 >= (9 * 5 * 5)) + return LZMA_RESULT_DATA_ERROR; + { + for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5)); + for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9); + propsRes->lc = prop0; + /* + unsigned char remainder = (unsigned char)(prop0 / 9); + propsRes->lc = prop0 % 9; + propsRes->pb = remainder / 5; + propsRes->lp = remainder % 5; + */ + } + + #ifdef _LZMA_OUT_READ + { + int i; + propsRes->DictionarySize = 0; + for (i = 0; i < 4; i++) + propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8); + if (propsRes->DictionarySize == 0) + propsRes->DictionarySize = 1; + } + #endif + return LZMA_RESULT_OK; +} + +#define kLzmaStreamWasFinishedId (-1) + +int LzmaDecode(CLzmaDecoderState *vs, + #ifdef _LZMA_IN_CB + ILzmaInCallback *InCallback, + #else + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + #endif + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed) +{ + CProb *p = vs->Probs; + SizeT nowPos = 0; + Byte previousByte = 0; + UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1; + UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1; + int lc = vs->Properties.lc; + + #ifdef _LZMA_OUT_READ + + UInt32 Range = vs->Range; + UInt32 Code = vs->Code; + #ifdef _LZMA_IN_CB + const Byte *Buffer = vs->Buffer; + const Byte *BufferLim = vs->BufferLim; + #else + const Byte *Buffer = inStream; + const Byte *BufferLim = inStream + inSize; + #endif + int state = vs->State; + UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3]; + int len = vs->RemainLen; + UInt32 globalPos = vs->GlobalPos; + UInt32 distanceLimit = vs->DistanceLimit; + + Byte *dictionary = vs->Dictionary; + UInt32 dictionarySize = vs->Properties.DictionarySize; + UInt32 dictionaryPos = vs->DictionaryPos; + + Byte tempDictionary[4]; + + #ifndef _LZMA_IN_CB + *inSizeProcessed = 0; + #endif + *outSizeProcessed = 0; + if (len == kLzmaStreamWasFinishedId) + return LZMA_RESULT_OK; + + if (dictionarySize == 0) + { + dictionary = tempDictionary; + dictionarySize = 1; + tempDictionary[0] = vs->TempDictionary[0]; + } + + if (len == kLzmaNeedInitId) + { + { + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + UInt32 i; + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + rep0 = rep1 = rep2 = rep3 = 1; + state = 0; + globalPos = 0; + distanceLimit = 0; + dictionaryPos = 0; + dictionary[dictionarySize - 1] = 0; + #ifdef _LZMA_IN_CB + RC_INIT; + #else + RC_INIT(inStream, inSize); + #endif + } + len = 0; + } + while(len != 0 && nowPos < outSize) + { + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos]; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + len--; + } + if (dictionaryPos == 0) + previousByte = dictionary[dictionarySize - 1]; + else + previousByte = dictionary[dictionaryPos - 1]; + + #else /* if !_LZMA_OUT_READ */ + + int state = 0; + UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1; + int len = 0; + const Byte *Buffer; + const Byte *BufferLim; + UInt32 Range; + UInt32 Code; + + #ifndef _LZMA_IN_CB + *inSizeProcessed = 0; + #endif + *outSizeProcessed = 0; + + { + UInt32 i; + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + } + + #ifdef _LZMA_IN_CB + RC_INIT; + #else + RC_INIT(inStream, inSize); + #endif + + #endif /* _LZMA_OUT_READ */ + + while(nowPos < outSize) + { + CProb *prob; + UInt32 bound; + int posState = (int)( + (nowPos + #ifdef _LZMA_OUT_READ + + globalPos + #endif + ) + & posStateMask); + + prob = p + IsMatch + (state << kNumPosBitsMax) + posState; + IfBit0(prob) + { + int symbol = 1; + UpdateBit0(prob) + prob = p + Literal + (LZMA_LIT_SIZE * + ((( + (nowPos + #ifdef _LZMA_OUT_READ + + globalPos + #endif + ) + & literalPosMask) << lc) + (previousByte >> (8 - lc)))); + + if (state >= kNumLitStates) + { + int matchByte; + #ifdef _LZMA_OUT_READ + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + matchByte = dictionary[pos]; + #else + matchByte = outStream[nowPos - rep0]; + #endif + do + { + int bit; + CProb *probLit; + matchByte <<= 1; + bit = (matchByte & 0x100); + probLit = prob + 0x100 + bit + symbol; + RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break) + } + while (symbol < 0x100); + } + while (symbol < 0x100) + { + CProb *probLit = prob + symbol; + RC_GET_BIT(probLit, symbol) + } + previousByte = (Byte)symbol; + + outStream[nowPos++] = previousByte; + #ifdef _LZMA_OUT_READ + if (distanceLimit < dictionarySize) + distanceLimit++; + + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #endif + if (state < 4) state = 0; + else if (state < 10) state -= 3; + else state -= 6; + } + else + { + UpdateBit1(prob); + prob = p + IsRep + state; + IfBit0(prob) + { + UpdateBit0(prob); + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + state = state < kNumLitStates ? 0 : 3; + prob = p + LenCoder; + } + else + { + UpdateBit1(prob); + prob = p + IsRepG0 + state; + IfBit0(prob) + { + UpdateBit0(prob); + prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState; + IfBit0(prob) + { + #ifdef _LZMA_OUT_READ + UInt32 pos; + #endif + UpdateBit0(prob); + + #ifdef _LZMA_OUT_READ + if (distanceLimit == 0) + #else + if (nowPos == 0) + #endif + return LZMA_RESULT_DATA_ERROR; + + state = state < kNumLitStates ? 9 : 11; + #ifdef _LZMA_OUT_READ + pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + previousByte = dictionary[pos]; + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #else + previousByte = outStream[nowPos - rep0]; + #endif + outStream[nowPos++] = previousByte; + #ifdef _LZMA_OUT_READ + if (distanceLimit < dictionarySize) + distanceLimit++; + #endif + + continue; + } + else + { + UpdateBit1(prob); + } + } + else + { + UInt32 distance; + UpdateBit1(prob); + prob = p + IsRepG1 + state; + IfBit0(prob) + { + UpdateBit0(prob); + distance = rep1; + } + else + { + UpdateBit1(prob); + prob = p + IsRepG2 + state; + IfBit0(prob) + { + UpdateBit0(prob); + distance = rep2; + } + else + { + UpdateBit1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = p + RepLenCoder; + } + { + int numBits, offset; + CProb *probLen = prob + LenChoice; + IfBit0(probLen) + { + UpdateBit0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + numBits = kLenNumLowBits; + } + else + { + UpdateBit1(probLen); + probLen = prob + LenChoice2; + IfBit0(probLen) + { + UpdateBit0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + numBits = kLenNumMidBits; + } + else + { + UpdateBit1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + numBits = kLenNumHighBits; + } + } + RangeDecoderBitTreeDecode(probLen, numBits, len); + len += offset; + } + + if (state < 4) + { + int posSlot; + state += kNumLitStates; + prob = p + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + int numDirectBits = ((posSlot >> 1) - 1); + rep0 = (2 | ((UInt32)posSlot & 1)); + if (posSlot < kEndPosModelIndex) + { + rep0 <<= numDirectBits; + prob = p + SpecPos + rep0 - posSlot - 1; + } + else + { + numDirectBits -= kNumAlignBits; + do + { + RC_NORMALIZE + Range >>= 1; + rep0 <<= 1; + if (Code >= Range) + { + Code -= Range; + rep0 |= 1; + } + } + while (--numDirectBits != 0); + prob = p + Align; + rep0 <<= kNumAlignBits; + numDirectBits = kNumAlignBits; + } + { + int i = 1; + int mi = 1; + do + { + CProb *prob3 = prob + mi; + RC_GET_BIT2(prob3, mi, ; , rep0 |= i); + i <<= 1; + } + while(--numDirectBits != 0); + } + } + else + rep0 = posSlot; + if (++rep0 == (UInt32)(0)) + { + /* it's for stream version */ + len = kLzmaStreamWasFinishedId; + break; + } + } + + len += kMatchMinLen; + #ifdef _LZMA_OUT_READ + if (rep0 > distanceLimit) + #else + if (rep0 > nowPos) + #endif + return LZMA_RESULT_DATA_ERROR; + + #ifdef _LZMA_OUT_READ + if (dictionarySize - distanceLimit > (UInt32)len) + distanceLimit += len; + else + distanceLimit = dictionarySize; + #endif + + do + { + #ifdef _LZMA_OUT_READ + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + previousByte = dictionary[pos]; + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #else + previousByte = outStream[nowPos - rep0]; + #endif + len--; + outStream[nowPos++] = previousByte; + } + while(len != 0 && nowPos < outSize); + } + } + RC_NORMALIZE; + + #ifdef _LZMA_OUT_READ + vs->Range = Range; + vs->Code = Code; + vs->DictionaryPos = dictionaryPos; + vs->GlobalPos = globalPos + (UInt32)nowPos; + vs->DistanceLimit = distanceLimit; + vs->Reps[0] = rep0; + vs->Reps[1] = rep1; + vs->Reps[2] = rep2; + vs->Reps[3] = rep3; + vs->State = state; + vs->RemainLen = len; + vs->TempDictionary[0] = tempDictionary[0]; + #endif + + #ifdef _LZMA_IN_CB + vs->Buffer = Buffer; + vs->BufferLim = BufferLim; + #else + *inSizeProcessed = (SizeT)(Buffer - inStream); + #endif + *outSizeProcessed = nowPos; + return LZMA_RESULT_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lzma/LzmaDecode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lzma/LzmaDecode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,113 @@ +/* + LzmaDecode.h + LZMA Decoder interface + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + http://www.7-zip.org/ + + LZMA SDK is licensed under two licenses: + 1) GNU Lesser General Public License (GNU LGPL) + 2) Common Public License (CPL) + It means that you can select one of these two licenses and + follow rules of that license. + + SPECIAL EXCEPTION: + Igor Pavlov, as the author of this code, expressly permits you to + statically or dynamically link your code (or bind by name) to the + interfaces of this file without subjecting your linked code to the + terms of the CPL or GNU LGPL. Any modifications or additions + to this file, however, are subject to the LGPL or CPL terms. +*/ + +#ifndef __LZMADECODE_H +#define __LZMADECODE_H + +#include "LzmaTypes.h" + +/* #define _LZMA_IN_CB */ +/* Use callback for input data */ + +/* #define _LZMA_OUT_READ */ +/* Use read function for output data */ + +/* #define _LZMA_PROB32 */ +/* It can increase speed on some 32-bit CPUs, + but memory usage will be doubled in that case */ + +/* #define _LZMA_LOC_OPT */ +/* Enable local speed optimizations inside code */ + +#ifdef _LZMA_PROB32 +#define CProb UInt32 +#else +#define CProb UInt16 +#endif + +#define LZMA_RESULT_OK 0 +#define LZMA_RESULT_DATA_ERROR 1 + +#ifdef _LZMA_IN_CB +typedef struct _ILzmaInCallback +{ + int (*Read)(void *object, const unsigned char **buffer, SizeT *bufferSize); +} ILzmaInCallback; +#endif + +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 768 + +#define LZMA_PROPERTIES_SIZE 5 + +typedef struct _CLzmaProperties +{ + int lc; + int lp; + int pb; + #ifdef _LZMA_OUT_READ + UInt32 DictionarySize; + #endif +}CLzmaProperties; + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size); + +#define LzmaGetNumProbs(Properties) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp))) + +#define kLzmaNeedInitId (-2) + +typedef struct _CLzmaDecoderState +{ + CLzmaProperties Properties; + CProb *Probs; + + #ifdef _LZMA_IN_CB + const unsigned char *Buffer; + const unsigned char *BufferLim; + #endif + + #ifdef _LZMA_OUT_READ + unsigned char *Dictionary; + UInt32 Range; + UInt32 Code; + UInt32 DictionaryPos; + UInt32 GlobalPos; + UInt32 DistanceLimit; + UInt32 Reps[4]; + int State; + int RemainLen; + unsigned char TempDictionary[4]; + #endif +} CLzmaDecoderState; + +#ifdef _LZMA_OUT_READ +#define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; } +#endif + +int LzmaDecode(CLzmaDecoderState *vs, + #ifdef _LZMA_IN_CB + ILzmaInCallback *inCallback, + #else + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + #endif + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lzma/LzmaDecodeSize.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lzma/LzmaDecodeSize.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,712 @@ +/* + LzmaDecodeSize.c + LZMA Decoder (optimized for Size version) + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + http://www.7-zip.org/ + + LZMA SDK is licensed under two licenses: + 1) GNU Lesser General Public License (GNU LGPL) + 2) Common Public License (CPL) + It means that you can select one of these two licenses and + follow rules of that license. + + SPECIAL EXCEPTION: + Igor Pavlov, as the author of this code, expressly permits you to + statically or dynamically link your code (or bind by name) to the + interfaces of this file without subjecting your linked code to the + terms of the CPL or GNU LGPL. Any modifications or additions + to this file, however, are subject to the LGPL or CPL terms. +*/ + +#include "LzmaDecode.h" + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +typedef struct _CRangeDecoder +{ + const Byte *Buffer; + const Byte *BufferLim; + UInt32 Range; + UInt32 Code; + #ifdef _LZMA_IN_CB + ILzmaInCallback *InCallback; + int Result; + #endif + int ExtraBytes; +} CRangeDecoder; + +Byte RangeDecoderReadByte(CRangeDecoder *rd) +{ + if (rd->Buffer == rd->BufferLim) + { + #ifdef _LZMA_IN_CB + SizeT size; + rd->Result = rd->InCallback->Read(rd->InCallback, &rd->Buffer, &size); + rd->BufferLim = rd->Buffer + size; + if (size == 0) + #endif + { + rd->ExtraBytes = 1; + return 0xFF; + } + } + return (*rd->Buffer++); +} + +/* #define ReadByte (*rd->Buffer++) */ +#define ReadByte (RangeDecoderReadByte(rd)) + +void RangeDecoderInit(CRangeDecoder *rd + #ifndef _LZMA_IN_CB + , const Byte *stream, SizeT bufferSize + #endif + ) +{ + int i; + #ifdef _LZMA_IN_CB + rd->Buffer = rd->BufferLim = 0; + #else + rd->Buffer = stream; + rd->BufferLim = stream + bufferSize; + #endif + rd->ExtraBytes = 0; + rd->Code = 0; + rd->Range = (0xFFFFFFFF); + for(i = 0; i < 5; i++) + rd->Code = (rd->Code << 8) | ReadByte; +} + +#define RC_INIT_VAR UInt32 range = rd->Range; UInt32 code = rd->Code; +#define RC_FLUSH_VAR rd->Range = range; rd->Code = code; +#define RC_NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | ReadByte; } + +UInt32 RangeDecoderDecodeDirectBits(CRangeDecoder *rd, int numTotalBits) +{ + RC_INIT_VAR + UInt32 result = 0; + int i; + for (i = numTotalBits; i != 0; i--) + { + /* UInt32 t; */ + range >>= 1; + + result <<= 1; + if (code >= range) + { + code -= range; + result |= 1; + } + /* + t = (code - range) >> 31; + t &= 1; + code -= range & (t - 1); + result = (result + result) | (1 - t); + */ + RC_NORMALIZE + } + RC_FLUSH_VAR + return result; +} + +int RangeDecoderBitDecode(CProb *prob, CRangeDecoder *rd) +{ + UInt32 bound = (rd->Range >> kNumBitModelTotalBits) * *prob; + if (rd->Code < bound) + { + rd->Range = bound; + *prob += (kBitModelTotal - *prob) >> kNumMoveBits; + if (rd->Range < kTopValue) + { + rd->Code = (rd->Code << 8) | ReadByte; + rd->Range <<= 8; + } + return 0; + } + else + { + rd->Range -= bound; + rd->Code -= bound; + *prob -= (*prob) >> kNumMoveBits; + if (rd->Range < kTopValue) + { + rd->Code = (rd->Code << 8) | ReadByte; + rd->Range <<= 8; + } + return 1; + } +} + +#define RC_GET_BIT2(prob, mi, A0, A1) \ + UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; \ + if (code < bound) \ + { A0; range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; mi <<= 1; } \ + else \ + { A1; range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; mi = (mi + mi) + 1; } \ + RC_NORMALIZE + +#define RC_GET_BIT(prob, mi) RC_GET_BIT2(prob, mi, ; , ;) + +int RangeDecoderBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd) +{ + int mi = 1; + int i; + #ifdef _LZMA_LOC_OPT + RC_INIT_VAR + #endif + for(i = numLevels; i != 0; i--) + { + #ifdef _LZMA_LOC_OPT + CProb *prob = probs + mi; + RC_GET_BIT(prob, mi) + #else + mi = (mi + mi) + RangeDecoderBitDecode(probs + mi, rd); + #endif + } + #ifdef _LZMA_LOC_OPT + RC_FLUSH_VAR + #endif + return mi - (1 << numLevels); +} + +int RangeDecoderReverseBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd) +{ + int mi = 1; + int i; + int symbol = 0; + #ifdef _LZMA_LOC_OPT + RC_INIT_VAR + #endif + for(i = 0; i < numLevels; i++) + { + #ifdef _LZMA_LOC_OPT + CProb *prob = probs + mi; + RC_GET_BIT2(prob, mi, ; , symbol |= (1 << i)) + #else + int bit = RangeDecoderBitDecode(probs + mi, rd); + mi = mi + mi + bit; + symbol |= (bit << i); + #endif + } + #ifdef _LZMA_LOC_OPT + RC_FLUSH_VAR + #endif + return symbol; +} + +Byte LzmaLiteralDecode(CProb *probs, CRangeDecoder *rd) +{ + int symbol = 1; + #ifdef _LZMA_LOC_OPT + RC_INIT_VAR + #endif + do + { + #ifdef _LZMA_LOC_OPT + CProb *prob = probs + symbol; + RC_GET_BIT(prob, symbol) + #else + symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd); + #endif + } + while (symbol < 0x100); + #ifdef _LZMA_LOC_OPT + RC_FLUSH_VAR + #endif + return symbol; +} + +Byte LzmaLiteralDecodeMatch(CProb *probs, CRangeDecoder *rd, Byte matchByte) +{ + int symbol = 1; + #ifdef _LZMA_LOC_OPT + RC_INIT_VAR + #endif + do + { + int bit; + int matchBit = (matchByte >> 7) & 1; + matchByte <<= 1; + #ifdef _LZMA_LOC_OPT + { + CProb *prob = probs + 0x100 + (matchBit << 8) + symbol; + RC_GET_BIT2(prob, symbol, bit = 0, bit = 1) + } + #else + bit = RangeDecoderBitDecode(probs + 0x100 + (matchBit << 8) + symbol, rd); + symbol = (symbol << 1) | bit; + #endif + if (matchBit != bit) + { + while (symbol < 0x100) + { + #ifdef _LZMA_LOC_OPT + CProb *prob = probs + symbol; + RC_GET_BIT(prob, symbol) + #else + symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd); + #endif + } + break; + } + } + while (symbol < 0x100); + #ifdef _LZMA_LOC_OPT + RC_FLUSH_VAR + #endif + return symbol; +} + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + +int LzmaLenDecode(CProb *p, CRangeDecoder *rd, int posState) +{ + if(RangeDecoderBitDecode(p + LenChoice, rd) == 0) + return RangeDecoderBitTreeDecode(p + LenLow + + (posState << kLenNumLowBits), kLenNumLowBits, rd); + if(RangeDecoderBitDecode(p + LenChoice2, rd) == 0) + return kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid + + (posState << kLenNumMidBits), kLenNumMidBits, rd); + return kLenNumLowSymbols + kLenNumMidSymbols + + RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd); +} + +#define kNumStates 12 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 + +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG +#endif + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size) +{ + unsigned char prop0; + if (size < LZMA_PROPERTIES_SIZE) + return LZMA_RESULT_DATA_ERROR; + prop0 = propsData[0]; + if (prop0 >= (9 * 5 * 5)) + return LZMA_RESULT_DATA_ERROR; + { + for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5)); + for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9); + propsRes->lc = prop0; + /* + unsigned char remainder = (unsigned char)(prop0 / 9); + propsRes->lc = prop0 % 9; + propsRes->pb = remainder / 5; + propsRes->lp = remainder % 5; + */ + } + + #ifdef _LZMA_OUT_READ + { + int i; + propsRes->DictionarySize = 0; + for (i = 0; i < 4; i++) + propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8); + if (propsRes->DictionarySize == 0) + propsRes->DictionarySize = 1; + } + #endif + return LZMA_RESULT_OK; +} + +#define kLzmaStreamWasFinishedId (-1) + +int LzmaDecode(CLzmaDecoderState *vs, + #ifdef _LZMA_IN_CB + ILzmaInCallback *InCallback, + #else + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + #endif + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed) +{ + CProb *p = vs->Probs; + SizeT nowPos = 0; + Byte previousByte = 0; + UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1; + UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1; + int lc = vs->Properties.lc; + CRangeDecoder rd; + + #ifdef _LZMA_OUT_READ + + int state = vs->State; + UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3]; + int len = vs->RemainLen; + UInt32 globalPos = vs->GlobalPos; + UInt32 distanceLimit = vs->DistanceLimit; + + Byte *dictionary = vs->Dictionary; + UInt32 dictionarySize = vs->Properties.DictionarySize; + UInt32 dictionaryPos = vs->DictionaryPos; + + Byte tempDictionary[4]; + + rd.Range = vs->Range; + rd.Code = vs->Code; + #ifdef _LZMA_IN_CB + rd.InCallback = InCallback; + rd.Buffer = vs->Buffer; + rd.BufferLim = vs->BufferLim; + #else + rd.Buffer = inStream; + rd.BufferLim = inStream + inSize; + #endif + + #ifndef _LZMA_IN_CB + *inSizeProcessed = 0; + #endif + *outSizeProcessed = 0; + if (len == kLzmaStreamWasFinishedId) + return LZMA_RESULT_OK; + + if (dictionarySize == 0) + { + dictionary = tempDictionary; + dictionarySize = 1; + tempDictionary[0] = vs->TempDictionary[0]; + } + + if (len == kLzmaNeedInitId) + { + { + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + UInt32 i; + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + rep0 = rep1 = rep2 = rep3 = 1; + state = 0; + globalPos = 0; + distanceLimit = 0; + dictionaryPos = 0; + dictionary[dictionarySize - 1] = 0; + RangeDecoderInit(&rd + #ifndef _LZMA_IN_CB + , inStream, inSize + #endif + ); + #ifdef _LZMA_IN_CB + if (rd.Result != LZMA_RESULT_OK) + return rd.Result; + #endif + if (rd.ExtraBytes != 0) + return LZMA_RESULT_DATA_ERROR; + } + len = 0; + } + while(len != 0 && nowPos < outSize) + { + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos]; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + len--; + } + if (dictionaryPos == 0) + previousByte = dictionary[dictionarySize - 1]; + else + previousByte = dictionary[dictionaryPos - 1]; + + #ifdef _LZMA_IN_CB + rd.Result = LZMA_RESULT_OK; + #endif + rd.ExtraBytes = 0; + + #else /* if !_LZMA_OUT_READ */ + + int state = 0; + UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1; + int len = 0; + + #ifndef _LZMA_IN_CB + *inSizeProcessed = 0; + #endif + *outSizeProcessed = 0; + + { + UInt32 i; + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + } + + #ifdef _LZMA_IN_CB + rd.InCallback = InCallback; + #endif + RangeDecoderInit(&rd + #ifndef _LZMA_IN_CB + , inStream, inSize + #endif + ); + + #ifdef _LZMA_IN_CB + if (rd.Result != LZMA_RESULT_OK) + return rd.Result; + #endif + if (rd.ExtraBytes != 0) + return LZMA_RESULT_DATA_ERROR; + + #endif /* _LZMA_OUT_READ */ + + + while(nowPos < outSize) + { + int posState = (int)( + (nowPos + #ifdef _LZMA_OUT_READ + + globalPos + #endif + ) + & posStateMask); + #ifdef _LZMA_IN_CB + if (rd.Result != LZMA_RESULT_OK) + return rd.Result; + #endif + if (rd.ExtraBytes != 0) + return LZMA_RESULT_DATA_ERROR; + if (RangeDecoderBitDecode(p + IsMatch + (state << kNumPosBitsMax) + posState, &rd) == 0) + { + CProb *probs = p + Literal + (LZMA_LIT_SIZE * + ((( + (nowPos + #ifdef _LZMA_OUT_READ + + globalPos + #endif + ) + & literalPosMask) << lc) + (previousByte >> (8 - lc)))); + + if (state >= kNumLitStates) + { + Byte matchByte; + #ifdef _LZMA_OUT_READ + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + matchByte = dictionary[pos]; + #else + matchByte = outStream[nowPos - rep0]; + #endif + previousByte = LzmaLiteralDecodeMatch(probs, &rd, matchByte); + } + else + previousByte = LzmaLiteralDecode(probs, &rd); + outStream[nowPos++] = previousByte; + #ifdef _LZMA_OUT_READ + if (distanceLimit < dictionarySize) + distanceLimit++; + + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #endif + if (state < 4) state = 0; + else if (state < 10) state -= 3; + else state -= 6; + } + else + { + if (RangeDecoderBitDecode(p + IsRep + state, &rd) == 1) + { + if (RangeDecoderBitDecode(p + IsRepG0 + state, &rd) == 0) + { + if (RangeDecoderBitDecode(p + IsRep0Long + (state << kNumPosBitsMax) + posState, &rd) == 0) + { + #ifdef _LZMA_OUT_READ + UInt32 pos; + #endif + + #ifdef _LZMA_OUT_READ + if (distanceLimit == 0) + #else + if (nowPos == 0) + #endif + return LZMA_RESULT_DATA_ERROR; + + state = state < 7 ? 9 : 11; + #ifdef _LZMA_OUT_READ + pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + previousByte = dictionary[pos]; + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #else + previousByte = outStream[nowPos - rep0]; + #endif + outStream[nowPos++] = previousByte; + + #ifdef _LZMA_OUT_READ + if (distanceLimit < dictionarySize) + distanceLimit++; + #endif + continue; + } + } + else + { + UInt32 distance; + if(RangeDecoderBitDecode(p + IsRepG1 + state, &rd) == 0) + distance = rep1; + else + { + if(RangeDecoderBitDecode(p + IsRepG2 + state, &rd) == 0) + distance = rep2; + else + { + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + len = LzmaLenDecode(p + RepLenCoder, &rd, posState); + state = state < 7 ? 8 : 11; + } + else + { + int posSlot; + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + state = state < 7 ? 7 : 10; + len = LzmaLenDecode(p + LenCoder, &rd, posState); + posSlot = RangeDecoderBitTreeDecode(p + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits), kNumPosSlotBits, &rd); + if (posSlot >= kStartPosModelIndex) + { + int numDirectBits = ((posSlot >> 1) - 1); + rep0 = ((2 | ((UInt32)posSlot & 1)) << numDirectBits); + if (posSlot < kEndPosModelIndex) + { + rep0 += RangeDecoderReverseBitTreeDecode( + p + SpecPos + rep0 - posSlot - 1, numDirectBits, &rd); + } + else + { + rep0 += RangeDecoderDecodeDirectBits(&rd, + numDirectBits - kNumAlignBits) << kNumAlignBits; + rep0 += RangeDecoderReverseBitTreeDecode(p + Align, kNumAlignBits, &rd); + } + } + else + rep0 = posSlot; + if (++rep0 == (UInt32)(0)) + { + /* it's for stream version */ + len = kLzmaStreamWasFinishedId; + break; + } + } + + len += kMatchMinLen; + #ifdef _LZMA_OUT_READ + if (rep0 > distanceLimit) + #else + if (rep0 > nowPos) + #endif + return LZMA_RESULT_DATA_ERROR; + + #ifdef _LZMA_OUT_READ + if (dictionarySize - distanceLimit > (UInt32)len) + distanceLimit += len; + else + distanceLimit = dictionarySize; + #endif + + do + { + #ifdef _LZMA_OUT_READ + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + previousByte = dictionary[pos]; + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + #else + previousByte = outStream[nowPos - rep0]; + #endif + len--; + outStream[nowPos++] = previousByte; + } + while(len != 0 && nowPos < outSize); + } + } + + + #ifdef _LZMA_OUT_READ + vs->Range = rd.Range; + vs->Code = rd.Code; + vs->DictionaryPos = dictionaryPos; + vs->GlobalPos = globalPos + (UInt32)nowPos; + vs->DistanceLimit = distanceLimit; + vs->Reps[0] = rep0; + vs->Reps[1] = rep1; + vs->Reps[2] = rep2; + vs->Reps[3] = rep3; + vs->State = state; + vs->RemainLen = len; + vs->TempDictionary[0] = tempDictionary[0]; + #endif + + #ifdef _LZMA_IN_CB + vs->Buffer = rd.Buffer; + vs->BufferLim = rd.BufferLim; + #else + *inSizeProcessed = (SizeT)(rd.Buffer - inStream); + #endif + *outSizeProcessed = nowPos; + return LZMA_RESULT_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lzma/LzmaStateDecode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lzma/LzmaStateDecode.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,521 @@ +/* + LzmaStateDecode.c + LZMA Decoder (State version) + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + http://www.7-zip.org/ + + LZMA SDK is licensed under two licenses: + 1) GNU Lesser General Public License (GNU LGPL) + 2) Common Public License (CPL) + It means that you can select one of these two licenses and + follow rules of that license. + + SPECIAL EXCEPTION: + Igor Pavlov, as the author of this Code, expressly permits you to + statically or dynamically link your Code (or bind by name) to the + interfaces of this file without subjecting your linked Code to the + terms of the CPL or GNU LGPL. Any modifications or additions + to this file, however, are subject to the LGPL or CPL terms. +*/ + +#include "LzmaStateDecode.h" + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_READ_BYTE (*Buffer++) + +#define RC_INIT Code = 0; Range = 0xFFFFFFFF; \ + { int i; for(i = 0; i < 5; i++) { Code = (Code << 8) | RC_READ_BYTE; }} + +#define RC_NORMALIZE if (Range < kTopValue) { Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; } + +#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound) +#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits; +#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits; + +#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \ + { UpdateBit0(p); mi <<= 1; A0; } else \ + { UpdateBit1(p); mi = (mi + mi) + 1; A1; } + +#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;) + +#define RangeDecoderBitTreeDecode(probs, numLevels, res) \ + { int i = numLevels; res = 1; \ + do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \ + res -= (1 << numLevels); } + + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + + +#define kNumStates 12 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 + +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG +#endif + +/* kRequiredInBufferSize = number of required input bytes for worst case: + longest match with longest distance. + kLzmaInBufferSize must be larger than kRequiredInBufferSize + 23 bits = 2 (match select) + 10 (len) + 6 (distance) + 4(align) + 1 (RC_NORMALIZE) +*/ + +#define kRequiredInBufferSize ((23 * (kNumBitModelTotalBits - kNumMoveBits + 1) + 26 + 9) / 8) + +#define kLzmaStreamWasFinishedId (-1) + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size) +{ + unsigned char prop0; + if (size < LZMA_PROPERTIES_SIZE) + return LZMA_RESULT_DATA_ERROR; + prop0 = propsData[0]; + if (prop0 >= (9 * 5 * 5)) + return LZMA_RESULT_DATA_ERROR; + { + for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5)); + for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9); + propsRes->lc = prop0; + /* + unsigned char remainder = (unsigned char)(prop0 / 9); + propsRes->lc = prop0 % 9; + propsRes->pb = remainder / 5; + propsRes->lp = remainder % 5; + */ + } + + { + int i; + propsRes->DictionarySize = 0; + for (i = 0; i < 4; i++) + propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8); + if (propsRes->DictionarySize == 0) + propsRes->DictionarySize = 1; + return LZMA_RESULT_OK; + } +} + +int LzmaDecode( + CLzmaDecoderState *vs, + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed, + int finishDecoding) +{ + UInt32 Range = vs->Range; + UInt32 Code = vs->Code; + + unsigned char *Buffer = vs->Buffer; + int BufferSize = vs->BufferSize; /* don't change it to unsigned int */ + CProb *p = vs->Probs; + + int state = vs->State; + unsigned char previousByte; + UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3]; + SizeT nowPos = 0; + UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1; + UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1; + int lc = vs->Properties.lc; + int len = vs->RemainLen; + UInt32 globalPos = vs->GlobalPos; + UInt32 distanceLimit = vs->DistanceLimit; + + unsigned char *dictionary = vs->Dictionary; + UInt32 dictionarySize = vs->Properties.DictionarySize; + UInt32 dictionaryPos = vs->DictionaryPos; + + unsigned char tempDictionary[4]; + + (*inSizeProcessed) = 0; + (*outSizeProcessed) = 0; + if (len == kLzmaStreamWasFinishedId) + return LZMA_RESULT_OK; + + if (dictionarySize == 0) + { + dictionary = tempDictionary; + dictionarySize = 1; + tempDictionary[0] = vs->TempDictionary[0]; + } + + if (len == kLzmaNeedInitId) + { + while (inSize > 0 && BufferSize < kLzmaInBufferSize) + { + Buffer[BufferSize++] = *inStream++; + (*inSizeProcessed)++; + inSize--; + } + if (BufferSize < 5) + { + vs->BufferSize = BufferSize; + return finishDecoding ? LZMA_RESULT_DATA_ERROR : LZMA_RESULT_OK; + } + { + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp)); + UInt32 i; + for (i = 0; i < numProbs; i++) + p[i] = kBitModelTotal >> 1; + rep0 = rep1 = rep2 = rep3 = 1; + state = 0; + globalPos = 0; + distanceLimit = 0; + dictionaryPos = 0; + dictionary[dictionarySize - 1] = 0; + RC_INIT; + } + len = 0; + } + while(len != 0 && nowPos < outSize) + { + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos]; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + len--; + } + if (dictionaryPos == 0) + previousByte = dictionary[dictionarySize - 1]; + else + previousByte = dictionary[dictionaryPos - 1]; + + for (;;) + { + int bufferPos = (int)(Buffer - vs->Buffer); + if (BufferSize - bufferPos < kRequiredInBufferSize) + { + int i; + BufferSize -= bufferPos; + if (BufferSize < 0) + return LZMA_RESULT_DATA_ERROR; + for (i = 0; i < BufferSize; i++) + vs->Buffer[i] = Buffer[i]; + Buffer = vs->Buffer; + while (inSize > 0 && BufferSize < kLzmaInBufferSize) + { + Buffer[BufferSize++] = *inStream++; + (*inSizeProcessed)++; + inSize--; + } + if (BufferSize < kRequiredInBufferSize && !finishDecoding) + break; + } + if (nowPos >= outSize) + break; + { + CProb *prob; + UInt32 bound; + int posState = (int)((nowPos + globalPos) & posStateMask); + + prob = p + IsMatch + (state << kNumPosBitsMax) + posState; + IfBit0(prob) + { + int symbol = 1; + UpdateBit0(prob) + prob = p + Literal + (LZMA_LIT_SIZE * + ((((nowPos + globalPos)& literalPosMask) << lc) + (previousByte >> (8 - lc)))); + + if (state >= kNumLitStates) + { + int matchByte; + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + matchByte = dictionary[pos]; + do + { + int bit; + CProb *probLit; + matchByte <<= 1; + bit = (matchByte & 0x100); + probLit = prob + 0x100 + bit + symbol; + RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break) + } + while (symbol < 0x100); + } + while (symbol < 0x100) + { + CProb *probLit = prob + symbol; + RC_GET_BIT(probLit, symbol) + } + previousByte = (unsigned char)symbol; + + outStream[nowPos++] = previousByte; + if (distanceLimit < dictionarySize) + distanceLimit++; + + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + if (state < 4) state = 0; + else if (state < 10) state -= 3; + else state -= 6; + } + else + { + UpdateBit1(prob); + prob = p + IsRep + state; + IfBit0(prob) + { + UpdateBit0(prob); + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + state = state < kNumLitStates ? 0 : 3; + prob = p + LenCoder; + } + else + { + UpdateBit1(prob); + prob = p + IsRepG0 + state; + IfBit0(prob) + { + UpdateBit0(prob); + prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState; + IfBit0(prob) + { + UInt32 pos; + UpdateBit0(prob); + if (distanceLimit == 0) + return LZMA_RESULT_DATA_ERROR; + if (distanceLimit < dictionarySize) + distanceLimit++; + state = state < kNumLitStates ? 9 : 11; + pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + previousByte = dictionary[pos]; + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + outStream[nowPos++] = previousByte; + continue; + } + else + { + UpdateBit1(prob); + } + } + else + { + UInt32 distance; + UpdateBit1(prob); + prob = p + IsRepG1 + state; + IfBit0(prob) + { + UpdateBit0(prob); + distance = rep1; + } + else + { + UpdateBit1(prob); + prob = p + IsRepG2 + state; + IfBit0(prob) + { + UpdateBit0(prob); + distance = rep2; + } + else + { + UpdateBit1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = p + RepLenCoder; + } + { + int numBits, offset; + CProb *probLen = prob + LenChoice; + IfBit0(probLen) + { + UpdateBit0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + numBits = kLenNumLowBits; + } + else + { + UpdateBit1(probLen); + probLen = prob + LenChoice2; + IfBit0(probLen) + { + UpdateBit0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + numBits = kLenNumMidBits; + } + else + { + UpdateBit1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + numBits = kLenNumHighBits; + } + } + RangeDecoderBitTreeDecode(probLen, numBits, len); + len += offset; + } + + if (state < 4) + { + int posSlot; + state += kNumLitStates; + prob = p + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + int numDirectBits = ((posSlot >> 1) - 1); + rep0 = (2 | ((UInt32)posSlot & 1)); + if (posSlot < kEndPosModelIndex) + { + rep0 <<= numDirectBits; + prob = p + SpecPos + rep0 - posSlot - 1; + } + else + { + numDirectBits -= kNumAlignBits; + do + { + RC_NORMALIZE + Range >>= 1; + rep0 <<= 1; + if (Code >= Range) + { + Code -= Range; + rep0 |= 1; + } + } + while (--numDirectBits != 0); + prob = p + Align; + rep0 <<= kNumAlignBits; + numDirectBits = kNumAlignBits; + } + { + int i = 1; + int mi = 1; + do + { + CProb *prob3 = prob + mi; + RC_GET_BIT2(prob3, mi, ; , rep0 |= i); + i <<= 1; + } + while(--numDirectBits != 0); + } + } + else + rep0 = posSlot; + if (++rep0 == (UInt32)(0)) + { + /* it's for stream version */ + len = kLzmaStreamWasFinishedId; + break; + } + } + + len += kMatchMinLen; + if (rep0 > distanceLimit) + return LZMA_RESULT_DATA_ERROR; + if (dictionarySize - distanceLimit > (UInt32)len) + distanceLimit += len; + else + distanceLimit = dictionarySize; + + do + { + UInt32 pos = dictionaryPos - rep0; + if (pos >= dictionarySize) + pos += dictionarySize; + previousByte = dictionary[pos]; + dictionary[dictionaryPos] = previousByte; + if (++dictionaryPos == dictionarySize) + dictionaryPos = 0; + len--; + outStream[nowPos++] = previousByte; + } + while(len != 0 && nowPos < outSize); + } + } + } + RC_NORMALIZE; + + BufferSize -= (int)(Buffer - vs->Buffer); + if (BufferSize < 0) + return LZMA_RESULT_DATA_ERROR; + { + int i; + for (i = 0; i < BufferSize; i++) + vs->Buffer[i] = Buffer[i]; + } + vs->BufferSize = BufferSize; + vs->Range = Range; + vs->Code = Code; + vs->DictionaryPos = dictionaryPos; + vs->GlobalPos = (UInt32)(globalPos + nowPos); + vs->DistanceLimit = distanceLimit; + vs->Reps[0] = rep0; + vs->Reps[1] = rep1; + vs->Reps[2] = rep2; + vs->Reps[3] = rep3; + vs->State = state; + vs->RemainLen = len; + vs->TempDictionary[0] = tempDictionary[0]; + + (*outSizeProcessed) = nowPos; + return LZMA_RESULT_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lzma/LzmaStateDecode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lzma/LzmaStateDecode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,96 @@ +/* + LzmaStateDecode.h + LZMA Decoder interface (State version) + + LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01) + http://www.7-zip.org/ + + LZMA SDK is licensed under two licenses: + 1) GNU Lesser General Public License (GNU LGPL) + 2) Common Public License (CPL) + It means that you can select one of these two licenses and + follow rules of that license. + + SPECIAL EXCEPTION: + Igor Pavlov, as the author of this code, expressly permits you to + statically or dynamically link your code (or bind by name) to the + interfaces of this file without subjecting your linked code to the + terms of the CPL or GNU LGPL. Any modifications or additions + to this file, however, are subject to the LGPL or CPL terms. +*/ + +#ifndef __LZMASTATEDECODE_H +#define __LZMASTATEDECODE_H + +#include "LzmaTypes.h" + +/* #define _LZMA_PROB32 */ +/* It can increase speed on some 32-bit CPUs, + but memory usage will be doubled in that case */ + +#ifdef _LZMA_PROB32 +#define CProb UInt32 +#else +#define CProb UInt16 +#endif + +#define LZMA_RESULT_OK 0 +#define LZMA_RESULT_DATA_ERROR 1 + +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 768 + +#define LZMA_PROPERTIES_SIZE 5 + +typedef struct _CLzmaProperties +{ + int lc; + int lp; + int pb; + UInt32 DictionarySize; +}CLzmaProperties; + +int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size); + +#define LzmaGetNumProbs(lzmaProps) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((lzmaProps)->lc + (lzmaProps)->lp))) + +#define kLzmaInBufferSize 64 /* don't change it. it must be larger than kRequiredInBufferSize */ + +#define kLzmaNeedInitId (-2) + +typedef struct _CLzmaDecoderState +{ + CLzmaProperties Properties; + CProb *Probs; + unsigned char *Dictionary; + + unsigned char Buffer[kLzmaInBufferSize]; + int BufferSize; + + UInt32 Range; + UInt32 Code; + UInt32 DictionaryPos; + UInt32 GlobalPos; + UInt32 DistanceLimit; + UInt32 Reps[4]; + int State; + int RemainLen; /* -2: decoder needs internal initialization + -1: stream was finished, + 0: ok + > 0: need to write RemainLen bytes as match Reps[0], + */ + unsigned char TempDictionary[4]; /* it's required when DictionarySize = 0 */ +} CLzmaDecoderState; + +#define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; (vs)->BufferSize = 0; } + +/* LzmaDecode: decoding from input stream to output stream. + If finishDecoding != 0, then there are no more bytes in input stream + after inStream[inSize - 1]. */ + +int LzmaDecode(CLzmaDecoderState *vs, + const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed, + unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed, + int finishDecoding); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lzma/LzmaStateTest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lzma/LzmaStateTest.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,195 @@ +/* +LzmaStateTest.c +Test application for LZMA Decoder (State version) + +This file written and distributed to public domain by Igor Pavlov. +This file is part of LZMA SDK 4.26 (2005-08-02) +*/ + +#include +#include +#include + +#include "LzmaStateDecode.h" + +const char *kCantReadMessage = "Can not read input file"; +const char *kCantWriteMessage = "Can not write output file"; +const char *kCantAllocateMessage = "Can not allocate memory"; + +#define kInBufferSize (1 << 15) +#define kOutBufferSize (1 << 15) + +unsigned char g_InBuffer[kInBufferSize]; +unsigned char g_OutBuffer[kOutBufferSize]; + +size_t MyReadFile(FILE *file, void *data, size_t size) + { return fread(data, 1, size, file); } + +int MyReadFileAndCheck(FILE *file, void *data, size_t size) + { return (MyReadFile(file, data, size) == size); } + +int PrintError(char *buffer, const char *message) +{ + sprintf(buffer + strlen(buffer), "\nError: "); + sprintf(buffer + strlen(buffer), message); + return 1; +} + +int main3(FILE *inFile, FILE *outFile, char *rs) +{ + /* We use two 32-bit integers to construct 64-bit integer for file size. + You can remove outSizeHigh, if you don't need >= 4GB supporting, + or you can use UInt64 outSize, if your compiler supports 64-bit integers*/ + UInt32 outSize = 0; + UInt32 outSizeHigh = 0; + + int waitEOS = 1; + /* waitEOS = 1, if there is no uncompressed size in headers, + so decoder will wait EOS (End of Stream Marker) in compressed stream */ + + int i; + int res = 0; + CLzmaDecoderState state; /* it's about 140 bytes structure, if int is 32-bit */ + unsigned char properties[LZMA_PROPERTIES_SIZE]; + SizeT inAvail = 0; + unsigned char *inBuffer = 0; + + if (sizeof(UInt32) < 4) + return PrintError(rs, "LZMA decoder needs correct UInt32"); + + /* Read LZMA properties for compressed stream */ + + if (!MyReadFileAndCheck(inFile, properties, sizeof(properties))) + return PrintError(rs, kCantReadMessage); + + /* Read uncompressed size */ + + for (i = 0; i < 8; i++) + { + unsigned char b; + if (!MyReadFileAndCheck(inFile, &b, 1)) + return PrintError(rs, kCantReadMessage); + if (b != 0xFF) + waitEOS = 0; + if (i < 4) + outSize += (UInt32)(b) << (i * 8); + else + outSizeHigh += (UInt32)(b) << ((i - 4) * 8); + } + + /* Decode LZMA properties and allocate memory */ + + if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK) + return PrintError(rs, "Incorrect stream properties"); + state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); + if (state.Probs == 0) + return PrintError(rs, kCantAllocateMessage); + + if (state.Properties.DictionarySize == 0) + state.Dictionary = 0; + else + { + state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); + if (state.Dictionary == 0) + { + free(state.Probs); + return PrintError(rs, kCantAllocateMessage); + } + } + + /* Decompress */ + + LzmaDecoderInit(&state); + + do + { + SizeT inProcessed, outProcessed; + int finishDecoding; + UInt32 outAvail = kOutBufferSize; + if (!waitEOS && outSizeHigh == 0 && outAvail > outSize) + outAvail = outSize; + if (inAvail == 0) + { + inAvail = (SizeT)MyReadFile(inFile, g_InBuffer, kInBufferSize); + inBuffer = g_InBuffer; + } + finishDecoding = (inAvail == 0); + res = LzmaDecode(&state, + inBuffer, inAvail, &inProcessed, + g_OutBuffer, outAvail, &outProcessed, + finishDecoding); + if (res != 0) + { + sprintf(rs + strlen(rs), "\nDecoding error = %d\n", res); + res = 1; + break; + } + inAvail -= inProcessed; + inBuffer += inProcessed; + + if (outFile != 0) + if (fwrite(g_OutBuffer, 1, outProcessed, outFile) != outProcessed) + { + PrintError(rs, kCantWriteMessage); + res = 1; + break; + } + + if (outSize < outProcessed) + outSizeHigh--; + outSize -= (UInt32)outProcessed; + outSize &= 0xFFFFFFFF; + + if (outProcessed == 0 && finishDecoding) + { + if (!waitEOS && (outSize != 0 || outSizeHigh != 0)) + res = 1; + break; + } + } + while ((outSize != 0 && outSizeHigh == 0) || outSizeHigh != 0 || waitEOS); + + free(state.Dictionary); + free(state.Probs); + return res; +} + +int main2(int numArgs, const char *args[], char *rs) +{ + FILE *inFile = 0; + FILE *outFile = 0; + int res; + + sprintf(rs + strlen(rs), "\nLZMA Decoder 4.26 Copyright (c) 1999-2005 Igor Pavlov 2005-08-02\n"); + if (numArgs < 2 || numArgs > 3) + { + sprintf(rs + strlen(rs), "\nUsage: lzmadec file.lzma [outFile]\n"); + return 1; + } + + inFile = fopen(args[1], "rb"); + if (inFile == 0) + return PrintError(rs, "Can not open input file"); + + if (numArgs > 2) + { + outFile = fopen(args[2], "wb+"); + if (outFile == 0) + return PrintError(rs, "Can not open output file"); + } + + res = main3(inFile, outFile, rs); + + if (outFile != 0) + fclose(outFile); + fclose(inFile); + return res; +} + +int main(int numArgs, const char *args[]) +{ + char rs[800] = { 0 }; + int res = main2(numArgs, args, rs); + printf(rs); + return res; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lzma/LzmaTest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lzma/LzmaTest.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,342 @@ +/* +LzmaTest.c +Test application for LZMA Decoder + +This file written and distributed to public domain by Igor Pavlov. +This file is part of LZMA SDK 4.26 (2005-08-05) +*/ + +#include +#include +#include + +#include "LzmaDecode.h" + +const char *kCantReadMessage = "Can not read input file"; +const char *kCantWriteMessage = "Can not write output file"; +const char *kCantAllocateMessage = "Can not allocate memory"; + +size_t MyReadFile(FILE *file, void *data, size_t size) +{ + if (size == 0) + return 0; + return fread(data, 1, size, file); +} + +int MyReadFileAndCheck(FILE *file, void *data, size_t size) + { return (MyReadFile(file, data, size) == size);} + +size_t MyWriteFile(FILE *file, const void *data, size_t size) +{ + if (size == 0) + return 0; + return fwrite(data, 1, size, file); +} + +int MyWriteFileAndCheck(FILE *file, const void *data, size_t size) + { return (MyWriteFile(file, data, size) == size); } + +#ifdef _LZMA_IN_CB +#define kInBufferSize (1 << 15) +typedef struct _CBuffer +{ + ILzmaInCallback InCallback; + FILE *File; + unsigned char Buffer[kInBufferSize]; +} CBuffer; + +int LzmaReadCompressed(void *object, const unsigned char **buffer, SizeT *size) +{ + CBuffer *b = (CBuffer *)object; + *buffer = b->Buffer; + *size = (SizeT)MyReadFile(b->File, b->Buffer, kInBufferSize); + return LZMA_RESULT_OK; +} +CBuffer g_InBuffer; + +#endif + +#ifdef _LZMA_OUT_READ +#define kOutBufferSize (1 << 15) +unsigned char g_OutBuffer[kOutBufferSize]; +#endif + +int PrintError(char *buffer, const char *message) +{ + sprintf(buffer + strlen(buffer), "\nError: "); + sprintf(buffer + strlen(buffer), message); + return 1; +} + +int main3(FILE *inFile, FILE *outFile, char *rs) +{ + /* We use two 32-bit integers to construct 64-bit integer for file size. + You can remove outSizeHigh, if you don't need >= 4GB supporting, + or you can use UInt64 outSize, if your compiler supports 64-bit integers*/ + UInt32 outSize = 0; + UInt32 outSizeHigh = 0; + #ifndef _LZMA_OUT_READ + SizeT outSizeFull; + unsigned char *outStream; + #endif + + int waitEOS = 1; + /* waitEOS = 1, if there is no uncompressed size in headers, + so decoder will wait EOS (End of Stream Marker) in compressed stream */ + + #ifndef _LZMA_IN_CB + SizeT compressedSize; + unsigned char *inStream; + #endif + + CLzmaDecoderState state; /* it's about 24-80 bytes structure, if int is 32-bit */ + unsigned char properties[LZMA_PROPERTIES_SIZE]; + + int res; + + #ifdef _LZMA_IN_CB + g_InBuffer.File = inFile; + #endif + + if (sizeof(UInt32) < 4) + return PrintError(rs, "LZMA decoder needs correct UInt32"); + + #ifndef _LZMA_IN_CB + { + long length; + fseek(inFile, 0, SEEK_END); + length = ftell(inFile); + fseek(inFile, 0, SEEK_SET); + if ((long)(SizeT)length != length) + return PrintError(rs, "Too big compressed stream"); + compressedSize = (SizeT)(length - (LZMA_PROPERTIES_SIZE + 8)); + } + #endif + + /* Read LZMA properties for compressed stream */ + + if (!MyReadFileAndCheck(inFile, properties, sizeof(properties))) + return PrintError(rs, kCantReadMessage); + + /* Read uncompressed size */ + + { + int i; + for (i = 0; i < 8; i++) + { + unsigned char b; + if (!MyReadFileAndCheck(inFile, &b, 1)) + return PrintError(rs, kCantReadMessage); + if (b != 0xFF) + waitEOS = 0; + if (i < 4) + outSize += (UInt32)(b) << (i * 8); + else + outSizeHigh += (UInt32)(b) << ((i - 4) * 8); + } + + #ifndef _LZMA_OUT_READ + if (waitEOS) + return PrintError(rs, "Stream with EOS marker is not supported"); + outSizeFull = (SizeT)outSize; + if (sizeof(SizeT) >= 8) + outSizeFull |= (((SizeT)outSizeHigh << 16) << 16); + else if (outSizeHigh != 0 || (UInt32)(SizeT)outSize != outSize) + return PrintError(rs, "Too big uncompressed stream"); + #endif + } + + /* Decode LZMA properties and allocate memory */ + + if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK) + return PrintError(rs, "Incorrect stream properties"); + state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); + + #ifdef _LZMA_OUT_READ + if (state.Properties.DictionarySize == 0) + state.Dictionary = 0; + else + state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); + #else + if (outSizeFull == 0) + outStream = 0; + else + outStream = (unsigned char *)malloc(outSizeFull); + #endif + + #ifndef _LZMA_IN_CB + if (compressedSize == 0) + inStream = 0; + else + inStream = (unsigned char *)malloc(compressedSize); + #endif + + if (state.Probs == 0 + #ifdef _LZMA_OUT_READ + || (state.Dictionary == 0 && state.Properties.DictionarySize != 0) + #else + || (outStream == 0 && outSizeFull != 0) + #endif + #ifndef _LZMA_IN_CB + || (inStream == 0 && compressedSize != 0) + #endif + ) + { + free(state.Probs); + #ifdef _LZMA_OUT_READ + free(state.Dictionary); + #else + free(outStream); + #endif + #ifndef _LZMA_IN_CB + free(inStream); + #endif + return PrintError(rs, kCantAllocateMessage); + } + + /* Decompress */ + + #ifdef _LZMA_IN_CB + g_InBuffer.InCallback.Read = LzmaReadCompressed; + #else + if (!MyReadFileAndCheck(inFile, inStream, compressedSize)) + return PrintError(rs, kCantReadMessage); + #endif + + #ifdef _LZMA_OUT_READ + { + #ifndef _LZMA_IN_CB + SizeT inAvail = compressedSize; + const unsigned char *inBuffer = inStream; + #endif + LzmaDecoderInit(&state); + do + { + #ifndef _LZMA_IN_CB + SizeT inProcessed; + #endif + SizeT outProcessed; + SizeT outAvail = kOutBufferSize; + if (!waitEOS && outSizeHigh == 0 && outAvail > outSize) + outAvail = (SizeT)outSize; + res = LzmaDecode(&state, + #ifdef _LZMA_IN_CB + &g_InBuffer.InCallback, + #else + inBuffer, inAvail, &inProcessed, + #endif + g_OutBuffer, outAvail, &outProcessed); + if (res != 0) + { + sprintf(rs + strlen(rs), "\nDecoding error = %d\n", res); + res = 1; + break; + } + #ifndef _LZMA_IN_CB + inAvail -= inProcessed; + inBuffer += inProcessed; + #endif + + if (outFile != 0) + if (!MyWriteFileAndCheck(outFile, g_OutBuffer, (size_t)outProcessed)) + { + PrintError(rs, kCantWriteMessage); + res = 1; + break; + } + + if (outSize < outProcessed) + outSizeHigh--; + outSize -= (UInt32)outProcessed; + outSize &= 0xFFFFFFFF; + + if (outProcessed == 0) + { + if (!waitEOS && (outSize != 0 || outSizeHigh != 0)) + res = 1; + break; + } + } + while ((outSize != 0 && outSizeHigh == 0) || outSizeHigh != 0 || waitEOS); + } + + #else + { + #ifndef _LZMA_IN_CB + SizeT inProcessed; + #endif + SizeT outProcessed; + res = LzmaDecode(&state, + #ifdef _LZMA_IN_CB + &g_InBuffer.InCallback, + #else + inStream, compressedSize, &inProcessed, + #endif + outStream, outSizeFull, &outProcessed); + if (res != 0) + { + sprintf(rs + strlen(rs), "\nDecoding error = %d\n", res); + res = 1; + } + else if (outFile != 0) + { + if (!MyWriteFileAndCheck(outFile, outStream, (size_t)outProcessed)) + { + PrintError(rs, kCantWriteMessage); + res = 1; + } + } + } + #endif + + free(state.Probs); + #ifdef _LZMA_OUT_READ + free(state.Dictionary); + #else + free(outStream); + #endif + #ifndef _LZMA_IN_CB + free(inStream); + #endif + return res; +} + +int main2(int numArgs, const char *args[], char *rs) +{ + FILE *inFile = 0; + FILE *outFile = 0; + int res; + + sprintf(rs + strlen(rs), "\nLZMA Decoder 4.26 Copyright (c) 1999-2005 Igor Pavlov 2005-08-05\n"); + if (numArgs < 2 || numArgs > 3) + { + sprintf(rs + strlen(rs), "\nUsage: lzmadec file.lzma [outFile]\n"); + return 1; + } + + inFile = fopen(args[1], "rb"); + if (inFile == 0) + return PrintError(rs, "Can not open input file"); + + if (numArgs > 2) + { + outFile = fopen(args[2], "wb+"); + if (outFile == 0) + return PrintError(rs, "Can not open output file"); + } + + res = main3(inFile, outFile, rs); + + if (outFile != 0) + fclose(outFile); + fclose(inFile); + return res; +} + +int main(int numArgs, const char *args[]) +{ + char rs[800] = { 0 }; + int res = main2(numArgs, args, rs); + printf(rs); + return res; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Compress/Lzma/LzmaTypes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Compress/Lzma/LzmaTypes.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,45 @@ +/* +LzmaTypes.h + +Types for LZMA Decoder + +This file written and distributed to public domain by Igor Pavlov. +This file is part of LZMA SDK 4.40 (2006-05-01) +*/ + +#ifndef __LZMATYPES_H +#define __LZMATYPES_H + +#ifndef _7ZIP_BYTE_DEFINED +#define _7ZIP_BYTE_DEFINED +typedef unsigned char Byte; +#endif + +#ifndef _7ZIP_UINT16_DEFINED +#define _7ZIP_UINT16_DEFINED +typedef unsigned short UInt16; +#endif + +#ifndef _7ZIP_UINT32_DEFINED +#define _7ZIP_UINT32_DEFINED +#ifdef _LZMA_UINT32_IS_ULONG +typedef unsigned long UInt32; +#else +typedef unsigned int UInt32; +#endif +#endif + +/* #define _LZMA_NO_SYSTEM_SIZE_T */ +/* You can use it, if you don't want */ + +#ifndef _7ZIP_SIZET_DEFINED +#define _7ZIP_SIZET_DEFINED +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +#include +typedef size_t SizeT; +#endif +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/CpuArch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/CpuArch.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,18 @@ +/* CpuArch.h */ + +#ifndef __CPUARCH_H +#define __CPUARCH_H + +/* +LITTLE_ENDIAN_UNALIGN means: + 1) CPU is LITTLE_ENDIAN + 2) it's allowed to make unaligned memory accesses +if LITTLE_ENDIAN_UNALIGN is not defined, it means that we don't know +about these properties of platform. +*/ + +#if defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || defined(__i386__) || defined(__x86_64__) +#define LITTLE_ENDIAN_UNALIGN +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/IStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/IStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,19 @@ +/* IStream.h */ + +#ifndef __C_ISTREAM_H +#define __C_ISTREAM_H + +#include "Types.h" + +typedef struct _ISeqInStream +{ + HRes (*Read)(void *object, void *data, UInt32 size, UInt32 *processedSize); +} ISeqInStream; + +typedef struct _ISzAlloc +{ + void *(*Alloc)(size_t size); + void (*Free)(void *address); /* address can be 0 */ +} ISzAlloc; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Sort.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Sort.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,92 @@ +/* Sort.c */ + +#include "Sort.h" + +#define HeapSortDown(p, k, size, temp) \ + { for (;;) { \ + UInt32 s = (k << 1); \ + if (s > size) break; \ + if (s < size && p[s + 1] > p[s]) s++; \ + if (temp >= p[s]) break; \ + p[k] = p[s]; k = s; \ + } p[k] = temp; } + +void HeapSort(UInt32 *p, UInt32 size) +{ + if (size <= 1) + return; + p--; + { + UInt32 i = size / 2; + do + { + UInt32 temp = p[i]; + UInt32 k = i; + HeapSortDown(p, k, size, temp) + } + while(--i != 0); + } + /* + do + { + UInt32 k = 1; + UInt32 temp = p[size]; + p[size--] = p[1]; + HeapSortDown(p, k, size, temp) + } + while (size > 1); + */ + while (size > 3) + { + UInt32 temp = p[size]; + UInt32 k = (p[3] > p[2]) ? 3 : 2; + p[size--] = p[1]; + p[1] = p[k]; + HeapSortDown(p, k, size, temp) + } + { + UInt32 temp = p[size]; + p[size] = p[1]; + if (size > 2 && p[2] < temp) + { + p[1] = p[2]; + p[2] = temp; + } + else + p[1] = temp; + } +} + +/* +#define HeapSortRefDown(p, vals, n, size, temp) \ + { UInt32 k = n; UInt32 val = vals[temp]; for (;;) { \ + UInt32 s = (k << 1); \ + if (s > size) break; \ + if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \ + if (val >= vals[p[s]]) break; \ + p[k] = p[s]; k = s; \ + } p[k] = temp; } + +void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size) +{ + if (size <= 1) + return; + p--; + { + UInt32 i = size / 2; + do + { + UInt32 temp = p[i]; + HeapSortRefDown(p, vals, i, size, temp); + } + while(--i != 0); + } + do + { + UInt32 temp = p[size]; + p[size--] = p[1]; + HeapSortRefDown(p, vals, 1, size, temp); + } + while (size > 1); +} +*/ \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Sort.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Sort.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,11 @@ +/* Sort.h */ + +#ifndef __7Z_Sort_H +#define __7Z_Sort_H + +#include "Types.h" + +void HeapSort(UInt32 *p, UInt32 size); +/* void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size); */ + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Threads.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Threads.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,106 @@ +/* Threads.c */ + +#include "Threads.h" +#include + +HRes GetError() +{ + DWORD res = GetLastError(); + return (res) ? (HRes)(res) : SZE_FAIL; +} + +HRes BoolToHRes(int v) { return v ? SZ_OK : GetError(); } +HRes BOOLToHRes(BOOL v) { return v ? SZ_OK : GetError(); } + +HRes MyCloseHandle(HANDLE *h) +{ + if (*h != NULL) + if (!CloseHandle(*h)) + return GetError(); + *h = NULL; + return SZ_OK; +} + +HRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter) +{ + unsigned threadId; /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ + thread->handle = + /* CreateThread(0, 0, startAddress, parameter, 0, &threadId); */ + (HANDLE)_beginthreadex(NULL, 0, startAddress, parameter, 0, &threadId); + /* maybe we must use errno here, but probably GetLastError() is also OK. */ + return BoolToHRes(thread->handle != 0); +} + +HRes WaitObject(HANDLE h) +{ + return (HRes)WaitForSingleObject(h, INFINITE); +} + +HRes Thread_Wait(CThread *thread) +{ + if (thread->handle == NULL) + return 1; + return WaitObject(thread->handle); +} + +HRes Thread_Close(CThread *thread) +{ + return MyCloseHandle(&thread->handle); +} + +HRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled) +{ + p->handle = CreateEvent(NULL, manualReset, (initialSignaled ? TRUE : FALSE), NULL); + return BoolToHRes(p->handle != 0); +} + +HRes ManualResetEvent_Create(CManualResetEvent *p, int initialSignaled) + { return Event_Create(p, TRUE, initialSignaled); } +HRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) + { return ManualResetEvent_Create(p, 0); } + +HRes AutoResetEvent_Create(CAutoResetEvent *p, int initialSignaled) + { return Event_Create(p, FALSE, initialSignaled); } +HRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) + { return AutoResetEvent_Create(p, 0); } + +HRes Event_Set(CEvent *p) { return BOOLToHRes(SetEvent(p->handle)); } +HRes Event_Reset(CEvent *p) { return BOOLToHRes(ResetEvent(p->handle)); } +HRes Event_Wait(CEvent *p) { return WaitObject(p->handle); } +HRes Event_Close(CEvent *p) { return MyCloseHandle(&p->handle); } + + +HRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount) +{ + p->handle = CreateSemaphore(NULL, (LONG)initiallyCount, (LONG)maxCount, NULL); + return BoolToHRes(p->handle != 0); +} + +HRes Semaphore_Release(CSemaphore *p, LONG releaseCount, LONG *previousCount) +{ + return BOOLToHRes(ReleaseSemaphore(p->handle, releaseCount, previousCount)); +} +HRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount) +{ + return Semaphore_Release(p, (LONG)releaseCount, NULL); +} +HRes Semaphore_Release1(CSemaphore *p) +{ + return Semaphore_ReleaseN(p, 1); +} + +HRes Semaphore_Wait(CSemaphore *p) { return WaitObject(p->handle); } +HRes Semaphore_Close(CSemaphore *p) { return MyCloseHandle(&p->handle); } + +HRes CriticalSection_Init(CCriticalSection *p) +{ + /* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */ + __try + { + InitializeCriticalSection(p); + /* InitializeCriticalSectionAndSpinCount(p, 0); */ + } + __except (EXCEPTION_EXECUTE_HANDLER) { return SZE_OUTOFMEMORY; } + return SZ_OK; +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Threads.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Threads.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,69 @@ +/* Threads.h */ + +#ifndef __7Z_THRESDS_H +#define __7Z_THRESDS_H + +#include + +#include "Types.h" + +typedef struct _CThread +{ + HANDLE handle; +} CThread; + +#define Thread_Construct(thread) (thread)->handle = NULL +#define Thread_WasCreated(thread) ((thread)->handle != NULL) + +typedef unsigned THREAD_FUNC_RET_TYPE; +#define THREAD_FUNC_CALL_TYPE StdCall +#define THREAD_FUNC_DECL THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE + +HRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter); +HRes Thread_Wait(CThread *thread); +HRes Thread_Close(CThread *thread); + +typedef struct _CEvent +{ + HANDLE handle; +} CEvent; + +typedef CEvent CAutoResetEvent; +typedef CEvent CManualResetEvent; + +#define Event_Construct(event) (event)->handle = NULL +#define Event_IsCreated(event) ((event)->handle != NULL) + +HRes ManualResetEvent_Create(CManualResetEvent *event, int initialSignaled); +HRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *event); +HRes AutoResetEvent_Create(CAutoResetEvent *event, int initialSignaled); +HRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *event); +HRes Event_Set(CEvent *event); +HRes Event_Reset(CEvent *event); +HRes Event_Wait(CEvent *event); +HRes Event_Close(CEvent *event); + + +typedef struct _CSemaphore +{ + HANDLE handle; +} CSemaphore; + +#define Semaphore_Construct(p) (p)->handle = NULL + +HRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount); +HRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); +HRes Semaphore_Release1(CSemaphore *p); +HRes Semaphore_Wait(CSemaphore *p); +HRes Semaphore_Close(CSemaphore *p); + + +typedef CRITICAL_SECTION CCriticalSection; + +HRes CriticalSection_Init(CCriticalSection *p); +#define CriticalSection_Delete(p) DeleteCriticalSection(p) +#define CriticalSection_Enter(p) EnterCriticalSection(p) +#define CriticalSection_Leave(p) LeaveCriticalSection(p) + +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/C/Types.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/C/Types.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,100 @@ +/* 7zTypes.h */ + +#ifndef __C_TYPES_H +#define __C_TYPES_H + +#ifndef _7ZIP_BYTE_DEFINED +#define _7ZIP_BYTE_DEFINED +typedef unsigned char Byte; +#endif + +#ifndef _7ZIP_UINT16_DEFINED +#define _7ZIP_UINT16_DEFINED +typedef unsigned short UInt16; +#endif + +#ifndef _7ZIP_UINT32_DEFINED +#define _7ZIP_UINT32_DEFINED +#ifdef _LZMA_UINT32_IS_ULONG +typedef unsigned long UInt32; +#else +typedef unsigned int UInt32; +#endif +#endif + +#ifndef _7ZIP_INT32_DEFINED +#define _7ZIP_INT32_DEFINED +#ifdef _LZMA_INT32_IS_ULONG +typedef long Int32; +#else +typedef int Int32; +#endif +#endif + +/* #define _SZ_NO_INT_64 */ +/* define it your compiler doesn't support long long int */ + +#ifndef _7ZIP_UINT64_DEFINED +#define _7ZIP_UINT64_DEFINED +#ifdef _SZ_NO_INT_64 +typedef unsigned long UInt64; +#else +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 UInt64; +#else +typedef unsigned long long int UInt64; +#endif +#endif +#endif + + +/* #define _SZ_FILE_SIZE_32 */ +/* You can define _SZ_FILE_SIZE_32, if you don't need support for files larger than 4 GB*/ + +#ifndef CFileSize +#ifdef _SZ_FILE_SIZE_32 +typedef UInt32 CFileSize; +#else +typedef UInt64 CFileSize; +#endif +#endif + +#define SZ_RESULT int + +typedef int HRes; +#define RES_OK (0) + +#define SZ_OK (0) +#define SZE_DATA_ERROR (1) +#define SZE_CRC_ERROR (3) +#define SZE_ARCHIVE_ERROR (6) + +#define SZE_OUTOFMEMORY (0x8007000EL) +#define SZE_NOTIMPL (0x80004001L) +#define SZE_FAIL (0x80004005L) +#define SZE_INVALIDARG (0x80070057L) + + +#ifndef RINOK +#define RINOK(x) { HRes __result_ = (x); if(__result_ != 0) return __result_; } +#endif + +typedef int Bool; +#define True 1 +#define False 0 + +#ifdef _MSC_VER +#define StdCall __stdcall +#else +#define StdCall +#endif + +#if _MSC_VER >= 1300 +#define MY_FAST_CALL __declspec(noinline) __fastcall +#elif defined( _MSC_VER) +#define MY_FAST_CALL __fastcall +#else +#define MY_FAST_CALL +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7z.ico Binary file misc/libphysfs/lzma/CPP/7zip/Archive/7z/7z.ico has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zCompressionMode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zCompressionMode.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// CompressionMethod.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zCompressionMode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zCompressionMode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,50 @@ +// 7zCompressionMode.h + +#ifndef __7Z_COMPRESSION_MODE_H +#define __7Z_COMPRESSION_MODE_H + +#include "../../../Common/MyString.h" + +#include "../../../Windows/PropVariant.h" + +#include "../../Common/MethodProps.h" + +namespace NArchive { +namespace N7z { + +struct CMethodFull: public CMethod +{ + UInt32 NumInStreams; + UInt32 NumOutStreams; + bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); } +}; + +struct CBind +{ + UInt32 InCoder; + UInt32 InStream; + UInt32 OutCoder; + UInt32 OutStream; +}; + +struct CCompressionMethodMode +{ + CObjectVector Methods; + CRecordVector Binds; + #ifdef COMPRESS_MT + UInt32 NumThreads; + #endif + bool PasswordIsDefined; + UString Password; + + bool IsEmpty() const { return (Methods.IsEmpty() && !PasswordIsDefined); } + CCompressionMethodMode(): PasswordIsDefined(false) + #ifdef COMPRESS_MT + , NumThreads(1) + #endif + {} +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zDecode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zDecode.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,330 @@ +// 7zDecode.cpp + +#include "StdAfx.h" + +#include "7zDecode.h" + +#include "../../IPassword.h" +#include "../../Common/LockedStream.h" +#include "../../Common/StreamObjects.h" +#include "../../Common/ProgressUtils.h" +#include "../../Common/LimitedStreams.h" +#include "../../Common/CreateCoder.h" +#include "../../Common/FilterCoder.h" + +namespace NArchive { +namespace N7z { + +static void ConvertFolderItemInfoToBindInfo(const CFolder &folder, + CBindInfoEx &bindInfo) +{ + bindInfo.Clear(); + int i; + for (i = 0; i < folder.BindPairs.Size(); i++) + { + NCoderMixer::CBindPair bindPair; + bindPair.InIndex = (UInt32)folder.BindPairs[i].InIndex; + bindPair.OutIndex = (UInt32)folder.BindPairs[i].OutIndex; + bindInfo.BindPairs.Add(bindPair); + } + UInt32 outStreamIndex = 0; + for (i = 0; i < folder.Coders.Size(); i++) + { + NCoderMixer::CCoderStreamsInfo coderStreamsInfo; + const CCoderInfo &coderInfo = folder.Coders[i]; + coderStreamsInfo.NumInStreams = (UInt32)coderInfo.NumInStreams; + coderStreamsInfo.NumOutStreams = (UInt32)coderInfo.NumOutStreams; + bindInfo.Coders.Add(coderStreamsInfo); + bindInfo.CoderMethodIDs.Add(coderInfo.MethodID); + for (UInt32 j = 0; j < coderStreamsInfo.NumOutStreams; j++, outStreamIndex++) + if (folder.FindBindPairForOutStream(outStreamIndex) < 0) + bindInfo.OutStreams.Add(outStreamIndex); + } + for (i = 0; i < folder.PackStreams.Size(); i++) + bindInfo.InStreams.Add((UInt32)folder.PackStreams[i]); +} + +static bool AreCodersEqual(const NCoderMixer::CCoderStreamsInfo &a1, + const NCoderMixer::CCoderStreamsInfo &a2) +{ + return (a1.NumInStreams == a2.NumInStreams) && + (a1.NumOutStreams == a2.NumOutStreams); +} + +static bool AreBindPairsEqual(const NCoderMixer::CBindPair &a1, const NCoderMixer::CBindPair &a2) +{ + return (a1.InIndex == a2.InIndex) && + (a1.OutIndex == a2.OutIndex); +} + +static bool AreBindInfoExEqual(const CBindInfoEx &a1, const CBindInfoEx &a2) +{ + if (a1.Coders.Size() != a2.Coders.Size()) + return false; + int i; + for (i = 0; i < a1.Coders.Size(); i++) + if (!AreCodersEqual(a1.Coders[i], a2.Coders[i])) + return false; + if (a1.BindPairs.Size() != a2.BindPairs.Size()) + return false; + for (i = 0; i < a1.BindPairs.Size(); i++) + if (!AreBindPairsEqual(a1.BindPairs[i], a2.BindPairs[i])) + return false; + for (i = 0; i < a1.CoderMethodIDs.Size(); i++) + if (a1.CoderMethodIDs[i] != a2.CoderMethodIDs[i]) + return false; + if (a1.InStreams.Size() != a2.InStreams.Size()) + return false; + if (a1.OutStreams.Size() != a2.OutStreams.Size()) + return false; + return true; +} + +CDecoder::CDecoder(bool multiThread) +{ + #ifndef _ST_MODE + multiThread = true; + #endif + _multiThread = multiThread; + _bindInfoExPrevIsDefined = false; +} + +HRESULT CDecoder::Decode( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + UInt64 startPos, + const UInt64 *packSizes, + const CFolder &folderInfo, + ISequentialOutStream *outStream, + ICompressProgressInfo *compressProgress + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getTextPassword + #endif + #ifdef COMPRESS_MT + , bool mtMode, UInt32 numThreads + #endif + ) +{ + CObjectVector< CMyComPtr > inStreams; + + CLockedInStream lockedInStream; + lockedInStream.Init(inStream); + + for (int j = 0; j < folderInfo.PackStreams.Size(); j++) + { + CLockedSequentialInStreamImp *lockedStreamImpSpec = new + CLockedSequentialInStreamImp; + CMyComPtr lockedStreamImp = lockedStreamImpSpec; + lockedStreamImpSpec->Init(&lockedInStream, startPos); + startPos += packSizes[j]; + + CLimitedSequentialInStream *streamSpec = new + CLimitedSequentialInStream; + CMyComPtr inStream = streamSpec; + streamSpec->SetStream(lockedStreamImp); + streamSpec->Init(packSizes[j]); + inStreams.Add(inStream); + } + + int numCoders = folderInfo.Coders.Size(); + + CBindInfoEx bindInfo; + ConvertFolderItemInfoToBindInfo(folderInfo, bindInfo); + bool createNewCoders; + if (!_bindInfoExPrevIsDefined) + createNewCoders = true; + else + createNewCoders = !AreBindInfoExEqual(bindInfo, _bindInfoExPrev); + if (createNewCoders) + { + int i; + _decoders.Clear(); + // _decoders2.Clear(); + + _mixerCoder.Release(); + + if (_multiThread) + { + _mixerCoderMTSpec = new NCoderMixer::CCoderMixer2MT; + _mixerCoder = _mixerCoderMTSpec; + _mixerCoderCommon = _mixerCoderMTSpec; + } + else + { + #ifdef _ST_MODE + _mixerCoderSTSpec = new NCoderMixer::CCoderMixer2ST; + _mixerCoder = _mixerCoderSTSpec; + _mixerCoderCommon = _mixerCoderSTSpec; + #endif + } + RINOK(_mixerCoderCommon->SetBindInfo(bindInfo)); + + for (i = 0; i < numCoders; i++) + { + const CCoderInfo &coderInfo = folderInfo.Coders[i]; + + + CMyComPtr decoder; + CMyComPtr decoder2; + RINOK(CreateCoder( + EXTERNAL_CODECS_LOC_VARS + coderInfo.MethodID, decoder, decoder2, false)); + CMyComPtr decoderUnknown; + if (coderInfo.IsSimpleCoder()) + { + if (decoder == 0) + return E_NOTIMPL; + + decoderUnknown = (IUnknown *)decoder; + + if (_multiThread) + _mixerCoderMTSpec->AddCoder(decoder); + #ifdef _ST_MODE + else + _mixerCoderSTSpec->AddCoder(decoder, false); + #endif + } + else + { + if (decoder2 == 0) + return E_NOTIMPL; + decoderUnknown = (IUnknown *)decoder2; + if (_multiThread) + _mixerCoderMTSpec->AddCoder2(decoder2); + #ifdef _ST_MODE + else + _mixerCoderSTSpec->AddCoder2(decoder2, false); + #endif + } + _decoders.Add(decoderUnknown); + #ifdef EXTERNAL_CODECS + CMyComPtr setCompressCodecsInfo; + decoderUnknown.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo); + if (setCompressCodecsInfo) + { + RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecsInfo)); + } + #endif + } + _bindInfoExPrev = bindInfo; + _bindInfoExPrevIsDefined = true; + } + int i; + _mixerCoderCommon->ReInit(); + + UInt32 packStreamIndex = 0, unPackStreamIndex = 0; + UInt32 coderIndex = 0; + // UInt32 coder2Index = 0; + + for (i = 0; i < numCoders; i++) + { + const CCoderInfo &coderInfo = folderInfo.Coders[i]; + CMyComPtr &decoder = _decoders[coderIndex]; + + { + CMyComPtr setDecoderProperties; + decoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties); + if (setDecoderProperties) + { + const CByteBuffer &properties = coderInfo.Properties; + size_t size = properties.GetCapacity(); + if (size > 0xFFFFFFFF) + return E_NOTIMPL; + if (size > 0) + { + RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)properties, (UInt32)size)); + } + } + } + + #ifdef COMPRESS_MT + if (mtMode) + { + CMyComPtr setCoderMt; + decoder.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt); + if (setCoderMt) + { + RINOK(setCoderMt->SetNumberOfThreads(numThreads)); + } + } + #endif + + #ifndef _NO_CRYPTO + { + CMyComPtr cryptoSetPassword; + decoder.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword); + if (cryptoSetPassword) + { + if (getTextPassword == 0) + return E_FAIL; + CMyComBSTR password; + RINOK(getTextPassword->CryptoGetTextPassword(&password)); + CByteBuffer buffer; + UString unicodePassword(password); + const UInt32 sizeInBytes = unicodePassword.Length() * 2; + buffer.SetCapacity(sizeInBytes); + for (int i = 0; i < unicodePassword.Length(); i++) + { + wchar_t c = unicodePassword[i]; + ((Byte *)buffer)[i * 2] = (Byte)c; + ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8); + } + RINOK(cryptoSetPassword->CryptoSetPassword( + (const Byte *)buffer, sizeInBytes)); + } + } + #endif + + coderIndex++; + + UInt32 numInStreams = (UInt32)coderInfo.NumInStreams; + UInt32 numOutStreams = (UInt32)coderInfo.NumOutStreams; + CRecordVector packSizesPointers; + CRecordVector unPackSizesPointers; + packSizesPointers.Reserve(numInStreams); + unPackSizesPointers.Reserve(numOutStreams); + UInt32 j; + for (j = 0; j < numOutStreams; j++, unPackStreamIndex++) + unPackSizesPointers.Add(&folderInfo.UnPackSizes[unPackStreamIndex]); + + for (j = 0; j < numInStreams; j++, packStreamIndex++) + { + int bindPairIndex = folderInfo.FindBindPairForInStream(packStreamIndex); + if (bindPairIndex >= 0) + packSizesPointers.Add( + &folderInfo.UnPackSizes[(UInt32)folderInfo.BindPairs[bindPairIndex].OutIndex]); + else + { + int index = folderInfo.FindPackStreamArrayIndex(packStreamIndex); + if (index < 0) + return E_FAIL; + packSizesPointers.Add(&packSizes[index]); + } + } + + _mixerCoderCommon->SetCoderInfo(i, + &packSizesPointers.Front(), + &unPackSizesPointers.Front()); + } + UInt32 mainCoder, temp; + bindInfo.FindOutStream(bindInfo.OutStreams[0], mainCoder, temp); + + if (_multiThread) + _mixerCoderMTSpec->SetProgressCoderIndex(mainCoder); + /* + else + _mixerCoderSTSpec->SetProgressCoderIndex(mainCoder);; + */ + + if (numCoders == 0) + return 0; + CRecordVector inStreamPointers; + inStreamPointers.Reserve(inStreams.Size()); + for (i = 0; i < inStreams.Size(); i++) + inStreamPointers.Add(inStreams[i]); + ISequentialOutStream *outStreamPointer = outStream; + return _mixerCoder->Code(&inStreamPointers.Front(), NULL, + inStreams.Size(), &outStreamPointer, NULL, 1, compressProgress); +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zDecode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zDecode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,68 @@ +// 7zDecode.h + +#ifndef __7Z_DECODE_H +#define __7Z_DECODE_H + +#include "../../IStream.h" +#include "../../IPassword.h" + +#include "../Common/CoderMixer2.h" +#include "../Common/CoderMixer2MT.h" +#ifdef _ST_MODE +#include "../Common/CoderMixer2ST.h" +#endif + +#include "../../Common/CreateCoder.h" + +#include "7zItem.h" + +namespace NArchive { +namespace N7z { + +struct CBindInfoEx: public NCoderMixer::CBindInfo +{ + CRecordVector CoderMethodIDs; + void Clear() + { + CBindInfo::Clear(); + CoderMethodIDs.Clear(); + } +}; + +class CDecoder +{ + bool _bindInfoExPrevIsDefined; + CBindInfoEx _bindInfoExPrev; + + bool _multiThread; + #ifdef _ST_MODE + NCoderMixer::CCoderMixer2ST *_mixerCoderSTSpec; + #endif + NCoderMixer::CCoderMixer2MT *_mixerCoderMTSpec; + NCoderMixer::CCoderMixer2 *_mixerCoderCommon; + + CMyComPtr _mixerCoder; + CObjectVector > _decoders; + // CObjectVector > _decoders2; +public: + CDecoder(bool multiThread); + HRESULT Decode( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + UInt64 startPos, + const UInt64 *packSizes, + const CFolder &folder, + ISequentialOutStream *outStream, + ICompressProgressInfo *compressProgress + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getTextPasswordSpec + #endif + #ifdef COMPRESS_MT + , bool mtMode, UInt32 numThreads + #endif + ); +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zEncode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zEncode.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,453 @@ +// Encode.cpp + +#include "StdAfx.h" + +#include "7zEncode.h" +#include "7zSpecStream.h" + +#include "../../IPassword.h" +#include "../../Common/ProgressUtils.h" +#include "../../Common/LimitedStreams.h" +#include "../../Common/InOutTempBuffer.h" +#include "../../Common/StreamObjects.h" +#include "../../Common/CreateCoder.h" +#include "../../Common/FilterCoder.h" + +static const UInt64 k_AES = 0x06F10701; +static const UInt64 k_BCJ = 0x03030103; +static const UInt64 k_BCJ2 = 0x0303011B; + +namespace NArchive { +namespace N7z { + +static void ConvertBindInfoToFolderItemInfo(const NCoderMixer::CBindInfo &bindInfo, + const CRecordVector decompressionMethods, + CFolder &folder) +{ + folder.Coders.Clear(); + // bindInfo.CoderMethodIDs.Clear(); + // folder.OutStreams.Clear(); + folder.PackStreams.Clear(); + folder.BindPairs.Clear(); + int i; + for (i = 0; i < bindInfo.BindPairs.Size(); i++) + { + CBindPair bindPair; + bindPair.InIndex = bindInfo.BindPairs[i].InIndex; + bindPair.OutIndex = bindInfo.BindPairs[i].OutIndex; + folder.BindPairs.Add(bindPair); + } + for (i = 0; i < bindInfo.Coders.Size(); i++) + { + CCoderInfo coderInfo; + const NCoderMixer::CCoderStreamsInfo &coderStreamsInfo = bindInfo.Coders[i]; + coderInfo.NumInStreams = coderStreamsInfo.NumInStreams; + coderInfo.NumOutStreams = coderStreamsInfo.NumOutStreams; + coderInfo.MethodID = decompressionMethods[i]; + folder.Coders.Add(coderInfo); + } + for (i = 0; i < bindInfo.InStreams.Size(); i++) + folder.PackStreams.Add(bindInfo.InStreams[i]); +} + +HRESULT CEncoder::CreateMixerCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + const UInt64 *inSizeForReduce) +{ + _mixerCoderSpec = new NCoderMixer::CCoderMixer2MT; + _mixerCoder = _mixerCoderSpec; + RINOK(_mixerCoderSpec->SetBindInfo(_bindInfo)); + for (int i = 0; i < _options.Methods.Size(); i++) + { + const CMethodFull &methodFull = _options.Methods[i]; + _codersInfo.Add(CCoderInfo()); + CCoderInfo &encodingInfo = _codersInfo.Back(); + encodingInfo.MethodID = methodFull.Id; + CMyComPtr encoder; + CMyComPtr encoder2; + + + RINOK(CreateCoder( + EXTERNAL_CODECS_LOC_VARS + methodFull.Id, encoder, encoder2, true)); + + if (!encoder && !encoder2) + return E_FAIL; + + CMyComPtr encoderCommon = encoder ? (IUnknown *)encoder : (IUnknown *)encoder2; + + #ifdef COMPRESS_MT + { + CMyComPtr setCoderMt; + encoderCommon.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt); + if (setCoderMt) + { + RINOK(setCoderMt->SetNumberOfThreads(_options.NumThreads)); + } + } + #endif + + + RINOK(SetMethodProperties(methodFull, inSizeForReduce, encoderCommon)); + + /* + CMyComPtr resetSalt; + encoderCommon.QueryInterface(IID_ICryptoResetSalt, (void **)&resetSalt); + if (resetSalt != NULL) + { + resetSalt->ResetSalt(); + } + */ + + #ifdef EXTERNAL_CODECS + CMyComPtr setCompressCodecsInfo; + encoderCommon.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo); + if (setCompressCodecsInfo) + { + RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecsInfo)); + } + #endif + + CMyComPtr cryptoSetPassword; + encoderCommon.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword); + + if (cryptoSetPassword) + { + CByteBuffer buffer; + const UInt32 sizeInBytes = _options.Password.Length() * 2; + buffer.SetCapacity(sizeInBytes); + for (int i = 0; i < _options.Password.Length(); i++) + { + wchar_t c = _options.Password[i]; + ((Byte *)buffer)[i * 2] = (Byte)c; + ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8); + } + RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, sizeInBytes)); + } + + if (encoder) + _mixerCoderSpec->AddCoder(encoder); + else + _mixerCoderSpec->AddCoder2(encoder2); + } + return S_OK; +} + +HRESULT CEncoder::Encode( + DECL_EXTERNAL_CODECS_LOC_VARS + ISequentialInStream *inStream, + const UInt64 *inStreamSize, const UInt64 *inSizeForReduce, + CFolder &folderItem, + ISequentialOutStream *outStream, + CRecordVector &packSizes, + ICompressProgressInfo *compressProgress) +{ + RINOK(EncoderConstr()); + + if (_mixerCoderSpec == NULL) + { + RINOK(CreateMixerCoder(EXTERNAL_CODECS_LOC_VARS inSizeForReduce)); + } + _mixerCoderSpec->ReInit(); + // _mixerCoderSpec->SetCoderInfo(0, NULL, NULL, progress); + + CObjectVector inOutTempBuffers; + CObjectVector tempBufferSpecs; + CObjectVector > tempBuffers; + int numMethods = _bindInfo.Coders.Size(); + int i; + for (i = 1; i < _bindInfo.OutStreams.Size(); i++) + { + inOutTempBuffers.Add(CInOutTempBuffer()); + inOutTempBuffers.Back().Create(); + inOutTempBuffers.Back().InitWriting(); + } + for (i = 1; i < _bindInfo.OutStreams.Size(); i++) + { + CSequentialOutTempBufferImp *tempBufferSpec = + new CSequentialOutTempBufferImp; + CMyComPtr tempBuffer = tempBufferSpec; + tempBufferSpec->Init(&inOutTempBuffers[i - 1]); + tempBuffers.Add(tempBuffer); + tempBufferSpecs.Add(tempBufferSpec); + } + + for (i = 0; i < numMethods; i++) + _mixerCoderSpec->SetCoderInfo(i, NULL, NULL); + + if (_bindInfo.InStreams.IsEmpty()) + return E_FAIL; + UInt32 mainCoderIndex, mainStreamIndex; + _bindInfo.FindInStream(_bindInfo.InStreams[0], mainCoderIndex, mainStreamIndex); + + if (inStreamSize != NULL) + { + CRecordVector sizePointers; + for (UInt32 i = 0; i < _bindInfo.Coders[mainCoderIndex].NumInStreams; i++) + if (i == mainStreamIndex) + sizePointers.Add(inStreamSize); + else + sizePointers.Add(NULL); + _mixerCoderSpec->SetCoderInfo(mainCoderIndex, &sizePointers.Front(), NULL); + } + + + // UInt64 outStreamStartPos; + // RINOK(stream->Seek(0, STREAM_SEEK_CUR, &outStreamStartPos)); + + CSequentialInStreamSizeCount2 *inStreamSizeCountSpec = + new CSequentialInStreamSizeCount2; + CMyComPtr inStreamSizeCount = inStreamSizeCountSpec; + CSequentialOutStreamSizeCount *outStreamSizeCountSpec = + new CSequentialOutStreamSizeCount; + CMyComPtr outStreamSizeCount = outStreamSizeCountSpec; + + inStreamSizeCountSpec->Init(inStream); + outStreamSizeCountSpec->SetStream(outStream); + outStreamSizeCountSpec->Init(); + + CRecordVector inStreamPointers; + CRecordVector outStreamPointers; + inStreamPointers.Add(inStreamSizeCount); + outStreamPointers.Add(outStreamSizeCount); + for (i = 1; i < _bindInfo.OutStreams.Size(); i++) + outStreamPointers.Add(tempBuffers[i - 1]); + + for (i = 0; i < _codersInfo.Size(); i++) + { + CCoderInfo &encodingInfo = _codersInfo[i]; + + CMyComPtr resetInitVector; + _mixerCoderSpec->_coders[i].QueryInterface(IID_ICryptoResetInitVector, (void **)&resetInitVector); + if (resetInitVector != NULL) + { + resetInitVector->ResetInitVector(); + } + + CMyComPtr writeCoderProperties; + _mixerCoderSpec->_coders[i].QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties); + if (writeCoderProperties != NULL) + { + CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp; + CMyComPtr outStream(outStreamSpec); + outStreamSpec->Init(); + writeCoderProperties->WriteCoderProperties(outStream); + size_t size = outStreamSpec->GetSize(); + encodingInfo.Properties.SetCapacity(size); + memmove(encodingInfo.Properties, outStreamSpec->GetBuffer(), size); + } + } + + UInt32 progressIndex = mainCoderIndex; + + for (i = 0; i < _codersInfo.Size(); i++) + { + const CCoderInfo &e = _codersInfo[i]; + if ((e.MethodID == k_BCJ || e.MethodID == k_BCJ2) && i + 1 < _codersInfo.Size()) + progressIndex = i + 1; + } + + _mixerCoderSpec->SetProgressCoderIndex(progressIndex); + + RINOK(_mixerCoder->Code(&inStreamPointers.Front(), NULL, 1, + &outStreamPointers.Front(), NULL, outStreamPointers.Size(), compressProgress)); + + ConvertBindInfoToFolderItemInfo(_decompressBindInfo, _decompressionMethods, + folderItem); + + packSizes.Add(outStreamSizeCountSpec->GetSize()); + + for (i = 1; i < _bindInfo.OutStreams.Size(); i++) + { + CInOutTempBuffer &inOutTempBuffer = inOutTempBuffers[i - 1]; + inOutTempBuffer.FlushWrite(); + inOutTempBuffer.InitReading(); + inOutTempBuffer.WriteToStream(outStream); + packSizes.Add(inOutTempBuffer.GetDataSize()); + } + + for (i = 0; i < (int)_bindReverseConverter->NumSrcInStreams; i++) + { + int binder = _bindInfo.FindBinderForInStream( + _bindReverseConverter->DestOutToSrcInMap[i]); + UInt64 streamSize; + if (binder < 0) + streamSize = inStreamSizeCountSpec->GetSize(); + else + streamSize = _mixerCoderSpec->GetWriteProcessedSize(binder); + folderItem.UnPackSizes.Add(streamSize); + } + for (i = numMethods - 1; i >= 0; i--) + folderItem.Coders[numMethods - 1 - i].Properties = _codersInfo[i].Properties; + return S_OK; +} + + +CEncoder::CEncoder(const CCompressionMethodMode &options): + _bindReverseConverter(0), + _constructed(false) +{ + if (options.IsEmpty()) + throw 1; + + _options = options; + _mixerCoderSpec = NULL; +} + +HRESULT CEncoder::EncoderConstr() +{ + if (_constructed) + return S_OK; + if (_options.Methods.IsEmpty()) + { + // it has only password method; + if (!_options.PasswordIsDefined) + throw 1; + if (!_options.Binds.IsEmpty()) + throw 1; + NCoderMixer::CCoderStreamsInfo coderStreamsInfo; + CMethodFull method; + + method.NumInStreams = 1; + method.NumOutStreams = 1; + coderStreamsInfo.NumInStreams = 1; + coderStreamsInfo.NumOutStreams = 1; + method.Id = k_AES; + + _options.Methods.Add(method); + _bindInfo.Coders.Add(coderStreamsInfo); + + _bindInfo.InStreams.Add(0); + _bindInfo.OutStreams.Add(0); + } + else + { + + UInt32 numInStreams = 0, numOutStreams = 0; + int i; + for (i = 0; i < _options.Methods.Size(); i++) + { + const CMethodFull &methodFull = _options.Methods[i]; + NCoderMixer::CCoderStreamsInfo coderStreamsInfo; + coderStreamsInfo.NumInStreams = methodFull.NumOutStreams; + coderStreamsInfo.NumOutStreams = methodFull.NumInStreams; + if (_options.Binds.IsEmpty()) + { + if (i < _options.Methods.Size() - 1) + { + NCoderMixer::CBindPair bindPair; + bindPair.InIndex = numInStreams + coderStreamsInfo.NumInStreams; + bindPair.OutIndex = numOutStreams; + _bindInfo.BindPairs.Add(bindPair); + } + else + _bindInfo.OutStreams.Insert(0, numOutStreams); + for (UInt32 j = 1; j < coderStreamsInfo.NumOutStreams; j++) + _bindInfo.OutStreams.Add(numOutStreams + j); + } + + numInStreams += coderStreamsInfo.NumInStreams; + numOutStreams += coderStreamsInfo.NumOutStreams; + + _bindInfo.Coders.Add(coderStreamsInfo); + } + + if (!_options.Binds.IsEmpty()) + { + for (i = 0; i < _options.Binds.Size(); i++) + { + NCoderMixer::CBindPair bindPair; + const CBind &bind = _options.Binds[i]; + bindPair.InIndex = _bindInfo.GetCoderInStreamIndex(bind.InCoder) + bind.InStream; + bindPair.OutIndex = _bindInfo.GetCoderOutStreamIndex(bind.OutCoder) + bind.OutStream; + _bindInfo.BindPairs.Add(bindPair); + } + for (i = 0; i < (int)numOutStreams; i++) + if (_bindInfo.FindBinderForOutStream(i) == -1) + _bindInfo.OutStreams.Add(i); + } + + for (i = 0; i < (int)numInStreams; i++) + if (_bindInfo.FindBinderForInStream(i) == -1) + _bindInfo.InStreams.Add(i); + + if (_bindInfo.InStreams.IsEmpty()) + throw 1; // this is error + + // Make main stream first in list + int inIndex = _bindInfo.InStreams[0]; + for (;;) + { + UInt32 coderIndex, coderStreamIndex; + _bindInfo.FindInStream(inIndex, coderIndex, coderStreamIndex); + UInt32 outIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex); + int binder = _bindInfo.FindBinderForOutStream(outIndex); + if (binder >= 0) + { + inIndex = _bindInfo.BindPairs[binder].InIndex; + continue; + } + for (i = 0; i < _bindInfo.OutStreams.Size(); i++) + if (_bindInfo.OutStreams[i] == outIndex) + { + _bindInfo.OutStreams.Delete(i); + _bindInfo.OutStreams.Insert(0, outIndex); + break; + } + break; + } + + if (_options.PasswordIsDefined) + { + int numCryptoStreams = _bindInfo.OutStreams.Size(); + + for (i = 0; i < numCryptoStreams; i++) + { + NCoderMixer::CBindPair bindPair; + bindPair.InIndex = numInStreams + i; + bindPair.OutIndex = _bindInfo.OutStreams[i]; + _bindInfo.BindPairs.Add(bindPair); + } + _bindInfo.OutStreams.Clear(); + + /* + if (numCryptoStreams == 0) + numCryptoStreams = 1; + */ + + for (i = 0; i < numCryptoStreams; i++) + { + NCoderMixer::CCoderStreamsInfo coderStreamsInfo; + CMethodFull method; + method.NumInStreams = 1; + method.NumOutStreams = 1; + coderStreamsInfo.NumInStreams = method.NumOutStreams; + coderStreamsInfo.NumOutStreams = method.NumInStreams; + method.Id = k_AES; + + _options.Methods.Add(method); + _bindInfo.Coders.Add(coderStreamsInfo); + _bindInfo.OutStreams.Add(numOutStreams + i); + } + } + + } + + for (int i = _options.Methods.Size() - 1; i >= 0; i--) + { + const CMethodFull &methodFull = _options.Methods[i]; + _decompressionMethods.Add(methodFull.Id); + } + + _bindReverseConverter = new NCoderMixer::CBindReverseConverter(_bindInfo); + _bindReverseConverter->CreateReverseBindInfo(_decompressBindInfo); + _constructed = true; + return S_OK; +} + +CEncoder::~CEncoder() +{ + delete _bindReverseConverter; +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zEncode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zEncode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,55 @@ +// 7zEncode.h + +#ifndef __7Z_ENCODE_H +#define __7Z_ENCODE_H + +// #include "../../Common/StreamObjects.h" + +#include "7zCompressionMode.h" + +#include "../Common/CoderMixer2.h" +#include "../Common/CoderMixer2MT.h" +#ifdef _ST_MODE +#include "../Common/CoderMixer2ST.h" +#endif +#include "7zItem.h" + +#include "../../Common/CreateCoder.h" + +namespace NArchive { +namespace N7z { + +class CEncoder +{ + NCoderMixer::CCoderMixer2MT *_mixerCoderSpec; + CMyComPtr _mixerCoder; + + CObjectVector _codersInfo; + + CCompressionMethodMode _options; + NCoderMixer::CBindInfo _bindInfo; + NCoderMixer::CBindInfo _decompressBindInfo; + NCoderMixer::CBindReverseConverter *_bindReverseConverter; + CRecordVector _decompressionMethods; + + HRESULT CreateMixerCoder(DECL_EXTERNAL_CODECS_LOC_VARS + const UInt64 *inSizeForReduce); + + bool _constructed; +public: + CEncoder(const CCompressionMethodMode &options); + ~CEncoder(); + HRESULT EncoderConstr(); + HRESULT Encode( + DECL_EXTERNAL_CODECS_LOC_VARS + ISequentialInStream *inStream, + const UInt64 *inStreamSize, const UInt64 *inSizeForReduce, + CFolder &folderItem, + ISequentialOutStream *outStream, + CRecordVector &packSizes, + ICompressProgressInfo *compressProgress); +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zExtract.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zExtract.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,269 @@ +// 7zExtract.cpp + +#include "StdAfx.h" + +#include "7zHandler.h" +#include "7zFolderOutStream.h" +#include "7zDecode.h" +// #include "7z1Decode.h" + +#include "../../../Common/ComTry.h" +#include "../../Common/StreamObjects.h" +#include "../../Common/ProgressUtils.h" +#include "../../Common/LimitedStreams.h" + +namespace NArchive { +namespace N7z { + +struct CExtractFolderInfo +{ + #ifdef _7Z_VOL + int VolumeIndex; + #endif + CNum FileIndex; + CNum FolderIndex; + CBoolVector ExtractStatuses; + UInt64 UnPackSize; + CExtractFolderInfo( + #ifdef _7Z_VOL + int volumeIndex, + #endif + CNum fileIndex, CNum folderIndex): + #ifdef _7Z_VOL + VolumeIndex(volumeIndex), + #endif + FileIndex(fileIndex), + FolderIndex(folderIndex), + UnPackSize(0) + { + if (fileIndex != kNumNoIndex) + { + ExtractStatuses.Reserve(1); + ExtractStatuses.Add(true); + } + }; +}; + +STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, + Int32 testModeSpec, IArchiveExtractCallback *extractCallbackSpec) +{ + COM_TRY_BEGIN + bool testMode = (testModeSpec != 0); + CMyComPtr extractCallback = extractCallbackSpec; + UInt64 importantTotalUnPacked = 0; + + bool allFilesMode = (numItems == UInt32(-1)); + if (allFilesMode) + numItems = + #ifdef _7Z_VOL + _refs.Size(); + #else + _database.Files.Size(); + #endif + + if(numItems == 0) + return S_OK; + + /* + if(_volumes.Size() != 1) + return E_FAIL; + const CVolume &volume = _volumes.Front(); + const CArchiveDatabaseEx &_database = volume.Database; + IInStream *_inStream = volume.Stream; + */ + + CObjectVector extractFolderInfoVector; + for(UInt32 ii = 0; ii < numItems; ii++) + { + // UInt32 fileIndex = allFilesMode ? indexIndex : indices[indexIndex]; + UInt32 ref2Index = allFilesMode ? ii : indices[ii]; + // const CRef2 &ref2 = _refs[ref2Index]; + + // for(UInt32 ri = 0; ri < ref2.Refs.Size(); ri++) + { + #ifdef _7Z_VOL + // const CRef &ref = ref2.Refs[ri]; + const CRef &ref = _refs[ref2Index]; + + int volumeIndex = ref.VolumeIndex; + const CVolume &volume = _volumes[volumeIndex]; + const CArchiveDatabaseEx &database = volume.Database; + UInt32 fileIndex = ref.ItemIndex; + #else + const CArchiveDatabaseEx &database = _database; + UInt32 fileIndex = ref2Index; + #endif + + CNum folderIndex = database.FileIndexToFolderIndexMap[fileIndex]; + if (folderIndex == kNumNoIndex) + { + extractFolderInfoVector.Add(CExtractFolderInfo( + #ifdef _7Z_VOL + volumeIndex, + #endif + fileIndex, kNumNoIndex)); + continue; + } + if (extractFolderInfoVector.IsEmpty() || + folderIndex != extractFolderInfoVector.Back().FolderIndex + #ifdef _7Z_VOL + || volumeIndex != extractFolderInfoVector.Back().VolumeIndex + #endif + ) + { + extractFolderInfoVector.Add(CExtractFolderInfo( + #ifdef _7Z_VOL + volumeIndex, + #endif + kNumNoIndex, folderIndex)); + const CFolder &folderInfo = database.Folders[folderIndex]; + UInt64 unPackSize = folderInfo.GetUnPackSize(); + importantTotalUnPacked += unPackSize; + extractFolderInfoVector.Back().UnPackSize = unPackSize; + } + + CExtractFolderInfo &efi = extractFolderInfoVector.Back(); + + // const CFolderInfo &folderInfo = m_dam_Folders[folderIndex]; + CNum startIndex = database.FolderStartFileIndex[folderIndex]; + for (CNum index = efi.ExtractStatuses.Size(); + index <= fileIndex - startIndex; index++) + { + // UInt64 unPackSize = _database.Files[startIndex + index].UnPackSize; + // Count partial_folder_size + // efi.UnPackSize += unPackSize; + // importantTotalUnPacked += unPackSize; + efi.ExtractStatuses.Add(index == fileIndex - startIndex); + } + } + } + + extractCallback->SetTotal(importantTotalUnPacked); + + CDecoder decoder( + #ifdef _ST_MODE + false + #else + true + #endif + ); + // CDecoder1 decoder; + + UInt64 currentTotalPacked = 0; + UInt64 currentTotalUnPacked = 0; + UInt64 totalFolderUnPacked; + UInt64 totalFolderPacked; + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr progress = lps; + lps->Init(extractCallback, false); + + for(int i = 0; i < extractFolderInfoVector.Size(); i++, + currentTotalUnPacked += totalFolderUnPacked, + currentTotalPacked += totalFolderPacked) + { + lps->OutSize = currentTotalUnPacked; + lps->InSize = currentTotalPacked; + RINOK(lps->SetCur()); + + const CExtractFolderInfo &efi = extractFolderInfoVector[i]; + totalFolderUnPacked = efi.UnPackSize; + + totalFolderPacked = 0; + + CFolderOutStream *folderOutStream = new CFolderOutStream; + CMyComPtr outStream(folderOutStream); + + #ifdef _7Z_VOL + const CVolume &volume = _volumes[efi.VolumeIndex]; + const CArchiveDatabaseEx &database = volume.Database; + #else + const CArchiveDatabaseEx &database = _database; + #endif + + CNum startIndex; + if (efi.FileIndex != kNumNoIndex) + startIndex = efi.FileIndex; + else + startIndex = database.FolderStartFileIndex[efi.FolderIndex]; + + + HRESULT result = folderOutStream->Init(&database, + #ifdef _7Z_VOL + volume.StartRef2Index, + #else + 0, + #endif + startIndex, + &efi.ExtractStatuses, extractCallback, testMode, _crcSize != 0); + + RINOK(result); + + if (efi.FileIndex != kNumNoIndex) + continue; + + CNum folderIndex = efi.FolderIndex; + const CFolder &folderInfo = database.Folders[folderIndex]; + + totalFolderPacked = _database.GetFolderFullPackSize(folderIndex); + + CNum packStreamIndex = database.FolderStartPackStreamIndex[folderIndex]; + UInt64 folderStartPackPos = database.GetFolderStreamPos(folderIndex, 0); + + #ifndef _NO_CRYPTO + CMyComPtr getTextPassword; + if (extractCallback) + extractCallback.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword); + #endif + + try + { + HRESULT result = decoder.Decode( + EXTERNAL_CODECS_VARS + #ifdef _7Z_VOL + volume.Stream, + #else + _inStream, + #endif + folderStartPackPos, + &database.PackSizes[packStreamIndex], + folderInfo, + outStream, + progress + #ifndef _NO_CRYPTO + , getTextPassword + #endif + #ifdef COMPRESS_MT + , true, _numThreads + #endif + ); + + if (result == S_FALSE) + { + RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); + continue; + } + if (result == E_NOTIMPL) + { + RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kUnSupportedMethod)); + continue; + } + if (result != S_OK) + return result; + if (folderOutStream->WasWritingFinished() != S_OK) + { + RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); + continue; + } + } + catch(...) + { + RINOK(folderOutStream->FlushCorrupted(NArchive::NExtract::NOperationResult::kDataError)); + continue; + } + } + return S_OK; + COM_TRY_END +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,130 @@ +// 7zFolderInStream.cpp + +#include "StdAfx.h" + +#include "7zFolderInStream.h" + +namespace NArchive { +namespace N7z { + +CFolderInStream::CFolderInStream() +{ + _inStreamWithHashSpec = new CSequentialInStreamWithCRC; + _inStreamWithHash = _inStreamWithHashSpec; +} + +void CFolderInStream::Init(IArchiveUpdateCallback *updateCallback, + const UInt32 *fileIndices, UInt32 numFiles) +{ + _updateCallback = updateCallback; + _numFiles = numFiles; + _fileIndex = 0; + _fileIndices = fileIndices; + Processed.Clear(); + CRCs.Clear(); + Sizes.Clear(); + _fileIsOpen = false; + _currentSizeIsDefined = false; +} + +HRESULT CFolderInStream::OpenStream() +{ + _filePos = 0; + while (_fileIndex < _numFiles) + { + _currentSizeIsDefined = false; + CMyComPtr stream; + HRESULT result = _updateCallback->GetStream(_fileIndices[_fileIndex], &stream); + if (result != S_OK && result != S_FALSE) + return result; + _fileIndex++; + _inStreamWithHashSpec->SetStream(stream); + _inStreamWithHashSpec->Init(); + if (!stream) + { + RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); + Sizes.Add(0); + Processed.Add(result == S_OK); + AddDigest(); + continue; + } + CMyComPtr streamGetSize; + if (stream.QueryInterface(IID_IStreamGetSize, &streamGetSize) == S_OK) + { + if(streamGetSize) + { + _currentSizeIsDefined = true; + RINOK(streamGetSize->GetSize(&_currentSize)); + } + } + + _fileIsOpen = true; + return S_OK; + } + return S_OK; +} + +void CFolderInStream::AddDigest() +{ + CRCs.Add(_inStreamWithHashSpec->GetCRC()); +} + +HRESULT CFolderInStream::CloseStream() +{ + RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); + _inStreamWithHashSpec->ReleaseStream(); + _fileIsOpen = false; + Processed.Add(true); + Sizes.Add(_filePos); + AddDigest(); + return S_OK; +} + +STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize = 0; + while ((_fileIndex < _numFiles || _fileIsOpen) && size > 0) + { + if (_fileIsOpen) + { + UInt32 localProcessedSize; + RINOK(_inStreamWithHash->Read( + ((Byte *)data) + realProcessedSize, size, &localProcessedSize)); + if (localProcessedSize == 0) + { + RINOK(CloseStream()); + continue; + } + realProcessedSize += localProcessedSize; + _filePos += localProcessedSize; + size -= localProcessedSize; + break; + } + else + { + RINOK(OpenStream()); + } + } + if (processedSize != 0) + *processedSize = realProcessedSize; + return S_OK; +} + +STDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value) +{ + *value = 0; + int subStreamIndex = (int)subStream; + if (subStreamIndex < 0 || subStream > Sizes.Size()) + return E_FAIL; + if (subStreamIndex < Sizes.Size()) + { + *value= Sizes[subStreamIndex]; + return S_OK; + } + if (!_currentSizeIsDefined) + return S_FALSE; + *value = _currentSize; + return S_OK; +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zFolderInStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zFolderInStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,66 @@ +// 7z/FolderInStream.h + +#ifndef __7Z_FOLDERINSTREAM_H +#define __7Z_FOLDERINSTREAM_H + +#include "7zItem.h" +#include "7zHeader.h" + +#include "../IArchive.h" +#include "../Common/InStreamWithCRC.h" +#include "../../IStream.h" +#include "../../ICoder.h" + +namespace NArchive { +namespace N7z { + +class CFolderInStream: + public ISequentialInStream, + public ICompressGetSubStreamSize, + public CMyUnknownImp +{ +public: + + MY_UNKNOWN_IMP1(ICompressGetSubStreamSize) + + CFolderInStream(); + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + + STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); +private: + CSequentialInStreamWithCRC *_inStreamWithHashSpec; + CMyComPtr _inStreamWithHash; + CMyComPtr _updateCallback; + + bool _currentSizeIsDefined; + UInt64 _currentSize; + + bool _fileIsOpen; + UInt64 _filePos; + + const UInt32 *_fileIndices; + UInt32 _numFiles; + UInt32 _fileIndex; + + HRESULT OpenStream(); + HRESULT CloseStream(); + void AddDigest(); +public: + void Init(IArchiveUpdateCallback *updateCallback, + const UInt32 *fileIndices, UInt32 numFiles); + CRecordVector Processed; + CRecordVector CRCs; + CRecordVector Sizes; + UInt64 GetFullSize() const + { + UInt64 size = 0; + for (int i = 0; i < Sizes.Size(); i++) + size += Sizes[i]; + return size; + } +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zFolderOutStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zFolderOutStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,165 @@ +// 7zFolderOutStream.cpp + +#include "StdAfx.h" + +#include "7zFolderOutStream.h" + +namespace NArchive { +namespace N7z { + +CFolderOutStream::CFolderOutStream() +{ + _outStreamWithHashSpec = new COutStreamWithCRC; + _outStreamWithHash = _outStreamWithHashSpec; +} + +HRESULT CFolderOutStream::Init( + const CArchiveDatabaseEx *archiveDatabase, + UInt32 ref2Offset, + UInt32 startIndex, + const CBoolVector *extractStatuses, + IArchiveExtractCallback *extractCallback, + bool testMode, + bool checkCrc) +{ + _archiveDatabase = archiveDatabase; + _ref2Offset = ref2Offset; + _startIndex = startIndex; + + _extractStatuses = extractStatuses; + _extractCallback = extractCallback; + _testMode = testMode; + + _checkCrc = checkCrc; + + _currentIndex = 0; + _fileIsOpen = false; + return WriteEmptyFiles(); +} + +HRESULT CFolderOutStream::OpenFile() +{ + Int32 askMode; + if((*_extractStatuses)[_currentIndex]) + askMode = _testMode ? + NArchive::NExtract::NAskMode::kTest : + NArchive::NExtract::NAskMode::kExtract; + else + askMode = NArchive::NExtract::NAskMode::kSkip; + CMyComPtr realOutStream; + + UInt32 index = _startIndex + _currentIndex; + RINOK(_extractCallback->GetStream(_ref2Offset + index, &realOutStream, askMode)); + + _outStreamWithHashSpec->SetStream(realOutStream); + _outStreamWithHashSpec->Init(_checkCrc); + if (askMode == NArchive::NExtract::NAskMode::kExtract && + (!realOutStream)) + { + const CFileItem &fileInfo = _archiveDatabase->Files[index]; + if (!fileInfo.IsAnti && !fileInfo.IsDirectory) + askMode = NArchive::NExtract::NAskMode::kSkip; + } + return _extractCallback->PrepareOperation(askMode); +} + +HRESULT CFolderOutStream::WriteEmptyFiles() +{ + for(;_currentIndex < _extractStatuses->Size(); _currentIndex++) + { + UInt32 index = _startIndex + _currentIndex; + const CFileItem &fileInfo = _archiveDatabase->Files[index]; + if (!fileInfo.IsAnti && !fileInfo.IsDirectory && fileInfo.UnPackSize != 0) + return S_OK; + RINOK(OpenFile()); + RINOK(_extractCallback->SetOperationResult( + NArchive::NExtract::NOperationResult::kOK)); + _outStreamWithHashSpec->ReleaseStream(); + } + return S_OK; +} + +STDMETHODIMP CFolderOutStream::Write(const void *data, + UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize = 0; + while(_currentIndex < _extractStatuses->Size()) + { + if (_fileIsOpen) + { + UInt32 index = _startIndex + _currentIndex; + const CFileItem &fileInfo = _archiveDatabase->Files[index]; + UInt64 fileSize = fileInfo.UnPackSize; + + UInt32 numBytesToWrite = (UInt32)MyMin(fileSize - _filePos, + UInt64(size - realProcessedSize)); + + UInt32 processedSizeLocal; + RINOK(_outStreamWithHash->Write((const Byte *)data + realProcessedSize, + numBytesToWrite, &processedSizeLocal)); + + _filePos += processedSizeLocal; + realProcessedSize += processedSizeLocal; + if (_filePos == fileSize) + { + bool digestsAreEqual; + if (fileInfo.IsFileCRCDefined && _checkCrc) + digestsAreEqual = fileInfo.FileCRC == _outStreamWithHashSpec->GetCRC(); + else + digestsAreEqual = true; + + RINOK(_extractCallback->SetOperationResult( + digestsAreEqual ? + NArchive::NExtract::NOperationResult::kOK : + NArchive::NExtract::NOperationResult::kCRCError)); + _outStreamWithHashSpec->ReleaseStream(); + _fileIsOpen = false; + _currentIndex++; + } + if (realProcessedSize == size) + { + if (processedSize != NULL) + *processedSize = realProcessedSize; + return WriteEmptyFiles(); + } + } + else + { + RINOK(OpenFile()); + _fileIsOpen = true; + _filePos = 0; + } + } + if (processedSize != NULL) + *processedSize = size; + return S_OK; +} + +HRESULT CFolderOutStream::FlushCorrupted(Int32 resultEOperationResult) +{ + while(_currentIndex < _extractStatuses->Size()) + { + if (_fileIsOpen) + { + RINOK(_extractCallback->SetOperationResult(resultEOperationResult)); + _outStreamWithHashSpec->ReleaseStream(); + _fileIsOpen = false; + _currentIndex++; + } + else + { + RINOK(OpenFile()); + _fileIsOpen = true; + } + } + return S_OK; +} + +HRESULT CFolderOutStream::WasWritingFinished() +{ + if (_currentIndex == _extractStatuses->Size()) + return S_OK; + return E_FAIL; +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zFolderOutStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zFolderOutStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,60 @@ +// 7zFolderOutStream.h + +#ifndef __7Z_FOLDEROUTSTREAM_H +#define __7Z_FOLDEROUTSTREAM_H + +#include "7zIn.h" + +#include "../../IStream.h" +#include "../IArchive.h" +#include "../Common/OutStreamWithCRC.h" + +namespace NArchive { +namespace N7z { + +class CFolderOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + + CFolderOutStream(); + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +private: + + COutStreamWithCRC *_outStreamWithHashSpec; + CMyComPtr _outStreamWithHash; + const CArchiveDatabaseEx *_archiveDatabase; + const CBoolVector *_extractStatuses; + UInt32 _startIndex; + UInt32 _ref2Offset; + int _currentIndex; + // UInt64 _currentDataPos; + CMyComPtr _extractCallback; + bool _testMode; + + bool _fileIsOpen; + + bool _checkCrc; + UInt64 _filePos; + + HRESULT OpenFile(); + HRESULT WriteEmptyFiles(); +public: + HRESULT Init( + const CArchiveDatabaseEx *archiveDatabase, + UInt32 ref2Offset, + UInt32 startIndex, + const CBoolVector *extractStatuses, + IArchiveExtractCallback *extractCallback, + bool testMode, + bool checkCrc); + HRESULT FlushCorrupted(Int32 resultEOperationResult); + HRESULT WasWritingFinished(); +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHandler.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,793 @@ +// 7zHandler.cpp + +#include "StdAfx.h" + +#include "7zHandler.h" +#include "7zProperties.h" + +#include "../../../Common/IntToString.h" +#include "../../../Common/ComTry.h" +#include "../../../Windows/Defs.h" + +#include "../Common/ItemNameUtils.h" +#ifdef _7Z_VOL +#include "../Common/MultiStream.h" +#endif + +#ifdef __7Z_SET_PROPERTIES +#ifdef EXTRACT_ONLY +#include "../Common/ParseProperties.h" +#endif +#endif + +#ifdef COMPRESS_MT +#include "../../../Windows/System.h" +#endif + +using namespace NWindows; + +extern UString ConvertMethodIdToString(UInt64 id); + +namespace NArchive { +namespace N7z { + +CHandler::CHandler() +{ + _crcSize = 4; + + #ifdef EXTRACT_ONLY + #ifdef COMPRESS_MT + _numThreads = NWindows::NSystem::GetNumberOfProcessors(); + #endif + #else + Init(); + #endif +} + +STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) +{ + *numItems = + #ifdef _7Z_VOL + _refs.Size(); + #else + *numItems = _database.Files.Size(); + #endif + return S_OK; +} + +#ifdef _SFX + +IMP_IInArchive_ArcProps_NO + +STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 * /* numProperties */) +{ + return E_NOTIMPL; +} + +STDMETHODIMP CHandler::GetPropertyInfo(UInt32 /* index */, + BSTR * /* name */, PROPID * /* propID */, VARTYPE * /* varType */) +{ + return E_NOTIMPL; +} + + +#else + +STATPROPSTG kArcProps[] = +{ + { NULL, kpidMethod, VT_BSTR}, + { NULL, kpidSolid, VT_BOOL}, + { NULL, kpidNumBlocks, VT_UI4} +}; + +STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) +{ + COM_TRY_BEGIN + NWindows::NCOM::CPropVariant prop; + switch(propID) + { + case kpidMethod: + { + UString resString; + CRecordVector ids; + int i; + for (i = 0; i < _database.Folders.Size(); i++) + { + const CFolder &f = _database.Folders[i]; + for (int j = f.Coders.Size() - 1; j >= 0; j--) + ids.AddToUniqueSorted(f.Coders[j].MethodID); + } + + for (i = 0; i < ids.Size(); i++) + { + UInt64 id = ids[i]; + UString methodName; + /* bool methodIsKnown = */ FindMethod(EXTERNAL_CODECS_VARS id, methodName); + if (methodName.IsEmpty()) + methodName = ConvertMethodIdToString(id); + if (!resString.IsEmpty()) + resString += L' '; + resString += methodName; + } + prop = resString; + break; + } + case kpidSolid: prop = _database.IsSolid(); break; + case kpidNumBlocks: prop = (UInt32)_database.Folders.Size(); break; + } + prop.Detach(value); + return S_OK; + COM_TRY_END +} + +IMP_IInArchive_ArcProps + +#endif + +static void MySetFileTime(bool timeDefined, FILETIME unixTime, NWindows::NCOM::CPropVariant &prop) +{ + if (timeDefined) + prop = unixTime; +} + +#ifndef _SFX + +static UString ConvertUInt32ToString(UInt32 value) +{ + wchar_t buffer[32]; + ConvertUInt64ToString(value, buffer); + return buffer; +} + +static UString GetStringForSizeValue(UInt32 value) +{ + for (int i = 31; i >= 0; i--) + if ((UInt32(1) << i) == value) + return ConvertUInt32ToString(i); + UString result; + if (value % (1 << 20) == 0) + { + result += ConvertUInt32ToString(value >> 20); + result += L"m"; + } + else if (value % (1 << 10) == 0) + { + result += ConvertUInt32ToString(value >> 10); + result += L"k"; + } + else + { + result += ConvertUInt32ToString(value); + result += L"b"; + } + return result; +} + +static const UInt64 k_Copy = 0x0; +static const UInt64 k_LZMA = 0x030101; +static const UInt64 k_PPMD = 0x030401; + +static wchar_t GetHex(Byte value) +{ + return (wchar_t)((value < 10) ? (L'0' + value) : (L'A' + (value - 10))); +} +static inline UString GetHex2(Byte value) +{ + UString result; + result += GetHex((Byte)(value >> 4)); + result += GetHex((Byte)(value & 0xF)); + return result; +} + +#endif + +static const UInt64 k_AES = 0x06F10701; + +#ifndef _SFX +static inline UInt32 GetUInt32FromMemLE(const Byte *p) +{ + return p[0] | (((UInt32)p[1]) << 8) | (((UInt32)p[2]) << 16) | (((UInt32)p[3]) << 24); +} +#endif + +bool CHandler::IsEncrypted(UInt32 index2) const +{ + CNum folderIndex = _database.FileIndexToFolderIndexMap[index2]; + if (folderIndex != kNumNoIndex) + { + const CFolder &folderInfo = _database.Folders[folderIndex]; + for (int i = folderInfo.Coders.Size() - 1; i >= 0; i--) + if (folderInfo.Coders[i].MethodID == k_AES) + return true; + } + return false; +} + +STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) +{ + COM_TRY_BEGIN + NWindows::NCOM::CPropVariant prop; + + /* + const CRef2 &ref2 = _refs[index]; + if (ref2.Refs.IsEmpty()) + return E_FAIL; + const CRef &ref = ref2.Refs.Front(); + */ + + #ifdef _7Z_VOL + const CRef &ref = _refs[index]; + const CVolume &volume = _volumes[ref.VolumeIndex]; + const CArchiveDatabaseEx &_database = volume.Database; + UInt32 index2 = ref.ItemIndex; + const CFileItem &item = _database.Files[index2]; + #else + const CFileItem &item = _database.Files[index]; + UInt32 index2 = index; + #endif + + switch(propID) + { + case kpidPath: + { + if (!item.Name.IsEmpty()) + prop = NItemName::GetOSName(item.Name); + break; + } + case kpidIsFolder: + prop = item.IsDirectory; + break; + case kpidSize: + { + prop = item.UnPackSize; + // prop = ref2.UnPackSize; + break; + } + case kpidPosition: + { + /* + if (ref2.Refs.Size() > 1) + prop = ref2.StartPos; + else + */ + if (item.IsStartPosDefined) + prop = item.StartPos; + break; + } + case kpidPackedSize: + { + // prop = ref2.PackSize; + { + CNum folderIndex = _database.FileIndexToFolderIndexMap[index2]; + if (folderIndex != kNumNoIndex) + { + if (_database.FolderStartFileIndex[folderIndex] == (CNum)index2) + prop = _database.GetFolderFullPackSize(folderIndex); + /* + else + prop = (UInt64)0; + */ + } + else + prop = (UInt64)0; + } + break; + } + case kpidLastAccessTime: + MySetFileTime(item.IsLastAccessTimeDefined, item.LastAccessTime, prop); + break; + case kpidCreationTime: + MySetFileTime(item.IsCreationTimeDefined, item.CreationTime, prop); + break; + case kpidLastWriteTime: + MySetFileTime(item.IsLastWriteTimeDefined, item.LastWriteTime, prop); + break; + case kpidAttributes: + if (item.AreAttributesDefined) + prop = item.Attributes; + break; + case kpidCRC: + if (item.IsFileCRCDefined) + prop = item.FileCRC; + break; + case kpidEncrypted: + { + prop = IsEncrypted(index2); + break; + } + #ifndef _SFX + case kpidMethod: + { + CNum folderIndex = _database.FileIndexToFolderIndexMap[index2]; + if (folderIndex != kNumNoIndex) + { + const CFolder &folderInfo = _database.Folders[folderIndex]; + UString methodsString; + for (int i = folderInfo.Coders.Size() - 1; i >= 0; i--) + { + const CCoderInfo &coderInfo = folderInfo.Coders[i]; + if (!methodsString.IsEmpty()) + methodsString += L' '; + + { + UString methodName; + bool methodIsKnown = FindMethod( + EXTERNAL_CODECS_VARS + coderInfo.MethodID, methodName); + + if (methodIsKnown) + { + methodsString += methodName; + if (coderInfo.MethodID == k_LZMA) + { + if (coderInfo.Properties.GetCapacity() >= 5) + { + methodsString += L":"; + UInt32 dicSize = GetUInt32FromMemLE( + ((const Byte *)coderInfo.Properties + 1)); + methodsString += GetStringForSizeValue(dicSize); + } + } + else if (coderInfo.MethodID == k_PPMD) + { + if (coderInfo.Properties.GetCapacity() >= 5) + { + Byte order = *(const Byte *)coderInfo.Properties; + methodsString += L":o"; + methodsString += ConvertUInt32ToString(order); + methodsString += L":mem"; + UInt32 dicSize = GetUInt32FromMemLE( + ((const Byte *)coderInfo.Properties + 1)); + methodsString += GetStringForSizeValue(dicSize); + } + } + else if (coderInfo.MethodID == k_AES) + { + if (coderInfo.Properties.GetCapacity() >= 1) + { + methodsString += L":"; + const Byte *data = (const Byte *)coderInfo.Properties; + Byte firstByte = *data++; + UInt32 numCyclesPower = firstByte & 0x3F; + methodsString += ConvertUInt32ToString(numCyclesPower); + /* + if ((firstByte & 0xC0) != 0) + { + methodsString += L":"; + return S_OK; + UInt32 saltSize = (firstByte >> 7) & 1; + UInt32 ivSize = (firstByte >> 6) & 1; + if (coderInfo.Properties.GetCapacity() >= 2) + { + Byte secondByte = *data++; + saltSize += (secondByte >> 4); + ivSize += (secondByte & 0x0F); + } + } + */ + } + } + else + { + if (coderInfo.Properties.GetCapacity() > 0) + { + methodsString += L":["; + for (size_t bi = 0; bi < coderInfo.Properties.GetCapacity(); bi++) + { + if (bi > 5 && bi + 1 < coderInfo.Properties.GetCapacity()) + { + methodsString += L".."; + break; + } + else + methodsString += GetHex2(coderInfo.Properties[bi]); + } + methodsString += L"]"; + } + } + } + else + { + methodsString += ConvertMethodIdToString(coderInfo.MethodID); + } + } + } + prop = methodsString; + } + } + break; + case kpidBlock: + { + CNum folderIndex = _database.FileIndexToFolderIndexMap[index2]; + if (folderIndex != kNumNoIndex) + prop = (UInt32)folderIndex; + } + break; + case kpidPackedSize0: + case kpidPackedSize1: + case kpidPackedSize2: + case kpidPackedSize3: + case kpidPackedSize4: + { + CNum folderIndex = _database.FileIndexToFolderIndexMap[index2]; + if (folderIndex != kNumNoIndex) + { + const CFolder &folderInfo = _database.Folders[folderIndex]; + if (_database.FolderStartFileIndex[folderIndex] == (CNum)index2 && + folderInfo.PackStreams.Size() > (int)(propID - kpidPackedSize0)) + { + prop = _database.GetFolderPackStreamSize(folderIndex, propID - kpidPackedSize0); + } + else + prop = (UInt64)0; + } + else + prop = (UInt64)0; + } + break; + #endif + case kpidIsAnti: + prop = item.IsAnti; + break; + } + prop.Detach(value); + return S_OK; + COM_TRY_END +} + +#ifdef _7Z_VOL + +static const wchar_t *kExt = L"7z"; +static const wchar_t *kAfterPart = L".7z"; + +class CVolumeName +{ + bool _first; + UString _unchangedPart; + UString _changedPart; + UString _afterPart; +public: + bool InitName(const UString &name) + { + _first = true; + int dotPos = name.ReverseFind('.'); + UString basePart = name; + if (dotPos >= 0) + { + UString ext = name.Mid(dotPos + 1); + if (ext.CompareNoCase(kExt)==0 || + ext.CompareNoCase(L"EXE") == 0) + { + _afterPart = kAfterPart; + basePart = name.Left(dotPos); + } + } + + int numLetters = 1; + bool splitStyle = false; + if (basePart.Right(numLetters) == L"1") + { + while (numLetters < basePart.Length()) + { + if (basePart[basePart.Length() - numLetters - 1] != '0') + break; + numLetters++; + } + } + else + return false; + _unchangedPart = basePart.Left(basePart.Length() - numLetters); + _changedPart = basePart.Right(numLetters); + return true; + } + + UString GetNextName() + { + UString newName; + // if (_newStyle || !_first) + { + int i; + int numLetters = _changedPart.Length(); + for (i = numLetters - 1; i >= 0; i--) + { + wchar_t c = _changedPart[i]; + if (c == L'9') + { + c = L'0'; + newName = c + newName; + if (i == 0) + newName = UString(L'1') + newName; + continue; + } + c++; + newName = UString(c) + newName; + i--; + for (; i >= 0; i--) + newName = _changedPart[i] + newName; + break; + } + _changedPart = newName; + } + _first = false; + return _unchangedPart + _changedPart + _afterPart; + } +}; + +#endif + +STDMETHODIMP CHandler::Open(IInStream *stream, + const UInt64 *maxCheckStartPosition, + IArchiveOpenCallback *openArchiveCallback) +{ + COM_TRY_BEGIN + Close(); + #ifndef _SFX + _fileInfoPopIDs.Clear(); + #endif + try + { + CMyComPtr openArchiveCallbackTemp = openArchiveCallback; + #ifdef _7Z_VOL + CVolumeName seqName; + + CMyComPtr openVolumeCallback; + #endif + + #ifndef _NO_CRYPTO + CMyComPtr getTextPassword; + if (openArchiveCallback) + { + openArchiveCallbackTemp.QueryInterface( + IID_ICryptoGetTextPassword, &getTextPassword); + } + #endif + #ifdef _7Z_VOL + if (openArchiveCallback) + { + openArchiveCallbackTemp.QueryInterface(IID_IArchiveOpenVolumeCallback, &openVolumeCallback); + } + for (;;) + { + CMyComPtr inStream; + if (!_volumes.IsEmpty()) + { + if (!openVolumeCallback) + break; + if(_volumes.Size() == 1) + { + UString baseName; + { + NCOM::CPropVariant prop; + RINOK(openVolumeCallback->GetProperty(kpidName, &prop)); + if (prop.vt != VT_BSTR) + break; + baseName = prop.bstrVal; + } + seqName.InitName(baseName); + } + + UString fullName = seqName.GetNextName(); + HRESULT result = openVolumeCallback->GetStream(fullName, &inStream); + if (result == S_FALSE) + break; + if (result != S_OK) + return result; + if (!stream) + break; + } + else + inStream = stream; + + CInArchive archive; + RINOK(archive.Open(inStream, maxCheckStartPosition)); + + _volumes.Add(CVolume()); + CVolume &volume = _volumes.Back(); + CArchiveDatabaseEx &database = volume.Database; + volume.Stream = inStream; + volume.StartRef2Index = _refs.Size(); + + HRESULT result = archive.ReadDatabase(database + #ifndef _NO_CRYPTO + , getTextPassword + #endif + ); + if (result != S_OK) + { + _volumes.Clear(); + return result; + } + database.Fill(); + for(int i = 0; i < database.Files.Size(); i++) + { + CRef refNew; + refNew.VolumeIndex = _volumes.Size() - 1; + refNew.ItemIndex = i; + _refs.Add(refNew); + /* + const CFileItem &file = database.Files[i]; + int j; + */ + /* + for (j = _refs.Size() - 1; j >= 0; j--) + { + CRef2 &ref2 = _refs[j]; + const CRef &ref = ref2.Refs.Back(); + const CVolume &volume2 = _volumes[ref.VolumeIndex]; + const CArchiveDatabaseEx &database2 = volume2.Database; + const CFileItem &file2 = database2.Files[ref.ItemIndex]; + if (file2.Name.CompareNoCase(file.Name) == 0) + { + if (!file.IsStartPosDefined) + continue; + if (file.StartPos != ref2.StartPos + ref2.UnPackSize) + continue; + ref2.Refs.Add(refNew); + break; + } + } + */ + /* + j = -1; + if (j < 0) + { + CRef2 ref2New; + ref2New.Refs.Add(refNew); + j = _refs.Add(ref2New); + } + CRef2 &ref2 = _refs[j]; + ref2.UnPackSize += file.UnPackSize; + ref2.PackSize += database.GetFilePackSize(i); + if (ref2.Refs.Size() == 1 && file.IsStartPosDefined) + ref2.StartPos = file.StartPos; + */ + } + if (database.Files.Size() != 1) + break; + const CFileItem &file = database.Files.Front(); + if (!file.IsStartPosDefined) + break; + } + #else + CInArchive archive; + RINOK(archive.Open(stream, maxCheckStartPosition)); + HRESULT result = archive.ReadDatabase( + EXTERNAL_CODECS_VARS + _database + #ifndef _NO_CRYPTO + , getTextPassword + #endif + ); + RINOK(result); + _database.Fill(); + _inStream = stream; + #endif + } + catch(...) + { + Close(); + return S_FALSE; + } + // _inStream = stream; + #ifndef _SFX + FillPopIDs(); + #endif + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CHandler::Close() +{ + COM_TRY_BEGIN + #ifdef _7Z_VOL + _volumes.Clear(); + _refs.Clear(); + #else + _inStream.Release(); + _database.Clear(); + #endif + return S_OK; + COM_TRY_END +} + +#ifdef _7Z_VOL +STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) +{ + if (index != 0) + return E_INVALIDARG; + *stream = 0; + CMultiStream *streamSpec = new CMultiStream; + CMyComPtr streamTemp = streamSpec; + + UInt64 pos = 0; + const UString *fileName; + for (int i = 0; i < _refs.Size(); i++) + { + const CRef &ref = _refs[i]; + const CVolume &volume = _volumes[ref.VolumeIndex]; + const CArchiveDatabaseEx &database = volume.Database; + const CFileItem &file = database.Files[ref.ItemIndex]; + if (i == 0) + fileName = &file.Name; + else + if (fileName->Compare(file.Name) != 0) + return S_FALSE; + if (!file.IsStartPosDefined) + return S_FALSE; + if (file.StartPos != pos) + return S_FALSE; + CNum folderIndex = database.FileIndexToFolderIndexMap[ref.ItemIndex]; + if (folderIndex == kNumNoIndex) + { + if (file.UnPackSize != 0) + return E_FAIL; + continue; + } + if (database.NumUnPackStreamsVector[folderIndex] != 1) + return S_FALSE; + const CFolder &folder = database.Folders[folderIndex]; + if (folder.Coders.Size() != 1) + return S_FALSE; + const CCoderInfo &coder = folder.Coders.Front(); + if (coder.NumInStreams != 1 || coder.NumOutStreams != 1) + return S_FALSE; + if (coder.MethodID != k_Copy) + return S_FALSE; + + pos += file.UnPackSize; + CMultiStream::CSubStreamInfo subStreamInfo; + subStreamInfo.Stream = volume.Stream; + subStreamInfo.Pos = database.GetFolderStreamPos(folderIndex, 0); + subStreamInfo.Size = file.UnPackSize; + streamSpec->Streams.Add(subStreamInfo); + } + streamSpec->Init(); + *stream = streamTemp.Detach(); + return S_OK; +} +#endif + + +#ifdef __7Z_SET_PROPERTIES +#ifdef EXTRACT_ONLY + +STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) +{ + COM_TRY_BEGIN + #ifdef COMPRESS_MT + const UInt32 numProcessors = NSystem::GetNumberOfProcessors(); + _numThreads = numProcessors; + #endif + + for (int i = 0; i < numProperties; i++) + { + UString name = names[i]; + name.MakeUpper(); + if (name.IsEmpty()) + return E_INVALIDARG; + const PROPVARIANT &value = values[i]; + UInt32 number; + int index = ParseStringToUInt32(name, number); + if (index == 0) + { + if(name.Left(2).CompareNoCase(L"MT") == 0) + { + #ifdef COMPRESS_MT + RINOK(ParseMtProp(name.Mid(2), value, numProcessors, _numThreads)); + #endif + continue; + } + else + return E_INVALIDARG; + } + } + return S_OK; + COM_TRY_END +} + +#endif +#endif + +IMPL_ISetCompressCodecsInfo + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHandler.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,146 @@ +// 7z/Handler.h + +#ifndef __7Z_HANDLER_H +#define __7Z_HANDLER_H + +#include "../../ICoder.h" +#include "../IArchive.h" +#include "7zIn.h" + +#include "7zCompressionMode.h" + +#include "../../Common/CreateCoder.h" + +#ifndef EXTRACT_ONLY +#include "../Common/HandlerOut.h" +#endif + +namespace NArchive { +namespace N7z { + +#ifdef _7Z_VOL +struct CRef +{ + int VolumeIndex; + int ItemIndex; +}; + +struct CVolume +{ + int StartRef2Index; + CMyComPtr Stream; + CArchiveDatabaseEx Database; +}; +#endif + +#ifndef __7Z_SET_PROPERTIES + +#ifdef EXTRACT_ONLY +#ifdef COMPRESS_MT +#define __7Z_SET_PROPERTIES +#endif +#else +#define __7Z_SET_PROPERTIES +#endif + +#endif + + +class CHandler: + #ifndef EXTRACT_ONLY + public NArchive::COutHandler, + #endif + public IInArchive, + #ifdef _7Z_VOL + public IInArchiveGetStream, + #endif + #ifdef __7Z_SET_PROPERTIES + public ISetProperties, + #endif + #ifndef EXTRACT_ONLY + public IOutArchive, + #endif + PUBLIC_ISetCompressCodecsInfo + public CMyUnknownImp +{ +public: + MY_QUERYINTERFACE_BEGIN2(IInArchive) + #ifdef _7Z_VOL + MY_QUERYINTERFACE_ENTRY(IInArchiveGetStream) + #endif + #ifdef __7Z_SET_PROPERTIES + MY_QUERYINTERFACE_ENTRY(ISetProperties) + #endif + #ifndef EXTRACT_ONLY + MY_QUERYINTERFACE_ENTRY(IOutArchive) + #endif + QUERY_ENTRY_ISetCompressCodecsInfo + MY_QUERYINTERFACE_END + MY_ADDREF_RELEASE + + INTERFACE_IInArchive(;) + + #ifdef _7Z_VOL + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream); + #endif + + #ifdef __7Z_SET_PROPERTIES + STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties); + #endif + + #ifndef EXTRACT_ONLY + INTERFACE_IOutArchive(;) + #endif + + DECL_ISetCompressCodecsInfo + + CHandler(); + +private: + #ifdef _7Z_VOL + CObjectVector _volumes; + CObjectVector _refs; + #else + CMyComPtr _inStream; + NArchive::N7z::CArchiveDatabaseEx _database; + #endif + + #ifdef EXTRACT_ONLY + + #ifdef COMPRESS_MT + UInt32 _numThreads; + #endif + + UInt32 _crcSize; + + #else + + CRecordVector _binds; + + HRESULT SetPassword(CCompressionMethodMode &methodMode, IArchiveUpdateCallback *updateCallback); + + HRESULT SetCompressionMethod(CCompressionMethodMode &method, + CObjectVector &methodsInfo + #ifdef COMPRESS_MT + , UInt32 numThreads + #endif + ); + + HRESULT SetCompressionMethod( + CCompressionMethodMode &method, + CCompressionMethodMode &headerMethod); + + #endif + + bool IsEncrypted(UInt32 index2) const; + #ifndef _SFX + + CRecordVector _fileInfoPopIDs; + void FillPopIDs(); + + #endif +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,464 @@ +// 7zHandlerOut.cpp + +#include "StdAfx.h" + +#include "7zHandler.h" +#include "7zOut.h" +#include "7zUpdate.h" + +#include "../../../Windows/PropVariant.h" + +#include "../../../Common/ComTry.h" +#include "../../../Common/StringToInt.h" +#include "../../IPassword.h" +#include "../../ICoder.h" + +#include "../Common/ItemNameUtils.h" +#include "../Common/ParseProperties.h" + +using namespace NWindows; + +namespace NArchive { +namespace N7z { + +static const wchar_t *kLZMAMethodName = L"LZMA"; +static const wchar_t *kCopyMethod = L"Copy"; +static const wchar_t *kDefaultMethodName = kLZMAMethodName; + +static const UInt32 kLzmaAlgorithmX5 = 1; +static const wchar_t *kLzmaMatchFinderForHeaders = L"BT2"; +static const UInt32 kDictionaryForHeaders = 1 << 20; +static const UInt32 kNumFastBytesForHeaders = 273; +static const UInt32 kAlgorithmForHeaders = kLzmaAlgorithmX5; + +static inline bool IsCopyMethod(const UString &methodName) + { return (methodName.CompareNoCase(kCopyMethod) == 0); } + +STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type) +{ + *type = NFileTimeType::kWindows; + return S_OK; +} + +HRESULT CHandler::SetPassword(CCompressionMethodMode &methodMode, + IArchiveUpdateCallback *updateCallback) +{ + CMyComPtr getTextPassword; + if (!getTextPassword) + { + CMyComPtr udateCallback2(updateCallback); + udateCallback2.QueryInterface(IID_ICryptoGetTextPassword2, &getTextPassword); + } + + if (getTextPassword) + { + CMyComBSTR password; + Int32 passwordIsDefined; + RINOK(getTextPassword->CryptoGetTextPassword2( + &passwordIsDefined, &password)); + methodMode.PasswordIsDefined = IntToBool(passwordIsDefined); + if (methodMode.PasswordIsDefined) + methodMode.Password = password; + } + else + methodMode.PasswordIsDefined = false; + return S_OK; +} + +HRESULT CHandler::SetCompressionMethod( + CCompressionMethodMode &methodMode, + CCompressionMethodMode &headerMethod) +{ + HRESULT res = SetCompressionMethod(methodMode, _methods + #ifdef COMPRESS_MT + , _numThreads + #endif + ); + RINOK(res); + methodMode.Binds = _binds; + + if (_compressHeaders) + { + // headerMethod.Methods.Add(methodMode.Methods.Back()); + + CObjectVector headerMethodInfoVector; + COneMethodInfo oneMethodInfo; + oneMethodInfo.MethodName = kLZMAMethodName; + { + CProp property; + property.Id = NCoderPropID::kMatchFinder; + property.Value = kLzmaMatchFinderForHeaders; + oneMethodInfo.Properties.Add(property); + } + { + CProp property; + property.Id = NCoderPropID::kAlgorithm; + property.Value = kAlgorithmForHeaders; + oneMethodInfo.Properties.Add(property); + } + { + CProp property; + property.Id = NCoderPropID::kNumFastBytes; + property.Value = UInt32(kNumFastBytesForHeaders); + oneMethodInfo.Properties.Add(property); + } + { + CProp property; + property.Id = NCoderPropID::kDictionarySize; + property.Value = UInt32(kDictionaryForHeaders); + oneMethodInfo.Properties.Add(property); + } + headerMethodInfoVector.Add(oneMethodInfo); + HRESULT res = SetCompressionMethod(headerMethod, headerMethodInfoVector + #ifdef COMPRESS_MT + ,1 + #endif + ); + RINOK(res); + } + return S_OK; +} + +HRESULT CHandler::SetCompressionMethod( + CCompressionMethodMode &methodMode, + CObjectVector &methodsInfo + #ifdef COMPRESS_MT + , UInt32 numThreads + #endif + ) +{ + UInt32 level = _level; + + if (methodsInfo.IsEmpty()) + { + COneMethodInfo oneMethodInfo; + oneMethodInfo.MethodName = ((level == 0) ? kCopyMethod : kDefaultMethodName); + methodsInfo.Add(oneMethodInfo); + } + + bool needSolid = false; + for(int i = 0; i < methodsInfo.Size(); i++) + { + COneMethodInfo &oneMethodInfo = methodsInfo[i]; + SetCompressionMethod2(oneMethodInfo + #ifdef COMPRESS_MT + , numThreads + #endif + ); + + if (!IsCopyMethod(oneMethodInfo.MethodName)) + needSolid = true; + + CMethodFull methodFull; + + if (!FindMethod( + EXTERNAL_CODECS_VARS + oneMethodInfo.MethodName, methodFull.Id, methodFull.NumInStreams, methodFull.NumOutStreams)) + return E_INVALIDARG; + methodFull.Properties = oneMethodInfo.Properties; + methodMode.Methods.Add(methodFull); + + if (!_numSolidBytesDefined) + { + for (int j = 0; j < methodFull.Properties.Size(); j++) + { + const CProp &prop = methodFull.Properties[j]; + if ((prop.Id == NCoderPropID::kDictionarySize || + prop.Id == NCoderPropID::kUsedMemorySize) && prop.Value.vt == VT_UI4) + { + _numSolidBytes = ((UInt64)prop.Value.ulVal) << 7; + const UInt64 kMinSize = (1 << 24); + if (_numSolidBytes < kMinSize) + _numSolidBytes = kMinSize; + _numSolidBytesDefined = true; + break; + } + } + } + } + + if (!needSolid && !_numSolidBytesDefined) + { + _numSolidBytesDefined = true; + _numSolidBytes = 0; + } + return S_OK; +} + +static HRESULT GetTime(IArchiveUpdateCallback *updateCallback, int index, PROPID propID, CArchiveFileTime &filetime, bool &filetimeIsDefined) +{ + filetimeIsDefined = false; + NCOM::CPropVariant propVariant; + RINOK(updateCallback->GetProperty(index, propID, &propVariant)); + if (propVariant.vt == VT_FILETIME) + { + filetime = propVariant.filetime; + filetimeIsDefined = true; + } + else if (propVariant.vt != VT_EMPTY) + return E_INVALIDARG; + return S_OK; +} + +STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems, + IArchiveUpdateCallback *updateCallback) +{ + COM_TRY_BEGIN + + const CArchiveDatabaseEx *database = 0; + #ifdef _7Z_VOL + if(_volumes.Size() > 1) + return E_FAIL; + const CVolume *volume = 0; + if (_volumes.Size() == 1) + { + volume = &_volumes.Front(); + database = &volume->Database; + } + #else + if (_inStream != 0) + database = &_database; + #endif + + // CRecordVector compressStatuses; + CObjectVector updateItems; + // CRecordVector copyIndices; + + // CMyComPtr updateCallback2; + // updateCallback->QueryInterface(&updateCallback2); + + for(UInt32 i = 0; i < numItems; i++) + { + Int32 newData; + Int32 newProperties; + UInt32 indexInArchive; + if (!updateCallback) + return E_FAIL; + RINOK(updateCallback->GetUpdateItemInfo(i, + &newData, &newProperties, &indexInArchive)); + CUpdateItem updateItem; + updateItem.NewProperties = IntToBool(newProperties); + updateItem.NewData = IntToBool(newData); + updateItem.IndexInArchive = indexInArchive; + updateItem.IndexInClient = i; + updateItem.IsAnti = false; + updateItem.Size = 0; + + if (updateItem.IndexInArchive != -1) + { + const CFileItem &fileItem = database->Files[updateItem.IndexInArchive]; + updateItem.Name = fileItem.Name; + updateItem.IsDirectory = fileItem.IsDirectory; + updateItem.Size = fileItem.UnPackSize; + updateItem.IsAnti = fileItem.IsAnti; + + updateItem.CreationTime = fileItem.CreationTime; + updateItem.IsCreationTimeDefined = fileItem.IsCreationTimeDefined; + updateItem.LastWriteTime = fileItem.LastWriteTime; + updateItem.IsLastWriteTimeDefined = fileItem.IsLastWriteTimeDefined; + updateItem.LastAccessTime = fileItem.LastAccessTime; + updateItem.IsLastAccessTimeDefined = fileItem.IsLastAccessTimeDefined; + } + + if (updateItem.NewProperties) + { + bool nameIsDefined; + bool folderStatusIsDefined; + { + NCOM::CPropVariant propVariant; + RINOK(updateCallback->GetProperty(i, kpidAttributes, &propVariant)); + if (propVariant.vt == VT_EMPTY) + updateItem.AttributesAreDefined = false; + else if (propVariant.vt != VT_UI4) + return E_INVALIDARG; + else + { + updateItem.Attributes = propVariant.ulVal; + updateItem.AttributesAreDefined = true; + } + } + + RINOK(GetTime(updateCallback, i, kpidCreationTime, updateItem.CreationTime, updateItem.IsCreationTimeDefined)); + RINOK(GetTime(updateCallback, i, kpidLastWriteTime, updateItem.LastWriteTime , updateItem.IsLastWriteTimeDefined)); + RINOK(GetTime(updateCallback, i, kpidLastAccessTime, updateItem.LastAccessTime, updateItem.IsLastAccessTimeDefined)); + + { + NCOM::CPropVariant propVariant; + RINOK(updateCallback->GetProperty(i, kpidPath, &propVariant)); + if (propVariant.vt == VT_EMPTY) + nameIsDefined = false; + else if (propVariant.vt != VT_BSTR) + return E_INVALIDARG; + else + { + updateItem.Name = NItemName::MakeLegalName(propVariant.bstrVal); + nameIsDefined = true; + } + } + { + NCOM::CPropVariant propVariant; + RINOK(updateCallback->GetProperty(i, kpidIsFolder, &propVariant)); + if (propVariant.vt == VT_EMPTY) + folderStatusIsDefined = false; + else if (propVariant.vt != VT_BOOL) + return E_INVALIDARG; + else + { + updateItem.IsDirectory = (propVariant.boolVal != VARIANT_FALSE); + folderStatusIsDefined = true; + } + } + + { + NCOM::CPropVariant propVariant; + RINOK(updateCallback->GetProperty(i, kpidIsAnti, &propVariant)); + if (propVariant.vt == VT_EMPTY) + updateItem.IsAnti = false; + else if (propVariant.vt != VT_BOOL) + return E_INVALIDARG; + else + updateItem.IsAnti = (propVariant.boolVal != VARIANT_FALSE); + } + + if (updateItem.IsAnti) + { + updateItem.AttributesAreDefined = false; + + updateItem.IsCreationTimeDefined = false; + updateItem.IsLastWriteTimeDefined = false; + updateItem.IsLastAccessTimeDefined = false; + + updateItem.Size = 0; + } + + if (!folderStatusIsDefined && updateItem.AttributesAreDefined) + updateItem.SetDirectoryStatusFromAttributes(); + } + + if (updateItem.NewData) + { + NCOM::CPropVariant propVariant; + RINOK(updateCallback->GetProperty(i, kpidSize, &propVariant)); + if (propVariant.vt != VT_UI8) + return E_INVALIDARG; + updateItem.Size = (UInt64)propVariant.uhVal.QuadPart; + if (updateItem.Size != 0 && updateItem.IsAnti) + return E_INVALIDARG; + } + updateItems.Add(updateItem); + } + + CCompressionMethodMode methodMode, headerMethod; + RINOK(SetCompressionMethod(methodMode, headerMethod)); + #ifdef COMPRESS_MT + methodMode.NumThreads = _numThreads; + headerMethod.NumThreads = 1; + #endif + + RINOK(SetPassword(methodMode, updateCallback)); + + bool compressMainHeader = _compressHeaders; // check it + + if (methodMode.PasswordIsDefined) + { + compressMainHeader = true; + if(_encryptHeaders) + RINOK(SetPassword(headerMethod, updateCallback)); + } + + if (numItems < 2) + compressMainHeader = false; + + CUpdateOptions options; + options.Method = &methodMode; + options.HeaderMethod = (_compressHeaders || + (methodMode.PasswordIsDefined && _encryptHeaders)) ? + &headerMethod : 0; + options.UseFilters = _level != 0 && _autoFilter; + options.MaxFilter = _level >= 8; + + options.HeaderOptions.CompressMainHeader = compressMainHeader; + options.HeaderOptions.WriteModified = WriteModified; + options.HeaderOptions.WriteCreated = WriteCreated; + options.HeaderOptions.WriteAccessed = WriteAccessed; + + options.NumSolidFiles = _numSolidFiles; + options.NumSolidBytes = _numSolidBytes; + options.SolidExtension = _solidExtension; + options.RemoveSfxBlock = _removeSfxBlock; + options.VolumeMode = _volumeMode; + return Update( + EXTERNAL_CODECS_VARS + #ifdef _7Z_VOL + volume ? volume->Stream: 0, + volume ? database: 0, + #else + _inStream, + database, + #endif + updateItems, outStream, updateCallback, options); + COM_TRY_END +} + +static HRESULT GetBindInfoPart(UString &srcString, UInt32 &coder, UInt32 &stream) +{ + stream = 0; + int index = ParseStringToUInt32(srcString, coder); + if (index == 0) + return E_INVALIDARG; + srcString.Delete(0, index); + if (srcString[0] == 'S') + { + srcString.Delete(0); + int index = ParseStringToUInt32(srcString, stream); + if (index == 0) + return E_INVALIDARG; + srcString.Delete(0, index); + } + return S_OK; +} + +static HRESULT GetBindInfo(UString &srcString, CBind &bind) +{ + RINOK(GetBindInfoPart(srcString, bind.OutCoder, bind.OutStream)); + if (srcString[0] != ':') + return E_INVALIDARG; + srcString.Delete(0); + RINOK(GetBindInfoPart(srcString, bind.InCoder, bind.InStream)); + if (!srcString.IsEmpty()) + return E_INVALIDARG; + return S_OK; +} + +STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) +{ + COM_TRY_BEGIN + _binds.Clear(); + BeforeSetProperty(); + + for (int i = 0; i < numProperties; i++) + { + UString name = names[i]; + name.MakeUpper(); + if (name.IsEmpty()) + return E_INVALIDARG; + + const PROPVARIANT &value = values[i]; + + if (name[0] == 'B') + { + name.Delete(0); + CBind bind; + RINOK(GetBindInfo(name, bind)); + _binds.Add(bind); + continue; + } + + RINOK(SetProperty(name, value)); + } + + return S_OK; + COM_TRY_END +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHeader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHeader.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,27 @@ +// 7z/Header.cpp + +#include "StdAfx.h" +#include "7zHeader.h" + +namespace NArchive { +namespace N7z { + +Byte kSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C}; +#ifdef _7Z_VOL +Byte kFinishSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C + 1}; +#endif + +class SignatureInitializer +{ +public: + SignatureInitializer() + { + kSignature[0]--; + #ifdef _7Z_VOL + kFinishSignature[0]--; + #endif + }; +} g_SignatureInitializer; + +}} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHeader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zHeader.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,96 @@ +// 7z/7zHeader.h + +#ifndef __7Z_HEADER_H +#define __7Z_HEADER_H + +#include "../../../Common/Types.h" + +namespace NArchive { +namespace N7z { + +const int kSignatureSize = 6; +extern Byte kSignature[kSignatureSize]; + +// #define _7Z_VOL +// 7z-MultiVolume is not finished yet. +// It can work already, but I still do not like some +// things of that new multivolume format. +// So please keep it commented. + +#ifdef _7Z_VOL +extern Byte kFinishSignature[kSignatureSize]; +#endif + +struct CArchiveVersion +{ + Byte Major; + Byte Minor; +}; + +const Byte kMajorVersion = 0; + +struct CStartHeader +{ + UInt64 NextHeaderOffset; + UInt64 NextHeaderSize; + UInt32 NextHeaderCRC; +}; + +const UInt32 kStartHeaderSize = 20; + +#ifdef _7Z_VOL +struct CFinishHeader: public CStartHeader +{ + UInt64 ArchiveStartOffset; // data offset from end if that struct + UInt64 AdditionalStartBlockSize; // start signature & start header size +}; + +const UInt32 kFinishHeaderSize = kStartHeaderSize + 16; +#endif + +namespace NID +{ + enum EEnum + { + kEnd, + + kHeader, + + kArchiveProperties, + + kAdditionalStreamsInfo, + kMainStreamsInfo, + kFilesInfo, + + kPackInfo, + kUnPackInfo, + kSubStreamsInfo, + + kSize, + kCRC, + + kFolder, + + kCodersUnPackSize, + kNumUnPackStream, + + kEmptyStream, + kEmptyFile, + kAnti, + + kName, + kCreationTime, + kLastAccessTime, + kLastWriteTime, + kWinAttributes, + kComment, + + kEncodedHeader, + + kStartPos + }; +} + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zIn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zIn.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1206 @@ +// 7zIn.cpp + +#include "StdAfx.h" + +#include "7zIn.h" +#include "7zDecode.h" +#include "../../Common/StreamObjects.h" +#include "../../Common/StreamUtils.h" +extern "C" +{ +#include "../../../../C/7zCrc.h" +} + +// define FORMAT_7Z_RECOVERY if you want to recover multivolume archives with empty StartHeader +#ifndef _SFX +#define FORMAT_7Z_RECOVERY +#endif + +namespace NArchive { +namespace N7z { + +class CInArchiveException {}; + +static void ThrowException() { throw CInArchiveException(); } +static inline void ThrowEndOfData() { ThrowException(); } +static inline void ThrowUnsupported() { ThrowException(); } +static inline void ThrowIncorrect() { ThrowException(); } +static inline void ThrowUnsupportedVersion() { ThrowException(); } + +/* +class CInArchiveException +{ +public: + enum CCauseType + { + kUnsupportedVersion = 0, + kUnsupported, + kIncorrect, + kEndOfData, + } Cause; + CInArchiveException(CCauseType cause): Cause(cause) {}; +}; + +static void ThrowException(CInArchiveException::CCauseType c) { throw CInArchiveException(c); } +static void ThrowEndOfData() { ThrowException(CInArchiveException::kEndOfData); } +static void ThrowUnsupported() { ThrowException(CInArchiveException::kUnsupported); } +static void ThrowIncorrect() { ThrowException(CInArchiveException::kIncorrect); } +static void ThrowUnsupportedVersion() { ThrowException(CInArchiveException::kUnsupportedVersion); } +*/ + +class CStreamSwitch +{ + CInArchive *_archive; + bool _needRemove; +public: + CStreamSwitch(): _needRemove(false) {} + ~CStreamSwitch() { Remove(); } + void Remove(); + void Set(CInArchive *archive, const Byte *data, size_t size); + void Set(CInArchive *archive, const CByteBuffer &byteBuffer); + void Set(CInArchive *archive, const CObjectVector *dataVector); +}; + +void CStreamSwitch::Remove() +{ + if (_needRemove) + { + _archive->DeleteByteStream(); + _needRemove = false; + } +} + +void CStreamSwitch::Set(CInArchive *archive, const Byte *data, size_t size) +{ + Remove(); + _archive = archive; + _archive->AddByteStream(data, size); + _needRemove = true; +} + +void CStreamSwitch::Set(CInArchive *archive, const CByteBuffer &byteBuffer) +{ + Set(archive, byteBuffer, byteBuffer.GetCapacity()); +} + +void CStreamSwitch::Set(CInArchive *archive, const CObjectVector *dataVector) +{ + Remove(); + Byte external = archive->ReadByte(); + if (external != 0) + { + int dataIndex = (int)archive->ReadNum(); + if (dataIndex < 0 || dataIndex >= dataVector->Size()) + ThrowIncorrect(); + Set(archive, (*dataVector)[dataIndex]); + } +} + +#if defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || defined(__i386__) || defined(__x86_64__) +#define SZ_LITTLE_ENDIAN_UNALIGN +#endif + +#ifdef SZ_LITTLE_ENDIAN_UNALIGN +static inline UInt16 GetUInt16FromMem(const Byte *p) { return *(const UInt16 *)p; } +static inline UInt32 GetUInt32FromMem(const Byte *p) { return *(const UInt32 *)p; } +static inline UInt64 GetUInt64FromMem(const Byte *p) { return *(const UInt64 *)p; } +#else +static inline UInt16 GetUInt16FromMem(const Byte *p) { return p[0] | ((UInt16)p[1] << 8); } +static inline UInt32 GetUInt32FromMem(const Byte *p) { return p[0] | ((UInt32)p[1] << 8) | ((UInt32)p[2] << 16) | ((UInt32)p[3] << 24); } +static inline UInt64 GetUInt64FromMem(const Byte *p) { return GetUInt32FromMem(p) | ((UInt64)GetUInt32FromMem(p + 4) << 32); } +#endif + +Byte CInByte2::ReadByte() +{ + if (_pos >= _size) + ThrowEndOfData(); + return _buffer[_pos++]; +} + +void CInByte2::ReadBytes(Byte *data, size_t size) +{ + if (size > _size - _pos) + ThrowEndOfData(); + for (size_t i = 0; i < size; i++) + data[i] = _buffer[_pos++]; +} + +void CInByte2::SkeepData(UInt64 size) +{ + if (size > _size - _pos) + ThrowEndOfData(); +} + +void CInByte2::SkeepData() +{ + SkeepData(ReadNumber()); +} + +UInt64 CInByte2::ReadNumber() +{ + if (_pos >= _size) + ThrowEndOfData(); + Byte firstByte = _buffer[_pos++]; + Byte mask = 0x80; + UInt64 value = 0; + for (int i = 0; i < 8; i++) + { + if ((firstByte & mask) == 0) + { + UInt64 highPart = firstByte & (mask - 1); + value += (highPart << (i * 8)); + return value; + } + if (_pos >= _size) + ThrowEndOfData(); + value |= ((UInt64)_buffer[_pos++] << (8 * i)); + mask >>= 1; + } + return value; +} + +CNum CInByte2::ReadNum() +{ + UInt64 value = ReadNumber(); + if (value > kNumMax) + ThrowUnsupported(); + return (CNum)value; +} + +UInt32 CInByte2::ReadUInt32() +{ + if (_pos + 4 > _size) + ThrowEndOfData(); + UInt32 res = GetUInt32FromMem(_buffer + _pos); + _pos += 4; + return res; +} + +UInt64 CInByte2::ReadUInt64() +{ + if (_pos + 8 > _size) + ThrowEndOfData(); + UInt64 res = GetUInt64FromMem(_buffer + _pos); + _pos += 8; + return res; +} + +void CInByte2::ReadString(UString &s) +{ + const Byte *buf = _buffer + _pos; + size_t rem = (_size - _pos) / 2 * 2; + { + size_t i; + for (i = 0; i < rem; i += 2) + if (buf[i] == 0 && buf[i + 1] == 0) + break; + if (i == rem) + ThrowEndOfData(); + rem = i; + } + int len = (int)(rem / 2); + if (len < 0 || (size_t)len * 2 != rem) + ThrowUnsupported(); + wchar_t *p = s.GetBuffer(len); + int i; + for (i = 0; i < len; i++, buf += 2) + p[i] = (wchar_t)GetUInt16FromMem(buf); + p[i] = 0; + s.ReleaseBuffer(len); + _pos += rem + 2; +} + +static inline bool TestSignatureCandidate(const Byte *p) +{ + for (int i = 0; i < kSignatureSize; i++) + if (p[i] != kSignature[i]) + return false; + return (p[0x1A] == 0 && p[0x1B] == 0); +} + +HRESULT CInArchive::FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit) +{ + UInt32 processedSize; + RINOK(ReadStream(stream, _header, kHeaderSize, &processedSize)); + if (processedSize != kHeaderSize) + return S_FALSE; + if (TestSignatureCandidate(_header)) + return S_OK; + + CByteBuffer byteBuffer; + const UInt32 kBufferSize = (1 << 16); + byteBuffer.SetCapacity(kBufferSize); + Byte *buffer = byteBuffer; + UInt32 numPrevBytes = kHeaderSize - 1; + memcpy(buffer, _header + 1, numPrevBytes); + UInt64 curTestPos = _arhiveBeginStreamPosition + 1; + for (;;) + { + if (searchHeaderSizeLimit != NULL) + if (curTestPos - _arhiveBeginStreamPosition > *searchHeaderSizeLimit) + break; + UInt32 numReadBytes = kBufferSize - numPrevBytes; + RINOK(stream->Read(buffer + numPrevBytes, numReadBytes, &processedSize)); + UInt32 numBytesInBuffer = numPrevBytes + processedSize; + if (numBytesInBuffer < kHeaderSize) + break; + UInt32 numTests = numBytesInBuffer - kHeaderSize + 1; + for(UInt32 pos = 0; pos < numTests; pos++, curTestPos++) + { + if (TestSignatureCandidate(buffer + pos)) + { + memcpy(_header, buffer + pos, kHeaderSize); + _arhiveBeginStreamPosition = curTestPos; + return stream->Seek(curTestPos + kHeaderSize, STREAM_SEEK_SET, NULL); + } + } + numPrevBytes = numBytesInBuffer - numTests; + memmove(buffer, buffer + numTests, numPrevBytes); + } + return S_FALSE; +} + +// S_FALSE means that file is not archive +HRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit) +{ + Close(); + RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_arhiveBeginStreamPosition)) + RINOK(FindAndReadSignature(stream, searchHeaderSizeLimit)); + _stream = stream; + return S_OK; +} + +void CInArchive::Close() +{ + _stream.Release(); +} + +void CInArchive::ReadArchiveProperties(CInArchiveInfo & /* archiveInfo */) +{ + for (;;) + { + if (ReadID() == NID::kEnd) + break; + SkeepData(); + } +} + +void CInArchive::GetNextFolderItem(CFolder &folder) +{ + CNum numCoders = ReadNum(); + + folder.Coders.Clear(); + folder.Coders.Reserve((int)numCoders); + CNum numInStreams = 0; + CNum numOutStreams = 0; + CNum i; + for (i = 0; i < numCoders; i++) + { + folder.Coders.Add(CCoderInfo()); + CCoderInfo &coder = folder.Coders.Back(); + + { + Byte mainByte = ReadByte(); + int idSize = (mainByte & 0xF); + Byte longID[15]; + ReadBytes(longID, idSize); + if (idSize > 8) + ThrowUnsupported(); + UInt64 id = 0; + for (int j = 0; j < idSize; j++) + id |= (UInt64)longID[idSize - 1 - j] << (8 * j); + coder.MethodID = id; + + if ((mainByte & 0x10) != 0) + { + coder.NumInStreams = ReadNum(); + coder.NumOutStreams = ReadNum(); + } + else + { + coder.NumInStreams = 1; + coder.NumOutStreams = 1; + } + if ((mainByte & 0x20) != 0) + { + CNum propertiesSize = ReadNum(); + coder.Properties.SetCapacity((size_t)propertiesSize); + ReadBytes((Byte *)coder.Properties, (size_t)propertiesSize); + } + if ((mainByte & 0x80) != 0) + ThrowUnsupported(); + } + numInStreams += coder.NumInStreams; + numOutStreams += coder.NumOutStreams; + } + + CNum numBindPairs; + numBindPairs = numOutStreams - 1; + folder.BindPairs.Clear(); + folder.BindPairs.Reserve(numBindPairs); + for (i = 0; i < numBindPairs; i++) + { + CBindPair bindPair; + bindPair.InIndex = ReadNum(); + bindPair.OutIndex = ReadNum(); + folder.BindPairs.Add(bindPair); + } + + CNum numPackedStreams = numInStreams - numBindPairs; + folder.PackStreams.Reserve(numPackedStreams); + if (numPackedStreams == 1) + { + for (CNum j = 0; j < numInStreams; j++) + if (folder.FindBindPairForInStream(j) < 0) + { + folder.PackStreams.Add(j); + break; + } + } + else + for(i = 0; i < numPackedStreams; i++) + folder.PackStreams.Add(ReadNum()); +} + +void CInArchive::WaitAttribute(UInt64 attribute) +{ + for (;;) + { + UInt64 type = ReadID(); + if (type == attribute) + return; + if (type == NID::kEnd) + ThrowIncorrect(); + SkeepData(); + } +} + +void CInArchive::ReadHashDigests(int numItems, + CRecordVector &digestsDefined, + CRecordVector &digests) +{ + ReadBoolVector2(numItems, digestsDefined); + digests.Clear(); + digests.Reserve(numItems); + for(int i = 0; i < numItems; i++) + { + UInt32 crc = 0; + if (digestsDefined[i]) + crc = ReadUInt32(); + digests.Add(crc); + } +} + +void CInArchive::ReadPackInfo( + UInt64 &dataOffset, + CRecordVector &packSizes, + CRecordVector &packCRCsDefined, + CRecordVector &packCRCs) +{ + dataOffset = ReadNumber(); + CNum numPackStreams = ReadNum(); + + WaitAttribute(NID::kSize); + packSizes.Clear(); + packSizes.Reserve(numPackStreams); + for (CNum i = 0; i < numPackStreams; i++) + packSizes.Add(ReadNumber()); + + UInt64 type; + for (;;) + { + type = ReadID(); + if (type == NID::kEnd) + break; + if (type == NID::kCRC) + { + ReadHashDigests(numPackStreams, packCRCsDefined, packCRCs); + continue; + } + SkeepData(); + } + if (packCRCsDefined.IsEmpty()) + { + packCRCsDefined.Reserve(numPackStreams); + packCRCsDefined.Clear(); + packCRCs.Reserve(numPackStreams); + packCRCs.Clear(); + for(CNum i = 0; i < numPackStreams; i++) + { + packCRCsDefined.Add(false); + packCRCs.Add(0); + } + } +} + +void CInArchive::ReadUnPackInfo( + const CObjectVector *dataVector, + CObjectVector &folders) +{ + WaitAttribute(NID::kFolder); + CNum numFolders = ReadNum(); + + { + CStreamSwitch streamSwitch; + streamSwitch.Set(this, dataVector); + folders.Clear(); + folders.Reserve(numFolders); + for(CNum i = 0; i < numFolders; i++) + { + folders.Add(CFolder()); + GetNextFolderItem(folders.Back()); + } + } + + WaitAttribute(NID::kCodersUnPackSize); + + CNum i; + for (i = 0; i < numFolders; i++) + { + CFolder &folder = folders[i]; + CNum numOutStreams = folder.GetNumOutStreams(); + folder.UnPackSizes.Reserve(numOutStreams); + for (CNum j = 0; j < numOutStreams; j++) + folder.UnPackSizes.Add(ReadNumber()); + } + + for (;;) + { + UInt64 type = ReadID(); + if (type == NID::kEnd) + return; + if (type == NID::kCRC) + { + CRecordVector crcsDefined; + CRecordVector crcs; + ReadHashDigests(numFolders, crcsDefined, crcs); + for(i = 0; i < numFolders; i++) + { + CFolder &folder = folders[i]; + folder.UnPackCRCDefined = crcsDefined[i]; + folder.UnPackCRC = crcs[i]; + } + continue; + } + SkeepData(); + } +} + +void CInArchive::ReadSubStreamsInfo( + const CObjectVector &folders, + CRecordVector &numUnPackStreamsInFolders, + CRecordVector &unPackSizes, + CRecordVector &digestsDefined, + CRecordVector &digests) +{ + numUnPackStreamsInFolders.Clear(); + numUnPackStreamsInFolders.Reserve(folders.Size()); + UInt64 type; + for (;;) + { + type = ReadID(); + if (type == NID::kNumUnPackStream) + { + for(int i = 0; i < folders.Size(); i++) + numUnPackStreamsInFolders.Add(ReadNum()); + continue; + } + if (type == NID::kCRC || type == NID::kSize) + break; + if (type == NID::kEnd) + break; + SkeepData(); + } + + if (numUnPackStreamsInFolders.IsEmpty()) + for(int i = 0; i < folders.Size(); i++) + numUnPackStreamsInFolders.Add(1); + + int i; + for(i = 0; i < numUnPackStreamsInFolders.Size(); i++) + { + // v3.13 incorrectly worked with empty folders + // v4.07: we check that folder is empty + CNum numSubstreams = numUnPackStreamsInFolders[i]; + if (numSubstreams == 0) + continue; + UInt64 sum = 0; + for (CNum j = 1; j < numSubstreams; j++) + if (type == NID::kSize) + { + UInt64 size = ReadNumber(); + unPackSizes.Add(size); + sum += size; + } + unPackSizes.Add(folders[i].GetUnPackSize() - sum); + } + if (type == NID::kSize) + type = ReadID(); + + int numDigests = 0; + int numDigestsTotal = 0; + for(i = 0; i < folders.Size(); i++) + { + CNum numSubstreams = numUnPackStreamsInFolders[i]; + if (numSubstreams != 1 || !folders[i].UnPackCRCDefined) + numDigests += numSubstreams; + numDigestsTotal += numSubstreams; + } + + for (;;) + { + if (type == NID::kCRC) + { + CRecordVector digestsDefined2; + CRecordVector digests2; + ReadHashDigests(numDigests, digestsDefined2, digests2); + int digestIndex = 0; + for (i = 0; i < folders.Size(); i++) + { + CNum numSubstreams = numUnPackStreamsInFolders[i]; + const CFolder &folder = folders[i]; + if (numSubstreams == 1 && folder.UnPackCRCDefined) + { + digestsDefined.Add(true); + digests.Add(folder.UnPackCRC); + } + else + for (CNum j = 0; j < numSubstreams; j++, digestIndex++) + { + digestsDefined.Add(digestsDefined2[digestIndex]); + digests.Add(digests2[digestIndex]); + } + } + } + else if (type == NID::kEnd) + { + if (digestsDefined.IsEmpty()) + { + digestsDefined.Clear(); + digests.Clear(); + for (int i = 0; i < numDigestsTotal; i++) + { + digestsDefined.Add(false); + digests.Add(0); + } + } + return; + } + else + SkeepData(); + type = ReadID(); + } +} + +void CInArchive::ReadStreamsInfo( + const CObjectVector *dataVector, + UInt64 &dataOffset, + CRecordVector &packSizes, + CRecordVector &packCRCsDefined, + CRecordVector &packCRCs, + CObjectVector &folders, + CRecordVector &numUnPackStreamsInFolders, + CRecordVector &unPackSizes, + CRecordVector &digestsDefined, + CRecordVector &digests) +{ + for (;;) + { + UInt64 type = ReadID(); + if (type > ((UInt32)1 << 30)) + ThrowIncorrect(); + switch((UInt32)type) + { + case NID::kEnd: + return; + case NID::kPackInfo: + { + ReadPackInfo(dataOffset, packSizes, packCRCsDefined, packCRCs); + break; + } + case NID::kUnPackInfo: + { + ReadUnPackInfo(dataVector, folders); + break; + } + case NID::kSubStreamsInfo: + { + ReadSubStreamsInfo(folders, numUnPackStreamsInFolders, + unPackSizes, digestsDefined, digests); + break; + } + default: + ThrowIncorrect(); + } + } +} + +void CInArchive::ReadBoolVector(int numItems, CBoolVector &v) +{ + v.Clear(); + v.Reserve(numItems); + Byte b = 0; + Byte mask = 0; + for(int i = 0; i < numItems; i++) + { + if (mask == 0) + { + b = ReadByte(); + mask = 0x80; + } + v.Add((b & mask) != 0); + mask >>= 1; + } +} + +void CInArchive::ReadBoolVector2(int numItems, CBoolVector &v) +{ + Byte allAreDefined = ReadByte(); + if (allAreDefined == 0) + { + ReadBoolVector(numItems, v); + return; + } + v.Clear(); + v.Reserve(numItems); + for (int i = 0; i < numItems; i++) + v.Add(true); +} + +void CInArchive::ReadTime(const CObjectVector &dataVector, + CObjectVector &files, UInt32 type) +{ + CBoolVector boolVector; + ReadBoolVector2(files.Size(), boolVector); + + CStreamSwitch streamSwitch; + streamSwitch.Set(this, &dataVector); + + for(int i = 0; i < files.Size(); i++) + { + CFileItem &file = files[i]; + CArchiveFileTime fileTime; + fileTime.dwLowDateTime = 0; + fileTime.dwHighDateTime = 0; + bool defined = boolVector[i]; + if (defined) + { + fileTime.dwLowDateTime = ReadUInt32(); + fileTime.dwHighDateTime = ReadUInt32(); + } + switch(type) + { + case NID::kCreationTime: + file.IsCreationTimeDefined = defined; + if (defined) + file.CreationTime = fileTime; + break; + case NID::kLastWriteTime: + file.IsLastWriteTimeDefined = defined; + if (defined) + file.LastWriteTime = fileTime; + break; + case NID::kLastAccessTime: + file.IsLastAccessTimeDefined = defined; + if (defined) + file.LastAccessTime = fileTime; + break; + } + } +} + +HRESULT CInArchive::ReadAndDecodePackedStreams( + DECL_EXTERNAL_CODECS_LOC_VARS + UInt64 baseOffset, + UInt64 &dataOffset, CObjectVector &dataVector + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getTextPassword + #endif + ) +{ + CRecordVector packSizes; + CRecordVector packCRCsDefined; + CRecordVector packCRCs; + CObjectVector folders; + + CRecordVector numUnPackStreamsInFolders; + CRecordVector unPackSizes; + CRecordVector digestsDefined; + CRecordVector digests; + + ReadStreamsInfo(NULL, + dataOffset, + packSizes, + packCRCsDefined, + packCRCs, + folders, + numUnPackStreamsInFolders, + unPackSizes, + digestsDefined, + digests); + + // database.ArchiveInfo.DataStartPosition2 += database.ArchiveInfo.StartPositionAfterHeader; + + CNum packIndex = 0; + CDecoder decoder( + #ifdef _ST_MODE + false + #else + true + #endif + ); + UInt64 dataStartPos = baseOffset + dataOffset; + for(int i = 0; i < folders.Size(); i++) + { + const CFolder &folder = folders[i]; + dataVector.Add(CByteBuffer()); + CByteBuffer &data = dataVector.Back(); + UInt64 unPackSize64 = folder.GetUnPackSize(); + size_t unPackSize = (size_t)unPackSize64; + if (unPackSize != unPackSize64) + ThrowUnsupported(); + data.SetCapacity(unPackSize); + + CSequentialOutStreamImp2 *outStreamSpec = new CSequentialOutStreamImp2; + CMyComPtr outStream = outStreamSpec; + outStreamSpec->Init(data, unPackSize); + + HRESULT result = decoder.Decode( + EXTERNAL_CODECS_LOC_VARS + _stream, dataStartPos, + &packSizes[packIndex], folder, outStream, NULL + #ifndef _NO_CRYPTO + , getTextPassword + #endif + #ifdef COMPRESS_MT + , false, 1 + #endif + ); + RINOK(result); + + if (folder.UnPackCRCDefined) + if (CrcCalc(data, unPackSize) != folder.UnPackCRC) + ThrowIncorrect(); + for (int j = 0; j < folder.PackStreams.Size(); j++) + dataStartPos += packSizes[packIndex++]; + } + return S_OK; +} + +HRESULT CInArchive::ReadHeader( + DECL_EXTERNAL_CODECS_LOC_VARS + CArchiveDatabaseEx &database + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getTextPassword + #endif + ) +{ + UInt64 type = ReadID(); + + if (type == NID::kArchiveProperties) + { + ReadArchiveProperties(database.ArchiveInfo); + type = ReadID(); + } + + CObjectVector dataVector; + + if (type == NID::kAdditionalStreamsInfo) + { + HRESULT result = ReadAndDecodePackedStreams( + EXTERNAL_CODECS_LOC_VARS + database.ArchiveInfo.StartPositionAfterHeader, + database.ArchiveInfo.DataStartPosition2, + dataVector + #ifndef _NO_CRYPTO + , getTextPassword + #endif + ); + RINOK(result); + database.ArchiveInfo.DataStartPosition2 += database.ArchiveInfo.StartPositionAfterHeader; + type = ReadID(); + } + + CRecordVector unPackSizes; + CRecordVector digestsDefined; + CRecordVector digests; + + if (type == NID::kMainStreamsInfo) + { + ReadStreamsInfo(&dataVector, + database.ArchiveInfo.DataStartPosition, + database.PackSizes, + database.PackCRCsDefined, + database.PackCRCs, + database.Folders, + database.NumUnPackStreamsVector, + unPackSizes, + digestsDefined, + digests); + database.ArchiveInfo.DataStartPosition += database.ArchiveInfo.StartPositionAfterHeader; + type = ReadID(); + } + else + { + for(int i = 0; i < database.Folders.Size(); i++) + { + database.NumUnPackStreamsVector.Add(1); + CFolder &folder = database.Folders[i]; + unPackSizes.Add(folder.GetUnPackSize()); + digestsDefined.Add(folder.UnPackCRCDefined); + digests.Add(folder.UnPackCRC); + } + } + + database.Files.Clear(); + + if (type == NID::kEnd) + return S_OK; + if (type != NID::kFilesInfo) + ThrowIncorrect(); + + CNum numFiles = ReadNum(); + database.Files.Reserve(numFiles); + CNum i; + for(i = 0; i < numFiles; i++) + database.Files.Add(CFileItem()); + + database.ArchiveInfo.FileInfoPopIDs.Add(NID::kSize); + if (!database.PackSizes.IsEmpty()) + database.ArchiveInfo.FileInfoPopIDs.Add(NID::kPackInfo); + if (numFiles > 0 && !digests.IsEmpty()) + database.ArchiveInfo.FileInfoPopIDs.Add(NID::kCRC); + + CBoolVector emptyStreamVector; + emptyStreamVector.Reserve((int)numFiles); + for(i = 0; i < numFiles; i++) + emptyStreamVector.Add(false); + CBoolVector emptyFileVector; + CBoolVector antiFileVector; + CNum numEmptyStreams = 0; + + for (;;) + { + UInt64 type = ReadID(); + if (type == NID::kEnd) + break; + UInt64 size = ReadNumber(); + bool isKnownType = true; + if (type > ((UInt32)1 << 30)) + isKnownType = false; + else switch((UInt32)type) + { + case NID::kName: + { + CStreamSwitch streamSwitch; + streamSwitch.Set(this, &dataVector); + for(int i = 0; i < database.Files.Size(); i++) + _inByteBack->ReadString(database.Files[i].Name); + break; + } + case NID::kWinAttributes: + { + CBoolVector boolVector; + ReadBoolVector2(database.Files.Size(), boolVector); + CStreamSwitch streamSwitch; + streamSwitch.Set(this, &dataVector); + for(i = 0; i < numFiles; i++) + { + CFileItem &file = database.Files[i]; + file.AreAttributesDefined = boolVector[i]; + if (file.AreAttributesDefined) + file.Attributes = ReadUInt32(); + } + break; + } + case NID::kStartPos: + { + CBoolVector boolVector; + ReadBoolVector2(database.Files.Size(), boolVector); + CStreamSwitch streamSwitch; + streamSwitch.Set(this, &dataVector); + for(i = 0; i < numFiles; i++) + { + CFileItem &file = database.Files[i]; + file.IsStartPosDefined = boolVector[i]; + if (file.IsStartPosDefined) + file.StartPos = ReadUInt64(); + } + break; + } + case NID::kEmptyStream: + { + ReadBoolVector(numFiles, emptyStreamVector); + for (i = 0; i < (CNum)emptyStreamVector.Size(); i++) + if (emptyStreamVector[i]) + numEmptyStreams++; + emptyFileVector.Reserve(numEmptyStreams); + antiFileVector.Reserve(numEmptyStreams); + for (i = 0; i < numEmptyStreams; i++) + { + emptyFileVector.Add(false); + antiFileVector.Add(false); + } + break; + } + case NID::kEmptyFile: + { + ReadBoolVector(numEmptyStreams, emptyFileVector); + break; + } + case NID::kAnti: + { + ReadBoolVector(numEmptyStreams, antiFileVector); + break; + } + case NID::kCreationTime: + case NID::kLastWriteTime: + case NID::kLastAccessTime: + { + ReadTime(dataVector, database.Files, (UInt32)type); + break; + } + default: + isKnownType = false; + } + if (isKnownType) + database.ArchiveInfo.FileInfoPopIDs.Add(type); + else + SkeepData(size); + } + + CNum emptyFileIndex = 0; + CNum sizeIndex = 0; + for(i = 0; i < numFiles; i++) + { + CFileItem &file = database.Files[i]; + file.HasStream = !emptyStreamVector[i]; + if(file.HasStream) + { + file.IsDirectory = false; + file.IsAnti = false; + file.UnPackSize = unPackSizes[sizeIndex]; + file.FileCRC = digests[sizeIndex]; + file.IsFileCRCDefined = digestsDefined[sizeIndex]; + sizeIndex++; + } + else + { + file.IsDirectory = !emptyFileVector[emptyFileIndex]; + file.IsAnti = antiFileVector[emptyFileIndex]; + emptyFileIndex++; + file.UnPackSize = 0; + file.IsFileCRCDefined = false; + } + } + return S_OK; +} + + +void CArchiveDatabaseEx::FillFolderStartPackStream() +{ + FolderStartPackStreamIndex.Clear(); + FolderStartPackStreamIndex.Reserve(Folders.Size()); + CNum startPos = 0; + for(int i = 0; i < Folders.Size(); i++) + { + FolderStartPackStreamIndex.Add(startPos); + startPos += (CNum)Folders[i].PackStreams.Size(); + } +} + +void CArchiveDatabaseEx::FillStartPos() +{ + PackStreamStartPositions.Clear(); + PackStreamStartPositions.Reserve(PackSizes.Size()); + UInt64 startPos = 0; + for(int i = 0; i < PackSizes.Size(); i++) + { + PackStreamStartPositions.Add(startPos); + startPos += PackSizes[i]; + } +} + +void CArchiveDatabaseEx::FillFolderStartFileIndex() +{ + FolderStartFileIndex.Clear(); + FolderStartFileIndex.Reserve(Folders.Size()); + FileIndexToFolderIndexMap.Clear(); + FileIndexToFolderIndexMap.Reserve(Files.Size()); + + int folderIndex = 0; + CNum indexInFolder = 0; + for (int i = 0; i < Files.Size(); i++) + { + const CFileItem &file = Files[i]; + bool emptyStream = !file.HasStream; + if (emptyStream && indexInFolder == 0) + { + FileIndexToFolderIndexMap.Add(kNumNoIndex); + continue; + } + if (indexInFolder == 0) + { + // v3.13 incorrectly worked with empty folders + // v4.07: Loop for skipping empty folders + for (;;) + { + if (folderIndex >= Folders.Size()) + ThrowIncorrect(); + FolderStartFileIndex.Add(i); // check it + if (NumUnPackStreamsVector[folderIndex] != 0) + break; + folderIndex++; + } + } + FileIndexToFolderIndexMap.Add(folderIndex); + if (emptyStream) + continue; + indexInFolder++; + if (indexInFolder >= NumUnPackStreamsVector[folderIndex]) + { + folderIndex++; + indexInFolder = 0; + } + } +} + +HRESULT CInArchive::ReadDatabase2( + DECL_EXTERNAL_CODECS_LOC_VARS + CArchiveDatabaseEx &database + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getTextPassword + #endif + ) +{ + database.Clear(); + database.ArchiveInfo.StartPosition = _arhiveBeginStreamPosition; + + database.ArchiveInfo.Version.Major = _header[6]; + database.ArchiveInfo.Version.Minor = _header[7]; + + if (database.ArchiveInfo.Version.Major != kMajorVersion) + ThrowUnsupportedVersion(); + + UInt32 crcFromArchive = GetUInt32FromMem(_header + 8); + UInt64 nextHeaderOffset = GetUInt64FromMem(_header + 0xC); + UInt64 nextHeaderSize = GetUInt64FromMem(_header + 0x14); + UInt32 nextHeaderCRC = GetUInt32FromMem(_header + 0x1C); + UInt32 crc = CrcCalc(_header + 0xC, 20); + + #ifdef FORMAT_7Z_RECOVERY + if (crcFromArchive == 0 && nextHeaderOffset == 0 && nextHeaderSize == 0 && nextHeaderCRC == 0) + { + UInt64 cur, cur2; + RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &cur)); + const int kCheckSize = 500; + Byte buf[kCheckSize]; + RINOK(_stream->Seek(0, STREAM_SEEK_END, &cur2)); + int checkSize = kCheckSize; + if (cur2 - cur < kCheckSize) + checkSize = (int)(cur2 - cur); + RINOK(_stream->Seek(-checkSize, STREAM_SEEK_END, &cur2)); + + UInt32 realProcessedSize; + RINOK(_stream->Read(buf, (UInt32)kCheckSize, &realProcessedSize)); + + int i; + for (i = (int)realProcessedSize - 2; i >= 0; i--) + if (buf[i] == 0x17 && buf[i + 1] == 0x6 || buf[i] == 0x01 && buf[i + 1] == 0x04) + break; + if (i < 0) + return S_FALSE; + nextHeaderSize = realProcessedSize - i; + nextHeaderOffset = cur2 - cur + i; + nextHeaderCRC = CrcCalc(buf + i, (size_t)nextHeaderSize); + RINOK(_stream->Seek(cur, STREAM_SEEK_SET, NULL)); + } + #endif + + #ifdef FORMAT_7Z_RECOVERY + crcFromArchive = crc; + #endif + + database.ArchiveInfo.StartPositionAfterHeader = _arhiveBeginStreamPosition + kHeaderSize; + + if (crc != crcFromArchive) + ThrowIncorrect(); + + if (nextHeaderSize == 0) + return S_OK; + + if (nextHeaderSize > (UInt64)0xFFFFFFFF) + return S_FALSE; + + RINOK(_stream->Seek(nextHeaderOffset, STREAM_SEEK_CUR, NULL)); + + CByteBuffer buffer2; + buffer2.SetCapacity((size_t)nextHeaderSize); + + UInt32 realProcessedSize; + RINOK(_stream->Read(buffer2, (UInt32)nextHeaderSize, &realProcessedSize)); + if (realProcessedSize != (UInt32)nextHeaderSize) + return S_FALSE; + if (CrcCalc(buffer2, (UInt32)nextHeaderSize) != nextHeaderCRC) + ThrowIncorrect(); + + CStreamSwitch streamSwitch; + streamSwitch.Set(this, buffer2); + + CObjectVector dataVector; + + for (;;) + { + UInt64 type = ReadID(); + if (type == NID::kHeader) + break; + if (type != NID::kEncodedHeader) + ThrowIncorrect(); + HRESULT result = ReadAndDecodePackedStreams( + EXTERNAL_CODECS_LOC_VARS + database.ArchiveInfo.StartPositionAfterHeader, + database.ArchiveInfo.DataStartPosition2, + dataVector + #ifndef _NO_CRYPTO + , getTextPassword + #endif + ); + RINOK(result); + if (dataVector.Size() == 0) + return S_OK; + if (dataVector.Size() > 1) + ThrowIncorrect(); + streamSwitch.Remove(); + streamSwitch.Set(this, dataVector.Front()); + } + + return ReadHeader( + EXTERNAL_CODECS_LOC_VARS + database + #ifndef _NO_CRYPTO + , getTextPassword + #endif + ); +} + +HRESULT CInArchive::ReadDatabase( + DECL_EXTERNAL_CODECS_LOC_VARS + CArchiveDatabaseEx &database + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getTextPassword + #endif + ) +{ + try + { + return ReadDatabase2( + EXTERNAL_CODECS_LOC_VARS database + #ifndef _NO_CRYPTO + , getTextPassword + #endif + ); + } + catch(CInArchiveException &) { return S_FALSE; } +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zIn.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zIn.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,235 @@ +// 7zIn.h + +#ifndef __7Z_IN_H +#define __7Z_IN_H + +#include "../../../Common/MyCom.h" +#include "../../IStream.h" +#include "../../IPassword.h" +#include "../../Common/CreateCoder.h" +#include "../../Common/InBuffer.h" + +#include "7zItem.h" + +namespace NArchive { +namespace N7z { + +struct CInArchiveInfo +{ + CArchiveVersion Version; + UInt64 StartPosition; + UInt64 StartPositionAfterHeader; + UInt64 DataStartPosition; + UInt64 DataStartPosition2; + CRecordVector FileInfoPopIDs; + void Clear() + { + FileInfoPopIDs.Clear(); + } +}; + +struct CArchiveDatabaseEx: public CArchiveDatabase +{ + CInArchiveInfo ArchiveInfo; + CRecordVector PackStreamStartPositions; + CRecordVector FolderStartPackStreamIndex; + CRecordVector FolderStartFileIndex; + CRecordVector FileIndexToFolderIndexMap; + + void Clear() + { + CArchiveDatabase::Clear(); + ArchiveInfo.Clear(); + PackStreamStartPositions.Clear(); + FolderStartPackStreamIndex.Clear(); + FolderStartFileIndex.Clear(); + FileIndexToFolderIndexMap.Clear(); + } + + void FillFolderStartPackStream(); + void FillStartPos(); + void FillFolderStartFileIndex(); + + void Fill() + { + FillFolderStartPackStream(); + FillStartPos(); + FillFolderStartFileIndex(); + } + + UInt64 GetFolderStreamPos(int folderIndex, int indexInFolder) const + { + return ArchiveInfo.DataStartPosition + + PackStreamStartPositions[FolderStartPackStreamIndex[folderIndex] + indexInFolder]; + } + + UInt64 GetFolderFullPackSize(int folderIndex) const + { + CNum packStreamIndex = FolderStartPackStreamIndex[folderIndex]; + const CFolder &folder = Folders[folderIndex]; + UInt64 size = 0; + for (int i = 0; i < folder.PackStreams.Size(); i++) + size += PackSizes[packStreamIndex + i]; + return size; + } + + UInt64 GetFolderPackStreamSize(int folderIndex, int streamIndex) const + { + return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex]; + } + + UInt64 GetFilePackSize(CNum fileIndex) const + { + CNum folderIndex = FileIndexToFolderIndexMap[fileIndex]; + if (folderIndex != kNumNoIndex) + if (FolderStartFileIndex[folderIndex] == fileIndex) + return GetFolderFullPackSize(folderIndex); + return 0; + } +}; + +class CInByte2 +{ + const Byte *_buffer; + size_t _size; + size_t _pos; +public: + void Init(const Byte *buffer, size_t size) + { + _buffer = buffer; + _size = size; + _pos = 0; + } + Byte ReadByte(); + void ReadBytes(Byte *data, size_t size); + void SkeepData(UInt64 size); + void SkeepData(); + UInt64 ReadNumber(); + CNum ReadNum(); + UInt32 ReadUInt32(); + UInt64 ReadUInt64(); + void ReadString(UString &s); +}; + +class CStreamSwitch; + +const UInt32 kHeaderSize = 32; + +class CInArchive +{ + friend class CStreamSwitch; + + CMyComPtr _stream; + + CObjectVector _inByteVector; + CInByte2 *_inByteBack; + + UInt64 _arhiveBeginStreamPosition; + + Byte _header[kHeaderSize]; + + void AddByteStream(const Byte *buffer, size_t size) + { + _inByteVector.Add(CInByte2()); + _inByteBack = &_inByteVector.Back(); + _inByteBack->Init(buffer, size); + } + + void DeleteByteStream() + { + _inByteVector.DeleteBack(); + if (!_inByteVector.IsEmpty()) + _inByteBack = &_inByteVector.Back(); + } + +private: + HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit); + + void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); } + Byte ReadByte() { return _inByteBack->ReadByte(); } + UInt64 ReadNumber() { return _inByteBack->ReadNumber(); } + CNum ReadNum() { return _inByteBack->ReadNum(); } + UInt64 ReadID() { return _inByteBack->ReadNumber(); } + UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); } + UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); } + void SkeepData(UInt64 size) { _inByteBack->SkeepData(size); } + void SkeepData() { _inByteBack->SkeepData(); } + void WaitAttribute(UInt64 attribute); + + void ReadArchiveProperties(CInArchiveInfo &archiveInfo); + void GetNextFolderItem(CFolder &itemInfo); + void ReadHashDigests(int numItems, + CRecordVector &digestsDefined, CRecordVector &digests); + + void ReadPackInfo( + UInt64 &dataOffset, + CRecordVector &packSizes, + CRecordVector &packCRCsDefined, + CRecordVector &packCRCs); + + void ReadUnPackInfo( + const CObjectVector *dataVector, + CObjectVector &folders); + + void ReadSubStreamsInfo( + const CObjectVector &folders, + CRecordVector &numUnPackStreamsInFolders, + CRecordVector &unPackSizes, + CRecordVector &digestsDefined, + CRecordVector &digests); + + void ReadStreamsInfo( + const CObjectVector *dataVector, + UInt64 &dataOffset, + CRecordVector &packSizes, + CRecordVector &packCRCsDefined, + CRecordVector &packCRCs, + CObjectVector &folders, + CRecordVector &numUnPackStreamsInFolders, + CRecordVector &unPackSizes, + CRecordVector &digestsDefined, + CRecordVector &digests); + + + void ReadBoolVector(int numItems, CBoolVector &v); + void ReadBoolVector2(int numItems, CBoolVector &v); + void ReadTime(const CObjectVector &dataVector, + CObjectVector &files, UInt32 type); + HRESULT ReadAndDecodePackedStreams( + DECL_EXTERNAL_CODECS_LOC_VARS + UInt64 baseOffset, UInt64 &dataOffset, + CObjectVector &dataVector + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getTextPassword + #endif + ); + HRESULT ReadHeader( + DECL_EXTERNAL_CODECS_LOC_VARS + CArchiveDatabaseEx &database + #ifndef _NO_CRYPTO + ,ICryptoGetTextPassword *getTextPassword + #endif + ); + HRESULT ReadDatabase2( + DECL_EXTERNAL_CODECS_LOC_VARS + CArchiveDatabaseEx &database + #ifndef _NO_CRYPTO + ,ICryptoGetTextPassword *getTextPassword + #endif + ); +public: + HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive + void Close(); + + HRESULT ReadDatabase( + DECL_EXTERNAL_CODECS_LOC_VARS + CArchiveDatabaseEx &database + #ifndef _NO_CRYPTO + ,ICryptoGetTextPassword *getTextPassword + #endif + ); +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zItem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zItem.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,184 @@ +// 7zItem.h + +#ifndef __7Z_ITEM_H +#define __7Z_ITEM_H + +#include "../../../Common/Buffer.h" +#include "../../../Common/MyString.h" +#include "../../Common/MethodId.h" +#include "7zHeader.h" + +namespace NArchive { +namespace N7z { + +typedef UInt32 CNum; +const CNum kNumMax = 0x7FFFFFFF; +const CNum kNumNoIndex = 0xFFFFFFFF; + +struct CCoderInfo +{ + CMethodId MethodID; + CByteBuffer Properties; + CNum NumInStreams; + CNum NumOutStreams; + bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); } +}; + +struct CBindPair +{ + CNum InIndex; + CNum OutIndex; +}; + +struct CFolder +{ + CObjectVector Coders; + CRecordVector BindPairs; + CRecordVector PackStreams; + CRecordVector UnPackSizes; + UInt32 UnPackCRC; + bool UnPackCRCDefined; + + CFolder(): UnPackCRCDefined(false) {} + + UInt64 GetUnPackSize() const // test it + { + if (UnPackSizes.IsEmpty()) + return 0; + for (int i = UnPackSizes.Size() - 1; i >= 0; i--) + if (FindBindPairForOutStream(i) < 0) + return UnPackSizes[i]; + throw 1; + } + + CNum GetNumOutStreams() const + { + CNum result = 0; + for (int i = 0; i < Coders.Size(); i++) + result += Coders[i].NumOutStreams; + return result; + } + + int FindBindPairForInStream(CNum inStreamIndex) const + { + for(int i = 0; i < BindPairs.Size(); i++) + if (BindPairs[i].InIndex == inStreamIndex) + return i; + return -1; + } + int FindBindPairForOutStream(CNum outStreamIndex) const + { + for(int i = 0; i < BindPairs.Size(); i++) + if (BindPairs[i].OutIndex == outStreamIndex) + return i; + return -1; + } + int FindPackStreamArrayIndex(CNum inStreamIndex) const + { + for(int i = 0; i < PackStreams.Size(); i++) + if (PackStreams[i] == inStreamIndex) + return i; + return -1; + } +}; + +typedef FILETIME CArchiveFileTime; + +class CFileItem +{ +public: + CArchiveFileTime CreationTime; + CArchiveFileTime LastWriteTime; + CArchiveFileTime LastAccessTime; + UInt64 UnPackSize; + UInt64 StartPos; + UInt32 Attributes; + UInt32 FileCRC; + UString Name; + + bool HasStream; // Test it !!! it means that there is + // stream in some folder. It can be empty stream + bool IsDirectory; + bool IsAnti; + bool IsFileCRCDefined; + bool AreAttributesDefined; + bool IsCreationTimeDefined; + bool IsLastWriteTimeDefined; + bool IsLastAccessTimeDefined; + bool IsStartPosDefined; + + /* + const bool HasStream() const { + return !IsDirectory && !IsAnti && UnPackSize != 0; } + */ + CFileItem(): + HasStream(true), + IsDirectory(false), + IsAnti(false), + IsFileCRCDefined(false), + AreAttributesDefined(false), + IsCreationTimeDefined(false), + IsLastWriteTimeDefined(false), + IsLastAccessTimeDefined(false), + IsStartPosDefined(false) + {} + void SetAttributes(UInt32 attributes) + { + AreAttributesDefined = true; + Attributes = attributes; + } + void SetCreationTime(const CArchiveFileTime &creationTime) + { + IsCreationTimeDefined = true; + CreationTime = creationTime; + } + void SetLastWriteTime(const CArchiveFileTime &lastWriteTime) + { + IsLastWriteTimeDefined = true; + LastWriteTime = lastWriteTime; + } + void SetLastAccessTime(const CArchiveFileTime &lastAccessTime) + { + IsLastAccessTimeDefined = true; + LastAccessTime = lastAccessTime; + } +}; + +struct CArchiveDatabase +{ + CRecordVector PackSizes; + CRecordVector PackCRCsDefined; + CRecordVector PackCRCs; + CObjectVector Folders; + CRecordVector NumUnPackStreamsVector; + CObjectVector Files; + void Clear() + { + PackSizes.Clear(); + PackCRCsDefined.Clear(); + PackCRCs.Clear(); + Folders.Clear(); + NumUnPackStreamsVector.Clear(); + Files.Clear(); + } + bool IsEmpty() const + { + return (PackSizes.IsEmpty() && + PackCRCsDefined.IsEmpty() && + PackCRCs.IsEmpty() && + Folders.IsEmpty() && + NumUnPackStreamsVector.IsEmpty() && + Files.IsEmpty()); + } + bool IsSolid() const + { + for (int i = 0; i < NumUnPackStreamsVector.Size(); i++) + if (NumUnPackStreamsVector[i] > 1) + return true; + return false; + } +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zOut.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zOut.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1026 @@ +// 7zOut.cpp + +#include "StdAfx.h" + +#include "../../../Common/AutoPtr.h" +#include "../../Common/StreamObjects.h" + +#include "7zOut.h" + +extern "C" +{ +#include "../../../../C/7zCrc.h" +} + +static HRESULT WriteBytes(ISequentialOutStream *stream, const void *data, size_t size) +{ + while (size > 0) + { + UInt32 curSize = (UInt32)MyMin(size, (size_t)0xFFFFFFFF); + UInt32 processedSize; + RINOK(stream->Write(data, curSize, &processedSize)); + if(processedSize == 0) + return E_FAIL; + data = (const void *)((const Byte *)data + processedSize); + size -= processedSize; + } + return S_OK; +} + +namespace NArchive { +namespace N7z { + +HRESULT COutArchive::WriteDirect(const void *data, UInt32 size) +{ + return ::WriteBytes(SeqStream, data, size); +} + +UInt32 CrcUpdateUInt32(UInt32 crc, UInt32 value) +{ + for (int i = 0; i < 4; i++, value >>= 8) + crc = CRC_UPDATE_BYTE(crc, (Byte)value); + return crc; +} + +UInt32 CrcUpdateUInt64(UInt32 crc, UInt64 value) +{ + for (int i = 0; i < 8; i++, value >>= 8) + crc = CRC_UPDATE_BYTE(crc, (Byte)value); + return crc; +} + +HRESULT COutArchive::WriteDirectUInt32(UInt32 value) +{ + for (int i = 0; i < 4; i++) + { + RINOK(WriteDirectByte((Byte)value)); + value >>= 8; + } + return S_OK; +} + +HRESULT COutArchive::WriteDirectUInt64(UInt64 value) +{ + for (int i = 0; i < 8; i++) + { + RINOK(WriteDirectByte((Byte)value)); + value >>= 8; + } + return S_OK; +} + +HRESULT COutArchive::WriteSignature() +{ + RINOK(WriteDirect(kSignature, kSignatureSize)); + RINOK(WriteDirectByte(kMajorVersion)); + return WriteDirectByte(2); +} + +#ifdef _7Z_VOL +HRESULT COutArchive::WriteFinishSignature() +{ + RINOK(WriteDirect(kFinishSignature, kSignatureSize)); + CArchiveVersion av; + av.Major = kMajorVersion; + av.Minor = 2; + RINOK(WriteDirectByte(av.Major)); + return WriteDirectByte(av.Minor); +} +#endif + +HRESULT COutArchive::WriteStartHeader(const CStartHeader &h) +{ + UInt32 crc = CRC_INIT_VAL; + crc = CrcUpdateUInt64(crc, h.NextHeaderOffset); + crc = CrcUpdateUInt64(crc, h.NextHeaderSize); + crc = CrcUpdateUInt32(crc, h.NextHeaderCRC); + RINOK(WriteDirectUInt32(CRC_GET_DIGEST(crc))); + RINOK(WriteDirectUInt64(h.NextHeaderOffset)); + RINOK(WriteDirectUInt64(h.NextHeaderSize)); + return WriteDirectUInt32(h.NextHeaderCRC); +} + +#ifdef _7Z_VOL +HRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h) +{ + CCRC crc; + crc.UpdateUInt64(h.NextHeaderOffset); + crc.UpdateUInt64(h.NextHeaderSize); + crc.UpdateUInt32(h.NextHeaderCRC); + crc.UpdateUInt64(h.ArchiveStartOffset); + crc.UpdateUInt64(h.AdditionalStartBlockSize); + RINOK(WriteDirectUInt32(crc.GetDigest())); + RINOK(WriteDirectUInt64(h.NextHeaderOffset)); + RINOK(WriteDirectUInt64(h.NextHeaderSize)); + RINOK(WriteDirectUInt32(h.NextHeaderCRC)); + RINOK(WriteDirectUInt64(h.ArchiveStartOffset)); + return WriteDirectUInt64(h.AdditionalStartBlockSize); +} +#endif + +HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker) +{ + Close(); + #ifdef _7Z_VOL + // endMarker = false; + _endMarker = endMarker; + #endif + SeqStream = stream; + if (!endMarker) + { + SeqStream.QueryInterface(IID_IOutStream, &Stream); + if (!Stream) + { + return E_NOTIMPL; + // endMarker = true; + } + } + #ifdef _7Z_VOL + if (endMarker) + { + /* + CStartHeader sh; + sh.NextHeaderOffset = (UInt32)(Int32)-1; + sh.NextHeaderSize = (UInt32)(Int32)-1; + sh.NextHeaderCRC = 0; + WriteStartHeader(sh); + */ + } + else + #endif + { + if (!Stream) + return E_FAIL; + RINOK(WriteSignature()); + RINOK(Stream->Seek(0, STREAM_SEEK_CUR, &_prefixHeaderPos)); + } + return S_OK; +} + +void COutArchive::Close() +{ + SeqStream.Release(); + Stream.Release(); +} + +HRESULT COutArchive::SkeepPrefixArchiveHeader() +{ + #ifdef _7Z_VOL + if (_endMarker) + return S_OK; + #endif + return Stream->Seek(24, STREAM_SEEK_CUR, NULL); +} + +HRESULT COutArchive::WriteBytes(const void *data, size_t size) +{ + if (_mainMode) + { + if (_dynamicMode) + _dynamicBuffer.Write(data, size); + else + _outByte.WriteBytes(data, size); + _crc = CrcUpdate(_crc, data, size); + } + else + { + if (_countMode) + _countSize += size; + else + RINOK(_outByte2.Write(data, size)); + } + return S_OK; +} + +HRESULT COutArchive::WriteBytes(const CByteBuffer &data) +{ + return WriteBytes(data, data.GetCapacity()); +} + +HRESULT COutArchive::WriteByte(Byte b) +{ + return WriteBytes(&b, 1); +} + +HRESULT COutArchive::WriteUInt32(UInt32 value) +{ + for (int i = 0; i < 4; i++) + { + RINOK(WriteByte((Byte)value)); + value >>= 8; + } + return S_OK; +} + +HRESULT COutArchive::WriteNumber(UInt64 value) +{ + Byte firstByte = 0; + Byte mask = 0x80; + int i; + for (i = 0; i < 8; i++) + { + if (value < ((UInt64(1) << ( 7 * (i + 1))))) + { + firstByte |= Byte(value >> (8 * i)); + break; + } + firstByte |= mask; + mask >>= 1; + } + RINOK(WriteByte(firstByte)); + for (;i > 0; i--) + { + RINOK(WriteByte((Byte)value)); + value >>= 8; + } + return S_OK; +} + +#ifdef _7Z_VOL +static UInt32 GetBigNumberSize(UInt64 value) +{ + int i; + for (i = 0; i < 8; i++) + if (value < ((UInt64(1) << ( 7 * (i + 1))))) + break; + return 1 + i; +} + +UInt32 COutArchive::GetVolHeadersSize(UInt64 dataSize, int nameLength, bool props) +{ + UInt32 result = GetBigNumberSize(dataSize) * 2 + 41; + if (nameLength != 0) + { + nameLength = (nameLength + 1) * 2; + result += nameLength + GetBigNumberSize(nameLength) + 2; + } + if (props) + { + result += 20; + } + if (result >= 128) + result++; + result += kSignatureSize + 2 + kFinishHeaderSize; + return result; +} + +UInt64 COutArchive::GetVolPureSize(UInt64 volSize, int nameLength, bool props) +{ + UInt32 headersSizeBase = COutArchive::GetVolHeadersSize(1, nameLength, props); + int testSize; + if (volSize > headersSizeBase) + testSize = volSize - headersSizeBase; + else + testSize = 1; + UInt32 headersSize = COutArchive::GetVolHeadersSize(testSize, nameLength, props); + UInt64 pureSize = 1; + if (volSize > headersSize) + pureSize = volSize - headersSize; + return pureSize; +} +#endif + +HRESULT COutArchive::WriteFolder(const CFolder &folder) +{ + RINOK(WriteNumber(folder.Coders.Size())); + int i; + for (i = 0; i < folder.Coders.Size(); i++) + { + const CCoderInfo &coder = folder.Coders[i]; + { + size_t propertiesSize = coder.Properties.GetCapacity(); + + UInt64 id = coder.MethodID; + int idSize; + for (idSize = 1; idSize < sizeof(id); idSize++) + if ((id >> (8 * idSize)) == 0) + break; + BYTE longID[15]; + for (int t = idSize - 1; t >= 0 ; t--, id >>= 8) + longID[t] = (Byte)(id & 0xFF); + Byte b; + b = (Byte)(idSize & 0xF); + bool isComplex = !coder.IsSimpleCoder(); + b |= (isComplex ? 0x10 : 0); + b |= ((propertiesSize != 0) ? 0x20 : 0 ); + RINOK(WriteByte(b)); + RINOK(WriteBytes(longID, idSize)); + if (isComplex) + { + RINOK(WriteNumber(coder.NumInStreams)); + RINOK(WriteNumber(coder.NumOutStreams)); + } + if (propertiesSize == 0) + continue; + RINOK(WriteNumber(propertiesSize)); + RINOK(WriteBytes(coder.Properties, propertiesSize)); + } + } + for (i = 0; i < folder.BindPairs.Size(); i++) + { + const CBindPair &bindPair = folder.BindPairs[i]; + RINOK(WriteNumber(bindPair.InIndex)); + RINOK(WriteNumber(bindPair.OutIndex)); + } + if (folder.PackStreams.Size() > 1) + for (i = 0; i < folder.PackStreams.Size(); i++) + { + RINOK(WriteNumber(folder.PackStreams[i])); + } + return S_OK; +} + +HRESULT COutArchive::WriteBoolVector(const CBoolVector &boolVector) +{ + Byte b = 0; + Byte mask = 0x80; + for(int i = 0; i < boolVector.Size(); i++) + { + if (boolVector[i]) + b |= mask; + mask >>= 1; + if (mask == 0) + { + RINOK(WriteByte(b)); + mask = 0x80; + b = 0; + } + } + if (mask != 0x80) + { + RINOK(WriteByte(b)); + } + return S_OK; +} + + +HRESULT COutArchive::WriteHashDigests( + const CRecordVector &digestsDefined, + const CRecordVector &digests) +{ + int numDefined = 0; + int i; + for(i = 0; i < digestsDefined.Size(); i++) + if (digestsDefined[i]) + numDefined++; + if (numDefined == 0) + return S_OK; + + RINOK(WriteByte(NID::kCRC)); + if (numDefined == digestsDefined.Size()) + { + RINOK(WriteByte(1)); + } + else + { + RINOK(WriteByte(0)); + RINOK(WriteBoolVector(digestsDefined)); + } + for(i = 0; i < digests.Size(); i++) + { + if(digestsDefined[i]) + RINOK(WriteUInt32(digests[i])); + } + return S_OK; +} + +HRESULT COutArchive::WritePackInfo( + UInt64 dataOffset, + const CRecordVector &packSizes, + const CRecordVector &packCRCsDefined, + const CRecordVector &packCRCs) +{ + if (packSizes.IsEmpty()) + return S_OK; + RINOK(WriteByte(NID::kPackInfo)); + RINOK(WriteNumber(dataOffset)); + RINOK(WriteNumber(packSizes.Size())); + RINOK(WriteByte(NID::kSize)); + for(int i = 0; i < packSizes.Size(); i++) + RINOK(WriteNumber(packSizes[i])); + + RINOK(WriteHashDigests(packCRCsDefined, packCRCs)); + + return WriteByte(NID::kEnd); +} + +HRESULT COutArchive::WriteUnPackInfo(const CObjectVector &folders) +{ + if (folders.IsEmpty()) + return S_OK; + + RINOK(WriteByte(NID::kUnPackInfo)); + + RINOK(WriteByte(NID::kFolder)); + RINOK(WriteNumber(folders.Size())); + { + RINOK(WriteByte(0)); + for(int i = 0; i < folders.Size(); i++) + RINOK(WriteFolder(folders[i])); + } + + RINOK(WriteByte(NID::kCodersUnPackSize)); + int i; + for(i = 0; i < folders.Size(); i++) + { + const CFolder &folder = folders[i]; + for (int j = 0; j < folder.UnPackSizes.Size(); j++) + RINOK(WriteNumber(folder.UnPackSizes[j])); + } + + CRecordVector unPackCRCsDefined; + CRecordVector unPackCRCs; + for(i = 0; i < folders.Size(); i++) + { + const CFolder &folder = folders[i]; + unPackCRCsDefined.Add(folder.UnPackCRCDefined); + unPackCRCs.Add(folder.UnPackCRC); + } + RINOK(WriteHashDigests(unPackCRCsDefined, unPackCRCs)); + + return WriteByte(NID::kEnd); +} + +HRESULT COutArchive::WriteSubStreamsInfo( + const CObjectVector &folders, + const CRecordVector &numUnPackStreamsInFolders, + const CRecordVector &unPackSizes, + const CRecordVector &digestsDefined, + const CRecordVector &digests) +{ + RINOK(WriteByte(NID::kSubStreamsInfo)); + + int i; + for(i = 0; i < numUnPackStreamsInFolders.Size(); i++) + { + if (numUnPackStreamsInFolders[i] != 1) + { + RINOK(WriteByte(NID::kNumUnPackStream)); + for(i = 0; i < numUnPackStreamsInFolders.Size(); i++) + RINOK(WriteNumber(numUnPackStreamsInFolders[i])); + break; + } + } + + + bool needFlag = true; + CNum index = 0; + for(i = 0; i < numUnPackStreamsInFolders.Size(); i++) + for (CNum j = 0; j < numUnPackStreamsInFolders[i]; j++) + { + if (j + 1 != numUnPackStreamsInFolders[i]) + { + if (needFlag) + RINOK(WriteByte(NID::kSize)); + needFlag = false; + RINOK(WriteNumber(unPackSizes[index])); + } + index++; + } + + CRecordVector digestsDefined2; + CRecordVector digests2; + + int digestIndex = 0; + for (i = 0; i < folders.Size(); i++) + { + int numSubStreams = (int)numUnPackStreamsInFolders[i]; + if (numSubStreams == 1 && folders[i].UnPackCRCDefined) + digestIndex++; + else + for (int j = 0; j < numSubStreams; j++, digestIndex++) + { + digestsDefined2.Add(digestsDefined[digestIndex]); + digests2.Add(digests[digestIndex]); + } + } + RINOK(WriteHashDigests(digestsDefined2, digests2)); + return WriteByte(NID::kEnd); +} + +HRESULT COutArchive::WriteTime( + const CObjectVector &files, Byte type) +{ + ///////////////////////////////////////////////// + // CreationTime + CBoolVector boolVector; + boolVector.Reserve(files.Size()); + bool thereAreDefined = false; + bool allDefined = true; + int i; + for(i = 0; i < files.Size(); i++) + { + const CFileItem &item = files[i]; + bool defined; + switch(type) + { + case NID::kCreationTime: + defined = item.IsCreationTimeDefined; + break; + case NID::kLastWriteTime: + defined = item.IsLastWriteTimeDefined; + break; + case NID::kLastAccessTime: + defined = item.IsLastAccessTimeDefined; + break; + default: + throw 1; + } + boolVector.Add(defined); + thereAreDefined = (thereAreDefined || defined); + allDefined = (allDefined && defined); + } + if (!thereAreDefined) + return S_OK; + RINOK(WriteByte(type)); + size_t dataSize = 1 + 1; + dataSize += files.Size() * 8; + if (allDefined) + { + RINOK(WriteNumber(dataSize)); + WriteByte(1); + } + else + { + RINOK(WriteNumber(1 + (boolVector.Size() + 7) / 8 + dataSize)); + WriteByte(0); + RINOK(WriteBoolVector(boolVector)); + } + RINOK(WriteByte(0)); + for(i = 0; i < files.Size(); i++) + { + if (boolVector[i]) + { + const CFileItem &item = files[i]; + CArchiveFileTime timeValue; + timeValue.dwLowDateTime = 0; + timeValue.dwHighDateTime = 0; + switch(type) + { + case NID::kCreationTime: + timeValue = item.CreationTime; + break; + case NID::kLastWriteTime: + timeValue = item.LastWriteTime; + break; + case NID::kLastAccessTime: + timeValue = item.LastAccessTime; + break; + } + RINOK(WriteUInt32(timeValue.dwLowDateTime)); + RINOK(WriteUInt32(timeValue.dwHighDateTime)); + } + } + return S_OK; +} + +HRESULT COutArchive::EncodeStream( + DECL_EXTERNAL_CODECS_LOC_VARS + CEncoder &encoder, const Byte *data, size_t dataSize, + CRecordVector &packSizes, CObjectVector &folders) +{ + CSequentialInStreamImp *streamSpec = new CSequentialInStreamImp; + CMyComPtr stream = streamSpec; + streamSpec->Init(data, dataSize); + CFolder folderItem; + folderItem.UnPackCRCDefined = true; + folderItem.UnPackCRC = CrcCalc(data, dataSize); + UInt64 dataSize64 = dataSize; + RINOK(encoder.Encode( + EXTERNAL_CODECS_LOC_VARS + stream, NULL, &dataSize64, folderItem, SeqStream, packSizes, NULL)) + folders.Add(folderItem); + return S_OK; +} + +HRESULT COutArchive::EncodeStream( + DECL_EXTERNAL_CODECS_LOC_VARS + CEncoder &encoder, const CByteBuffer &data, + CRecordVector &packSizes, CObjectVector &folders) +{ + return EncodeStream( + EXTERNAL_CODECS_LOC_VARS + encoder, data, data.GetCapacity(), packSizes, folders); +} + +static void WriteUInt32ToBuffer(Byte *data, UInt32 value) +{ + for (int i = 0; i < 4; i++) + { + *data++ = (Byte)value; + value >>= 8; + } +} + +static void WriteUInt64ToBuffer(Byte *data, UInt64 value) +{ + for (int i = 0; i < 8; i++) + { + *data++ = (Byte)value; + value >>= 8; + } +} + + +HRESULT COutArchive::WriteHeader( + const CArchiveDatabase &database, + const CHeaderOptions &headerOptions, + UInt64 &headerOffset) +{ + int i; + + ///////////////////////////////// + // Names + + CNum numDefinedNames = 0; + size_t namesDataSize = 0; + for(i = 0; i < database.Files.Size(); i++) + { + const UString &name = database.Files[i].Name; + if (!name.IsEmpty()) + numDefinedNames++; + namesDataSize += (name.Length() + 1) * 2; + } + + CByteBuffer namesData; + if (numDefinedNames > 0) + { + namesData.SetCapacity((size_t)namesDataSize); + size_t pos = 0; + for(int i = 0; i < database.Files.Size(); i++) + { + const UString &name = database.Files[i].Name; + for (int t = 0; t < name.Length(); t++) + { + wchar_t c = name[t]; + namesData[pos++] = Byte(c); + namesData[pos++] = Byte(c >> 8); + } + namesData[pos++] = 0; + namesData[pos++] = 0; + } + } + + ///////////////////////////////// + // Write Attributes + CBoolVector attributesBoolVector; + attributesBoolVector.Reserve(database.Files.Size()); + int numDefinedAttributes = 0; + for(i = 0; i < database.Files.Size(); i++) + { + bool defined = database.Files[i].AreAttributesDefined; + attributesBoolVector.Add(defined); + if (defined) + numDefinedAttributes++; + } + + CByteBuffer attributesData; + if (numDefinedAttributes > 0) + { + attributesData.SetCapacity(numDefinedAttributes * 4); + size_t pos = 0; + for(i = 0; i < database.Files.Size(); i++) + { + const CFileItem &file = database.Files[i]; + if (file.AreAttributesDefined) + { + WriteUInt32ToBuffer(attributesData + pos, file.Attributes); + pos += 4; + } + } + } + + ///////////////////////////////// + // Write StartPos + CBoolVector startsBoolVector; + startsBoolVector.Reserve(database.Files.Size()); + int numDefinedStarts = 0; + for(i = 0; i < database.Files.Size(); i++) + { + bool defined = database.Files[i].IsStartPosDefined; + startsBoolVector.Add(defined); + if (defined) + numDefinedStarts++; + } + + CByteBuffer startsData; + if (numDefinedStarts > 0) + { + startsData.SetCapacity(numDefinedStarts * 8); + size_t pos = 0; + for(i = 0; i < database.Files.Size(); i++) + { + const CFileItem &file = database.Files[i]; + if (file.IsStartPosDefined) + { + WriteUInt64ToBuffer(startsData + pos, file.StartPos); + pos += 8; + } + } + } + + ///////////////////////////////// + // Write Last Write Time + // /* + CNum numDefinedLastWriteTimes = 0; + for(i = 0; i < database.Files.Size(); i++) + if (database.Files[i].IsLastWriteTimeDefined) + numDefinedLastWriteTimes++; + + if (numDefinedLastWriteTimes > 0) + { + CByteBuffer lastWriteTimeData; + lastWriteTimeData.SetCapacity(numDefinedLastWriteTimes * 8); + size_t pos = 0; + for(i = 0; i < database.Files.Size(); i++) + { + const CFileItem &file = database.Files[i]; + if (file.IsLastWriteTimeDefined) + { + WriteUInt32ToBuffer(lastWriteTimeData + pos, file.LastWriteTime.dwLowDateTime); + pos += 4; + WriteUInt32ToBuffer(lastWriteTimeData + pos, file.LastWriteTime.dwHighDateTime); + pos += 4; + } + } + } + // */ + + + UInt64 packedSize = 0; + for(i = 0; i < database.PackSizes.Size(); i++) + packedSize += database.PackSizes[i]; + + headerOffset = packedSize; + + _mainMode = true; + + _outByte.SetStream(SeqStream); + _outByte.Init(); + _crc = CRC_INIT_VAL; + + + RINOK(WriteByte(NID::kHeader)); + + // Archive Properties + + if (database.Folders.Size() > 0) + { + RINOK(WriteByte(NID::kMainStreamsInfo)); + RINOK(WritePackInfo(0, database.PackSizes, + database.PackCRCsDefined, + database.PackCRCs)); + + RINOK(WriteUnPackInfo(database.Folders)); + + CRecordVector unPackSizes; + CRecordVector digestsDefined; + CRecordVector digests; + for (i = 0; i < database.Files.Size(); i++) + { + const CFileItem &file = database.Files[i]; + if (!file.HasStream) + continue; + unPackSizes.Add(file.UnPackSize); + digestsDefined.Add(file.IsFileCRCDefined); + digests.Add(file.FileCRC); + } + + RINOK(WriteSubStreamsInfo( + database.Folders, + database.NumUnPackStreamsVector, + unPackSizes, + digestsDefined, + digests)); + RINOK(WriteByte(NID::kEnd)); + } + + if (database.Files.IsEmpty()) + { + RINOK(WriteByte(NID::kEnd)); + return _outByte.Flush(); + } + + RINOK(WriteByte(NID::kFilesInfo)); + RINOK(WriteNumber(database.Files.Size())); + + CBoolVector emptyStreamVector; + emptyStreamVector.Reserve(database.Files.Size()); + int numEmptyStreams = 0; + for(i = 0; i < database.Files.Size(); i++) + if (database.Files[i].HasStream) + emptyStreamVector.Add(false); + else + { + emptyStreamVector.Add(true); + numEmptyStreams++; + } + if (numEmptyStreams > 0) + { + RINOK(WriteByte(NID::kEmptyStream)); + RINOK(WriteNumber((emptyStreamVector.Size() + 7) / 8)); + RINOK(WriteBoolVector(emptyStreamVector)); + + CBoolVector emptyFileVector, antiVector; + emptyFileVector.Reserve(numEmptyStreams); + antiVector.Reserve(numEmptyStreams); + CNum numEmptyFiles = 0, numAntiItems = 0; + for(i = 0; i < database.Files.Size(); i++) + { + const CFileItem &file = database.Files[i]; + if (!file.HasStream) + { + emptyFileVector.Add(!file.IsDirectory); + if (!file.IsDirectory) + numEmptyFiles++; + antiVector.Add(file.IsAnti); + if (file.IsAnti) + numAntiItems++; + } + } + + if (numEmptyFiles > 0) + { + RINOK(WriteByte(NID::kEmptyFile)); + RINOK(WriteNumber((emptyFileVector.Size() + 7) / 8)); + RINOK(WriteBoolVector(emptyFileVector)); + } + + if (numAntiItems > 0) + { + RINOK(WriteByte(NID::kAnti)); + RINOK(WriteNumber((antiVector.Size() + 7) / 8)); + RINOK(WriteBoolVector(antiVector)); + } + } + + if (numDefinedNames > 0) + { + ///////////////////////////////////////////////// + RINOK(WriteByte(NID::kName)); + { + RINOK(WriteNumber(1 + namesData.GetCapacity())); + RINOK(WriteByte(0)); + RINOK(WriteBytes(namesData)); + } + + } + + if (headerOptions.WriteCreated) + { + RINOK(WriteTime(database.Files, NID::kCreationTime)); + } + if (headerOptions.WriteModified) + { + RINOK(WriteTime(database.Files, NID::kLastWriteTime)); + } + if (headerOptions.WriteAccessed) + { + RINOK(WriteTime(database.Files, NID::kLastAccessTime)); + } + + if (numDefinedAttributes > 0) + { + RINOK(WriteByte(NID::kWinAttributes)); + size_t size = 2; + if (numDefinedAttributes != database.Files.Size()) + size += (attributesBoolVector.Size() + 7) / 8 + 1; + size += attributesData.GetCapacity(); + + RINOK(WriteNumber(size)); + if (numDefinedAttributes == database.Files.Size()) + { + RINOK(WriteByte(1)); + } + else + { + RINOK(WriteByte(0)); + RINOK(WriteBoolVector(attributesBoolVector)); + } + + { + RINOK(WriteByte(0)); + RINOK(WriteBytes(attributesData)); + } + } + + if (numDefinedStarts > 0) + { + RINOK(WriteByte(NID::kStartPos)); + size_t size = 2; + if (numDefinedStarts != database.Files.Size()) + size += (startsBoolVector.Size() + 7) / 8 + 1; + size += startsData.GetCapacity(); + + RINOK(WriteNumber(size)); + if (numDefinedStarts == database.Files.Size()) + { + RINOK(WriteByte(1)); + } + else + { + RINOK(WriteByte(0)); + RINOK(WriteBoolVector(startsBoolVector)); + } + + { + RINOK(WriteByte(0)); + RINOK(WriteBytes(startsData)); + } + } + + RINOK(WriteByte(NID::kEnd)); // for files + RINOK(WriteByte(NID::kEnd)); // for headers + + return _outByte.Flush(); +} + +HRESULT COutArchive::WriteDatabase( + DECL_EXTERNAL_CODECS_LOC_VARS + const CArchiveDatabase &database, + const CCompressionMethodMode *options, + const CHeaderOptions &headerOptions) +{ + UInt64 headerOffset; + UInt32 headerCRC; + UInt64 headerSize; + if (database.IsEmpty()) + { + headerSize = 0; + headerOffset = 0; + headerCRC = CrcCalc(0, 0); + } + else + { + _dynamicBuffer.Init(); + _dynamicMode = false; + + if (options != 0) + if (options->IsEmpty()) + options = 0; + if (options != 0) + if (options->PasswordIsDefined || headerOptions.CompressMainHeader) + _dynamicMode = true; + RINOK(WriteHeader(database, headerOptions, headerOffset)); + + if (_dynamicMode) + { + CCompressionMethodMode encryptOptions; + encryptOptions.PasswordIsDefined = options->PasswordIsDefined; + encryptOptions.Password = options->Password; + CEncoder encoder(headerOptions.CompressMainHeader ? *options : encryptOptions); + CRecordVector packSizes; + CObjectVector folders; + RINOK(EncodeStream( + EXTERNAL_CODECS_LOC_VARS + encoder, _dynamicBuffer, + _dynamicBuffer.GetSize(), packSizes, folders)); + _dynamicMode = false; + _mainMode = true; + + _outByte.SetStream(SeqStream); + _outByte.Init(); + _crc = CRC_INIT_VAL; + + if (folders.Size() == 0) + throw 1; + + RINOK(WriteID(NID::kEncodedHeader)); + RINOK(WritePackInfo(headerOffset, packSizes, + CRecordVector(), CRecordVector())); + RINOK(WriteUnPackInfo(folders)); + RINOK(WriteByte(NID::kEnd)); + for (int i = 0; i < packSizes.Size(); i++) + headerOffset += packSizes[i]; + RINOK(_outByte.Flush()); + } + headerCRC = CRC_GET_DIGEST(_crc); + headerSize = _outByte.GetProcessedSize(); + } + #ifdef _7Z_VOL + if (_endMarker) + { + CFinishHeader h; + h.NextHeaderSize = headerSize; + h.NextHeaderCRC = headerCRC; + h.NextHeaderOffset = + UInt64(0) - (headerSize + + 4 + kFinishHeaderSize); + h.ArchiveStartOffset = h.NextHeaderOffset - headerOffset; + h.AdditionalStartBlockSize = 0; + RINOK(WriteFinishHeader(h)); + return WriteFinishSignature(); + } + else + #endif + { + CStartHeader h; + h.NextHeaderSize = headerSize; + h.NextHeaderCRC = headerCRC; + h.NextHeaderOffset = headerOffset; + RINOK(Stream->Seek(_prefixHeaderPos, STREAM_SEEK_SET, NULL)); + return WriteStartHeader(h); + } +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zOut.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zOut.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,193 @@ +// 7z/Out.h + +#ifndef __7Z_OUT_H +#define __7Z_OUT_H + +#include "7zHeader.h" +#include "7zItem.h" +#include "7zCompressionMode.h" +#include "7zEncode.h" + +#include "../../Common/OutBuffer.h" +#include "../../../Common/DynamicBuffer.h" + +namespace NArchive { +namespace N7z { + +class CWriteBufferLoc +{ + Byte *_data; + size_t _size; + size_t _pos; +public: + CWriteBufferLoc(): _size(0), _pos(0) {} + void Init(Byte *data, size_t size) + { + _pos = 0; + _data = data; + _size = size; + } + HRESULT Write(const void *data, size_t size) + { + if (_pos + size > _size) + return E_FAIL; + memmove(_data + _pos, data, size); + _pos += size; + return S_OK; + } +}; + +class CWriteDynamicBuffer +{ + CByteDynamicBuffer _buffer; + size_t _pos; +public: + CWriteDynamicBuffer(): _pos(0) {} + void Init() + { + _pos = 0; + } + void Write(const void *data, size_t size) + { + if (_pos + size > _buffer.GetCapacity()) + _buffer.EnsureCapacity(_pos + size); + memmove(((Byte *)_buffer) +_pos, data, size); + _pos += size; + } + operator Byte *() { return (Byte *)_buffer; }; + operator const Byte *() const { return (const Byte *)_buffer; }; + size_t GetSize() const { return _pos; } +}; + +struct CHeaderOptions +{ + // bool UseAdditionalHeaderStreams; + bool CompressMainHeader; + bool WriteModified; + bool WriteCreated; + bool WriteAccessed; + + CHeaderOptions(): + // UseAdditionalHeaderStreams(false), + CompressMainHeader(true), + WriteModified(true), + WriteCreated(false), + WriteAccessed(false) {} +}; + +class COutArchive +{ + UInt64 _prefixHeaderPos; + + HRESULT WriteDirect(const void *data, UInt32 size); + HRESULT WriteDirectByte(Byte b) { return WriteDirect(&b, 1); } + HRESULT WriteDirectUInt32(UInt32 value); + HRESULT WriteDirectUInt64(UInt64 value); + + HRESULT WriteBytes(const void *data, size_t size); + HRESULT WriteBytes(const CByteBuffer &data); + HRESULT WriteByte(Byte b); + HRESULT WriteUInt32(UInt32 value); + HRESULT WriteNumber(UInt64 value); + HRESULT WriteID(UInt64 value) { return WriteNumber(value); } + + HRESULT WriteFolder(const CFolder &folder); + HRESULT WriteFileHeader(const CFileItem &itemInfo); + HRESULT WriteBoolVector(const CBoolVector &boolVector); + HRESULT WriteHashDigests( + const CRecordVector &digestsDefined, + const CRecordVector &hashDigests); + + HRESULT WritePackInfo( + UInt64 dataOffset, + const CRecordVector &packSizes, + const CRecordVector &packCRCsDefined, + const CRecordVector &packCRCs); + + HRESULT WriteUnPackInfo(const CObjectVector &folders); + + HRESULT WriteSubStreamsInfo( + const CObjectVector &folders, + const CRecordVector &numUnPackStreamsInFolders, + const CRecordVector &unPackSizes, + const CRecordVector &digestsDefined, + const CRecordVector &hashDigests); + + /* + HRESULT WriteStreamsInfo( + UInt64 dataOffset, + const CRecordVector &packSizes, + const CRecordVector &packCRCsDefined, + const CRecordVector &packCRCs, + bool externalFolders, + UInt64 externalFoldersStreamIndex, + const CObjectVector &folders, + const CRecordVector &numUnPackStreamsInFolders, + const CRecordVector &unPackSizes, + const CRecordVector &digestsDefined, + const CRecordVector &hashDigests); + */ + + + HRESULT WriteTime(const CObjectVector &files, Byte type); + + HRESULT EncodeStream( + DECL_EXTERNAL_CODECS_LOC_VARS + CEncoder &encoder, const Byte *data, size_t dataSize, + CRecordVector &packSizes, CObjectVector &folders); + HRESULT EncodeStream( + DECL_EXTERNAL_CODECS_LOC_VARS + CEncoder &encoder, const CByteBuffer &data, + CRecordVector &packSizes, CObjectVector &folders); + HRESULT WriteHeader( + const CArchiveDatabase &database, + const CHeaderOptions &headerOptions, + UInt64 &headerOffset); + + bool _mainMode; + + bool _dynamicMode; + + bool _countMode; + size_t _countSize; + COutBuffer _outByte; + CWriteBufferLoc _outByte2; + CWriteDynamicBuffer _dynamicBuffer; + UInt32 _crc; + + #ifdef _7Z_VOL + bool _endMarker; + #endif + + HRESULT WriteSignature(); + #ifdef _7Z_VOL + HRESULT WriteFinishSignature(); + #endif + HRESULT WriteStartHeader(const CStartHeader &h); + #ifdef _7Z_VOL + HRESULT WriteFinishHeader(const CFinishHeader &h); + #endif + CMyComPtr Stream; +public: + + COutArchive() { _outByte.Create(1 << 16); } + CMyComPtr SeqStream; + HRESULT Create(ISequentialOutStream *stream, bool endMarker); + void Close(); + HRESULT SkeepPrefixArchiveHeader(); + HRESULT WriteDatabase( + DECL_EXTERNAL_CODECS_LOC_VARS + const CArchiveDatabase &database, + const CCompressionMethodMode *options, + const CHeaderOptions &headerOptions); + + #ifdef _7Z_VOL + static UInt32 GetVolHeadersSize(UInt64 dataSize, int nameLength = 0, bool props = false); + static UInt64 GetVolPureSize(UInt64 volSize, int nameLength = 0, bool props = false); + #endif + +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zProperties.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zProperties.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,162 @@ +// 7zProperties.cpp + +#include "StdAfx.h" + +#include "7zProperties.h" +#include "7zHeader.h" +#include "7zHandler.h" + +// #define _MULTI_PACK + +namespace NArchive { +namespace N7z { + +struct CPropMap +{ + UInt64 FilePropID; + STATPROPSTG StatPROPSTG; +}; + +CPropMap kPropMap[] = +{ + { NID::kName, NULL, kpidPath, VT_BSTR}, + { NID::kSize, NULL, kpidSize, VT_UI8}, + { NID::kPackInfo, NULL, kpidPackedSize, VT_UI8}, + + #ifdef _MULTI_PACK + { 100, L"Pack0", kpidPackedSize0, VT_UI8}, + { 101, L"Pack1", kpidPackedSize1, VT_UI8}, + { 102, L"Pack2", kpidPackedSize2, VT_UI8}, + { 103, L"Pack3", kpidPackedSize3, VT_UI8}, + { 104, L"Pack4", kpidPackedSize4, VT_UI8}, + #endif + + { NID::kCreationTime, NULL, kpidCreationTime, VT_FILETIME}, + { NID::kLastWriteTime, NULL, kpidLastWriteTime, VT_FILETIME}, + { NID::kLastAccessTime, NULL, kpidLastAccessTime, VT_FILETIME}, + { NID::kWinAttributes, NULL, kpidAttributes, VT_UI4}, + { NID::kStartPos, NULL, kpidPosition, VT_UI4}, + + { NID::kCRC, NULL, kpidCRC, VT_UI4}, + + { NID::kAnti, NULL, kpidIsAnti, VT_BOOL}, + // { 97, NULL, kpidSolid, VT_BOOL}, + #ifndef _SFX + { 98, NULL, kpidMethod, VT_BSTR}, + { 99, NULL, kpidBlock, VT_UI4} + #endif +}; + +static const int kPropMapSize = sizeof(kPropMap) / sizeof(kPropMap[0]); + +static int FindPropInMap(UInt64 filePropID) +{ + for (int i = 0; i < kPropMapSize; i++) + if (kPropMap[i].FilePropID == filePropID) + return i; + return -1; +} + +static void CopyOneItem(CRecordVector &src, + CRecordVector &dest, UInt32 item) +{ + for (int i = 0; i < src.Size(); i++) + if (src[i] == item) + { + dest.Add(item); + src.Delete(i); + return; + } +} + +static void RemoveOneItem(CRecordVector &src, UInt32 item) +{ + for (int i = 0; i < src.Size(); i++) + if (src[i] == item) + { + src.Delete(i); + return; + } +} + +static void InsertToHead(CRecordVector &dest, UInt32 item) +{ + for (int i = 0; i < dest.Size(); i++) + if (dest[i] == item) + { + dest.Delete(i); + break; + } + dest.Insert(0, item); +} + +void CHandler::FillPopIDs() +{ + _fileInfoPopIDs.Clear(); + + #ifdef _7Z_VOL + if(_volumes.Size() < 1) + return; + const CVolume &volume = _volumes.Front(); + const CArchiveDatabaseEx &_database = volume.Database; + #endif + + CRecordVector fileInfoPopIDs = _database.ArchiveInfo.FileInfoPopIDs; + + RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream); + RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile); + + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kName); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kAnti); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kSize); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kPackInfo); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCreationTime); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kLastWriteTime); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kLastAccessTime); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kWinAttributes); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kCRC); + CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::kComment); + _fileInfoPopIDs += fileInfoPopIDs; + + #ifndef _SFX + _fileInfoPopIDs.Add(98); + _fileInfoPopIDs.Add(99); + #endif + #ifdef _MULTI_PACK + _fileInfoPopIDs.Add(100); + _fileInfoPopIDs.Add(101); + _fileInfoPopIDs.Add(102); + _fileInfoPopIDs.Add(103); + _fileInfoPopIDs.Add(104); + #endif + + #ifndef _SFX + InsertToHead(_fileInfoPopIDs, NID::kLastWriteTime); + InsertToHead(_fileInfoPopIDs, NID::kPackInfo); + InsertToHead(_fileInfoPopIDs, NID::kSize); + InsertToHead(_fileInfoPopIDs, NID::kName); + #endif +} + +STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) +{ + *numProperties = _fileInfoPopIDs.Size(); + return S_OK; +} + +STDMETHODIMP CHandler::GetPropertyInfo(UInt32 index, + BSTR *name, PROPID *propID, VARTYPE *varType) +{ + if((int)index >= _fileInfoPopIDs.Size()) + return E_INVALIDARG; + int indexInMap = FindPropInMap(_fileInfoPopIDs[index]); + if (indexInMap == -1) + return E_INVALIDARG; + const STATPROPSTG &srcItem = kPropMap[indexInMap].StatPROPSTG; + *propID = srcItem.propid; + *varType = srcItem.vt; + *name = 0; + return S_OK; +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zProperties.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zProperties.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,22 @@ +// 7zProperties.h + +#ifndef __7Z_PROPERTIES_H +#define __7Z_PROPERTIES_H + +#include "../../PropID.h" + +namespace NArchive { +namespace N7z { + +enum +{ + kpidPackedSize0 = kpidUserDefined, + kpidPackedSize1, + kpidPackedSize2, + kpidPackedSize3, + kpidPackedSize4 +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zRegister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zRegister.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,18 @@ +// 7zRegister.cpp + +#include "StdAfx.h" + +#include "../../Common/RegisterArc.h" + +#include "7zHandler.h" +static IInArchive *CreateArc() { return new NArchive::N7z::CHandler; } +#ifndef EXTRACT_ONLY +static IOutArchive *CreateArcOut() { return new NArchive::N7z::CHandler; } +#else +#define CreateArcOut 0 +#endif + +static CArcInfo g_ArcInfo = + { L"7z", L"7z", 0, 7, {'7' + 1 , 'z', 0xBC, 0xAF, 0x27, 0x1C}, 6, false, CreateArc, CreateArcOut }; + +REGISTER_ARC_DEC_SIG(7z) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// 7zSpecStream.cpp + +#include "StdAfx.h" + +#include "7zSpecStream.h" + +STDMETHODIMP CSequentialInStreamSizeCount2::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result = _stream->Read(data, size, &realProcessedSize); + _size += realProcessedSize; + if (processedSize != 0) + *processedSize = realProcessedSize; + return result; +} + +STDMETHODIMP CSequentialInStreamSizeCount2::GetSubStreamSize( + UInt64 subStream, UInt64 *value) +{ + if (_getSubStreamSize == NULL) + return E_NOTIMPL; + return _getSubStreamSize->GetSubStreamSize(subStream, value); +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zSpecStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zSpecStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,35 @@ +// 7zSpecStream.h + +#ifndef __7Z_SPEC_STREAM_H +#define __7Z_SPEC_STREAM_H + +#include "../../IStream.h" +#include "../../ICoder.h" +#include "../../../Common/MyCom.h" + +class CSequentialInStreamSizeCount2: + public ISequentialInStream, + public ICompressGetSubStreamSize, + public CMyUnknownImp +{ + CMyComPtr _stream; + CMyComPtr _getSubStreamSize; + UInt64 _size; +public: + void Init(ISequentialInStream *stream) + { + _stream = stream; + _getSubStreamSize = 0; + _stream.QueryInterface(IID_ICompressGetSubStreamSize, &_getSubStreamSize); + _size = 0; + } + UInt64 GetSize() const { return _size; } + + MY_UNKNOWN_IMP1(ICompressGetSubStreamSize) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + + STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zUpdate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zUpdate.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1029 @@ +// UpdateMain.cpp + +#include "StdAfx.h" + +#include "7zUpdate.h" +#include "7zFolderInStream.h" +#include "7zEncode.h" +#include "7zHandler.h" +#include "7zOut.h" + +#include "../../Compress/Copy/CopyCoder.h" +#include "../../Common/ProgressUtils.h" +#include "../../Common/LimitedStreams.h" +#include "../../Common/LimitedStreams.h" +#include "../Common/ItemNameUtils.h" + +namespace NArchive { +namespace N7z { + +static const wchar_t *kMatchFinderForBCJ2_LZMA = L"BT2"; +static const UInt32 kDictionaryForBCJ2_LZMA = 1 << 20; +static const UInt32 kAlgorithmForBCJ2_LZMA = 1; +static const UInt32 kNumFastBytesForBCJ2_LZMA = 64; + +static HRESULT WriteRange(IInStream *inStream, ISequentialOutStream *outStream, + UInt64 position, UInt64 size, ICompressProgressInfo *progress) +{ + RINOK(inStream->Seek(position, STREAM_SEEK_SET, 0)); + CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream; + CMyComPtr inStreamLimited(streamSpec); + streamSpec->SetStream(inStream); + streamSpec->Init(size); + + NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder; + CMyComPtr copyCoder = copyCoderSpec; + RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress)); + return (copyCoderSpec->TotalSize == size ? S_OK : E_FAIL); +} + +static int GetReverseSlashPos(const UString &name) +{ + int slashPos = name.ReverseFind(L'/'); + #ifdef _WIN32 + int slash1Pos = name.ReverseFind(L'\\'); + slashPos = MyMax(slashPos, slash1Pos); + #endif + return slashPos; +} + +int CUpdateItem::GetExtensionPos() const +{ + int slashPos = GetReverseSlashPos(Name); + int dotPos = Name.ReverseFind(L'.'); + if (dotPos < 0 || (dotPos < slashPos && slashPos >= 0)) + return Name.Length(); + return dotPos + 1; +} + +UString CUpdateItem::GetExtension() const +{ + return Name.Mid(GetExtensionPos()); +} + +#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; } + +static int CompareBuffers(const CByteBuffer &a1, const CByteBuffer &a2) +{ + size_t c1 = a1.GetCapacity(); + size_t c2 = a2.GetCapacity(); + RINOZ(MyCompare(c1, c2)); + for (size_t i = 0; i < c1; i++) + RINOZ(MyCompare(a1[i], a2[i])); + return 0; +} + +static int CompareCoders(const CCoderInfo &c1, const CCoderInfo &c2) +{ + RINOZ(MyCompare(c1.NumInStreams, c2.NumInStreams)); + RINOZ(MyCompare(c1.NumOutStreams, c2.NumOutStreams)); + RINOZ(MyCompare(c1.MethodID, c2.MethodID)); + return CompareBuffers(c1.Properties, c2.Properties); +} + +static int CompareBindPairs(const CBindPair &b1, const CBindPair &b2) +{ + RINOZ(MyCompare(b1.InIndex, b2.InIndex)); + return MyCompare(b1.OutIndex, b2.OutIndex); +} + +static int CompareFolders(const CFolder &f1, const CFolder &f2) +{ + int s1 = f1.Coders.Size(); + int s2 = f2.Coders.Size(); + RINOZ(MyCompare(s1, s2)); + int i; + for (i = 0; i < s1; i++) + RINOZ(CompareCoders(f1.Coders[i], f2.Coders[i])); + s1 = f1.BindPairs.Size(); + s2 = f2.BindPairs.Size(); + RINOZ(MyCompare(s1, s2)); + for (i = 0; i < s1; i++) + RINOZ(CompareBindPairs(f1.BindPairs[i], f2.BindPairs[i])); + return 0; +} + +static int CompareFiles(const CFileItem &f1, const CFileItem &f2) +{ + return MyStringCompareNoCase(f1.Name, f2.Name); +} + +static int CompareFolderRefs(const int *p1, const int *p2, void *param) +{ + int i1 = *p1; + int i2 = *p2; + const CArchiveDatabaseEx &db = *(const CArchiveDatabaseEx *)param; + RINOZ(CompareFolders( + db.Folders[i1], + db.Folders[i2])); + RINOZ(MyCompare( + db.NumUnPackStreamsVector[i1], + db.NumUnPackStreamsVector[i2])); + if (db.NumUnPackStreamsVector[i1] == 0) + return 0; + return CompareFiles( + db.Files[db.FolderStartFileIndex[i1]], + db.Files[db.FolderStartFileIndex[i2]]); +} + +//////////////////////////////////////////////////////////// + +static int CompareEmptyItems(const int *p1, const int *p2, void *param) +{ + const CObjectVector &updateItems = *(const CObjectVector *)param; + const CUpdateItem &u1 = updateItems[*p1]; + const CUpdateItem &u2 = updateItems[*p2]; + if (u1.IsDirectory != u2.IsDirectory) + return (u1.IsDirectory) ? 1 : -1; + if (u1.IsDirectory) + { + if (u1.IsAnti != u2.IsAnti) + return (u1.IsAnti ? 1 : -1); + int n = MyStringCompareNoCase(u1.Name, u2.Name); + return -n; + } + if (u1.IsAnti != u2.IsAnti) + return (u1.IsAnti ? 1 : -1); + return MyStringCompareNoCase(u1.Name, u2.Name); +} + +static const char *g_Exts = + " lzma 7z ace arc arj bz bz2 deb lzo lzx gz pak rpm sit tgz tbz tbz2 tgz cab ha lha lzh rar zoo" + " zip jar ear war msi" + " 3gp avi mov mpeg mpg mpe wmv" + " aac ape fla flac la mp3 m4a mp4 ofr ogg pac ra rm rka shn swa tta wv wma wav" + " swf " + " chm hxi hxs" + " gif jpeg jpg jp2 png tiff bmp ico psd psp" + " awg ps eps cgm dxf svg vrml wmf emf ai md" + " cad dwg pps key sxi" + " max 3ds" + " iso bin nrg mdf img pdi tar cpio xpi" + " vfd vhd vud vmc vsv" + " vmdk dsk nvram vmem vmsd vmsn vmss vmtm" + " inl inc idl acf asa h hpp hxx c cpp cxx rc java cs pas bas vb cls ctl frm dlg def" + " f77 f f90 f95" + " asm sql manifest dep " + " mak clw csproj vcproj sln dsp dsw " + " class " + " bat cmd" + " xml xsd xsl xslt hxk hxc htm html xhtml xht mht mhtml htw asp aspx css cgi jsp shtml" + " awk sed hta js php php3 php4 php5 phptml pl pm py pyo rb sh tcl vbs" + " text txt tex ans asc srt reg ini doc docx mcw dot rtf hlp xls xlr xlt xlw ppt pdf" + " sxc sxd sxi sxg sxw stc sti stw stm odt ott odg otg odp otp ods ots odf" + " abw afp cwk lwp wpd wps wpt wrf wri" + " abf afm bdf fon mgf otf pcf pfa snf ttf" + " dbf mdb nsf ntf wdb db fdb gdb" + " exe dll ocx vbx sfx sys tlb awx com obj lib out o so " + " pdb pch idb ncb opt"; + +int GetExtIndex(const char *ext) +{ + int extIndex = 1; + const char *p = g_Exts; + for (;;) + { + char c = *p++; + if (c == 0) + return extIndex; + if (c == ' ') + continue; + int pos = 0; + for (;;) + { + char c2 = ext[pos++]; + if (c2 == 0 && (c == 0 || c == ' ')) + return extIndex; + if (c != c2) + break; + c = *p++; + } + extIndex++; + for (;;) + { + if (c == 0) + return extIndex; + if (c == ' ') + break; + c = *p++; + } + } +} + +struct CRefItem +{ + UInt32 Index; + const CUpdateItem *UpdateItem; + UInt32 ExtensionPos; + UInt32 NamePos; + int ExtensionIndex; + CRefItem(UInt32 index, const CUpdateItem &updateItem, bool sortByType): + Index(index), + UpdateItem(&updateItem), + ExtensionPos(0), + NamePos(0), + ExtensionIndex(0) + { + if (sortByType) + { + int slashPos = GetReverseSlashPos(updateItem.Name); + NamePos = ((slashPos >= 0) ? (slashPos + 1) : 0); + int dotPos = updateItem.Name.ReverseFind(L'.'); + if (dotPos < 0 || (dotPos < slashPos && slashPos >= 0)) + ExtensionPos = updateItem.Name.Length(); + else + { + ExtensionPos = dotPos + 1; + UString us = updateItem.Name.Mid(ExtensionPos); + if (!us.IsEmpty()) + { + us.MakeLower(); + int i; + AString s; + for (i = 0; i < us.Length(); i++) + { + wchar_t c = us[i]; + if (c >= 0x80) + break; + s += (char)c; + } + if (i == us.Length()) + ExtensionIndex = GetExtIndex(s); + else + ExtensionIndex = 0; + } + } + } + } +}; + +static int CompareUpdateItems(const CRefItem *p1, const CRefItem *p2, void *param) +{ + const CRefItem &a1 = *p1; + const CRefItem &a2 = *p2; + const CUpdateItem &u1 = *a1.UpdateItem; + const CUpdateItem &u2 = *a2.UpdateItem; + int n; + if (u1.IsDirectory != u2.IsDirectory) + return (u1.IsDirectory) ? 1 : -1; + if (u1.IsDirectory) + { + if (u1.IsAnti != u2.IsAnti) + return (u1.IsAnti ? 1 : -1); + n = MyStringCompareNoCase(u1.Name, u2.Name); + return -n; + } + bool sortByType = *(bool *)param; + if (sortByType) + { + RINOZ(MyCompare(a1.ExtensionIndex, a2.ExtensionIndex)) + RINOZ(MyStringCompareNoCase(u1.Name + a1.ExtensionPos, u2.Name + a2.ExtensionPos)); + RINOZ(MyStringCompareNoCase(u1.Name + a1.NamePos, u2.Name + a2.NamePos)); + if (u1.IsLastWriteTimeDefined && u2.IsLastWriteTimeDefined) + RINOZ(CompareFileTime(&u1.LastWriteTime, &u2.LastWriteTime)); + RINOZ(MyCompare(u1.Size, u2.Size)) + } + return MyStringCompareNoCase(u1.Name, u2.Name); +} + +struct CSolidGroup +{ + CCompressionMethodMode Method; + CRecordVector Indices; +}; + +static wchar_t *g_ExeExts[] = +{ + L"dll", + L"exe", + L"ocx", + L"sfx", + L"sys" +}; + +static bool IsExeFile(const UString &ext) +{ + for (int i = 0; i < sizeof(g_ExeExts) / sizeof(g_ExeExts[0]); i++) + if (ext.CompareNoCase(g_ExeExts[i]) == 0) + return true; + return false; +} + +static const UInt64 k_LZMA = 0x030101; +static const UInt64 k_BCJ = 0x03030103; +static const UInt64 k_BCJ2 = 0x0303011B; + +static bool GetMethodFull(UInt64 methodID, + UInt32 numInStreams, CMethodFull &methodResult) +{ + methodResult.Id = methodID; + methodResult.NumInStreams = numInStreams; + methodResult.NumOutStreams = 1; + return true; +} + +static bool MakeExeMethod(const CCompressionMethodMode &method, + bool bcj2Filter, CCompressionMethodMode &exeMethod) +{ + exeMethod = method; + if (bcj2Filter) + { + CMethodFull methodFull; + if (!GetMethodFull(k_BCJ2, 4, methodFull)) + return false; + exeMethod.Methods.Insert(0, methodFull); + if (!GetMethodFull(k_LZMA, 1, methodFull)) + return false; + { + CProp property; + property.Id = NCoderPropID::kAlgorithm; + property.Value = kAlgorithmForBCJ2_LZMA; + methodFull.Properties.Add(property); + } + { + CProp property; + property.Id = NCoderPropID::kMatchFinder; + property.Value = kMatchFinderForBCJ2_LZMA; + methodFull.Properties.Add(property); + } + { + CProp property; + property.Id = NCoderPropID::kDictionarySize; + property.Value = kDictionaryForBCJ2_LZMA; + methodFull.Properties.Add(property); + } + { + CProp property; + property.Id = NCoderPropID::kNumFastBytes; + property.Value = kNumFastBytesForBCJ2_LZMA; + methodFull.Properties.Add(property); + } + + exeMethod.Methods.Add(methodFull); + exeMethod.Methods.Add(methodFull); + CBind bind; + + bind.OutCoder = 0; + bind.InStream = 0; + + bind.InCoder = 1; + bind.OutStream = 0; + exeMethod.Binds.Add(bind); + + bind.InCoder = 2; + bind.OutStream = 1; + exeMethod.Binds.Add(bind); + + bind.InCoder = 3; + bind.OutStream = 2; + exeMethod.Binds.Add(bind); + } + else + { + CMethodFull methodFull; + if (!GetMethodFull(k_BCJ, 1, methodFull)) + return false; + exeMethod.Methods.Insert(0, methodFull); + CBind bind; + bind.OutCoder = 0; + bind.InStream = 0; + bind.InCoder = 1; + bind.OutStream = 0; + exeMethod.Binds.Add(bind); + } + return true; +} + +static void SplitFilesToGroups( + const CCompressionMethodMode &method, + bool useFilters, bool maxFilter, + const CObjectVector &updateItems, + CObjectVector &groups) +{ + if (method.Methods.Size() != 1 || method.Binds.Size() != 0) + useFilters = false; + groups.Clear(); + groups.Add(CSolidGroup()); + groups.Add(CSolidGroup()); + CSolidGroup &generalGroup = groups[0]; + CSolidGroup &exeGroup = groups[1]; + generalGroup.Method = method; + int i; + for (i = 0; i < updateItems.Size(); i++) + { + const CUpdateItem &updateItem = updateItems[i]; + if (!updateItem.NewData) + continue; + if (!updateItem.HasStream()) + continue; + if (useFilters) + { + const UString name = updateItem.Name; + int dotPos = name.ReverseFind(L'.'); + if (dotPos >= 0) + { + UString ext = name.Mid(dotPos + 1); + if (IsExeFile(ext)) + { + exeGroup.Indices.Add(i); + continue; + } + } + } + generalGroup.Indices.Add(i); + } + if (exeGroup.Indices.Size() > 0) + if (!MakeExeMethod(method, maxFilter, exeGroup.Method)) + exeGroup.Method = method; + for (i = 0; i < groups.Size();) + if (groups[i].Indices.Size() == 0) + groups.Delete(i); + else + i++; +} + +static void FromUpdateItemToFileItem(const CUpdateItem &updateItem, + CFileItem &file) +{ + file.Name = NItemName::MakeLegalName(updateItem.Name); + if (updateItem.AttributesAreDefined) + file.SetAttributes(updateItem.Attributes); + + if (updateItem.IsCreationTimeDefined) + file.SetCreationTime(updateItem.CreationTime); + if (updateItem.IsLastWriteTimeDefined) + file.SetLastWriteTime(updateItem.LastWriteTime); + if (updateItem.IsLastAccessTimeDefined) + file.SetLastAccessTime(updateItem.LastAccessTime); + + file.UnPackSize = updateItem.Size; + file.IsDirectory = updateItem.IsDirectory; + file.IsAnti = updateItem.IsAnti; + file.HasStream = updateItem.HasStream(); +} + +static HRESULT Update2( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + const CArchiveDatabaseEx *database, + const CObjectVector &updateItems, + ISequentialOutStream *seqOutStream, + IArchiveUpdateCallback *updateCallback, + const CUpdateOptions &options) +{ + UInt64 numSolidFiles = options.NumSolidFiles; + if (numSolidFiles == 0) + numSolidFiles = 1; + /* + CMyComPtr outStream; + RINOK(seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStream)); + if (!outStream) + return E_NOTIMPL; + */ + + UInt64 startBlockSize = database != 0 ? database->ArchiveInfo.StartPosition: 0; + if (startBlockSize > 0 && !options.RemoveSfxBlock) + { + RINOK(WriteRange(inStream, seqOutStream, 0, startBlockSize, NULL)); + } + + CRecordVector fileIndexToUpdateIndexMap; + if (database != 0) + { + fileIndexToUpdateIndexMap.Reserve(database->Files.Size()); + for (int i = 0; i < database->Files.Size(); i++) + fileIndexToUpdateIndexMap.Add(-1); + } + int i; + for(i = 0; i < updateItems.Size(); i++) + { + int index = updateItems[i].IndexInArchive; + if (index != -1) + fileIndexToUpdateIndexMap[index] = i; + } + + CRecordVector folderRefs; + if (database != 0) + { + for(i = 0; i < database->Folders.Size(); i++) + { + CNum indexInFolder = 0; + CNum numCopyItems = 0; + CNum numUnPackStreams = database->NumUnPackStreamsVector[i]; + for (CNum fileIndex = database->FolderStartFileIndex[i]; + indexInFolder < numUnPackStreams; fileIndex++) + { + if (database->Files[fileIndex].HasStream) + { + indexInFolder++; + int updateIndex = fileIndexToUpdateIndexMap[fileIndex]; + if (updateIndex >= 0) + if (!updateItems[updateIndex].NewData) + numCopyItems++; + } + } + if (numCopyItems != numUnPackStreams && numCopyItems != 0) + return E_NOTIMPL; // It needs repacking !!! + if (numCopyItems > 0) + folderRefs.Add(i); + } + folderRefs.Sort(CompareFolderRefs, (void *)database); + } + + CArchiveDatabase newDatabase; + + //////////////////////////// + + COutArchive archive; + RINOK(archive.Create(seqOutStream, false)); + RINOK(archive.SkeepPrefixArchiveHeader()); + UInt64 complexity = 0; + for(i = 0; i < folderRefs.Size(); i++) + complexity += database->GetFolderFullPackSize(folderRefs[i]); + UInt64 inSizeForReduce = 0; + for(i = 0; i < updateItems.Size(); i++) + { + const CUpdateItem &updateItem = updateItems[i]; + if (updateItem.NewData) + { + complexity += updateItem.Size; + if (numSolidFiles == 1) + { + if (updateItem.Size > inSizeForReduce) + inSizeForReduce = updateItem.Size; + } + else + inSizeForReduce += updateItem.Size; + } + } + RINOK(updateCallback->SetTotal(complexity)); + complexity = 0; + RINOK(updateCallback->SetCompleted(&complexity)); + + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr progress = lps; + lps->Init(updateCallback, true); + + ///////////////////////////////////////// + // Write Copy Items + + for(i = 0; i < folderRefs.Size(); i++) + { + int folderIndex = folderRefs[i]; + + lps->ProgressOffset = complexity; + UInt64 packSize = database->GetFolderFullPackSize(folderIndex); + RINOK(WriteRange(inStream, archive.SeqStream, + database->GetFolderStreamPos(folderIndex, 0), packSize, progress)); + complexity += packSize; + + const CFolder &folder = database->Folders[folderIndex]; + CNum startIndex = database->FolderStartPackStreamIndex[folderIndex]; + for (int j = 0; j < folder.PackStreams.Size(); j++) + { + newDatabase.PackSizes.Add(database->PackSizes[startIndex + j]); + // newDatabase.PackCRCsDefined.Add(database.PackCRCsDefined[startIndex + j]); + // newDatabase.PackCRCs.Add(database.PackCRCs[startIndex + j]); + } + newDatabase.Folders.Add(folder); + + CNum numUnPackStreams = database->NumUnPackStreamsVector[folderIndex]; + newDatabase.NumUnPackStreamsVector.Add(numUnPackStreams); + + CNum indexInFolder = 0; + for (CNum fi = database->FolderStartFileIndex[folderIndex]; + indexInFolder < numUnPackStreams; fi++) + { + CFileItem file = database->Files[fi]; + if (file.HasStream) + { + indexInFolder++; + int updateIndex = fileIndexToUpdateIndexMap[fi]; + if (updateIndex >= 0) + { + const CUpdateItem &updateItem = updateItems[updateIndex]; + if (updateItem.NewProperties) + { + CFileItem file2; + FromUpdateItemToFileItem(updateItem, file2); + file2.UnPackSize = file.UnPackSize; + file2.FileCRC = file.FileCRC; + file2.IsFileCRCDefined = file.IsFileCRCDefined; + file2.HasStream = file.HasStream; + file = file2; + } + } + newDatabase.Files.Add(file); + } + } + } + + ///////////////////////////////////////// + // Compress New Files + + CObjectVector groups; + SplitFilesToGroups(*options.Method, options.UseFilters, options.MaxFilter, + updateItems, groups); + + const UInt32 kMinReduceSize = (1 << 16); + if (inSizeForReduce < kMinReduceSize) + inSizeForReduce = kMinReduceSize; + + for (int groupIndex = 0; groupIndex < groups.Size(); groupIndex++) + { + const CSolidGroup &group = groups[groupIndex]; + int numFiles = group.Indices.Size(); + if (numFiles == 0) + continue; + CRecordVector refItems; + refItems.Reserve(numFiles); + bool sortByType = (numSolidFiles > 1); + for (i = 0; i < numFiles; i++) + refItems.Add(CRefItem(group.Indices[i], updateItems[group.Indices[i]], sortByType)); + refItems.Sort(CompareUpdateItems, (void *)&sortByType); + + CRecordVector indices; + indices.Reserve(numFiles); + + for (i = 0; i < numFiles; i++) + { + UInt32 index = refItems[i].Index; + indices.Add(index); + /* + const CUpdateItem &updateItem = updateItems[index]; + CFileItem file; + if (updateItem.NewProperties) + FromUpdateItemToFileItem(updateItem, file); + else + file = database.Files[updateItem.IndexInArchive]; + if (file.IsAnti || file.IsDirectory) + return E_FAIL; + newDatabase.Files.Add(file); + */ + } + + CEncoder encoder(group.Method); + + for (i = 0; i < numFiles;) + { + UInt64 totalSize = 0; + int numSubFiles; + UString prevExtension; + for (numSubFiles = 0; i + numSubFiles < numFiles && + numSubFiles < numSolidFiles; numSubFiles++) + { + const CUpdateItem &updateItem = updateItems[indices[i + numSubFiles]]; + totalSize += updateItem.Size; + if (totalSize > options.NumSolidBytes) + break; + if (options.SolidExtension) + { + UString ext = updateItem.GetExtension(); + if (numSubFiles == 0) + prevExtension = ext; + else + if (ext.CompareNoCase(prevExtension) != 0) + break; + } + } + if (numSubFiles < 1) + numSubFiles = 1; + + CFolderInStream *inStreamSpec = new CFolderInStream; + CMyComPtr solidInStream(inStreamSpec); + inStreamSpec->Init(updateCallback, &indices[i], numSubFiles); + + CFolder folderItem; + + int startPackIndex = newDatabase.PackSizes.Size(); + RINOK(encoder.Encode( + EXTERNAL_CODECS_LOC_VARS + solidInStream, NULL, &inSizeForReduce, folderItem, + archive.SeqStream, newDatabase.PackSizes, progress)); + + for (; startPackIndex < newDatabase.PackSizes.Size(); startPackIndex++) + lps->OutSize += newDatabase.PackSizes[startPackIndex]; + + lps->InSize += folderItem.GetUnPackSize(); + // for() + // newDatabase.PackCRCsDefined.Add(false); + // newDatabase.PackCRCs.Add(0); + + newDatabase.Folders.Add(folderItem); + + CNum numUnPackStreams = 0; + for (int subIndex = 0; subIndex < numSubFiles; subIndex++) + { + const CUpdateItem &updateItem = updateItems[indices[i + subIndex]]; + CFileItem file; + if (updateItem.NewProperties) + FromUpdateItemToFileItem(updateItem, file); + else + file = database->Files[updateItem.IndexInArchive]; + if (file.IsAnti || file.IsDirectory) + return E_FAIL; + + /* + CFileItem &file = newDatabase.Files[ + startFileIndexInDatabase + i + subIndex]; + */ + if (!inStreamSpec->Processed[subIndex]) + { + continue; + // file.Name += L".locked"; + } + + file.FileCRC = inStreamSpec->CRCs[subIndex]; + file.UnPackSize = inStreamSpec->Sizes[subIndex]; + if (file.UnPackSize != 0) + { + file.IsFileCRCDefined = true; + file.HasStream = true; + numUnPackStreams++; + } + else + { + file.IsFileCRCDefined = false; + file.HasStream = false; + } + newDatabase.Files.Add(file); + } + // numUnPackStreams = 0 is very bad case for locked files + // v3.13 doesn't understand it. + newDatabase.NumUnPackStreamsVector.Add(numUnPackStreams); + i += numSubFiles; + } + } + + { + ///////////////////////////////////////// + // Write Empty Files & Folders + + CRecordVector emptyRefs; + for(i = 0; i < updateItems.Size(); i++) + { + const CUpdateItem &updateItem = updateItems[i]; + if (updateItem.NewData) + { + if (updateItem.HasStream()) + continue; + } + else + if (updateItem.IndexInArchive != -1) + if (database->Files[updateItem.IndexInArchive].HasStream) + continue; + emptyRefs.Add(i); + } + emptyRefs.Sort(CompareEmptyItems, (void *)&updateItems); + for(i = 0; i < emptyRefs.Size(); i++) + { + const CUpdateItem &updateItem = updateItems[emptyRefs[i]]; + CFileItem file; + if (updateItem.NewProperties) + FromUpdateItemToFileItem(updateItem, file); + else + file = database->Files[updateItem.IndexInArchive]; + newDatabase.Files.Add(file); + } + } + + /* + if (newDatabase.Files.Size() != updateItems.Size()) + return E_FAIL; + */ + + return archive.WriteDatabase(EXTERNAL_CODECS_LOC_VARS + newDatabase, options.HeaderMethod, options.HeaderOptions); +} + +#ifdef _7Z_VOL + +static const UInt64 k_Copy = 0x0; + +static HRESULT WriteVolumeHeader(COutArchive &archive, CFileItem &file, const CUpdateOptions &options) +{ + CCoderInfo coder; + coder.NumInStreams = coder.NumOutStreams = 1; + coder.MethodID = k_Copy; + + CFolder folder; + folder.Coders.Add(coder); + folder.PackStreams.Add(0); + + CNum numUnPackStreams = 0; + if (file.UnPackSize != 0) + { + file.IsFileCRCDefined = true; + file.HasStream = true; + numUnPackStreams++; + } + else + { + throw 1; + file.IsFileCRCDefined = false; + file.HasStream = false; + } + folder.UnPackSizes.Add(file.UnPackSize); + + CArchiveDatabase newDatabase; + newDatabase.Files.Add(file); + newDatabase.Folders.Add(folder); + newDatabase.NumUnPackStreamsVector.Add(numUnPackStreams); + newDatabase.PackSizes.Add(file.UnPackSize); + newDatabase.PackCRCsDefined.Add(false); + newDatabase.PackCRCs.Add(file.FileCRC); + + return archive.WriteDatabase(newDatabase, + options.HeaderMethod, + false, + false); +} + +HRESULT UpdateVolume( + IInStream *inStream, + const CArchiveDatabaseEx *database, + CObjectVector &updateItems, + ISequentialOutStream *seqOutStream, + IArchiveUpdateCallback *updateCallback, + const CUpdateOptions &options) +{ + if (updateItems.Size() != 1) + return E_NOTIMPL; + + CMyComPtr volumeCallback; + RINOK(updateCallback->QueryInterface(IID_IArchiveUpdateCallback2, (void **)&volumeCallback)); + if (!volumeCallback) + return E_NOTIMPL; + + CMyComPtr fileStream; + HRESULT result = updateCallback->GetStream(0, &fileStream); + if (result != S_OK && result != S_FALSE) + return result; + if (result == S_FALSE) + return E_FAIL; + + CFileItem file; + + const CUpdateItem &updateItem = updateItems[0]; + if (updateItem.NewProperties) + FromUpdateItemToFileItem(updateItem, file); + else + file = database->Files[updateItem.IndexInArchive]; + if (file.IsAnti || file.IsDirectory) + return E_FAIL; + + UInt64 complexity = 0; + file.IsStartPosDefined = true; + file.StartPos = 0; + for (UInt64 volumeIndex = 0; true; volumeIndex++) + { + UInt64 volSize; + RINOK(volumeCallback->GetVolumeSize(volumeIndex, &volSize)); + UInt64 pureSize = COutArchive::GetVolPureSize(volSize, file.Name.Length(), true); + CMyComPtr volumeStream; + RINOK(volumeCallback->GetVolumeStream(volumeIndex, &volumeStream)); + + COutArchive archive; + RINOK(archive.Create(volumeStream, true)); + RINOK(archive.SkeepPrefixArchiveHeader()); + + CSequentialInStreamWithCRC *inCrcStreamSpec = new CSequentialInStreamWithCRC; + CMyComPtr inCrcStream = inCrcStreamSpec; + inCrcStreamSpec->Init(fileStream); + + RINOK(WriteRange(inCrcStream, volumeStream, pureSize, updateCallback, complexity)); + file.UnPackSize = inCrcStreamSpec->GetSize(); + if (file.UnPackSize == 0) + break; + file.FileCRC = inCrcStreamSpec->GetCRC(); + RINOK(WriteVolumeHeader(archive, file, options)); + file.StartPos += file.UnPackSize; + if (file.UnPackSize < pureSize) + break; + } + return S_OK; +} + +class COutVolumeStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + int _volIndex; + UInt64 _volSize; + UInt64 _curPos; + CMyComPtr _volumeStream; + COutArchive _archive; + CCRC _crc; + +public: + MY_UNKNOWN_IMP + + CFileItem _file; + CUpdateOptions _options; + CMyComPtr VolumeCallback; + void Init(IArchiveUpdateCallback2 *volumeCallback, + const UString &name) + { + _file.Name = name; + _file.IsStartPosDefined = true; + _file.StartPos = 0; + + VolumeCallback = volumeCallback; + _volIndex = 0; + _volSize = 0; + } + + HRESULT Flush(); + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +HRESULT COutVolumeStream::Flush() +{ + if (_volumeStream) + { + _file.UnPackSize = _curPos; + _file.FileCRC = _crc.GetDigest(); + RINOK(WriteVolumeHeader(_archive, _file, _options)); + _archive.Close(); + _volumeStream.Release(); + _file.StartPos += _file.UnPackSize; + } + return S_OK; +} + +STDMETHODIMP COutVolumeStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if(processedSize != NULL) + *processedSize = 0; + while(size > 0) + { + if (!_volumeStream) + { + RINOK(VolumeCallback->GetVolumeSize(_volIndex, &_volSize)); + RINOK(VolumeCallback->GetVolumeStream(_volIndex, &_volumeStream)); + _volIndex++; + _curPos = 0; + RINOK(_archive.Create(_volumeStream, true)); + RINOK(_archive.SkeepPrefixArchiveHeader()); + _crc.Init(); + continue; + } + UInt64 pureSize = COutArchive::GetVolPureSize(_volSize, _file.Name.Length()); + UInt32 curSize = (UInt32)MyMin(UInt64(size), pureSize - _curPos); + + _crc.Update(data, curSize); + UInt32 realProcessed; + RINOK(_volumeStream->Write(data, curSize, &realProcessed)) + data = (void *)((Byte *)data + realProcessed); + size -= realProcessed; + if(processedSize != NULL) + *processedSize += realProcessed; + _curPos += realProcessed; + if (realProcessed != curSize && realProcessed == 0) + return E_FAIL; + if (_curPos == pureSize) + { + RINOK(Flush()); + } + } + return S_OK; +} + +#endif + +HRESULT Update( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + const CArchiveDatabaseEx *database, + const CObjectVector &updateItems, + ISequentialOutStream *seqOutStream, + IArchiveUpdateCallback *updateCallback, + const CUpdateOptions &options) +{ + #ifdef _7Z_VOL + if (seqOutStream) + #endif + return Update2( + EXTERNAL_CODECS_LOC_VARS + inStream, database, updateItems, + seqOutStream, updateCallback, options); + #ifdef _7Z_VOL + if (options.VolumeMode) + return UpdateVolume(inStream, database, updateItems, + seqOutStream, updateCallback, options); + COutVolumeStream *volStreamSpec = new COutVolumeStream; + CMyComPtr volStream = volStreamSpec; + CMyComPtr volumeCallback; + RINOK(updateCallback->QueryInterface(IID_IArchiveUpdateCallback2, (void **)&volumeCallback)); + if (!volumeCallback) + return E_NOTIMPL; + volStreamSpec->Init(volumeCallback, L"a.7z"); + volStreamSpec->_options = options; + RINOK(Update2(inStream, database, updateItems, + volStream, updateCallback, options)); + return volStreamSpec->Flush(); + #endif +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zUpdate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/7zUpdate.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,80 @@ +// 7zUpdate.h + +#ifndef __7Z_UPDATE_H +#define __7Z_UPDATE_H + +#include "7zIn.h" +#include "7zOut.h" +#include "7zCompressionMode.h" + +#include "../IArchive.h" + +namespace NArchive { +namespace N7z { + +struct CUpdateItem +{ + bool NewData; + bool NewProperties; + int IndexInArchive; + int IndexInClient; + + UInt32 Attributes; + FILETIME CreationTime; + FILETIME LastWriteTime; + FILETIME LastAccessTime; + + UInt64 Size; + UString Name; + + bool IsAnti; + bool IsDirectory; + + bool IsCreationTimeDefined; + bool IsLastWriteTimeDefined; + bool IsLastAccessTimeDefined; + bool AttributesAreDefined; + + bool HasStream() const + { return !IsDirectory && !IsAnti && Size != 0; } + CUpdateItem(): + IsAnti(false), + AttributesAreDefined(false), + IsCreationTimeDefined(false), + IsLastWriteTimeDefined(false), + IsLastAccessTimeDefined(false) + {} + void SetDirectoryStatusFromAttributes() + { IsDirectory = ((Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0); }; + + int GetExtensionPos() const; + UString GetExtension() const; +}; + +struct CUpdateOptions +{ + const CCompressionMethodMode *Method; + const CCompressionMethodMode *HeaderMethod; + bool UseFilters; + bool MaxFilter; + + CHeaderOptions HeaderOptions; + + UInt64 NumSolidFiles; + UInt64 NumSolidBytes; + bool SolidExtension; + bool RemoveSfxBlock; + bool VolumeMode; +}; + +HRESULT Update( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + const CArchiveDatabaseEx *database, + const CObjectVector &updateItems, + ISequentialOutStream *seqOutStream, + IArchiveUpdateCallback *updateCallback, + const CUpdateOptions &options); +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/7z/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/7z/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" +#include "../../../Common/NewHandler.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Archive.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Archive.def Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,6 @@ +EXPORTS + CreateObject PRIVATE + GetHandlerProperty PRIVATE + GetNumberOfFormats PRIVATE + GetHandlerProperty2 PRIVATE + CreateObject PRIVATE diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Archive2.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Archive2.def Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +EXPORTS + CreateObject PRIVATE + GetHandlerProperty PRIVATE + GetNumberOfFormats PRIVATE + GetHandlerProperty2 PRIVATE + CreateObject PRIVATE + GetNumberOfMethods PRIVATE + GetMethodProperty PRIVATE + SetLargePageMode PRIVATE diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/ArchiveExports.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/ArchiveExports.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,130 @@ +// ArchiveExports.cpp + +#include "StdAfx.h" + +#include "../../Common/ComTry.h" +#include "../../Common/Types.h" +#include "../../Windows/PropVariant.h" +#include "../Common/RegisterArc.h" + +#include "IArchive.h" +#include "../ICoder.h" +#include "../IPassword.h" + +static const unsigned int kNumArcsMax = 32; +static unsigned int g_NumArcs = 0; +static const CArcInfo *g_Arcs[kNumArcsMax]; +void RegisterArc(const CArcInfo *arcInfo) +{ + if (g_NumArcs < kNumArcsMax) + g_Arcs[g_NumArcs++] = arcInfo; +} + +DEFINE_GUID(CLSID_CArchiveHandler, +0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00); + +#define CLS_ARC_ID_ITEM(cls) ((cls).Data4[5]) + +static inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value) +{ + if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0) + value->vt = VT_BSTR; + return S_OK; +} + +static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value) +{ + return SetPropString((const char *)&guid, sizeof(GUID), value); +} + +int FindFormatCalssId(const GUID *clsID) +{ + GUID cls = *clsID; + CLS_ARC_ID_ITEM(cls) = 0; + if (cls != CLSID_CArchiveHandler) + return -1; + Byte id = CLS_ARC_ID_ITEM(*clsID); + for (UInt32 i = 0; i < g_NumArcs; i++) + if (g_Arcs[i]->ClassId == id) + return i; + return -1; +} + +STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject) +{ + COM_TRY_BEGIN + { + int needIn = (*iid == IID_IInArchive); + int needOut = (*iid == IID_IOutArchive); + if (!needIn && !needOut) + return E_NOINTERFACE; + int formatIndex = FindFormatCalssId(clsid); + if (formatIndex < 0) + return CLASS_E_CLASSNOTAVAILABLE; + + const CArcInfo &arc = *g_Arcs[formatIndex]; + if (needIn) + { + *outObject = arc.CreateInArchive(); + ((IInArchive *)*outObject)->AddRef(); + } + else + { + if (!arc.CreateOutArchive) + return CLASS_E_CLASSNOTAVAILABLE; + *outObject = arc.CreateOutArchive(); + ((IOutArchive *)*outObject)->AddRef(); + } + } + COM_TRY_END + return S_OK; +} + +STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value) +{ + if (formatIndex >= g_NumArcs) + return E_INVALIDARG; + const CArcInfo &arc = *g_Arcs[formatIndex]; + NWindows::NCOM::CPropVariant prop; + switch(propID) + { + case NArchive::kName: + prop = arc.Name; + break; + case NArchive::kClassID: + { + GUID clsId = CLSID_CArchiveHandler; + CLS_ARC_ID_ITEM(clsId) = arc.ClassId; + return SetPropGUID(clsId, value); + } + case NArchive::kExtension: + if (arc.Ext != 0) + prop = arc.Ext; + break; + case NArchive::kAddExtension: + if (arc.AddExt != 0) + prop = arc.AddExt; + break; + case NArchive::kUpdate: + prop = (bool)(arc.CreateOutArchive != 0); + break; + case NArchive::kKeepName: + prop = arc.KeepName; + break; + case NArchive::kStartSignature: + return SetPropString((const char *)arc.Signature, arc.SignatureSize, value); + } + prop.Detach(value); + return S_OK; +} + +STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value) +{ + return GetHandlerProperty2(0, propID, value); +} + +STDAPI GetNumberOfFormats(UINT32 *numFormats) +{ + *numFormats = g_NumArcs; + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,121 @@ +// CoderMixer2.cpp + +#include "StdAfx.h" + +#include "CoderMixer2.h" + +namespace NCoderMixer { + +CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo): + _srcBindInfo(srcBindInfo) +{ + srcBindInfo.GetNumStreams(NumSrcInStreams, _numSrcOutStreams); + + UInt32 j; + for (j = 0; j < NumSrcInStreams; j++) + { + _srcInToDestOutMap.Add(0); + DestOutToSrcInMap.Add(0); + } + for (j = 0; j < _numSrcOutStreams; j++) + { + _srcOutToDestInMap.Add(0); + _destInToSrcOutMap.Add(0); + } + + UInt32 destInOffset = 0; + UInt32 destOutOffset = 0; + UInt32 srcInOffset = NumSrcInStreams; + UInt32 srcOutOffset = _numSrcOutStreams; + + for (int i = srcBindInfo.Coders.Size() - 1; i >= 0; i--) + { + const CCoderStreamsInfo &srcCoderInfo = srcBindInfo.Coders[i]; + + srcInOffset -= srcCoderInfo.NumInStreams; + srcOutOffset -= srcCoderInfo.NumOutStreams; + + UInt32 j; + for (j = 0; j < srcCoderInfo.NumInStreams; j++, destOutOffset++) + { + UInt32 index = srcInOffset + j; + _srcInToDestOutMap[index] = destOutOffset; + DestOutToSrcInMap[destOutOffset] = index; + } + for (j = 0; j < srcCoderInfo.NumOutStreams; j++, destInOffset++) + { + UInt32 index = srcOutOffset + j; + _srcOutToDestInMap[index] = destInOffset; + _destInToSrcOutMap[destInOffset] = index; + } + } +} + +void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo) +{ + destBindInfo.Coders.Clear(); + destBindInfo.BindPairs.Clear(); + destBindInfo.InStreams.Clear(); + destBindInfo.OutStreams.Clear(); + + int i; + for (i = _srcBindInfo.Coders.Size() - 1; i >= 0; i--) + { + const CCoderStreamsInfo &srcCoderInfo = _srcBindInfo.Coders[i]; + CCoderStreamsInfo destCoderInfo; + destCoderInfo.NumInStreams = srcCoderInfo.NumOutStreams; + destCoderInfo.NumOutStreams = srcCoderInfo.NumInStreams; + destBindInfo.Coders.Add(destCoderInfo); + } + for (i = _srcBindInfo.BindPairs.Size() - 1; i >= 0; i--) + { + const CBindPair &srcBindPair = _srcBindInfo.BindPairs[i]; + CBindPair destBindPair; + destBindPair.InIndex = _srcOutToDestInMap[srcBindPair.OutIndex]; + destBindPair.OutIndex = _srcInToDestOutMap[srcBindPair.InIndex]; + destBindInfo.BindPairs.Add(destBindPair); + } + for (i = 0; i < _srcBindInfo.InStreams.Size(); i++) + destBindInfo.OutStreams.Add(_srcInToDestOutMap[_srcBindInfo.InStreams[i]]); + for (i = 0; i < _srcBindInfo.OutStreams.Size(); i++) + destBindInfo.InStreams.Add(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]); +} + +CCoderInfo2::CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams): + NumInStreams(numInStreams), + NumOutStreams(numOutStreams) +{ + InSizes.Reserve(NumInStreams); + InSizePointers.Reserve(NumInStreams); + OutSizePointers.Reserve(NumOutStreams); + OutSizePointers.Reserve(NumOutStreams); +} + +static void SetSizes(const UInt64 **srcSizes, CRecordVector &sizes, + CRecordVector &sizePointers, UInt32 numItems) +{ + sizes.Clear(); + sizePointers.Clear(); + for(UInt32 i = 0; i < numItems; i++) + { + if (srcSizes == 0 || srcSizes[i] == NULL) + { + sizes.Add(0); + sizePointers.Add(NULL); + } + else + { + sizes.Add(*srcSizes[i]); + sizePointers.Add(&sizes.Back()); + } + } +} + +void CCoderInfo2::SetCoderInfo(const UInt64 **inSizes, + const UInt64 **outSizes) +{ + SetSizes(inSizes, InSizes, InSizePointers, NumInStreams); + SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams); +} + +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,174 @@ +// CoderMixer2.h + +#ifndef __CODER_MIXER2_H +#define __CODER_MIXER2_H + +#include "../../../Common/MyVector.h" +#include "../../../Common/Types.h" +#include "../../../Common/MyCom.h" +#include "../../ICoder.h" + +namespace NCoderMixer { + +struct CBindPair +{ + UInt32 InIndex; + UInt32 OutIndex; +}; + +struct CCoderStreamsInfo +{ + UInt32 NumInStreams; + UInt32 NumOutStreams; +}; + +struct CBindInfo +{ + CRecordVector Coders; + CRecordVector BindPairs; + CRecordVector InStreams; + CRecordVector OutStreams; + + void Clear() + { + Coders.Clear(); + BindPairs.Clear(); + InStreams.Clear(); + OutStreams.Clear(); + } + + /* + UInt32 GetCoderStartOutStream(UInt32 coderIndex) const + { + UInt32 numOutStreams = 0; + for (UInt32 i = 0; i < coderIndex; i++) + numOutStreams += Coders[i].NumOutStreams; + return numOutStreams; + } + */ + + + void GetNumStreams(UInt32 &numInStreams, UInt32 &numOutStreams) const + { + numInStreams = 0; + numOutStreams = 0; + for (int i = 0; i < Coders.Size(); i++) + { + const CCoderStreamsInfo &coderStreamsInfo = Coders[i]; + numInStreams += coderStreamsInfo.NumInStreams; + numOutStreams += coderStreamsInfo.NumOutStreams; + } + } + + int FindBinderForInStream(UInt32 inStream) const + { + for (int i = 0; i < BindPairs.Size(); i++) + if (BindPairs[i].InIndex == inStream) + return i; + return -1; + } + int FindBinderForOutStream(UInt32 outStream) const + { + for (int i = 0; i < BindPairs.Size(); i++) + if (BindPairs[i].OutIndex == outStream) + return i; + return -1; + } + + UInt32 GetCoderInStreamIndex(UInt32 coderIndex) const + { + UInt32 streamIndex = 0; + for (UInt32 i = 0; i < coderIndex; i++) + streamIndex += Coders[i].NumInStreams; + return streamIndex; + } + + UInt32 GetCoderOutStreamIndex(UInt32 coderIndex) const + { + UInt32 streamIndex = 0; + for (UInt32 i = 0; i < coderIndex; i++) + streamIndex += Coders[i].NumOutStreams; + return streamIndex; + } + + + void FindInStream(UInt32 streamIndex, UInt32 &coderIndex, + UInt32 &coderStreamIndex) const + { + for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++) + { + UInt32 curSize = Coders[coderIndex].NumInStreams; + if (streamIndex < curSize) + { + coderStreamIndex = streamIndex; + return; + } + streamIndex -= curSize; + } + throw 1; + } + void FindOutStream(UInt32 streamIndex, UInt32 &coderIndex, + UInt32 &coderStreamIndex) const + { + for (coderIndex = 0; coderIndex < (UInt32)Coders.Size(); coderIndex++) + { + UInt32 curSize = Coders[coderIndex].NumOutStreams; + if (streamIndex < curSize) + { + coderStreamIndex = streamIndex; + return; + } + streamIndex -= curSize; + } + throw 1; + } +}; + +class CBindReverseConverter +{ + UInt32 _numSrcOutStreams; + NCoderMixer::CBindInfo _srcBindInfo; + CRecordVector _srcInToDestOutMap; + CRecordVector _srcOutToDestInMap; + CRecordVector _destInToSrcOutMap; +public: + UInt32 NumSrcInStreams; + CRecordVector DestOutToSrcInMap; + + CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo); + void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo); +}; + +struct CCoderInfo2 +{ + CMyComPtr Coder; + CMyComPtr Coder2; + UInt32 NumInStreams; + UInt32 NumOutStreams; + + CRecordVector InSizes; + CRecordVector OutSizes; + CRecordVector InSizePointers; + CRecordVector OutSizePointers; + + CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams); + void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes); + + HRESULT QueryInterface(REFGUID iid, void** pp) const + { + IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2; + return p->QueryInterface(iid, pp); + } +}; + +class CCoderMixer2 +{ +public: + virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) = 0; + virtual void ReInit() = 0; + virtual void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) = 0; +}; + +} +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2MT.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2MT.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,228 @@ +// CoderMixer2MT.cpp + +#include "StdAfx.h" + +#include "CoderMixer2MT.h" + +namespace NCoderMixer { + +CCoder2::CCoder2(UInt32 numInStreams, UInt32 numOutStreams): + CCoderInfo2(numInStreams, numOutStreams) +{ + InStreams.Reserve(NumInStreams); + InStreamPointers.Reserve(NumInStreams); + OutStreams.Reserve(NumOutStreams); + OutStreamPointers.Reserve(NumOutStreams); +} + +void CCoder2::Execute() { Code(NULL); } + +void CCoder2::Code(ICompressProgressInfo *progress) +{ + InStreamPointers.Clear(); + OutStreamPointers.Clear(); + UInt32 i; + for (i = 0; i < NumInStreams; i++) + { + if (InSizePointers[i] != NULL) + InSizePointers[i] = &InSizes[i]; + InStreamPointers.Add((ISequentialInStream *)InStreams[i]); + } + for (i = 0; i < NumOutStreams; i++) + { + if (OutSizePointers[i] != NULL) + OutSizePointers[i] = &OutSizes[i]; + OutStreamPointers.Add((ISequentialOutStream *)OutStreams[i]); + } + if (Coder) + Result = Coder->Code(InStreamPointers[0], OutStreamPointers[0], + InSizePointers[0], OutSizePointers[0], progress); + else + Result = Coder2->Code(&InStreamPointers.Front(), &InSizePointers.Front(), NumInStreams, + &OutStreamPointers.Front(), &OutSizePointers.Front(), NumOutStreams, progress); + { + int i; + for (i = 0; i < InStreams.Size(); i++) + InStreams[i].Release(); + for (i = 0; i < OutStreams.Size(); i++) + OutStreams[i].Release(); + } +} + +static void SetSizes(const UInt64 **srcSizes, CRecordVector &sizes, + CRecordVector &sizePointers, UInt32 numItems) +{ + sizes.Clear(); + sizePointers.Clear(); + for(UInt32 i = 0; i < numItems; i++) + { + if (srcSizes == 0 || srcSizes[i] == NULL) + { + sizes.Add(0); + sizePointers.Add(NULL); + } + else + { + sizes.Add(*srcSizes[i]); + sizePointers.Add(&sizes.Back()); + } + } +} + + +void CCoder2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes) +{ + SetSizes(inSizes, InSizes, InSizePointers, NumInStreams); + SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams); +} + +////////////////////////////////////// +// CCoderMixer2MT + +HRESULT CCoderMixer2MT::SetBindInfo(const CBindInfo &bindInfo) +{ + _bindInfo = bindInfo; + _streamBinders.Clear(); + for(int i = 0; i < _bindInfo.BindPairs.Size(); i++) + { + _streamBinders.Add(CStreamBinder()); + RINOK(_streamBinders.Back().CreateEvents()); + } + return S_OK; +} + +void CCoderMixer2MT::AddCoderCommon() +{ + const CCoderStreamsInfo &c = _bindInfo.Coders[_coders.Size()]; + CCoder2 threadCoderInfo(c.NumInStreams, c.NumOutStreams); + _coders.Add(threadCoderInfo); +} + +void CCoderMixer2MT::AddCoder(ICompressCoder *coder) +{ + AddCoderCommon(); + _coders.Back().Coder = coder; +} + +void CCoderMixer2MT::AddCoder2(ICompressCoder2 *coder) +{ + AddCoderCommon(); + _coders.Back().Coder2 = coder; +} + + +void CCoderMixer2MT::ReInit() +{ + for(int i = 0; i < _streamBinders.Size(); i++) + _streamBinders[i].ReInit(); +} + + +HRESULT CCoderMixer2MT::Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams) +{ + /* + if (_coders.Size() != _bindInfo.Coders.Size()) + throw 0; + */ + int i; + for(i = 0; i < _coders.Size(); i++) + { + CCoder2 &coderInfo = _coders[i]; + const CCoderStreamsInfo &coderStreamsInfo = _bindInfo.Coders[i]; + coderInfo.InStreams.Clear(); + UInt32 j; + for(j = 0; j < coderStreamsInfo.NumInStreams; j++) + coderInfo.InStreams.Add(NULL); + coderInfo.OutStreams.Clear(); + for(j = 0; j < coderStreamsInfo.NumOutStreams; j++) + coderInfo.OutStreams.Add(NULL); + } + + for(i = 0; i < _bindInfo.BindPairs.Size(); i++) + { + const CBindPair &bindPair = _bindInfo.BindPairs[i]; + UInt32 inCoderIndex, inCoderStreamIndex; + UInt32 outCoderIndex, outCoderStreamIndex; + _bindInfo.FindInStream(bindPair.InIndex, inCoderIndex, inCoderStreamIndex); + _bindInfo.FindOutStream(bindPair.OutIndex, outCoderIndex, outCoderStreamIndex); + + _streamBinders[i].CreateStreams( + &_coders[inCoderIndex].InStreams[inCoderStreamIndex], + &_coders[outCoderIndex].OutStreams[outCoderStreamIndex]); + } + + for(i = 0; i < _bindInfo.InStreams.Size(); i++) + { + UInt32 inCoderIndex, inCoderStreamIndex; + _bindInfo.FindInStream(_bindInfo.InStreams[i], inCoderIndex, inCoderStreamIndex); + _coders[inCoderIndex].InStreams[inCoderStreamIndex] = inStreams[i]; + } + + for(i = 0; i < _bindInfo.OutStreams.Size(); i++) + { + UInt32 outCoderIndex, outCoderStreamIndex; + _bindInfo.FindOutStream(_bindInfo.OutStreams[i], outCoderIndex, outCoderStreamIndex); + _coders[outCoderIndex].OutStreams[outCoderStreamIndex] = outStreams[i]; + } + return S_OK; +} + +HRESULT CCoderMixer2MT::ReturnIfError(HRESULT code) +{ + for (int i = 0; i < _coders.Size(); i++) + if (_coders[i].Result == code) + return code; + return S_OK; +} + +STDMETHODIMP CCoderMixer2MT::Code(ISequentialInStream **inStreams, + const UInt64 ** /* inSizes */, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 ** /* outSizes */, + UInt32 numOutStreams, + ICompressProgressInfo *progress) +{ + if (numInStreams != (UInt32)_bindInfo.InStreams.Size() || + numOutStreams != (UInt32)_bindInfo.OutStreams.Size()) + return E_INVALIDARG; + + Init(inStreams, outStreams); + + int i; + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + { + RINOK(_coders[i].Create()); + } + + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + _coders[i].Start(); + + _coders[_progressCoderIndex].Code(progress); + + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + _coders[i].WaitFinish(); + + RINOK(ReturnIfError(E_ABORT)); + RINOK(ReturnIfError(E_OUTOFMEMORY)); + RINOK(ReturnIfError(S_FALSE)); + + for (i = 0; i < _coders.Size(); i++) + { + HRESULT result = _coders[i].Result; + if (result != S_OK && result != E_FAIL) + return result; + } + for (i = 0; i < _coders.Size(); i++) + { + HRESULT result = _coders[i].Result; + if (result != S_OK) + return result; + } + return S_OK; +} + +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2MT.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/CoderMixer2MT.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,80 @@ +// CoderMixer2MT.h + +#ifndef __CODER_MIXER2_MT_H +#define __CODER_MIXER2_MT_H + +#include "CoderMixer2.h" +#include "../../../Common/MyCom.h" +#include "../../Common/StreamBinder.h" +#include "../../Common/VirtThread.h" + +namespace NCoderMixer { + +struct CCoder2: public CCoderInfo2, public CVirtThread +{ + HRESULT Result; + CObjectVector< CMyComPtr > InStreams; + CObjectVector< CMyComPtr > OutStreams; + CRecordVector InStreamPointers; + CRecordVector OutStreamPointers; + + CCoder2(UInt32 numInStreams, UInt32 numOutStreams); + void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes); + virtual void Execute(); + void Code(ICompressProgressInfo *progress); +}; + + +/* + SetBindInfo() + for each coder + AddCoder[2]() + SetProgressIndex(UInt32 coderIndex); + + for each file + { + ReInit() + for each coder + SetCoderInfo + Code + } +*/ + +class CCoderMixer2MT: + public ICompressCoder2, + public CCoderMixer2, + public CMyUnknownImp +{ + CBindInfo _bindInfo; + CObjectVector _streamBinders; + int _progressCoderIndex; + + void AddCoderCommon(); + HRESULT Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams); + HRESULT ReturnIfError(HRESULT code); +public: + CObjectVector _coders; + MY_UNKNOWN_IMP + + STDMETHOD(Code)(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress); + + HRESULT SetBindInfo(const CBindInfo &bindInfo); + void AddCoder(ICompressCoder *coder); + void AddCoder2(ICompressCoder2 *coder); + void SetProgressCoderIndex(int coderIndex) { _progressCoderIndex = coderIndex; } + + void ReInit(); + void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) + { _coders[coderIndex].SetCoderInfo(inSizes, outSizes); } + UInt64 GetWriteProcessedSize(UInt32 binderIndex) const + { return _streamBinders[binderIndex].ProcessedSize; } +}; + +} +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/CrossThreadProgress.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/CrossThreadProgress.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,15 @@ +// CrossThreadProgress.cpp + +#include "StdAfx.h" + +#include "CrossThreadProgress.h" + +STDMETHODIMP CCrossThreadProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) +{ + InSize = inSize; + OutSize = outSize; + ProgressEvent.Set(); + WaitEvent.Lock(); + return Result; +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/CrossThreadProgress.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/CrossThreadProgress.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,37 @@ +// CrossThreadProgress.h + +#ifndef __CROSSTHREADPROGRESS_H +#define __CROSSTHREADPROGRESS_H + +#include "../../ICoder.h" +#include "../../../Windows/Synchronization.h" +#include "../../../Common/MyCom.h" + +class CCrossThreadProgress: + public ICompressProgressInfo, + public CMyUnknownImp +{ +public: + const UInt64 *InSize; + const UInt64 *OutSize; + HRESULT Result; + NWindows::NSynchronization::CAutoResetEvent ProgressEvent; + NWindows::NSynchronization::CAutoResetEvent WaitEvent; + + HRes Create() + { + RINOK(ProgressEvent.CreateIfNotCreated()); + return WaitEvent.CreateIfNotCreated(); + } + void Init() + { + ProgressEvent.Reset(); + WaitEvent.Reset(); + } + + MY_UNKNOWN_IMP + + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,22 @@ +// DummyOutStream.cpp + +#include "StdAfx.h" + +#include "DummyOutStream.h" + +STDMETHODIMP CDummyOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result; + if(!_stream) + { + realProcessedSize = size; + result = S_OK; + } + else + result = _stream->Write(data, size, &realProcessedSize); + _size += realProcessedSize; + if(processedSize != NULL) + *processedSize = realProcessedSize; + return result; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/DummyOutStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/DummyOutStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,23 @@ +// DummyOutStream.h + +#ifndef __DUMMYOUTSTREAM_H +#define __DUMMYOUTSTREAM_H + +#include "../../IStream.h" +#include "Common/MyCom.h" + +class CDummyOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; +public: + void SetStream(ISequentialOutStream *outStream) { _stream = outStream; } + void Init() { _size = 0; } + MY_UNKNOWN_IMP + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + UInt64 GetSize() const { return _size; } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,618 @@ +// HandlerOutCommon.cpp + +#include "StdAfx.h" + +#include "HandlerOut.h" +#include "../../../Windows/PropVariant.h" +#include "../../../Common/StringToInt.h" +#include "../../ICoder.h" +#include "../Common/ParseProperties.h" + +#ifdef COMPRESS_MT +#include "../../../Windows/System.h" +#endif + +using namespace NWindows; + +namespace NArchive { + +static const wchar_t *kCopyMethod = L"Copy"; +static const wchar_t *kLZMAMethodName = L"LZMA"; +static const wchar_t *kLZMA2MethodName = L"LZMA2"; +static const wchar_t *kBZip2MethodName = L"BZip2"; +static const wchar_t *kPpmdMethodName = L"PPMd"; +static const wchar_t *kDeflateMethodName = L"Deflate"; +static const wchar_t *kDeflate64MethodName = L"Deflate64"; + +static const wchar_t *kLzmaMatchFinderX1 = L"HC4"; +static const wchar_t *kLzmaMatchFinderX5 = L"BT4"; + +static const UInt32 kLzmaAlgoX1 = 0; +static const UInt32 kLzmaAlgoX5 = 1; + +static const UInt32 kLzmaDicSizeX1 = 1 << 16; +static const UInt32 kLzmaDicSizeX3 = 1 << 20; +static const UInt32 kLzmaDicSizeX5 = 1 << 24; +static const UInt32 kLzmaDicSizeX7 = 1 << 25; +static const UInt32 kLzmaDicSizeX9 = 1 << 26; + +static const UInt32 kLzmaFastBytesX1 = 32; +static const UInt32 kLzmaFastBytesX7 = 64; + +static const UInt32 kPpmdMemSizeX1 = (1 << 22); +static const UInt32 kPpmdMemSizeX5 = (1 << 24); +static const UInt32 kPpmdMemSizeX7 = (1 << 26); +static const UInt32 kPpmdMemSizeX9 = (192 << 20); + +static const UInt32 kPpmdOrderX1 = 4; +static const UInt32 kPpmdOrderX5 = 6; +static const UInt32 kPpmdOrderX7 = 16; +static const UInt32 kPpmdOrderX9 = 32; + +static const UInt32 kDeflateAlgoX1 = 0; +static const UInt32 kDeflateAlgoX5 = 1; + +static const UInt32 kDeflateFastBytesX1 = 32; +static const UInt32 kDeflateFastBytesX7 = 64; +static const UInt32 kDeflateFastBytesX9 = 128; + +static const UInt32 kDeflatePassesX1 = 1; +static const UInt32 kDeflatePassesX7 = 3; +static const UInt32 kDeflatePassesX9 = 10; + +static const UInt32 kBZip2NumPassesX1 = 1; +static const UInt32 kBZip2NumPassesX7 = 2; +static const UInt32 kBZip2NumPassesX9 = 7; + +static const UInt32 kBZip2DicSizeX1 = 100000; +static const UInt32 kBZip2DicSizeX3 = 500000; +static const UInt32 kBZip2DicSizeX5 = 900000; + +static const wchar_t *kDefaultMethodName = kLZMAMethodName; + +static const wchar_t *kLzmaMatchFinderForHeaders = L"BT2"; +static const UInt32 kDictionaryForHeaders = 1 << 20; +static const UInt32 kNumFastBytesForHeaders = 273; +static const UInt32 kAlgorithmForHeaders = kLzmaAlgoX5; + +static bool AreEqual(const UString &methodName, const wchar_t *s) + { return (methodName.CompareNoCase(s) == 0); } + +static inline bool IsLZMAMethod(const UString &methodName) +{ + return + AreEqual(methodName, kLZMAMethodName) || + AreEqual(methodName, kLZMA2MethodName); +} + +static inline bool IsBZip2Method(const UString &methodName) + { return AreEqual(methodName, kBZip2MethodName); } + +static inline bool IsPpmdMethod(const UString &methodName) + { return AreEqual(methodName, kPpmdMethodName); } + +static inline bool IsDeflateMethod(const UString &methodName) +{ + return + AreEqual(methodName, kDeflateMethodName) || + AreEqual(methodName, kDeflate64MethodName); +} + +struct CNameToPropID +{ + PROPID PropID; + VARTYPE VarType; + const wchar_t *Name; +}; + +CNameToPropID g_NameToPropID[] = +{ + { NCoderPropID::kOrder, VT_UI4, L"O" }, + { NCoderPropID::kPosStateBits, VT_UI4, L"PB" }, + { NCoderPropID::kLitContextBits, VT_UI4, L"LC" }, + { NCoderPropID::kLitPosBits, VT_UI4, L"LP" }, + { NCoderPropID::kEndMarker, VT_BOOL, L"eos" }, + + { NCoderPropID::kNumPasses, VT_UI4, L"Pass" }, + { NCoderPropID::kNumFastBytes, VT_UI4, L"fb" }, + { NCoderPropID::kMatchFinderCycles, VT_UI4, L"mc" }, + { NCoderPropID::kAlgorithm, VT_UI4, L"a" }, + { NCoderPropID::kMatchFinder, VT_BSTR, L"mf" }, + { NCoderPropID::kNumThreads, VT_UI4, L"mt" } +}; + +static bool ConvertProperty(PROPVARIANT srcProp, VARTYPE varType, NCOM::CPropVariant &destProp) +{ + if (varType == srcProp.vt) + { + destProp = srcProp; + return true; + } + if (varType == VT_UI1) + { + if (srcProp.vt == VT_UI4) + { + UInt32 value = srcProp.ulVal; + if (value > 0xFF) + return false; + destProp = (Byte)value; + return true; + } + } + else if (varType == VT_BOOL) + { + bool res; + if (SetBoolProperty(res, srcProp) != S_OK) + return false; + destProp = res; + return true; + } + return false; +} + +static int FindPropIdFromStringName(const UString &name) +{ + for (int i = 0; i < sizeof(g_NameToPropID) / sizeof(g_NameToPropID[0]); i++) + if (name.CompareNoCase(g_NameToPropID[i].Name) == 0) + return i; + return -1; +} + +static void SetOneMethodProp(COneMethodInfo &oneMethodInfo, PROPID propID, + const NWindows::NCOM::CPropVariant &value) +{ + for (int j = 0; j < oneMethodInfo.Properties.Size(); j++) + if (oneMethodInfo.Properties[j].Id == propID) + return; + CProp property; + property.Id = propID; + property.Value = value; + oneMethodInfo.Properties.Add(property); +} + +void COutHandler::SetCompressionMethod2(COneMethodInfo &oneMethodInfo + #ifdef COMPRESS_MT + , UInt32 numThreads + #endif + ) +{ + UInt32 level = _level; + if (oneMethodInfo.MethodName.IsEmpty()) + oneMethodInfo.MethodName = kDefaultMethodName; + + if (IsLZMAMethod(oneMethodInfo.MethodName)) + { + UInt32 dicSize = + (level >= 9 ? kLzmaDicSizeX9 : + (level >= 7 ? kLzmaDicSizeX7 : + (level >= 5 ? kLzmaDicSizeX5 : + (level >= 3 ? kLzmaDicSizeX3 : + kLzmaDicSizeX1)))); + + UInt32 algo = + (level >= 5 ? kLzmaAlgoX5 : + kLzmaAlgoX1); + + UInt32 fastBytes = + (level >= 7 ? kLzmaFastBytesX7 : + kLzmaFastBytesX1); + + const wchar_t *matchFinder = + (level >= 5 ? kLzmaMatchFinderX5 : + kLzmaMatchFinderX1); + + SetOneMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kMatchFinder, matchFinder); + #ifdef COMPRESS_MT + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); + #endif + } + else if (IsDeflateMethod(oneMethodInfo.MethodName)) + { + UInt32 fastBytes = + (level >= 9 ? kDeflateFastBytesX9 : + (level >= 7 ? kDeflateFastBytesX7 : + kDeflateFastBytesX1)); + + UInt32 numPasses = + (level >= 9 ? kDeflatePassesX9 : + (level >= 7 ? kDeflatePassesX7 : + kDeflatePassesX1)); + + UInt32 algo = + (level >= 5 ? kDeflateAlgoX5 : + kDeflateAlgoX1); + + SetOneMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses); + } + else if (IsBZip2Method(oneMethodInfo.MethodName)) + { + UInt32 numPasses = + (level >= 9 ? kBZip2NumPassesX9 : + (level >= 7 ? kBZip2NumPassesX7 : + kBZip2NumPassesX1)); + + UInt32 dicSize = + (level >= 5 ? kBZip2DicSizeX5 : + (level >= 3 ? kBZip2DicSizeX3 : + kBZip2DicSizeX1)); + + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize); + #ifdef COMPRESS_MT + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); + #endif + } + else if (IsPpmdMethod(oneMethodInfo.MethodName)) + { + UInt32 useMemSize = + (level >= 9 ? kPpmdMemSizeX9 : + (level >= 7 ? kPpmdMemSizeX7 : + (level >= 5 ? kPpmdMemSizeX5 : + kPpmdMemSizeX1))); + + UInt32 order = + (level >= 9 ? kPpmdOrderX9 : + (level >= 7 ? kPpmdOrderX7 : + (level >= 5 ? kPpmdOrderX5 : + kPpmdOrderX1))); + + SetOneMethodProp(oneMethodInfo, NCoderPropID::kUsedMemorySize, useMemSize); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kOrder, order); + } +} + +static void SplitParams(const UString &srcString, UStringVector &subStrings) +{ + subStrings.Clear(); + UString name; + int len = srcString.Length(); + if (len == 0) + return; + for (int i = 0; i < len; i++) + { + wchar_t c = srcString[i]; + if (c == L':') + { + subStrings.Add(name); + name.Empty(); + } + else + name += c; + } + subStrings.Add(name); +} + +static void SplitParam(const UString ¶m, UString &name, UString &value) +{ + int eqPos = param.Find(L'='); + if (eqPos >= 0) + { + name = param.Left(eqPos); + value = param.Mid(eqPos + 1); + return; + } + for(int i = 0; i < param.Length(); i++) + { + wchar_t c = param[i]; + if (c >= L'0' && c <= L'9') + { + name = param.Left(i); + value = param.Mid(i); + return; + } + } + name = param; +} + +HRESULT COutHandler::SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value) +{ + CProp property; + if ( + name.CompareNoCase(L"D") == 0 || + name.CompareNoCase(L"MEM") == 0) + { + UInt32 dicSize; + RINOK(ParsePropDictionaryValue(value, dicSize)); + if (name.CompareNoCase(L"D") == 0) + property.Id = NCoderPropID::kDictionarySize; + else + property.Id = NCoderPropID::kUsedMemorySize; + property.Value = dicSize; + oneMethodInfo.Properties.Add(property); + } + else + { + int index = FindPropIdFromStringName(name); + if (index < 0) + return E_INVALIDARG; + + const CNameToPropID &nameToPropID = g_NameToPropID[index]; + property.Id = nameToPropID.PropID; + + NCOM::CPropVariant propValue; + + if (nameToPropID.VarType == VT_BSTR) + propValue = value; + else if (nameToPropID.VarType == VT_BOOL) + { + bool res; + if (!StringToBool(value, res)) + return E_INVALIDARG; + propValue = res; + } + else + { + UInt32 number; + if (ParseStringToUInt32(value, number) == value.Length()) + propValue = number; + else + propValue = value; + } + + if (!ConvertProperty(propValue, nameToPropID.VarType, property.Value)) + return E_INVALIDARG; + + oneMethodInfo.Properties.Add(property); + } + return S_OK; +} + +HRESULT COutHandler::SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString) +{ + UStringVector params; + SplitParams(srcString, params); + if (params.Size() > 0) + oneMethodInfo.MethodName = params[0]; + for (int i = 1; i < params.Size(); i++) + { + const UString ¶m = params[i]; + UString name, value; + SplitParam(param, name, value); + RINOK(SetParam(oneMethodInfo, name, value)); + } + return S_OK; +} + +HRESULT COutHandler::SetSolidSettings(const UString &s) +{ + bool res; + if (StringToBool(s, res)) + { + if (res) + InitSolid(); + else + _numSolidFiles = 1; + return S_OK; + } + UString s2 = s; + s2.MakeUpper(); + for (int i = 0; i < s2.Length();) + { + const wchar_t *start = ((const wchar_t *)s2) + i; + const wchar_t *end; + UInt64 v = ConvertStringToUInt64(start, &end); + if (start == end) + { + if (s2[i++] != 'E') + return E_INVALIDARG; + _solidExtension = true; + continue; + } + i += (int)(end - start); + if (i == s2.Length()) + return E_INVALIDARG; + wchar_t c = s2[i++]; + switch(c) + { + case 'F': + if (v < 1) + v = 1; + _numSolidFiles = v; + break; + case 'B': + _numSolidBytes = v; + _numSolidBytesDefined = true; + break; + case 'K': + _numSolidBytes = (v << 10); + _numSolidBytesDefined = true; + break; + case 'M': + _numSolidBytes = (v << 20); + _numSolidBytesDefined = true; + break; + case 'G': + _numSolidBytes = (v << 30); + _numSolidBytesDefined = true; + break; + default: + return E_INVALIDARG; + } + } + return S_OK; +} + +HRESULT COutHandler::SetSolidSettings(const PROPVARIANT &value) +{ + switch(value.vt) + { + case VT_EMPTY: + InitSolid(); + return S_OK; + case VT_BSTR: + return SetSolidSettings(value.bstrVal); + default: + return E_INVALIDARG; + } +} + +void COutHandler::Init() +{ + _removeSfxBlock = false; + _compressHeaders = true; + _encryptHeaders = false; + + WriteModified = true; + WriteCreated = false; + WriteAccessed = false; + + #ifdef COMPRESS_MT + _numThreads = NWindows::NSystem::GetNumberOfProcessors(); + #endif + + _level = 5; + _autoFilter = true; + _volumeMode = false; + _crcSize = 4; + InitSolid(); +} + +void COutHandler::BeforeSetProperty() +{ + Init(); + #ifdef COMPRESS_MT + numProcessors = NSystem::GetNumberOfProcessors(); + #endif + + mainDicSize = 0xFFFFFFFF; + mainDicMethodIndex = 0xFFFFFFFF; + minNumber = 0; + _crcSize = 4; +} + +HRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value) +{ + UString name = nameSpec; + name.MakeUpper(); + if (name.IsEmpty()) + return E_INVALIDARG; + + if (name[0] == 'X') + { + name.Delete(0); + _level = 9; + return ParsePropValue(name, value, _level); + } + + if (name[0] == L'S') + { + name.Delete(0); + if (name.IsEmpty()) + return SetSolidSettings(value); + if (value.vt != VT_EMPTY) + return E_INVALIDARG; + return SetSolidSettings(name); + } + + if (name == L"CRC") + { + _crcSize = 4; + name.Delete(0, 3); + return ParsePropValue(name, value, _crcSize); + } + + UInt32 number; + int index = ParseStringToUInt32(name, number); + UString realName = name.Mid(index); + if (index == 0) + { + if(name.Left(2).CompareNoCase(L"MT") == 0) + { + #ifdef COMPRESS_MT + RINOK(ParseMtProp(name.Mid(2), value, numProcessors, _numThreads)); + #endif + return S_OK; + } + if (name.CompareNoCase(L"RSFX") == 0) + return SetBoolProperty(_removeSfxBlock, value); + if (name.CompareNoCase(L"F") == 0) + return SetBoolProperty(_autoFilter, value); + if (name.CompareNoCase(L"HC") == 0) + return SetBoolProperty(_compressHeaders, value); + if (name.CompareNoCase(L"HCF") == 0) + { + bool compressHeadersFull = true; + RINOK(SetBoolProperty(compressHeadersFull, value)); + if (!compressHeadersFull) + return E_INVALIDARG; + return S_OK; + } + if (name.CompareNoCase(L"HE") == 0) + return SetBoolProperty(_encryptHeaders, value); + if (name.CompareNoCase(L"TM") == 0) + return SetBoolProperty(WriteModified, value); + if (name.CompareNoCase(L"TC") == 0) + return SetBoolProperty(WriteCreated, value); + if (name.CompareNoCase(L"TA") == 0) + return SetBoolProperty(WriteAccessed, value); + if (name.CompareNoCase(L"V") == 0) + return SetBoolProperty(_volumeMode, value); + number = 0; + } + if (number > 10000) + return E_FAIL; + if (number < minNumber) + return E_INVALIDARG; + number -= minNumber; + for(int j = _methods.Size(); j <= (int)number; j++) + { + COneMethodInfo oneMethodInfo; + _methods.Add(oneMethodInfo); + } + + COneMethodInfo &oneMethodInfo = _methods[number]; + + if (realName.Length() == 0) + { + if (value.vt != VT_BSTR) + return E_INVALIDARG; + + RINOK(SetParams(oneMethodInfo, value.bstrVal)); + } + else + { + CProp property; + if (realName.Left(1).CompareNoCase(L"D") == 0) + { + UInt32 dicSize; + RINOK(ParsePropDictionaryValue(realName.Mid(1), value, dicSize)); + property.Id = NCoderPropID::kDictionarySize; + property.Value = dicSize; + oneMethodInfo.Properties.Add(property); + if (number <= mainDicMethodIndex) + mainDicSize = dicSize; + } + else if (realName.Left(3).CompareNoCase(L"MEM") == 0) + { + UInt32 dicSize; + RINOK(ParsePropDictionaryValue(realName.Mid(3), value, dicSize)); + property.Id = NCoderPropID::kUsedMemorySize; + property.Value = dicSize; + oneMethodInfo.Properties.Add(property); + if (number <= mainDicMethodIndex) + mainDicSize = dicSize; + } + else + { + int index = FindPropIdFromStringName(realName); + if (index < 0) + return E_INVALIDARG; + + const CNameToPropID &nameToPropID = g_NameToPropID[index]; + property.Id = nameToPropID.PropID; + + if (!ConvertProperty(value, nameToPropID.VarType, property.Value)) + return E_INVALIDARG; + + oneMethodInfo.Properties.Add(property); + } + } + return S_OK; +} + +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/HandlerOut.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/HandlerOut.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,86 @@ +// HandlerOut.h + +#ifndef __HANDLER_OUT_H +#define __HANDLER_OUT_H + +#include "../../Common/MethodProps.h" +#include "../../Common/CreateCoder.h" + +namespace NArchive { + +struct COneMethodInfo +{ + CObjectVector Properties; + UString MethodName; +}; + +class COutHandler +{ +public: + HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value); + + HRESULT SetSolidSettings(const UString &s); + HRESULT SetSolidSettings(const PROPVARIANT &value); + + #ifdef COMPRESS_MT + UInt32 _numThreads; + #endif + + UInt32 _crcSize; + + CObjectVector _methods; + bool _removeSfxBlock; + + UInt64 _numSolidFiles; + UInt64 _numSolidBytes; + bool _numSolidBytesDefined; + bool _solidExtension; + + bool _compressHeaders; + bool _encryptHeaders; + + bool WriteModified; + bool WriteCreated; + bool WriteAccessed; + + bool _autoFilter; + UInt32 _level; + + bool _volumeMode; + + HRESULT SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value); + HRESULT SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString); + + void SetCompressionMethod2(COneMethodInfo &oneMethodInfo + #ifdef COMPRESS_MT + , UInt32 numThreads + #endif + ); + + void InitSolidFiles() { _numSolidFiles = (UInt64)(Int64)(-1); } + void InitSolidSize() { _numSolidBytes = (UInt64)(Int64)(-1); } + void InitSolid() + { + InitSolidFiles(); + InitSolidSize(); + _solidExtension = false; + _numSolidBytesDefined = false; + } + + void Init(); + + COutHandler() { Init(); } + + void BeforeSetProperty(); + + UInt32 minNumber; + UInt32 numProcessors; + UInt32 mainDicSize; + UInt32 mainDicMethodIndex; + + DECL_EXTERNAL_CODECS_VARS +}; + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,40 @@ +// InStreamWithCRC.cpp + +#include "StdAfx.h" + +#include "InStreamWithCRC.h" + +STDMETHODIMP CSequentialInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result = _stream->Read(data, size, &realProcessedSize); + _size += realProcessedSize; + if (size > 0 && realProcessedSize == 0) + _wasFinished = true; + _crc = CrcUpdate(_crc, data, realProcessedSize); + if(processedSize != NULL) + *processedSize = realProcessedSize; + return result; +} + +STDMETHODIMP CInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result = _stream->Read(data, size, &realProcessedSize); + if (size > 0 && realProcessedSize == 0) + _wasFinished = true; + _size += realProcessedSize; + _crc = CrcUpdate(_crc, data, realProcessedSize); + if(processedSize != NULL) + *processedSize = realProcessedSize; + return result; +} + +STDMETHODIMP CInStreamWithCRC::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + if (seekOrigin != STREAM_SEEK_SET || offset != 0) + return E_FAIL; + _size = 0; + _crc = CRC_INIT_VAL; + return _stream->Seek(offset, seekOrigin, newPosition); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,69 @@ +// InStreamWithCRC.h + +#ifndef __INSTREAMWITHCRC_H +#define __INSTREAMWITHCRC_H + +#include "../../../Common/MyCom.h" +#include "../../IStream.h" + +extern "C" +{ +#include "../../../../C/7zCrc.h" +} + +class CSequentialInStreamWithCRC: + public ISequentialInStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +private: + CMyComPtr _stream; + UInt64 _size; + UInt32 _crc; + bool _wasFinished; +public: + void SetStream(ISequentialInStream *stream) { _stream = stream; } + void Init() + { + _size = 0; + _wasFinished = false; + _crc = CRC_INIT_VAL; + } + void ReleaseStream() { _stream.Release(); } + UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } + UInt64 GetSize() const { return _size; } + bool WasFinished() const { return _wasFinished; } +}; + +class CInStreamWithCRC: + public IInStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP1(IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +private: + CMyComPtr _stream; + UInt64 _size; + UInt32 _crc; + bool _wasFinished; +public: + void SetStream(IInStream *stream) { _stream = stream; } + void Init() + { + _size = 0; + _wasFinished = false; + _crc = CRC_INIT_VAL; + } + void ReleaseStream() { _stream.Release(); } + UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } + UInt64 GetSize() const { return _size; } + bool WasFinished() const { return _wasFinished; } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,59 @@ +// Archive/Common/ItemNameUtils.cpp + +#include "StdAfx.h" + +#include "ItemNameUtils.h" + +namespace NArchive { +namespace NItemName { + +static const wchar_t kOSDirDelimiter = WCHAR_PATH_SEPARATOR; +static const wchar_t kDirDelimiter = L'/'; + +UString MakeLegalName(const UString &name) +{ + UString zipName = name; + zipName.Replace(kOSDirDelimiter, kDirDelimiter); + return zipName; +} + +UString GetOSName(const UString &name) +{ + UString newName = name; + newName.Replace(kDirDelimiter, kOSDirDelimiter); + return newName; +} + +UString GetOSName2(const UString &name) +{ + if (name.IsEmpty()) + return UString(); + UString newName = GetOSName(name); + if (newName[newName.Length() - 1] == kOSDirDelimiter) + newName.Delete(newName.Length() - 1); + return newName; +} + +bool HasTailSlash(const AString &name, UINT codePage) +{ + if (name.IsEmpty()) + return false; + LPCSTR prev = + #ifdef _WIN32 + CharPrevExA((WORD)codePage, name, &name[name.Length()], 0); + #else + (LPCSTR)(name) + (name.Length() - 1); + #endif + return (*prev == '/'); +} + +#ifndef _WIN32 +UString WinNameToOSName(const UString &name) +{ + UString newName = name; + newName.Replace(L'\\', kOSDirDelimiter); + return newName; +} +#endif + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/ItemNameUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/ItemNameUtils.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// Archive/Common/ItemNameUtils.h + +#ifndef __ARCHIVE_ITEMNAMEUTILS_H +#define __ARCHIVE_ITEMNAMEUTILS_H + +#include "../../../Common/MyString.h" + +namespace NArchive { +namespace NItemName { + + UString MakeLegalName(const UString &name); + UString GetOSName(const UString &name); + UString GetOSName2(const UString &name); + bool HasTailSlash(const AString &name, UINT codePage); + + #ifdef _WIN32 + inline UString WinNameToOSName(const UString &name) { return name; } + #else + UString WinNameToOSName(const UString &name); + #endif + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/MultiStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/MultiStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,201 @@ +// MultiStream.cpp + +#include "StdAfx.h" + +#include "MultiStream.h" + +STDMETHODIMP CMultiStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if(processedSize != NULL) + *processedSize = 0; + while(_streamIndex < Streams.Size() && size > 0) + { + CSubStreamInfo &s = Streams[_streamIndex]; + if (_pos == s.Size) + { + _streamIndex++; + _pos = 0; + continue; + } + RINOK(s.Stream->Seek(s.Pos + _pos, STREAM_SEEK_SET, 0)); + UInt32 sizeToRead = UInt32(MyMin((UInt64)size, s.Size - _pos)); + UInt32 realProcessed; + HRESULT result = s.Stream->Read(data, sizeToRead, &realProcessed); + data = (void *)((Byte *)data + realProcessed); + size -= realProcessed; + if(processedSize != NULL) + *processedSize += realProcessed; + _pos += realProcessed; + _seekPos += realProcessed; + RINOK(result); + break; + } + return S_OK; +} + +STDMETHODIMP CMultiStream::Seek(Int64 offset, UInt32 seekOrigin, + UInt64 *newPosition) +{ + UInt64 newPos; + switch(seekOrigin) + { + case STREAM_SEEK_SET: + newPos = offset; + break; + case STREAM_SEEK_CUR: + newPos = _seekPos + offset; + break; + case STREAM_SEEK_END: + newPos = _totalLength + offset; + break; + default: + return STG_E_INVALIDFUNCTION; + } + _seekPos = 0; + for (_streamIndex = 0; _streamIndex < Streams.Size(); _streamIndex++) + { + UInt64 size = Streams[_streamIndex].Size; + if (newPos < _seekPos + size) + { + _pos = newPos - _seekPos; + _seekPos += _pos; + if (newPosition != 0) + *newPosition = newPos; + return S_OK; + } + _seekPos += size; + } + if (newPos == _seekPos) + { + if (newPosition != 0) + *newPosition = newPos; + return S_OK; + } + return E_FAIL; +} + + +/* +class COutVolumeStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + int _volIndex; + UInt64 _volSize; + UInt64 _curPos; + CMyComPtr _volumeStream; + COutArchive _archive; + CCRC _crc; + +public: + MY_UNKNOWN_IMP + + CFileItem _file; + CUpdateOptions _options; + CMyComPtr VolumeCallback; + void Init(IArchiveUpdateCallback2 *volumeCallback, + const UString &name) + { + _file.Name = name; + _file.IsStartPosDefined = true; + _file.StartPos = 0; + + VolumeCallback = volumeCallback; + _volIndex = 0; + _volSize = 0; + } + + HRESULT Flush(); + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +HRESULT COutVolumeStream::Flush() +{ + if (_volumeStream) + { + _file.UnPackSize = _curPos; + _file.FileCRC = _crc.GetDigest(); + RINOK(WriteVolumeHeader(_archive, _file, _options)); + _archive.Close(); + _volumeStream.Release(); + _file.StartPos += _file.UnPackSize; + } + return S_OK; +} +*/ + +/* +STDMETHODIMP COutMultiStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if(processedSize != NULL) + *processedSize = 0; + while(size > 0) + { + if (_streamIndex >= Streams.Size()) + { + CSubStreamInfo subStream; + RINOK(VolumeCallback->GetVolumeSize(Streams.Size(), &subStream.Size)); + RINOK(VolumeCallback->GetVolumeStream(Streams.Size(), &subStream.Stream)); + subStream.Pos = 0; + Streams.Add(subStream); + continue; + } + CSubStreamInfo &subStream = Streams[_streamIndex]; + if (_offsetPos >= subStream.Size) + { + _offsetPos -= subStream.Size; + _streamIndex++; + continue; + } + if (_offsetPos != subStream.Pos) + { + CMyComPtr outStream; + RINOK(subStream.Stream.QueryInterface(IID_IOutStream, &outStream)); + RINOK(outStream->Seek(_offsetPos, STREAM_SEEK_SET, NULL)); + subStream.Pos = _offsetPos; + } + + UInt32 curSize = (UInt32)MyMin((UInt64)size, subStream.Size - subStream.Pos); + UInt32 realProcessed; + RINOK(subStream.Stream->Write(data, curSize, &realProcessed)); + data = (void *)((Byte *)data + realProcessed); + size -= realProcessed; + subStream.Pos += realProcessed; + _offsetPos += realProcessed; + _absPos += realProcessed; + if (_absPos > _length) + _length = _absPos; + if(processedSize != NULL) + *processedSize += realProcessed; + if (subStream.Pos == subStream.Size) + { + _streamIndex++; + _offsetPos = 0; + } + if (realProcessed != curSize && realProcessed == 0) + return E_FAIL; + } + return S_OK; +} + +STDMETHODIMP COutMultiStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + if(seekOrigin >= 3) + return STG_E_INVALIDFUNCTION; + switch(seekOrigin) + { + case STREAM_SEEK_SET: + _absPos = offset; + break; + case STREAM_SEEK_CUR: + _absPos += offset; + break; + case STREAM_SEEK_END: + _absPos = _length + offset; + break; + } + _offsetPos = _absPos; + _streamIndex = 0; + return S_OK; +} +*/ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/MultiStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/MultiStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,76 @@ +// MultiStream.h + +#ifndef __MULTISTREAM_H +#define __MULTISTREAM_H + +#include "../../../Common/MyCom.h" +#include "../../../Common/MyVector.h" +#include "../../Archive/IArchive.h" + +class CMultiStream: + public IInStream, + public CMyUnknownImp +{ + int _streamIndex; + UInt64 _pos; + UInt64 _seekPos; + UInt64 _totalLength; +public: + struct CSubStreamInfo + { + CMyComPtr Stream; + UInt64 Pos; + UInt64 Size; + }; + CObjectVector Streams; + void Init() + { + _streamIndex = 0; + _pos = 0; + _seekPos = 0; + _totalLength = 0; + for (int i = 0; i < Streams.Size(); i++) + _totalLength += Streams[i].Size; + } + + MY_UNKNOWN_IMP1(IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +}; + +/* +class COutMultiStream: + public IOutStream, + public CMyUnknownImp +{ + int _streamIndex; // required stream + UInt64 _offsetPos; // offset from start of _streamIndex index + UInt64 _absPos; + UInt64 _length; + + struct CSubStreamInfo + { + CMyComPtr Stream; + UInt64 Size; + UInt64 Pos; + }; + CObjectVector Streams; +public: + CMyComPtr VolumeCallback; + void Init() + { + _streamIndex = 0; + _offsetPos = 0; + _absPos = 0; + _length = 0; + } + + MY_UNKNOWN_IMP1(IOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +}; +*/ + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// OutStreamWithCRC.cpp + +#include "StdAfx.h" + +#include "OutStreamWithCRC.h" + +STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result; + if(!_stream) + { + realProcessedSize = size; + result = S_OK; + } + else + result = _stream->Write(data, size, &realProcessedSize); + if (_calculate) + _crc = CrcUpdate(_crc, data, realProcessedSize); + _size += realProcessedSize; + if(processedSize != NULL) + *processedSize = realProcessedSize; + return result; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,38 @@ +// OutStreamWithCRC.h + +#ifndef __OUTSTREAMWITHCRC_H +#define __OUTSTREAMWITHCRC_H + +#include "../../../Common/MyCom.h" +#include "../../IStream.h" + +extern "C" +{ +#include "../../../../C/7zCrc.h" +} + +class COutStreamWithCRC: + public ISequentialOutStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; + UInt32 _crc; + bool _calculate; +public: + MY_UNKNOWN_IMP + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + void SetStream(ISequentialOutStream *stream) { _stream = stream; } + void ReleaseStream() { _stream.Release(); } + void Init(bool calculate = true) + { + _size = 0; + _calculate = calculate; + _crc = CRC_INIT_VAL; + } + void InitCRC() { _crc = CRC_INIT_VAL; } + UInt64 GetSize() const { return _size; } + UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/ParseProperties.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/ParseProperties.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,174 @@ +// ParseProperties.cpp + +#include "StdAfx.h" + +#include "ParseProperties.h" + +#include "Common/StringToInt.h" +#include "Common/MyCom.h" + +HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue) +{ + if (prop.vt == VT_UI4) + { + if (!name.IsEmpty()) + return E_INVALIDARG; + resValue = prop.ulVal; + } + else if (prop.vt == VT_EMPTY) + { + if(!name.IsEmpty()) + { + const wchar_t *start = name; + const wchar_t *end; + UInt64 v = ConvertStringToUInt64(start, &end); + if (end - start != name.Length()) + return E_INVALIDARG; + resValue = (UInt32)v; + } + } + else + return E_INVALIDARG; + return S_OK; +} + +static const int kLogarithmicSizeLimit = 32; +static const wchar_t kByteSymbol = L'B'; +static const wchar_t kKiloByteSymbol = L'K'; +static const wchar_t kMegaByteSymbol = L'M'; + +HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize) +{ + UString srcString = srcStringSpec; + srcString.MakeUpper(); + + const wchar_t *start = srcString; + const wchar_t *end; + UInt64 number = ConvertStringToUInt64(start, &end); + int numDigits = (int)(end - start); + if (numDigits == 0 || srcString.Length() > numDigits + 1) + return E_INVALIDARG; + if (srcString.Length() == numDigits) + { + if (number >= kLogarithmicSizeLimit) + return E_INVALIDARG; + dicSize = (UInt32)1 << (int)number; + return S_OK; + } + switch (srcString[numDigits]) + { + case kByteSymbol: + if (number >= ((UInt64)1 << kLogarithmicSizeLimit)) + return E_INVALIDARG; + dicSize = (UInt32)number; + break; + case kKiloByteSymbol: + if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 10))) + return E_INVALIDARG; + dicSize = (UInt32)(number << 10); + break; + case kMegaByteSymbol: + if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 20))) + return E_INVALIDARG; + dicSize = (UInt32)(number << 20); + break; + default: + return E_INVALIDARG; + } + return S_OK; +} + +HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue) +{ + if (name.IsEmpty()) + { + if (prop.vt == VT_UI4) + { + UInt32 logDicSize = prop.ulVal; + if (logDicSize >= 32) + return E_INVALIDARG; + resValue = (UInt32)1 << logDicSize; + return S_OK; + } + if (prop.vt == VT_BSTR) + return ParsePropDictionaryValue(prop.bstrVal, resValue); + return E_INVALIDARG; + } + return ParsePropDictionaryValue(name, resValue); +} + +bool StringToBool(const UString &s, bool &res) +{ + if (s.IsEmpty() || s.CompareNoCase(L"ON") == 0) + { + res = true; + return true; + } + if (s.CompareNoCase(L"OFF") == 0) + { + res = false; + return true; + } + return false; +} + +HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value) +{ + switch(value.vt) + { + case VT_EMPTY: + dest = true; + return S_OK; + /* + case VT_UI4: + dest = (value.ulVal != 0); + break; + */ + case VT_BSTR: + return StringToBool(value.bstrVal, dest) ? S_OK : E_INVALIDARG; + } + return E_INVALIDARG; +} + +int ParseStringToUInt32(const UString &srcString, UInt32 &number) +{ + const wchar_t *start = srcString; + const wchar_t *end; + UInt64 number64 = ConvertStringToUInt64(start, &end); + if (number64 > 0xFFFFFFFF) + { + number = 0; + return 0; + } + number = (UInt32)number64; + return (int)(end - start); +} + +HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads) +{ + if (name.IsEmpty()) + { + switch(prop.vt) + { + case VT_UI4: + numThreads = prop.ulVal; + break; + default: + { + bool val; + RINOK(SetBoolProperty(val, prop)); + numThreads = (val ? defaultNumThreads : 1); + break; + } + } + } + else + { + UInt32 number; + int index = ParseStringToUInt32(name, number); + if (index != name.Length()) + return E_INVALIDARG; + numThreads = number; + } + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/Common/ParseProperties.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/Common/ParseProperties.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,18 @@ +// ParseProperties.h + +#ifndef __PARSEPROPERTIES_H +#define __PARSEPROPERTIES_H + +#include "Common/MyString.h" +#include "Common/Types.h" + +HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue); +HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize); +HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue); + +bool StringToBool(const UString &s, bool &res); +HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value); +int ParseStringToUInt32(const UString &srcString, UInt32 &number); +HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/DllExports2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/DllExports2.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,82 @@ +// DLLExports.cpp + +#include "StdAfx.h" + +#include "../../Common/MyInitGuid.h" +#include "../../Common/ComTry.h" +#include "../../Common/Types.h" +#include "../../Windows/PropVariant.h" +#if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) +extern "C" +{ +#include "../../../C/Alloc.h" +} +#endif + +#include "IArchive.h" +#include "../ICoder.h" +#include "../IPassword.h" + +HINSTANCE g_hInstance; +#ifndef _UNICODE +#ifdef _WIN32 +bool g_IsNT = false; +static bool IsItWindowsNT() +{ + OSVERSIONINFO versionInfo; + versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); + if (!::GetVersionEx(&versionInfo)) + return false; + return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); +} +#endif +#endif + +extern "C" +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + g_hInstance = hInstance; + #ifndef _UNICODE + #ifdef _WIN32 + g_IsNT = IsItWindowsNT(); + #endif + #endif + } + return TRUE; +} + +DEFINE_GUID(CLSID_CArchiveHandler, +0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00); + +static const UInt16 kDecodeId = 0x2790; + +DEFINE_GUID(CLSID_CCodec, +0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + +STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject); +STDAPI CreateArchiver(const GUID *classID, const GUID *iid, void **outObject); + +STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject) +{ + // COM_TRY_BEGIN + *outObject = 0; + if (*iid == IID_ICompressCoder || *iid == IID_ICompressCoder2 || *iid == IID_ICompressFilter) + { + return CreateCoder(clsid, iid, outObject); + } + else + { + return CreateArchiver(clsid, iid, outObject); + } + // COM_TRY_END +} + +STDAPI SetLargePageMode() +{ + #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) + SetLargePageSize(); + #endif + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Archive/IArchive.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Archive/IArchive.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,207 @@ +// IArchive.h + +#ifndef __IARCHIVE_H +#define __IARCHIVE_H + +#include "../IStream.h" +#include "../IProgress.h" +#include "../PropID.h" + +#define ARCHIVE_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 6, x) +#define ARCHIVE_INTERFACE(i, x) ARCHIVE_INTERFACE_SUB(i, IUnknown, x) + +namespace NFileTimeType +{ + enum EEnum + { + kWindows, + kUnix, + kDOS + }; +} + +namespace NArchive +{ + enum + { + kName = 0, + kClassID, + kExtension, + kAddExtension, + kUpdate, + kKeepName, + kStartSignature, + kFinishSignature, + kAssociate + }; + + namespace NExtract + { + namespace NAskMode + { + enum + { + kExtract = 0, + kTest, + kSkip + }; + } + namespace NOperationResult + { + enum + { + kOK = 0, + kUnSupportedMethod, + kDataError, + kCRCError + }; + } + } + namespace NUpdate + { + namespace NOperationResult + { + enum + { + kOK = 0, + kError + }; + } + } +} + +ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10) +{ + STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes) PURE; + STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes) PURE; +}; + + +ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20) +{ + STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, + Int32 askExtractMode) PURE; + // GetStream OUT: S_OK - OK, S_FALSE - skeep this file + STDMETHOD(PrepareOperation)(Int32 askExtractMode) PURE; + STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) PURE; +}; + + +ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30) +{ + STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) PURE; +}; + + +ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40) +{ + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE; +}; + + +ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50) +{ + STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE; +}; + + +/* +IInArchive::Extract: + indices must be sorted + numItems = 0xFFFFFFFF means "all files" + testMode != 0 means "test files without writing to outStream" +*/ + +#define INTERFACE_IInArchive(x) \ + STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openArchiveCallback) x; \ + STDMETHOD(Close)() x; \ + STDMETHOD(GetNumberOfItems)(UInt32 *numItems) x; \ + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \ + STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback) x; \ + STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) x; \ + STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) x; \ + STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \ + STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties) x; \ + STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; + +ARCHIVE_INTERFACE(IInArchive, 0x60) +{ + INTERFACE_IInArchive(PURE) +}; + + +ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80) +{ + STDMETHOD(GetUpdateItemInfo)(UInt32 index, + Int32 *newData, // 1 - new data, 0 - old data + Int32 *newProperties, // 1 - new properties, 0 - old properties + UInt32 *indexInArchive // -1 if there is no in archive, or if doesn't matter + ) PURE; + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) PURE; + STDMETHOD(SetOperationResult)(Int32 operationResult) PURE; +}; + + +ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82) +{ + STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) PURE; + STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) PURE; +}; + + +#define INTERFACE_IOutArchive(x) \ + STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \ + STDMETHOD(GetFileTimeType)(UInt32 *type) x; + +ARCHIVE_INTERFACE(IOutArchive, 0xA0) +{ + INTERFACE_IOutArchive(PURE) +}; + + +ARCHIVE_INTERFACE(ISetProperties, 0x03) +{ + STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) PURE; +}; + + +#define IMP_IInArchive_GetProp(k) \ + (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \ + { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \ + const STATPROPSTG &srcItem = k[index]; \ + *propID = srcItem.propid; *varType = srcItem.vt; *name = 0; return S_OK; } \ + +#define IMP_IInArchive_GetProp_WITH_NAME(k) \ + (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \ + { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \ + const STATPROPSTG &srcItem = k[index]; \ + *propID = srcItem.propid; *varType = srcItem.vt; \ + if (srcItem.lpwstrName == 0) *name = 0; else *name = ::SysAllocString(srcItem.lpwstrName); return S_OK; } \ + +#define IMP_IInArchive_Props \ + STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \ + { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \ + STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps) + +#define IMP_IInArchive_Props_WITH_NAME \ + STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \ + { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \ + STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps) + + +#define IMP_IInArchive_ArcProps \ + STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \ + { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \ + STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps) + +#define IMP_IInArchive_ArcProps_NO \ + STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \ + { *numProperties = 0; return S_OK; } \ + STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \ + { return E_NOTIMPL; } \ + STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \ + { value->vt = VT_EMPTY; return S_OK; } + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/Alone.dsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/Alone.dsp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1453 @@ +# Microsoft Developer Studio Project File - Name="Alone" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Alone - Win32 DebugU +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Alone.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Alone.mak" CFG="Alone - Win32 DebugU" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Alone - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Alone - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "Alone - Win32 ReleaseU" (based on "Win32 (x86) Console Application") +!MESSAGE "Alone - Win32 DebugU" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Alone - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /Gz /MT /W3 /GX /O1 /I "..\..\..\\" /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "COMPRESS_MT" /D "_NO_CRYPTO" /D "BREAK_HANDLER" /D "BENCH_MT" /Yu"StdAfx.h" /FD /c +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\UTIL\7zr.exe" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "Alone - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /Gz /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\\" /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "COMPRESS_MT" /D "_NO_CRYPTO" /D "BREAK_HANDLER" /D "BENCH_MT" /Yu"StdAfx.h" /FD /GZ /c +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\UTIL\7zr.exe" /pdbtype:sept + +!ELSEIF "$(CFG)" == "Alone - Win32 ReleaseU" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseU" +# PROP BASE Intermediate_Dir "ReleaseU" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "ReleaseU" +# PROP Intermediate_Dir "ReleaseU" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "EXCLUDE_COM" /D "NO_REGISTRY" /D "FORMAT_7Z" /D "FORMAT_BZIP2" /D "FORMAT_ZIP" /D "FORMAT_TAR" /D "FORMAT_GZIP" /D "COMPRESS_LZMA" /D "COMPRESS_BCJ_X86" /D "COMPRESS_BCJ2" /D "COMPRESS_COPY" /D "COMPRESS_MF_PAT" /D "COMPRESS_MF_BT" /D "COMPRESS_PPMD" /D "COMPRESS_DEFLATE" /D "COMPRESS_IMPLODE" /D "COMPRESS_BZIP2" /D "CRYPTO_ZIP" /Yu"StdAfx.h" /FD /c +# ADD CPP /nologo /Gz /MD /W3 /GX /O1 /I "..\..\..\\" /D "NDEBUG" /D "UNICODE" /D "_UNICODE" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "COMPRESS_MT" /D "_NO_CRYPTO" /D "BREAK_HANDLER" /D "BENCH_MT" /Yu"StdAfx.h" /FD /c +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\UTIL\7za.exe" /opt:NOWIN98 +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\UTIL\7zr.exe" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "Alone - Win32 DebugU" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "DebugU" +# PROP BASE Intermediate_Dir "DebugU" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "DebugU" +# PROP Intermediate_Dir "DebugU" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "EXCLUDE_COM" /D "NO_REGISTRY" /D "FORMAT_7Z" /D "FORMAT_BZIP2" /D "FORMAT_ZIP" /D "FORMAT_TAR" /D "FORMAT_GZIP" /D "COMPRESS_LZMA" /D "COMPRESS_BCJ_X86" /D "COMPRESS_BCJ2" /D "COMPRESS_COPY" /D "COMPRESS_MF_PAT" /D "COMPRESS_MF_BT" /D "COMPRESS_PPMD" /D "COMPRESS_DEFLATE" /D "COMPRESS_IMPLODE" /D "COMPRESS_BZIP2" /D "CRYPTO_ZIP" /D "_MBCS" /Yu"StdAfx.h" /FD /GZ /c +# ADD CPP /nologo /Gz /W4 /Gm /GX /ZI /Od /I "..\..\..\\" /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "COMPRESS_MT" /D "_NO_CRYPTO" /D "BREAK_HANDLER" /D "BENCH_MT" /Yu"StdAfx.h" /FD /GZ /c +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\UTIL\7za.exe" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\UTIL\7zr.exe" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "Alone - Win32 Release" +# Name "Alone - Win32 Debug" +# Name "Alone - Win32 ReleaseU" +# Name "Alone - Win32 DebugU" +# Begin Group "Console" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\Console\ArError.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\CompressionMode.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\ConsoleClose.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\ConsoleClose.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\ExtractCallbackConsole.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\ExtractCallbackConsole.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\List.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\List.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\Main.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\MainAr.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\OpenCallbackConsole.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\OpenCallbackConsole.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\PercentPrinter.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\PercentPrinter.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\UpdateCallbackConsole.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\UpdateCallbackConsole.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\UserInputUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Console\UserInputUtils.h +# End Source File +# End Group +# Begin Group "Spec" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\resource.rc +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"StdAfx.h" +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\Common\AutoPtr.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Buffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\CommandLineParser.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\CommandLineParser.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\ComTry.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\CRC.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Defs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\DynamicBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\IntToString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\IntToString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\ListFileUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\ListFileUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyCom.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyException.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyGuidDef.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyInitGuid.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyUnknown.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyWindows.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyWindows.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Random.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Random.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StdInStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StdInStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StdOutStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StdOutStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringConvert.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringConvert.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringToInt.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringToInt.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Types.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\UTFConvert.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\UTFConvert.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Wildcard.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Wildcard.h +# End Source File +# End Group +# Begin Group "Windows" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\Windows\Defs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Device.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\DLL.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\DLL.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Error.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Error.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileDir.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileDir.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileFind.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileFind.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileIO.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileIO.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileName.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileName.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Handle.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\MemoryLock.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\MemoryLock.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariant.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariant.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariantConversions.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariantConversions.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Synchronization.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Synchronization.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Thread.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Time.h +# End Source File +# End Group +# Begin Group "7zip Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Common\CreateCoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\CreateCoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\CrossThreadProgress.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\CrossThreadProgress.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FilePathAutoRename.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FilePathAutoRename.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FileStreams.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FileStreams.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FilterCoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FilterCoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\InBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\InBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\InOutTempBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\InOutTempBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\LimitedStreams.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\LimitedStreams.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\LockedStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\LockedStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\LSBFDecoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\LSBFDecoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\LSBFEncoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\LSBFEncoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MethodId.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MethodId.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MethodProps.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MethodProps.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MSBFDecoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MSBFEncoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\OffsetStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\OffsetStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\OutBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\OutBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\ProgressMt.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\ProgressMt.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\ProgressUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\ProgressUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\RegisterArc.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\RegisterCodec.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamBinder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamBinder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamObjects.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamObjects.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.h +# End Source File +# End Group +# Begin Group "Compress" + +# PROP Default_Filter "" +# Begin Group "Branch" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\Branch\BranchCoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\BranchCoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\Coder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\x86.cpp + +!IF "$(CFG)" == "Alone - Win32 Release" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "Alone - Win32 Debug" + +!ELSEIF "$(CFG)" == "Alone - Win32 ReleaseU" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "Alone - Win32 DebugU" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\x86.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\x86_2.cpp + +!IF "$(CFG)" == "Alone - Win32 Release" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "Alone - Win32 Debug" + +!ELSEIF "$(CFG)" == "Alone - Win32 ReleaseU" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "Alone - Win32 DebugU" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Branch\x86_2.h +# End Source File +# End Group +# Begin Group "Copy" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\Copy\CopyCoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Copy\CopyCoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\Copy\CopyRegister.cpp +# End Source File +# End Group +# Begin Group "LZ" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\LZ\LZOutWindow.cpp + +!IF "$(CFG)" == "Alone - Win32 Release" + +# ADD CPP /O1 + +!ELSEIF "$(CFG)" == "Alone - Win32 Debug" + +!ELSEIF "$(CFG)" == "Alone - Win32 ReleaseU" + +# ADD CPP /O1 + +!ELSEIF "$(CFG)" == "Alone - Win32 DebugU" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZ\LZOutWindow.h +# End Source File +# End Group +# Begin Group "LZMA" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\LZMA\LZMA.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA\LZMADecoder.cpp + +!IF "$(CFG)" == "Alone - Win32 Release" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "Alone - Win32 Debug" + +!ELSEIF "$(CFG)" == "Alone - Win32 ReleaseU" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "Alone - Win32 DebugU" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA\LZMADecoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA\LZMAEncoder.cpp + +!IF "$(CFG)" == "Alone - Win32 Release" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "Alone - Win32 Debug" + +!ELSEIF "$(CFG)" == "Alone - Win32 ReleaseU" + +# ADD CPP /O2 +# SUBTRACT CPP /YX /Yc /Yu + +!ELSEIF "$(CFG)" == "Alone - Win32 DebugU" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA\LZMAEncoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA\LZMARegister.cpp +# End Source File +# End Group +# Begin Group "RangeCoder" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\RangeCoder\RangeCoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\RangeCoder\RangeCoderBit.cpp + +!IF "$(CFG)" == "Alone - Win32 Release" + +# ADD CPP /O1 + +!ELSEIF "$(CFG)" == "Alone - Win32 Debug" + +!ELSEIF "$(CFG)" == "Alone - Win32 ReleaseU" + +# ADD CPP /O1 + +!ELSEIF "$(CFG)" == "Alone - Win32 DebugU" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\RangeCoder\RangeCoderBit.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\RangeCoder\RangeCoderBitTree.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\RangeCoder\RangeCoderOpt.h +# End Source File +# End Group +# Begin Group "LZMA_Alone" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compress\LZMA_Alone\LzmaBench.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA_Alone\LzmaBench.h +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA_Alone\LzmaBenchCon.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Compress\LZMA_Alone\LzmaBenchCon.h +# End Source File +# End Group +# End Group +# Begin Group "Archive" + +# PROP Default_Filter "" +# Begin Group "7z" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Archive\7z\7zCompressionMode.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zCompressionMode.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zDecode.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zDecode.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zEncode.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zEncode.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zExtract.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zFolderInStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zFolderInStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zFolderOutStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zFolderOutStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zHandler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zHandlerOut.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zHeader.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zHeader.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zIn.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zIn.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zItem.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zOut.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zOut.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zProperties.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zProperties.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zRegister.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zSpecStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zSpecStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zUpdate.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\7z\7zUpdate.h +# End Source File +# End Group +# Begin Group "Archive Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Archive\Common\CoderMixer2.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\CoderMixer2.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\CoderMixer2MT.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\CoderMixer2MT.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\DummyOutStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\DummyOutStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\HandlerOut.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\HandlerOut.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\InStreamWithCRC.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\InStreamWithCRC.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\ItemNameUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\ItemNameUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\MultiStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\MultiStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\OutStreamWithCRC.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\OutStreamWithCRC.h +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\ParseProperties.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Common\ParseProperties.h +# End Source File +# End Group +# Begin Group "split" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Archive\Split\SplitHandler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Archive\Split\SplitHandler.h +# End Source File +# End Group +# End Group +# Begin Group "UI Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveCommandLine.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveCommandLine.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveExtractCallback.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveExtractCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveOpenCallback.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ArchiveOpenCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\DefaultName.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\DefaultName.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\EnumDirItems.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\EnumDirItems.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Extract.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Extract.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ExtractingFilePath.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\ExtractingFilePath.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\LoadCodecs.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\LoadCodecs.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\OpenArchive.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\OpenArchive.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Property.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\PropIDUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\PropIDUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\SetProperties.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\SetProperties.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\SortUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\SortUtils.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\TempFiles.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\TempFiles.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Update.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\Update.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateAction.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateAction.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateCallback.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateCallback.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdatePair.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdatePair.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateProduce.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\UpdateProduce.h +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\WorkDir.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\UI\Common\WorkDir.h +# End Source File +# End Group +# Begin Group "7-zip" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\ICoder.h +# End Source File +# Begin Source File + +SOURCE=..\..\IMyUnknown.h +# End Source File +# Begin Source File + +SOURCE=..\..\IPassword.h +# End Source File +# Begin Source File + +SOURCE=..\..\IProgress.h +# End Source File +# Begin Source File + +SOURCE=..\..\IStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\PropID.h +# End Source File +# End Group +# Begin Group "C" + +# PROP Default_Filter "" +# Begin Group "C Branch" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchARM.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchARM.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchARMThumb.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchARMThumb.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchIA64.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchIA64.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchPPC.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchPPC.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchSPARC.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchSPARC.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchTypes.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchX86.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchX86.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\..\C\7zCrc.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\7zCrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Alloc.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Alloc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\IStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\LzHash.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\MatchFinder.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\MatchFinder.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\MatchFinderMt.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\MatchFinderMt.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Threads.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Threads.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Types.h +# End Source File +# End Group +# End Target +# End Project diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/Alone.dsw --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/Alone.dsw Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Alone"=.\Alone.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" +#include "../../../Common/NewHandler.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/makefile Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,236 @@ +PROG = 7za.exe +LIBS = $(LIBS) user32.lib oleaut32.lib Advapi32.lib + +CFLAGS = $(CFLAGS) -I ../../../ \ + -D_NO_CRYPTO \ + -DWIN_LONG_PATH \ + -DCOMPRESS_MT \ + -DCOMPRESS_MF_MT \ + -D_NO_CRYPTO \ + -DBREAK_HANDLER \ + -DBENCH_MT \ + + +CONSOLE_OBJS = \ + $O\ConsoleClose.obj \ + $O\ExtractCallbackConsole.obj \ + $O\List.obj \ + $O\Main.obj \ + $O\MainAr.obj \ + $O\OpenCallbackConsole.obj \ + $O\PercentPrinter.obj \ + $O\UpdateCallbackConsole.obj \ + $O\UserInputUtils.obj \ + +COMMON_OBJS = \ + $O\CommandLineParser.obj \ + $O\CRC.obj \ + $O\IntToString.obj \ + $O\ListFileUtils.obj \ + $O\NewHandler.obj \ + $O\StdInStream.obj \ + $O\StdOutStream.obj \ + $O\MyString.obj \ + $O\StringConvert.obj \ + $O\StringToInt.obj \ + $O\UTFConvert.obj \ + $O\MyVector.obj \ + $O\Wildcard.obj \ + +WIN_OBJS = \ + $O\DLL.obj \ + $O\Error.obj \ + $O\FileDir.obj \ + $O\FileFind.obj \ + $O\FileIO.obj \ + $O\FileName.obj \ + $O\MemoryLock.obj \ + $O\PropVariant.obj \ + $O\PropVariantConversions.obj \ + $O\Synchronization.obj \ + $O\System.obj \ + +7ZIP_COMMON_OBJS = \ + $O\CreateCoder.obj \ + $O\FilePathAutoRename.obj \ + $O\FileStreams.obj \ + $O\InBuffer.obj \ + $O\InOutTempBuffer.obj \ + $O\FilterCoder.obj \ + $O\LimitedStreams.obj \ + $O\LockedStream.obj \ + $O\MethodId.obj \ + $O\MethodProps.obj \ + $O\OffsetStream.obj \ + $O\OutBuffer.obj \ + $O\ProgressUtils.obj \ + $O\StreamBinder.obj \ + $O\StreamObjects.obj \ + $O\StreamUtils.obj \ + $O\VirtThread.obj \ + +UI_COMMON_OBJS = \ + $O\ArchiveCommandLine.obj \ + $O\ArchiveExtractCallback.obj \ + $O\ArchiveOpenCallback.obj \ + $O\DefaultName.obj \ + $O\EnumDirItems.obj \ + $O\Extract.obj \ + $O\ExtractingFilePath.obj \ + $O\LoadCodecs.obj \ + $O\OpenArchive.obj \ + $O\PropIDUtils.obj \ + $O\SetProperties.obj \ + $O\SortUtils.obj \ + $O\TempFiles.obj \ + $O\Update.obj \ + $O\UpdateAction.obj \ + $O\UpdateCallback.obj \ + $O\UpdatePair.obj \ + $O\UpdateProduce.obj \ + $O\WorkDir.obj \ + +AR_COMMON_OBJS = \ + $O\CoderMixer2.obj \ + $O\CoderMixer2MT.obj \ + $O\CrossThreadProgress.obj \ + $O\DummyOutStream.obj \ + $O\HandlerOut.obj \ + $O\InStreamWithCRC.obj \ + $O\ItemNameUtils.obj \ + $O\MultiStream.obj \ + $O\OutStreamWithCRC.obj \ + $O\ParseProperties.obj \ + + +7Z_OBJS = \ + $O\7zCompressionMode.obj \ + $O\7zDecode.obj \ + $O\7zEncode.obj \ + $O\7zExtract.obj \ + $O\7zFolderInStream.obj \ + $O\7zFolderOutStream.obj \ + $O\7zHandler.obj \ + $O\7zHandlerOut.obj \ + $O\7zHeader.obj \ + $O\7zIn.obj \ + $O\7zOut.obj \ + $O\7zProperties.obj \ + $O\7zRegister.obj \ + $O\7zSpecStream.obj \ + $O\7zUpdate.obj \ + + +BRANCH_OPT_OBJS = \ + $O\BranchCoder.obj \ + $O\x86.obj \ + $O\x86_2.obj \ + $O\ARM.obj \ + $O\ARMThumb.obj \ + $O\IA64.obj \ + $O\PPC.obj \ + $O\SPARC.obj \ + $O\BranchRegister.obj \ + $O\BCJRegister.obj \ + $O\BCJ2Register.obj \ + +SWAP_OPT_OBJS = \ + $O\ByteSwap.obj \ + $O\ByteSwapRegister.obj \ + +COPY_OBJS = \ + $O\CopyCoder.obj \ + $O\CopyRegister.obj \ + +LZ_OBJS = \ + $O\LZOutWindow.obj \ + +LZMA_OPT_OBJS = \ + $O\LZMADecoder.obj \ + $O\LZMAEncoder.obj \ + $O\LZMARegister.obj \ + +LZMA_BENCH_OBJS = \ + $O\LzmaBench.obj \ + $O\LzmaBenchCon.obj \ + +C_OBJS = \ + $O\Alloc.obj \ + $O\7zCrc.obj \ + $O\Sort.obj \ + $O\Threads.obj \ + +C_LZ_OBJS = \ + $O\MatchFinder.obj \ + $O\MatchFinderMt.obj \ + +C_BRANCH_OBJS = \ + $O\BranchARM.obj \ + $O\BranchARMThumb.obj \ + $O\BranchIA64.obj \ + $O\BranchPPC.obj \ + $O\BranchSPARC.obj \ + $O\BranchX86.obj \ + +OBJS = \ + $O\StdAfx.obj \ + $(CONSOLE_OBJS) \ + $(COMMON_OBJS) \ + $(WIN_OBJS) \ + $(7ZIP_COMMON_OBJS) \ + $(UI_COMMON_OBJS) \ + $(AR_COMMON_OBJS) \ + $(7Z_OBJS) \ + $(BRANCH_OPT_OBJS) \ + $(SWAP_OPT_OBJS) \ + $(COPY_OBJS) \ + $(LZ_OBJS) \ + $(LZMA_OPT_OBJS) \ + $(LZMA_BENCH_OBJS) \ + $(C_OBJS) \ + $(C_LZ_OBJS) \ + $(C_BRANCH_OBJS) \ + $O\RangeCoderBit.obj \ + $(CRC_OBJS) \ + $O\resource.res + + +!include "../../../Build.mak" + +$(CONSOLE_OBJS): ../../UI/Console/$(*B).cpp + $(COMPL) + +$(COMMON_OBJS): ../../../Common/$(*B).cpp + $(COMPL) +$(WIN_OBJS): ../../../Windows/$(*B).cpp + $(COMPL) +$(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp + $(COMPL) +$(UI_COMMON_OBJS): ../../UI/Common/$(*B).cpp + $(COMPL) +$(AR_COMMON_OBJS): ../../Archive/Common/$(*B).cpp + $(COMPL) + +$(7Z_OBJS): ../../Archive/7z/$(*B).cpp + $(COMPL) +$(BRANCH_OPT_OBJS): ../../Compress/Branch/$(*B).cpp + $(COMPL_O2) +$(SWAP_OPT_OBJS): ../../Compress/ByteSwap/$(*B).cpp + $(COMPL_O2) +$(COPY_OBJS): ../../Compress/Copy/$(*B).cpp + $(COMPL) +$(LZ_OBJS): ../../Compress/LZ/$(*B).cpp + $(COMPL) +$(LZMA_OPT_OBJS): ../../Compress/LZMA/$(*B).cpp + $(COMPL_O2) +$(LZMA_BENCH_OBJS): ../../Compress/LZMA_Alone/$(*B).cpp + $(COMPL) +$O\RangeCoderBit.obj: ../../Compress/RangeCoder/$(*B).cpp + $(COMPL) + +$(C_OBJS): ../../../../C/$(*B).c + $(COMPL_O2) +$(C_LZ_OBJS): ../../../../C/Compress/Lz/$(*B).c + $(COMPL_O2) +$(C_BRANCH_OBJS): ../../../../C/Compress/Branch/$(*B).c + $(COMPL_O2) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/resource.rc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Alone7z/resource.rc Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +#include "../../MyVersionInfo.rc" + +MY_VERSION_INFO_APP("7-Zip Standalone Console", "7za") diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zExtractR/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zExtractR/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zExtractR/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zExtractR/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" +#include "../../../Common/NewHandler.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zExtractR/makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zExtractR/makefile Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,165 @@ +PROG = 7zxr.dll +DEF_FILE = ../../Archive/Archive2.def +LIBS = $(LIBS) user32.lib oleaut32.lib +CFLAGS = $(CFLAGS) -I ../../../ \ + -DEXTRACT_ONLY \ + -DCOMPRESS_MT \ + -D_NO_CRYPTO + +COMMON_OBJS = \ + $O\CRC.obj \ + $O\IntToString.obj \ + $O\NewHandler.obj \ + $O\MyString.obj \ + $O\StringConvert.obj \ + $O\StringToInt.obj \ + $O\MyVector.obj \ + $O\Wildcard.obj \ + +WIN_OBJS = \ + $O\FileDir.obj \ + $O\FileFind.obj \ + $O\FileIO.obj \ + $O\PropVariant.obj \ + $O\Synchronization.obj \ + $O\System.obj \ + +7ZIP_COMMON_OBJS = \ + $O\CreateCoder.obj \ + $O\InBuffer.obj \ + $O\InOutTempBuffer.obj \ + $O\FilterCoder.obj \ + $O\LimitedStreams.obj \ + $O\LockedStream.obj \ + $O\MethodId.obj \ + $O\MethodProps.obj \ + $O\OutBuffer.obj \ + $O\ProgressUtils.obj \ + $O\StreamBinder.obj \ + $O\StreamObjects.obj \ + $O\StreamUtils.obj \ + $O\VirtThread.obj \ + +AR_OBJS = \ + $O\ArchiveExports.obj \ + $O\DllExports2.obj \ + +AR_COMMON_OBJS = \ + $O\CoderMixer2.obj \ + $O\CoderMixer2MT.obj \ + $O\CrossThreadProgress.obj \ + $O\HandlerOut.obj \ + $O\ItemNameUtils.obj \ + $O\OutStreamWithCRC.obj \ + $O\ParseProperties.obj \ + + +7Z_OBJS = \ + $O\7zCompressionMode.obj \ + $O\7zDecode.obj \ + $O\7zExtract.obj \ + $O\7zFolderOutStream.obj \ + $O\7zHandler.obj \ + $O\7zHeader.obj \ + $O\7zIn.obj \ + $O\7zProperties.obj \ + $O\7zRegister.obj \ + + +COMPRESS_OBJS = \ + $O\CodecExports.obj \ + +SWAP_OPT_OBJS = \ + $O\ByteSwap.obj \ + $O\ByteSwapRegister.obj \ + +BRANCH_OPT_OBJS = \ + $O\BranchCoder.obj \ + $O\x86.obj \ + $O\x86_2.obj \ + $O\ARM.obj \ + $O\ARMThumb.obj \ + $O\IA64.obj \ + $O\PPC.obj \ + $O\SPARC.obj \ + $O\BranchRegister.obj \ + $O\BCJRegister.obj \ + $O\BCJ2Register.obj \ + +COPY_OBJS = \ + $O\CopyCoder.obj \ + $O\CopyRegister.obj \ + +LZ_OBJS = \ + $O\LZOutWindow.obj \ + +LZMA_OPT_OBJS = \ + $O\LZMADecoder.obj \ + $O\LZMARegister.obj \ + +C_OBJS = \ + $O\Alloc.obj \ + $O\7zCrc.obj \ + $O\Threads.obj \ + +C_BRANCH_OBJS = \ + $O\BranchARM.obj \ + $O\BranchARMThumb.obj \ + $O\BranchIA64.obj \ + $O\BranchPPC.obj \ + $O\BranchSPARC.obj \ + $O\BranchX86.obj \ + +OBJS = \ + $O\StdAfx.obj \ + $(CONSOLE_OBJS) \ + $(COMMON_OBJS) \ + $(WIN_OBJS) \ + $(7ZIP_COMMON_OBJS) \ + $(AR_OBJS) \ + $(AR_COMMON_OBJS) \ + $(7Z_OBJS) \ + $(COMPRESS_OBJS) \ + $(BRANCH_OPT_OBJS) \ + $(SWAP_OPT_OBJS) \ + $(COPY_OBJS) \ + $(LZ_OBJS) \ + $(LZMA_OPT_OBJS) \ + $(C_OBJS) \ + $(C_BRANCH_OBJS) \ + $O\resource.res + + +!include "../../../Build.mak" + +$(COMMON_OBJS): ../../../Common/$(*B).cpp + $(COMPL) +$(WIN_OBJS): ../../../Windows/$(*B).cpp + $(COMPL) +$(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp + $(COMPL) +$(AR_OBJS): ../../Archive/$(*B).cpp + $(COMPL) +$(AR_COMMON_OBJS): ../../Archive/Common/$(*B).cpp + $(COMPL) + +$(7Z_OBJS): ../../Archive/7z/$(*B).cpp + $(COMPL) + +$(COMPRESS_OBJS): ../../Compress/$(*B).cpp + $(COMPL) +$(BRANCH_OPT_OBJS): ../../Compress/Branch/$(*B).cpp + $(COMPL_O2) +$(SWAP_OPT_OBJS): ../../Compress/ByteSwap/$(*B).cpp + $(COMPL_O2) +$(COPY_OBJS): ../../Compress/Copy/$(*B).cpp + $(COMPL) +$(LZ_OBJS): ../../Compress/LZ/$(*B).cpp + $(COMPL) +$(LZMA_OPT_OBJS): ../../Compress/LZMA/$(*B).cpp + $(COMPL_O2) + +$(C_OBJS): ../../../../C/$(*B).c + $(COMPL_O2) +$(C_BRANCH_OBJS): ../../../../C/Compress/Branch/$(*B).c + $(COMPL_O2) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zExtractR/resource.rc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zExtractR/resource.rc Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,5 @@ +#include "../../MyVersionInfo.rc" + +MY_VERSION_INFO_DLL("7z Standalone Extracting Plugin", "7zxr") + +101 ICON "../../Archive/7z/7z.ico" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zR/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zR/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zR/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zR/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" +#include "../../../Common/NewHandler.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zR/makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zR/makefile Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,188 @@ +PROG = 7zra.dll +DEF_FILE = ../../Archive/Archive2.def +LIBS = $(LIBS) user32.lib oleaut32.lib +CFLAGS = $(CFLAGS) -I ../../../ \ + -DCOMPRESS_MT \ + -DCOMPRESS_MF_MT \ + -D_NO_CRYPTO + +COMMON_OBJS = \ + $O\CRC.obj \ + $O\IntToString.obj \ + $O\NewHandler.obj \ + $O\MyString.obj \ + $O\StringConvert.obj \ + $O\StringToInt.obj \ + $O\MyVector.obj \ + $O\Wildcard.obj \ + +WIN_OBJS = \ + $O\FileDir.obj \ + $O\FileFind.obj \ + $O\FileIO.obj \ + $O\PropVariant.obj \ + $O\Synchronization.obj \ + $O\System.obj \ + +7ZIP_COMMON_OBJS = \ + $O\CreateCoder.obj \ + $O\InBuffer.obj \ + $O\InOutTempBuffer.obj \ + $O\FilterCoder.obj \ + $O\LimitedStreams.obj \ + $O\LockedStream.obj \ + $O\MethodId.obj \ + $O\MethodProps.obj \ + $O\OutBuffer.obj \ + $O\ProgressUtils.obj \ + $O\StreamBinder.obj \ + $O\StreamObjects.obj \ + $O\StreamUtils.obj \ + $O\VirtThread.obj \ + +AR_OBJS = \ + $O\ArchiveExports.obj \ + $O\DllExports2.obj \ + +AR_COMMON_OBJS = \ + $O\CoderMixer2.obj \ + $O\CoderMixer2MT.obj \ + $O\CrossThreadProgress.obj \ + $O\HandlerOut.obj \ + $O\InStreamWithCRC.obj \ + $O\ItemNameUtils.obj \ + $O\OutStreamWithCRC.obj \ + $O\ParseProperties.obj \ + + +7Z_OBJS = \ + $O\7zCompressionMode.obj \ + $O\7zDecode.obj \ + $O\7zEncode.obj \ + $O\7zExtract.obj \ + $O\7zFolderInStream.obj \ + $O\7zFolderOutStream.obj \ + $O\7zHandler.obj \ + $O\7zHandlerOut.obj \ + $O\7zHeader.obj \ + $O\7zIn.obj \ + $O\7zOut.obj \ + $O\7zProperties.obj \ + $O\7zSpecStream.obj \ + $O\7zUpdate.obj \ + $O\7zRegister.obj \ + + +COMPRESS_OBJS = \ + $O\CodecExports.obj \ + +BRANCH_OPT_OBJS = \ + $O\BranchCoder.obj \ + $O\x86.obj \ + $O\x86_2.obj \ + $O\ARM.obj \ + $O\ARMThumb.obj \ + $O\IA64.obj \ + $O\PPC.obj \ + $O\SPARC.obj \ + $O\BranchRegister.obj \ + $O\BCJRegister.obj \ + $O\BCJ2Register.obj \ + +SWAP_OPT_OBJS = \ + $O\ByteSwap.obj \ + $O\ByteSwapRegister.obj \ + +COPY_OBJS = \ + $O\CopyCoder.obj \ + $O\CopyRegister.obj \ + +LZ_OBJS = \ + $O\LZOutWindow.obj \ + +LZMA_OPT_OBJS = \ + $O\LZMADecoder.obj \ + $O\LZMAEncoder.obj \ + $O\LZMARegister.obj \ + +C_OBJS = \ + $O\Alloc.obj \ + $O\7zCrc.obj \ + $O\Sort.obj \ + $O\Threads.obj \ + +C_LZ_OBJS = \ + $O\MatchFinder.obj \ + $O\MatchFinderMt.obj \ + +C_BRANCH_OBJS = \ + $O\BranchARM.obj \ + $O\BranchARMThumb.obj \ + $O\BranchIA64.obj \ + $O\BranchPPC.obj \ + $O\BranchSPARC.obj \ + $O\BranchX86.obj \ + +OBJS = \ + $O\StdAfx.obj \ + $(CONSOLE_OBJS) \ + $(COMMON_OBJS) \ + $(WIN_OBJS) \ + $(7ZIP_COMMON_OBJS) \ + $(AR_OBJS) \ + $(AR_COMMON_OBJS) \ + $(7Z_OBJS) \ + $(BZIP2_OBJS) \ + $(BZIP2_OPT_OBJS) \ + $(COMPRESS_OBJS) \ + $(BRANCH_OPT_OBJS) \ + $(SWAP_OPT_OBJS) \ + $(COPY_OBJS) \ + $(DEFLATE_OPT_OBJS) \ + $(LZ_OBJS) \ + $(LZMA_OPT_OBJS) \ + $(PPMD_OPT_OBJS) \ + $(C_OBJS) \ + $(C_LZ_OBJS) \ + $(C_BRANCH_OBJS) \ + $O\RangeCoderBit.obj \ + $O\resource.res + + +!include "../../../Build.mak" + +$(COMMON_OBJS): ../../../Common/$(*B).cpp + $(COMPL) +$(WIN_OBJS): ../../../Windows/$(*B).cpp + $(COMPL) +$(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp + $(COMPL) +$(AR_OBJS): ../../Archive/$(*B).cpp + $(COMPL) +$(AR_COMMON_OBJS): ../../Archive/Common/$(*B).cpp + $(COMPL) + +$(7Z_OBJS): ../../Archive/7z/$(*B).cpp + $(COMPL) + +$(COMPRESS_OBJS): ../../Compress/$(*B).cpp + $(COMPL) +$(BRANCH_OPT_OBJS): ../../Compress/Branch/$(*B).cpp + $(COMPL_O2) +$(SWAP_OPT_OBJS): ../../Compress/ByteSwap/$(*B).cpp + $(COMPL_O2) +$(COPY_OBJS): ../../Compress/Copy/$(*B).cpp + $(COMPL) +$(LZ_OBJS): ../../Compress/LZ/$(*B).cpp + $(COMPL) +$(LZMA_OPT_OBJS): ../../Compress/LZMA/$(*B).cpp + $(COMPL_O2) +$O\RangeCoderBit.obj: ../../Compress/RangeCoder/$(*B).cpp + $(COMPL) + +$(C_OBJS): ../../../../C/$(*B).c + $(COMPL_O2) +$(C_LZ_OBJS): ../../../../C/Compress/Lz/$(*B).c + $(COMPL_O2) +$(C_BRANCH_OBJS): ../../../../C/Compress/Branch/$(*B).c + $(COMPL_O2) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zR/resource.rc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Bundles/Format7zR/resource.rc Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,5 @@ +#include "../../MyVersionInfo.rc" + +MY_VERSION_INFO_DLL("7z Standalone Plugin", "7zr") + +101 ICON "../../Archive/7z/7z.ico" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/CreateCoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/CreateCoder.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,292 @@ +// CreateCoder.cpp + +#include "StdAfx.h" + +#include "CreateCoder.h" + +#include "../../Windows/PropVariant.h" +#include "../../Windows/Defs.h" +#include "FilterCoder.h" +#include "RegisterCodec.h" + +static const unsigned int kNumCodecsMax = 64; +unsigned int g_NumCodecs = 0; +const CCodecInfo *g_Codecs[kNumCodecsMax]; +void RegisterCodec(const CCodecInfo *codecInfo) +{ + if (g_NumCodecs < kNumCodecsMax) + g_Codecs[g_NumCodecs++] = codecInfo; +} + +#ifdef EXTERNAL_CODECS +static HRESULT ReadNumberOfStreams(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, UInt32 &res) +{ + NWindows::NCOM::CPropVariant prop; + RINOK(codecsInfo->GetProperty(index, propID, &prop)); + if (prop.vt == VT_EMPTY) + res = 1; + else if (prop.vt == VT_UI4) + res = prop.ulVal; + else + return E_INVALIDARG; + return S_OK; +} + +static HRESULT ReadIsAssignedProp(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, bool &res) +{ + NWindows::NCOM::CPropVariant prop; + RINOK(codecsInfo->GetProperty(index, propID, &prop)); + if (prop.vt == VT_EMPTY) + res = true; + else if (prop.vt == VT_BOOL) + res = VARIANT_BOOLToBool(prop.boolVal); + else + return E_INVALIDARG; + return S_OK; +} + +HRESULT LoadExternalCodecs(ICompressCodecsInfo *codecsInfo, CObjectVector &externalCodecs) +{ + UInt32 num; + RINOK(codecsInfo->GetNumberOfMethods(&num)); + for (UInt32 i = 0; i < num; i++) + { + CCodecInfoEx info; + NWindows::NCOM::CPropVariant prop; + RINOK(codecsInfo->GetProperty(i, NMethodPropID::kID, &prop)); + // if (prop.vt != VT_BSTR) + // info.Id.IDSize = (Byte)SysStringByteLen(prop.bstrVal); + // memmove(info.Id.ID, prop.bstrVal, info.Id.IDSize); + if (prop.vt != VT_UI8) + { + continue; // old Interface + // return E_INVALIDARG; + } + info.Id = prop.uhVal.QuadPart; + prop.Clear(); + + RINOK(codecsInfo->GetProperty(i, NMethodPropID::kName, &prop)); + if (prop.vt == VT_BSTR) + info.Name = prop.bstrVal; + else if (prop.vt != VT_EMPTY) + return E_INVALIDARG;; + + RINOK(ReadNumberOfStreams(codecsInfo, i, NMethodPropID::kInStreams, info.NumInStreams)); + RINOK(ReadNumberOfStreams(codecsInfo, i, NMethodPropID::kOutStreams, info.NumOutStreams)); + RINOK(ReadIsAssignedProp(codecsInfo, i, NMethodPropID::kEncoderIsAssigned, info.EncoderIsAssigned)); + RINOK(ReadIsAssignedProp(codecsInfo, i, NMethodPropID::kDecoderIsAssigned, info.DecoderIsAssigned)); + + externalCodecs.Add(info); + } + return S_OK; +} + +#endif + +bool FindMethod( + #ifdef EXTERNAL_CODECS + ICompressCodecsInfo * /* codecsInfo */, const CObjectVector *externalCodecs, + #endif + const UString &name, + CMethodId &methodId, UInt32 &numInStreams, UInt32 &numOutStreams) +{ + UInt32 i; + for (i = 0; i < g_NumCodecs; i++) + { + const CCodecInfo &codec = *g_Codecs[i]; + if (name.CompareNoCase(codec.Name) == 0) + { + methodId = codec.Id; + numInStreams = codec.NumInStreams; + numOutStreams = 1; + return true; + } + } + #ifdef EXTERNAL_CODECS + if (externalCodecs) + for (i = 0; i < (UInt32)externalCodecs->Size(); i++) + { + const CCodecInfoEx &codec = (*externalCodecs)[i]; + if (codec.Name.CompareNoCase(name) == 0) + { + methodId = codec.Id; + numInStreams = codec.NumInStreams; + numOutStreams = codec.NumOutStreams; + return true; + } + } + #endif + return false; +} + +bool FindMethod( + #ifdef EXTERNAL_CODECS + ICompressCodecsInfo * /* codecsInfo */, const CObjectVector *externalCodecs, + #endif + CMethodId methodId, UString &name) +{ + UInt32 i; + for (i = 0; i < g_NumCodecs; i++) + { + const CCodecInfo &codec = *g_Codecs[i]; + if (methodId == codec.Id) + { + name = codec.Name; + return true; + } + } + #ifdef EXTERNAL_CODECS + if (externalCodecs) + for (i = 0; i < (UInt32)externalCodecs->Size(); i++) + { + const CCodecInfoEx &codec = (*externalCodecs)[i]; + if (methodId == codec.Id) + { + name = codec.Name; + return true; + } + } + #endif + return false; +} + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + CMyComPtr &filter, + CMyComPtr &coder, + CMyComPtr &coder2, + bool encode, bool onlyCoder) +{ + bool created = false; + UInt32 i; + for (i = 0; i < g_NumCodecs; i++) + { + const CCodecInfo &codec = *g_Codecs[i]; + if (codec.Id == methodId) + { + if (encode) + { + if (codec.CreateEncoder) + { + void *p = codec.CreateEncoder(); + if (codec.IsFilter) filter = (ICompressFilter *)p; + else if (codec.NumInStreams == 1) coder = (ICompressCoder *)p; + else coder2 = (ICompressCoder2 *)p; + created = (p != 0); + break; + } + } + else + if (codec.CreateDecoder) + { + void *p = codec.CreateDecoder(); + if (codec.IsFilter) filter = (ICompressFilter *)p; + else if (codec.NumInStreams == 1) coder = (ICompressCoder *)p; + else coder2 = (ICompressCoder2 *)p; + created = (p != 0); + break; + } + } + } + + #ifdef EXTERNAL_CODECS + if (!created && externalCodecs) + for (i = 0; i < (UInt32)externalCodecs->Size(); i++) + { + const CCodecInfoEx &codec = (*externalCodecs)[i]; + if (codec.Id == methodId) + { + if (encode) + { + if (codec.EncoderIsAssigned) + { + if (codec.IsSimpleCodec()) + { + HRESULT result = codecsInfo->CreateEncoder(i, &IID_ICompressCoder, (void **)&coder); + if (result != S_OK && result != E_NOINTERFACE && result != CLASS_E_CLASSNOTAVAILABLE) + return result; + if (!coder) + { + RINOK(codecsInfo->CreateEncoder(i, &IID_ICompressFilter, (void **)&filter)); + } + } + else + { + RINOK(codecsInfo->CreateEncoder(i, &IID_ICompressCoder2, (void **)&coder2)); + } + break; + } + } + else + if (codec.DecoderIsAssigned) + { + if (codec.IsSimpleCodec()) + { + HRESULT result = codecsInfo->CreateDecoder(i, &IID_ICompressCoder, (void **)&coder); + if (result != S_OK && result != E_NOINTERFACE && result != CLASS_E_CLASSNOTAVAILABLE) + return result; + if (!coder) + { + RINOK(codecsInfo->CreateDecoder(i, &IID_ICompressFilter, (void **)&filter)); + } + } + else + { + RINOK(codecsInfo->CreateDecoder(i, &IID_ICompressCoder2, (void **)&coder2)); + } + break; + } + } + } + #endif + + if (onlyCoder && filter) + { + CFilterCoder *coderSpec = new CFilterCoder; + coder = coderSpec; + coderSpec->Filter = filter; + } + return S_OK; +} + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + CMyComPtr &coder, + CMyComPtr &coder2, + bool encode) +{ + CMyComPtr filter; + return CreateCoder( + EXTERNAL_CODECS_LOC_VARS + methodId, + filter, coder, coder2, encode, true); +} + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + CMyComPtr &coder, bool encode) +{ + CMyComPtr filter; + CMyComPtr coder2; + return CreateCoder( + EXTERNAL_CODECS_LOC_VARS + methodId, + coder, coder2, encode); +} + +HRESULT CreateFilter( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + CMyComPtr &filter, + bool encode) +{ + CMyComPtr coder; + CMyComPtr coder2; + return CreateCoder( + EXTERNAL_CODECS_LOC_VARS + methodId, + filter, coder, coder2, encode, false); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/CreateCoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/CreateCoder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,98 @@ +// CreateCoder.h + +#ifndef __CREATECODER_H +#define __CREATECODER_H + +#include "Common/MyCom.h" +#include "Common/MyString.h" +#include "../ICoder.h" + +#include "MethodId.h" + +#ifdef EXTERNAL_CODECS + +struct CCodecInfoEx +{ + UString Name; + CMethodId Id; + UInt32 NumInStreams; + UInt32 NumOutStreams; + bool EncoderIsAssigned; + bool DecoderIsAssigned; + bool IsSimpleCodec() const { return NumOutStreams == 1 && NumInStreams == 1; } + CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false) {} +}; + +HRESULT LoadExternalCodecs(ICompressCodecsInfo *codecsInfo, CObjectVector &externalCodecs); + +#define PUBLIC_ISetCompressCodecsInfo public ISetCompressCodecsInfo, +#define QUERY_ENTRY_ISetCompressCodecsInfo MY_QUERYINTERFACE_ENTRY(ISetCompressCodecsInfo) +#define DECL_ISetCompressCodecsInfo STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo); +#define IMPL_ISetCompressCodecsInfo2(x) \ +STDMETHODIMP x::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo) { \ + COM_TRY_BEGIN _codecsInfo = compressCodecsInfo; return LoadExternalCodecs(_codecsInfo, _externalCodecs); COM_TRY_END } +#define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler) + +#define EXTERNAL_CODECS_VARS2 _codecsInfo, &_externalCodecs + +#define DECL_EXTERNAL_CODECS_VARS CMyComPtr _codecsInfo; CObjectVector _externalCodecs; +#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2, + +#define DECL_EXTERNAL_CODECS_LOC_VARS2 ICompressCodecsInfo *codecsInfo, const CObjectVector *externalCodecs +#define EXTERNAL_CODECS_LOC_VARS2 codecsInfo, externalCodecs + +#define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2, +#define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2, + +#else + +#define PUBLIC_ISetCompressCodecsInfo +#define QUERY_ENTRY_ISetCompressCodecsInfo +#define DECL_ISetCompressCodecsInfo +#define IMPL_ISetCompressCodecsInfo +#define EXTERNAL_CODECS_VARS2 +#define DECL_EXTERNAL_CODECS_VARS +#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2 +#define DECL_EXTERNAL_CODECS_LOC_VARS2 +#define EXTERNAL_CODECS_LOC_VARS2 +#define DECL_EXTERNAL_CODECS_LOC_VARS +#define EXTERNAL_CODECS_LOC_VARS + +#endif + +bool FindMethod( + DECL_EXTERNAL_CODECS_LOC_VARS + const UString &name, CMethodId &methodId, UInt32 &numInStreams, UInt32 &numOutStreams); + +bool FindMethod( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, UString &name); + + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + CMyComPtr &filter, + CMyComPtr &coder, + CMyComPtr &coder2, + bool encode, bool onlyCoder); + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + CMyComPtr &coder, + CMyComPtr &coder2, + bool encode); + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + CMyComPtr &coder, bool encode); + +HRESULT CreateFilter( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + CMyComPtr &filter, + bool encode); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/FilePathAutoRename.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/FilePathAutoRename.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,57 @@ +// FilePathAutoRename.cpp + +#include "StdAfx.h" +#include "FilePathAutoRename.h" + +#include "Common/Defs.h" +#include "Common/IntToString.h" + +#include "Windows/FileName.h" +#include "Windows/FileFind.h" + +using namespace NWindows; + +static bool MakeAutoName(const UString &name, + const UString &extension, int value, UString &path) +{ + wchar_t number[32]; + ConvertUInt64ToString(value, number); + path = name; + path += number; + path += extension; + return NFile::NFind::DoesFileExist(path); +} + +bool AutoRenamePath(UString &fullProcessedPath) +{ + UString path; + int dotPos = fullProcessedPath.ReverseFind(L'.'); + + int slashPos = fullProcessedPath.ReverseFind(L'/'); + #ifdef _WIN32 + int slash1Pos = fullProcessedPath.ReverseFind(L'\\'); + slashPos = MyMax(slashPos, slash1Pos); + #endif + + UString name, extension; + if (dotPos > slashPos && dotPos > 0) + { + name = fullProcessedPath.Left(dotPos); + extension = fullProcessedPath.Mid(dotPos); + } + else + name = fullProcessedPath; + name += L'_'; + int indexLeft = 1, indexRight = (1 << 30); + while (indexLeft != indexRight) + { + int indexMid = (indexLeft + indexRight) / 2; + if (MakeAutoName(name, extension, indexMid, path)) + indexLeft = indexMid + 1; + else + indexRight = indexMid; + } + if (MakeAutoName(name, extension, indexRight, fullProcessedPath)) + return false; + return true; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/FilePathAutoRename.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/FilePathAutoRename.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// Util/FilePathAutoRename.h + +#ifndef __FILEPATHAUTORENAME_H +#define __FILEPATHAUTORENAME_H + +#include "Common/MyString.h" + +bool AutoRenamePath(UString &fullProcessedPath); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/FileStreams.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/FileStreams.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,261 @@ +// FileStreams.cpp + +#include "StdAfx.h" + +#ifndef _WIN32 +#include +#include +#include +#endif + +#include "FileStreams.h" + +static inline HRESULT ConvertBoolToHRESULT(bool result) +{ + #ifdef _WIN32 + if (result) + return S_OK; + DWORD lastError = ::GetLastError(); + if (lastError == 0) + return E_FAIL; + return lastError; + #else + return result ? S_OK: E_FAIL; + #endif +} + +bool CInFileStream::Open(LPCTSTR fileName) +{ + return File.Open(fileName); +} + +#ifdef USE_WIN_FILE +#ifndef _UNICODE +bool CInFileStream::Open(LPCWSTR fileName) +{ + return File.Open(fileName); +} +#endif +#endif + +bool CInFileStream::OpenShared(LPCTSTR fileName, bool shareForWrite) +{ + return File.OpenShared(fileName, shareForWrite); +} + +#ifdef USE_WIN_FILE +#ifndef _UNICODE +bool CInFileStream::OpenShared(LPCWSTR fileName, bool shareForWrite) +{ + return File.OpenShared(fileName, shareForWrite); +} +#endif +#endif + +STDMETHODIMP CInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef USE_WIN_FILE + + UInt32 realProcessedSize; + bool result = File.ReadPart(data, size, realProcessedSize); + if(processedSize != NULL) + *processedSize = realProcessedSize; + return ConvertBoolToHRESULT(result); + + #else + + if(processedSize != NULL) + *processedSize = 0; + ssize_t res = File.Read(data, (size_t)size); + if (res == -1) + return E_FAIL; + if(processedSize != NULL) + *processedSize = (UInt32)res; + return S_OK; + + #endif +} + +#ifndef _WIN32_WCE +STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef _WIN32 + UInt32 realProcessedSize; + BOOL res = ::ReadFile(GetStdHandle(STD_INPUT_HANDLE), + data, size, (DWORD *)&realProcessedSize, NULL); + if(processedSize != NULL) + *processedSize = realProcessedSize; + if (res == FALSE && GetLastError() == ERROR_BROKEN_PIPE) + return S_OK; + return ConvertBoolToHRESULT(res != FALSE); + + #else + + if(processedSize != NULL) + *processedSize = 0; + ssize_t res; + do + { + res = read(0, data, (size_t)size); + } + while (res < 0 && (errno == EINTR)); + if (res == -1) + return E_FAIL; + if(processedSize != NULL) + *processedSize = (UInt32)res; + return S_OK; + + #endif +} + +#endif + +STDMETHODIMP CInFileStream::Seek(Int64 offset, UInt32 seekOrigin, + UInt64 *newPosition) +{ + if(seekOrigin >= 3) + return STG_E_INVALIDFUNCTION; + + #ifdef USE_WIN_FILE + + UInt64 realNewPosition; + bool result = File.Seek(offset, seekOrigin, realNewPosition); + if(newPosition != NULL) + *newPosition = realNewPosition; + return ConvertBoolToHRESULT(result); + + #else + + off_t res = File.Seek(offset, seekOrigin); + if (res == -1) + return E_FAIL; + if(newPosition != NULL) + *newPosition = (UInt64)res; + return S_OK; + + #endif +} + +STDMETHODIMP CInFileStream::GetSize(UInt64 *size) +{ + return ConvertBoolToHRESULT(File.GetLength(*size)); +} + + +////////////////////////// +// COutFileStream + +HRESULT COutFileStream::Close() +{ + return ConvertBoolToHRESULT(File.Close()); +} + +STDMETHODIMP COutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef USE_WIN_FILE + + UInt32 realProcessedSize; + bool result = File.WritePart(data, size, realProcessedSize); + ProcessedSize += realProcessedSize; + if(processedSize != NULL) + *processedSize = realProcessedSize; + return ConvertBoolToHRESULT(result); + + #else + + if(processedSize != NULL) + *processedSize = 0; + ssize_t res = File.Write(data, (size_t)size); + if (res == -1) + return E_FAIL; + if(processedSize != NULL) + *processedSize = (UInt32)res; + ProcessedSize += res; + return S_OK; + + #endif +} + +STDMETHODIMP COutFileStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + if(seekOrigin >= 3) + return STG_E_INVALIDFUNCTION; + #ifdef USE_WIN_FILE + + UInt64 realNewPosition; + bool result = File.Seek(offset, seekOrigin, realNewPosition); + if(newPosition != NULL) + *newPosition = realNewPosition; + return ConvertBoolToHRESULT(result); + + #else + + off_t res = File.Seek(offset, seekOrigin); + if (res == -1) + return E_FAIL; + if(newPosition != NULL) + *newPosition = (UInt64)res; + return S_OK; + + #endif +} + +STDMETHODIMP COutFileStream::SetSize(Int64 newSize) +{ + #ifdef USE_WIN_FILE + UInt64 currentPos; + if(!File.Seek(0, FILE_CURRENT, currentPos)) + return E_FAIL; + bool result = File.SetLength(newSize); + UInt64 currentPos2; + result = result && File.Seek(currentPos, currentPos2); + return result ? S_OK : E_FAIL; + #else + return E_FAIL; + #endif +} + +#ifndef _WIN32_WCE +STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if(processedSize != NULL) + *processedSize = 0; + + #ifdef _WIN32 + UInt32 realProcessedSize; + BOOL res = TRUE; + if (size > 0) + { + // Seems that Windows doesn't like big amounts writing to stdout. + // So we limit portions by 32KB. + UInt32 sizeTemp = (1 << 15); + if (sizeTemp > size) + sizeTemp = size; + res = ::WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), + data, sizeTemp, (DWORD *)&realProcessedSize, NULL); + size -= realProcessedSize; + data = (const void *)((const Byte *)data + realProcessedSize); + if(processedSize != NULL) + *processedSize += realProcessedSize; + } + return ConvertBoolToHRESULT(res != FALSE); + + #else + + ssize_t res; + do + { + res = write(1, data, (size_t)size); + } + while (res < 0 && (errno == EINTR)); + if (res == -1) + return E_FAIL; + if(processedSize != NULL) + *processedSize = (UInt32)res; + return S_OK; + + return S_OK; + #endif +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/FileStreams.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/FileStreams.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,143 @@ +// FileStreams.h + +#ifndef __FILESTREAMS_H +#define __FILESTREAMS_H + +#ifdef _WIN32 +#define USE_WIN_FILE +#endif + +#ifdef USE_WIN_FILE +#include "../../Windows/FileIO.h" +#else +#include "../../Common/C_FileIO.h" +#endif + +#include "../IStream.h" +#include "../../Common/MyCom.h" + +class CInFileStream: + public IInStream, + public IStreamGetSize, + public CMyUnknownImp +{ +public: + #ifdef USE_WIN_FILE + NWindows::NFile::NIO::CInFile File; + #else + NC::NFile::NIO::CInFile File; + #endif + CInFileStream() {} + virtual ~CInFileStream() {} + + bool Open(LPCTSTR fileName); + #ifdef USE_WIN_FILE + #ifndef _UNICODE + bool Open(LPCWSTR fileName); + #endif + #endif + + bool OpenShared(LPCTSTR fileName, bool shareForWrite); + #ifdef USE_WIN_FILE + #ifndef _UNICODE + bool OpenShared(LPCWSTR fileName, bool shareForWrite); + #endif + #endif + + MY_UNKNOWN_IMP2(IInStream, IStreamGetSize) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + + STDMETHOD(GetSize)(UInt64 *size); +}; + +#ifndef _WIN32_WCE +class CStdInFileStream: + public ISequentialInStream, + public CMyUnknownImp +{ +public: + // HANDLE File; + // CStdInFileStream() File(INVALID_HANDLE_VALUE): {} + // void Open() { File = GetStdHandle(STD_INPUT_HANDLE); }; + MY_UNKNOWN_IMP + + virtual ~CStdInFileStream() {} + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; +#endif + +class COutFileStream: + public IOutStream, + public CMyUnknownImp +{ + #ifdef USE_WIN_FILE + NWindows::NFile::NIO::COutFile File; + #else + NC::NFile::NIO::COutFile File; + #endif +public: + virtual ~COutFileStream() {} + bool Create(LPCTSTR fileName, bool createAlways) + { + ProcessedSize = 0; + return File.Create(fileName, createAlways); + } + bool Open(LPCTSTR fileName, DWORD creationDisposition) + { + ProcessedSize = 0; + return File.Open(fileName, creationDisposition); + } + #ifdef USE_WIN_FILE + #ifndef _UNICODE + bool Create(LPCWSTR fileName, bool createAlways) + { + ProcessedSize = 0; + return File.Create(fileName, createAlways); + } + bool Open(LPCWSTR fileName, DWORD creationDisposition) + { + ProcessedSize = 0; + return File.Open(fileName, creationDisposition); + } + #endif + #endif + + HRESULT Close(); + + UInt64 ProcessedSize; + + #ifdef USE_WIN_FILE + bool SetTime(const FILETIME *creationTime, const FILETIME *lastAccessTime, const FILETIME *lastWriteTime) + { + return File.SetTime(creationTime, lastAccessTime, lastWriteTime); + } + bool SetLastWriteTime(const FILETIME *lastWriteTime) + { + return File.SetLastWriteTime(lastWriteTime); + } + #endif + + + MY_UNKNOWN_IMP1(IOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(SetSize)(Int64 newSize); +}; + +#ifndef _WIN32_WCE +class CStdOutFileStream: + public ISequentialOutStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + + virtual ~CStdOutFileStream() {} + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/FilterCoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/FilterCoder.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,264 @@ +// FilterCoder.cpp + +#include "StdAfx.h" + +#include "FilterCoder.h" +extern "C" +{ +#include "../../../C/Alloc.h" +} +#include "../../Common/Defs.h" +#include "StreamUtils.h" + +static const UInt32 kBufferSize = 1 << 17; + +CFilterCoder::CFilterCoder() +{ + _buffer = (Byte *)::MidAlloc(kBufferSize); +} + +CFilterCoder::~CFilterCoder() +{ + ::MidFree(_buffer); +} + +HRESULT CFilterCoder::WriteWithLimit(ISequentialOutStream *outStream, UInt32 size) +{ + if (_outSizeIsDefined) + { + UInt64 remSize = _outSize - _nowPos64; + if (size > remSize) + size = (UInt32)remSize; + } + UInt32 processedSize = 0; + RINOK(WriteStream(outStream, _buffer, size, &processedSize)); + if (size != processedSize) + return E_FAIL; + _nowPos64 += processedSize; + return S_OK; +} + + +STDMETHODIMP CFilterCoder::Code(ISequentialInStream *inStream, + ISequentialOutStream *outStream, const UInt64 * /* inSize */, const UInt64 *outSize, + ICompressProgressInfo *progress) +{ + RINOK(Init()); + UInt32 bufferPos = 0; + _outSizeIsDefined = (outSize != 0); + if (_outSizeIsDefined) + _outSize = *outSize; + + while(NeedMore()) + { + UInt32 processedSize; + + // Change it: It can be optimized using ReadPart + RINOK(ReadStream(inStream, _buffer + bufferPos, kBufferSize - bufferPos, &processedSize)); + + UInt32 endPos = bufferPos + processedSize; + + bufferPos = Filter->Filter(_buffer, endPos); + if (bufferPos > endPos) + { + for (; endPos< bufferPos; endPos++) + _buffer[endPos] = 0; + bufferPos = Filter->Filter(_buffer, endPos); + } + + if (bufferPos == 0) + { + if (endPos > 0) + return WriteWithLimit(outStream, endPos); + return S_OK; + } + RINOK(WriteWithLimit(outStream, bufferPos)); + if (progress != NULL) + { + RINOK(progress->SetRatioInfo(&_nowPos64, &_nowPos64)); + } + UInt32 i = 0; + while(bufferPos < endPos) + _buffer[i++] = _buffer[bufferPos++]; + bufferPos = i; + } + return S_OK; +} + +// #ifdef _ST_MODE +STDMETHODIMP CFilterCoder::SetOutStream(ISequentialOutStream *outStream) +{ + _bufferPos = 0; + _outStream = outStream; + return Init(); +} + +STDMETHODIMP CFilterCoder::ReleaseOutStream() +{ + _outStream.Release(); + return S_OK; +}; + + +STDMETHODIMP CFilterCoder::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 processedSizeTotal = 0; + while(size > 0) + { + UInt32 sizeMax = kBufferSize - _bufferPos; + UInt32 sizeTemp = size; + if (sizeTemp > sizeMax) + sizeTemp = sizeMax; + memmove(_buffer + _bufferPos, data, sizeTemp); + size -= sizeTemp; + processedSizeTotal += sizeTemp; + data = (const Byte *)data + sizeTemp; + UInt32 endPos = _bufferPos + sizeTemp; + _bufferPos = Filter->Filter(_buffer, endPos); + if (_bufferPos == 0) + { + _bufferPos = endPos; + break; + } + if (_bufferPos > endPos) + { + if (size != 0) + return E_FAIL; + break; + } + RINOK(WriteWithLimit(_outStream, _bufferPos)); + UInt32 i = 0; + while(_bufferPos < endPos) + _buffer[i++] = _buffer[_bufferPos++]; + _bufferPos = i; + } + if (processedSize != NULL) + *processedSize = processedSizeTotal; + return S_OK; +} + +STDMETHODIMP CFilterCoder::Flush() +{ + if (_bufferPos != 0) + { + UInt32 endPos = Filter->Filter(_buffer, _bufferPos); + if (endPos > _bufferPos) + { + for (; _bufferPos < endPos; _bufferPos++) + _buffer[_bufferPos] = 0; + if (Filter->Filter(_buffer, endPos) != endPos) + return E_FAIL; + } + UInt32 processedSize; + RINOK(WriteStream(_outStream, _buffer, _bufferPos, &processedSize)); + if (_bufferPos != processedSize) + return E_FAIL; + _bufferPos = 0; + } + CMyComPtr flush; + _outStream.QueryInterface(IID_IOutStreamFlush, &flush); + if (flush) + return flush->Flush(); + return S_OK; +} + + +STDMETHODIMP CFilterCoder::SetInStream(ISequentialInStream *inStream) +{ + _convertedPosBegin = _convertedPosEnd = _bufferPos = 0; + _inStream = inStream; + return Init(); +} + +STDMETHODIMP CFilterCoder::ReleaseInStream() +{ + _inStream.Release(); + return S_OK; +}; + +STDMETHODIMP CFilterCoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 processedSizeTotal = 0; + while(size > 0) + { + if (_convertedPosBegin != _convertedPosEnd) + { + UInt32 sizeTemp = MyMin(size, _convertedPosEnd - _convertedPosBegin); + memmove(data, _buffer + _convertedPosBegin, sizeTemp); + _convertedPosBegin += sizeTemp; + data = (void *)((Byte *)data + sizeTemp); + size -= sizeTemp; + processedSizeTotal += sizeTemp; + break; + } + int i; + for (i = 0; _convertedPosEnd + i < _bufferPos; i++) + _buffer[i] = _buffer[i + _convertedPosEnd]; + _bufferPos = i; + _convertedPosBegin = _convertedPosEnd = 0; + UInt32 processedSizeTemp; + UInt32 size0 = kBufferSize - _bufferPos; + // Optimize it: + RINOK(ReadStream(_inStream, _buffer + _bufferPos, size0, &processedSizeTemp)); + _bufferPos = _bufferPos + processedSizeTemp; + _convertedPosEnd = Filter->Filter(_buffer, _bufferPos); + if (_convertedPosEnd == 0) + { + if (_bufferPos == 0) + break; + else + { + _convertedPosEnd = _bufferPos; // check it + continue; + } + } + if (_convertedPosEnd > _bufferPos) + { + for (; _bufferPos < _convertedPosEnd; _bufferPos++) + _buffer[_bufferPos] = 0; + _convertedPosEnd = Filter->Filter(_buffer, _bufferPos); + } + } + if (processedSize != NULL) + *processedSize = processedSizeTotal; + return S_OK; +} + +// #endif // _ST_MODE + +#ifndef _NO_CRYPTO +STDMETHODIMP CFilterCoder::CryptoSetPassword(const Byte *data, UInt32 size) +{ + return _setPassword->CryptoSetPassword(data, size); +} +#endif + +#ifndef EXTRACT_ONLY +STDMETHODIMP CFilterCoder::SetCoderProperties(const PROPID *propIDs, + const PROPVARIANT *properties, UInt32 numProperties) +{ + return _SetCoderProperties->SetCoderProperties(propIDs, properties, numProperties); +} + +STDMETHODIMP CFilterCoder::WriteCoderProperties(ISequentialOutStream *outStream) +{ + return _writeCoderProperties->WriteCoderProperties(outStream); +} + +/* +STDMETHODIMP CFilterCoder::ResetSalt() +{ + return _CryptoResetSalt->ResetSalt(); +} +*/ + +STDMETHODIMP CFilterCoder::ResetInitVector() +{ + return _CryptoResetInitVector->ResetInitVector(); +} +#endif + +STDMETHODIMP CFilterCoder::SetDecoderProperties2(const Byte *data, UInt32 size) +{ + return _setDecoderProperties->SetDecoderProperties2(data, size); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/FilterCoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/FilterCoder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,143 @@ +// FilterCoder.h + +#ifndef __FILTERCODER_H +#define __FILTERCODER_H + +#include "../../Common/MyCom.h" +#include "../ICoder.h" +#include "../IPassword.h" + +#define MY_QUERYINTERFACE_ENTRY_AG(i, sub0, sub) if (iid == IID_ ## i) \ +{ if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \ +*outObject = (void *)(i *)this; AddRef(); return S_OK; } + +class CFilterCoder: + public ICompressCoder, + // #ifdef _ST_MODE + public ICompressSetInStream, + public ISequentialInStream, + public ICompressSetOutStream, + public ISequentialOutStream, + public IOutStreamFlush, + // #endif + + #ifndef _NO_CRYPTO + public ICryptoSetPassword, + #endif + #ifndef EXTRACT_ONLY + public ICompressSetCoderProperties, + public ICompressWriteCoderProperties, + // public ICryptoResetSalt, + public ICryptoResetInitVector, + #endif + public ICompressSetDecoderProperties2, + public CMyUnknownImp +{ +protected: + Byte *_buffer; + // #ifdef _ST_MODE + CMyComPtr _inStream; + CMyComPtr _outStream; + UInt32 _bufferPos; + UInt32 _convertedPosBegin; + UInt32 _convertedPosEnd; + // #endif + bool _outSizeIsDefined; + UInt64 _outSize; + UInt64 _nowPos64; + + HRESULT Init() + { + _nowPos64 = 0; + _outSizeIsDefined = false; + return Filter->Init(); + } + + CMyComPtr _setPassword; + #ifndef EXTRACT_ONLY + CMyComPtr _SetCoderProperties; + CMyComPtr _writeCoderProperties; + // CMyComPtr _CryptoResetSalt; + CMyComPtr _CryptoResetInitVector; + #endif + CMyComPtr _setDecoderProperties; +public: + CMyComPtr Filter; + + CFilterCoder(); + ~CFilterCoder(); + HRESULT WriteWithLimit(ISequentialOutStream *outStream, UInt32 size); + bool NeedMore() const + { return (!_outSizeIsDefined || (_nowPos64 < _outSize)); } + +public: + MY_QUERYINTERFACE_BEGIN + MY_QUERYINTERFACE_ENTRY(ICompressCoder) + // #ifdef _ST_MODE + MY_QUERYINTERFACE_ENTRY(ICompressSetInStream) + MY_QUERYINTERFACE_ENTRY(ISequentialInStream) + + MY_QUERYINTERFACE_ENTRY(ICompressSetOutStream) + MY_QUERYINTERFACE_ENTRY(ISequentialOutStream) + MY_QUERYINTERFACE_ENTRY(IOutStreamFlush) + // #endif + + #ifndef _NO_CRYPTO + MY_QUERYINTERFACE_ENTRY_AG(ICryptoSetPassword, Filter, _setPassword) + #endif + + #ifndef EXTRACT_ONLY + MY_QUERYINTERFACE_ENTRY_AG(ICompressSetCoderProperties, Filter, _SetCoderProperties) + MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _writeCoderProperties) + // MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetSalt, Filter, _CryptoResetSalt) + MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetInitVector, Filter, _CryptoResetInitVector) + #endif + + MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _setDecoderProperties) + MY_QUERYINTERFACE_END + MY_ADDREF_RELEASE + STDMETHOD(Code)(ISequentialInStream *inStream, + ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress); + // #ifdef _ST_MODE + STDMETHOD(ReleaseInStream)(); + STDMETHOD(SetInStream)(ISequentialInStream *inStream); + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); \ + STDMETHOD(SetOutStream)(ISequentialOutStream *outStream); + STDMETHOD(ReleaseOutStream)(); + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Flush)(); + // #endif + + #ifndef _NO_CRYPTO + STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); + #endif + #ifndef EXTRACT_ONLY + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, + const PROPVARIANT *properties, UInt32 numProperties); + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + // STDMETHOD(ResetSalt)(); + STDMETHOD(ResetInitVector)(); + #endif + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); +}; + +// #ifdef _ST_MODE +class CInStreamReleaser +{ +public: + CFilterCoder *FilterCoder; + CInStreamReleaser(): FilterCoder(0) {} + ~CInStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); } +}; + +class COutStreamReleaser +{ +public: + CFilterCoder *FilterCoder; + COutStreamReleaser(): FilterCoder(0) {} + ~COutStreamReleaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); } +}; +// #endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/InBuffer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/InBuffer.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,83 @@ +// InBuffer.cpp + +#include "StdAfx.h" + +#include "InBuffer.h" + +extern "C" +{ + #include "../../../C/Alloc.h" +} + +CInBuffer::CInBuffer(): + _buffer(0), + _bufferLimit(0), + _bufferBase(0), + _stream(0), + _bufferSize(0) +{} + +bool CInBuffer::Create(UInt32 bufferSize) +{ + const UInt32 kMinBlockSize = 1; + if (bufferSize < kMinBlockSize) + bufferSize = kMinBlockSize; + if (_bufferBase != 0 && _bufferSize == bufferSize) + return true; + Free(); + _bufferSize = bufferSize; + _bufferBase = (Byte *)::MidAlloc(bufferSize); + return (_bufferBase != 0); +} + +void CInBuffer::Free() +{ + ::MidFree(_bufferBase); + _bufferBase = 0; +} + +void CInBuffer::SetStream(ISequentialInStream *stream) +{ + _stream = stream; +} + +void CInBuffer::Init() +{ + _processedSize = 0; + _buffer = _bufferBase; + _bufferLimit = _buffer; + _wasFinished = false; + #ifdef _NO_EXCEPTIONS + ErrorCode = S_OK; + #endif +} + +bool CInBuffer::ReadBlock() +{ + #ifdef _NO_EXCEPTIONS + if (ErrorCode != S_OK) + return false; + #endif + if (_wasFinished) + return false; + _processedSize += (_buffer - _bufferBase); + UInt32 numProcessedBytes; + HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes); + #ifdef _NO_EXCEPTIONS + ErrorCode = result; + #else + if (result != S_OK) + throw CInBufferException(result); + #endif + _buffer = _bufferBase; + _bufferLimit = _buffer + numProcessedBytes; + _wasFinished = (numProcessedBytes == 0); + return (!_wasFinished); +} + +Byte CInBuffer::ReadBlock2() +{ + if(!ReadBlock()) + return 0xFF; + return *_buffer++; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/InBuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/InBuffer.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,75 @@ +// InBuffer.h + +#ifndef __INBUFFER_H +#define __INBUFFER_H + +#include "../IStream.h" +#include "../../Common/MyCom.h" +#include "../../Common/MyException.h" + +#ifndef _NO_EXCEPTIONS +struct CInBufferException: public CSystemException +{ + CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} +}; +#endif + +class CInBuffer +{ + Byte *_buffer; + Byte *_bufferLimit; + Byte *_bufferBase; + CMyComPtr _stream; + UInt64 _processedSize; + UInt32 _bufferSize; + bool _wasFinished; + + bool ReadBlock(); + Byte ReadBlock2(); + +public: + #ifdef _NO_EXCEPTIONS + HRESULT ErrorCode; + #endif + + CInBuffer(); + ~CInBuffer() { Free(); } + + bool Create(UInt32 bufferSize); + void Free(); + + void SetStream(ISequentialInStream *stream); + void Init(); + void ReleaseStream() { _stream.Release(); } + + bool ReadByte(Byte &b) + { + if(_buffer >= _bufferLimit) + if(!ReadBlock()) + return false; + b = *_buffer++; + return true; + } + Byte ReadByte() + { + if(_buffer >= _bufferLimit) + return ReadBlock2(); + return *_buffer++; + } + void ReadBytes(void *data, UInt32 size, UInt32 &processedSize) + { + for(processedSize = 0; processedSize < size; processedSize++) + if (!ReadByte(((Byte *)data)[processedSize])) + return; + } + bool ReadBytes(void *data, UInt32 size) + { + UInt32 processedSize; + ReadBytes(data, size, processedSize); + return (processedSize == size); + } + UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); } + bool WasFinished() const { return _wasFinished; } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/InOutTempBuffer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/InOutTempBuffer.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,122 @@ +// InOutTempBuffer.cpp + +#include "StdAfx.h" + +#include "InOutTempBuffer.h" +#include "../../Common/Defs.h" +// #include "Windows/Defs.h" + +#include "StreamUtils.h" + +using namespace NWindows; +using namespace NFile; +using namespace NDirectory; + +static UInt32 kTmpBufferMemorySize = (1 << 20); + +static LPCTSTR kTempFilePrefixString = TEXT("iot"); + +CInOutTempBuffer::CInOutTempBuffer(): + _buffer(NULL) +{ +} + +void CInOutTempBuffer::Create() +{ + _buffer = new Byte[kTmpBufferMemorySize]; +} + +CInOutTempBuffer::~CInOutTempBuffer() +{ + delete []_buffer; +} +void CInOutTempBuffer::InitWriting() +{ + _bufferPosition = 0; + _tmpFileCreated = false; + _fileSize = 0; +} + +bool CInOutTempBuffer::WriteToFile(const void *data, UInt32 size) +{ + if (size == 0) + return true; + if(!_tmpFileCreated) + { + CSysString tempDirPath; + if(!MyGetTempPath(tempDirPath)) + return false; + if (_tempFile.Create(tempDirPath, kTempFilePrefixString, _tmpFileName) == 0) + return false; + // _outFile.SetOpenCreationDispositionCreateAlways(); + if(!_outFile.Create(_tmpFileName, true)) + return false; + _tmpFileCreated = true; + } + UInt32 processedSize; + if(!_outFile.Write(data, size, processedSize)) + return false; + _fileSize += processedSize; + return (processedSize == size); +} + +bool CInOutTempBuffer::FlushWrite() +{ + return _outFile.Close(); +} + +bool CInOutTempBuffer::Write(const void *data, UInt32 size) +{ + if(_bufferPosition < kTmpBufferMemorySize) + { + UInt32 curSize = MyMin(kTmpBufferMemorySize - _bufferPosition, size); + memmove(_buffer + _bufferPosition, (const Byte *)data, curSize); + _bufferPosition += curSize; + size -= curSize; + data = ((const Byte *)data) + curSize; + _fileSize += curSize; + } + return WriteToFile(data, size); +} + +bool CInOutTempBuffer::InitReading() +{ + _currentPositionInBuffer = 0; + if(_tmpFileCreated) + return _inFile.Open(_tmpFileName); + return true; +} + +HRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream) +{ + if (_currentPositionInBuffer < _bufferPosition) + { + UInt32 sizeToWrite = _bufferPosition - _currentPositionInBuffer; + RINOK(WriteStream(stream, _buffer + _currentPositionInBuffer, sizeToWrite, NULL)); + _currentPositionInBuffer += sizeToWrite; + } + if (!_tmpFileCreated) + return true; + for (;;) + { + UInt32 localProcessedSize; + if (!_inFile.ReadPart(_buffer, kTmpBufferMemorySize, localProcessedSize)) + return E_FAIL; + if (localProcessedSize == 0) + return S_OK; + RINOK(WriteStream(stream, _buffer, localProcessedSize, NULL)); + } +} + +STDMETHODIMP CSequentialOutTempBufferImp::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (!_buffer->Write(data, size)) + { + if (processedSize != NULL) + *processedSize = 0; + return E_FAIL; + } + if (processedSize != NULL) + *processedSize = size; + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/InOutTempBuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/InOutTempBuffer.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,55 @@ +// Util/InOutTempBuffer.h + +#ifndef __IN_OUT_TEMP_BUFFER_H +#define __IN_OUT_TEMP_BUFFER_H + +#include "../../Windows/FileIO.h" +#include "../../Windows/FileDir.h" +#include "../../Common/MyCom.h" + +#include "../IStream.h" + +class CInOutTempBuffer +{ + NWindows::NFile::NDirectory::CTempFile _tempFile; + NWindows::NFile::NIO::COutFile _outFile; + NWindows::NFile::NIO::CInFile _inFile; + Byte *_buffer; + UInt32 _bufferPosition; + UInt32 _currentPositionInBuffer; + CSysString _tmpFileName; + bool _tmpFileCreated; + + UInt64 _fileSize; + + bool WriteToFile(const void *data, UInt32 size); +public: + CInOutTempBuffer(); + ~CInOutTempBuffer(); + void Create(); + + void InitWriting(); + bool Write(const void *data, UInt32 size); + UInt64 GetDataSize() const { return _fileSize; } + bool FlushWrite(); + bool InitReading(); + HRESULT WriteToStream(ISequentialOutStream *stream); +}; + +class CSequentialOutTempBufferImp: + public ISequentialOutStream, + public CMyUnknownImp +{ + CInOutTempBuffer *_buffer; +public: + // CSequentialOutStreamImp(): _size(0) {} + // UInt32 _size; + void Init(CInOutTempBuffer *buffer) { _buffer = buffer; } + // UInt32 GetSize() const { return _size; } + + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/LimitedStreams.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/LimitedStreams.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// LimitedStreams.cpp + +#include "StdAfx.h" + +#include "LimitedStreams.h" +#include "../../Common/Defs.h" + +STDMETHODIMP CLimitedSequentialInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize = 0; + UInt32 sizeToRead = (UInt32)MyMin((_size - _pos), (UInt64)size); + HRESULT result = S_OK; + if (sizeToRead > 0) + { + result = _stream->Read(data, sizeToRead, &realProcessedSize); + _pos += realProcessedSize; + if (realProcessedSize == 0) + _wasFinished = true; + } + if(processedSize != NULL) + *processedSize = realProcessedSize; + return result; +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/LimitedStreams.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/LimitedStreams.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,33 @@ +// LimitedStreams.h + +#ifndef __LIMITEDSTREAMS_H +#define __LIMITEDSTREAMS_H + +#include "../../Common/MyCom.h" +#include "../IStream.h" + +class CLimitedSequentialInStream: + public ISequentialInStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; + UInt64 _pos; + bool _wasFinished; +public: + void SetStream(ISequentialInStream *stream) { _stream = stream; } + void Init(UInt64 streamSize) + { + _size = streamSize; + _pos = 0; + _wasFinished = false; + } + + MY_UNKNOWN_IMP + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + UInt64 GetSize() const { return _pos; } + bool WasFinished() const { return _wasFinished; } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/LockedStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/LockedStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,23 @@ +// LockedStream.cpp + +#include "StdAfx.h" + +#include "LockedStream.h" + +HRESULT CLockedInStream::Read(UInt64 startPos, void *data, UInt32 size, + UInt32 *processedSize) +{ + NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection); + RINOK(_stream->Seek(startPos, STREAM_SEEK_SET, NULL)); + return _stream->Read(data, size, processedSize); +} + +STDMETHODIMP CLockedSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize = 0; + HRESULT result = _lockedInStream->Read(_pos, data, size, &realProcessedSize); + _pos += realProcessedSize; + if (processedSize != NULL) + *processedSize = realProcessedSize; + return result; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/LockedStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/LockedStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,38 @@ +// LockedStream.h + +#ifndef __LOCKEDSTREAM_H +#define __LOCKEDSTREAM_H + +#include "../../Windows/Synchronization.h" +#include "../../Common/MyCom.h" +#include "../IStream.h" + +class CLockedInStream +{ + CMyComPtr _stream; + NWindows::NSynchronization::CCriticalSection _criticalSection; +public: + void Init(IInStream *stream) + { _stream = stream; } + HRESULT Read(UInt64 startPos, void *data, UInt32 size, UInt32 *processedSize); +}; + +class CLockedSequentialInStreamImp: + public ISequentialInStream, + public CMyUnknownImp +{ + CLockedInStream *_lockedInStream; + UInt64 _pos; +public: + void Init(CLockedInStream *lockedInStream, UInt64 startPos) + { + _lockedInStream = lockedInStream; + _pos = startPos; + } + + MY_UNKNOWN_IMP + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/MethodId.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/MethodId.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,27 @@ +// MethodId.cpp + +#include "StdAfx.h" + +#include "MethodId.h" +#include "../../Common/MyString.h" + +static inline wchar_t GetHex(Byte value) +{ + return (wchar_t)((value < 10) ? ('0' + value) : ('A' + (value - 10))); +} + +UString ConvertMethodIdToString(UInt64 id) +{ + wchar_t s[32]; + int len = 32; + s[--len] = 0; + do + { + s[--len] = GetHex((Byte)id & 0xF); + id >>= 4; + s[--len] = GetHex((Byte)id & 0xF); + id >>= 4; + } + while (id != 0); + return s + len; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/MethodId.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/MethodId.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// MethodId.h + +#ifndef __7Z_METHOD_ID_H +#define __7Z_METHOD_ID_H + +#include "../../Common/Types.h" + +typedef UInt64 CMethodId; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/MethodProps.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/MethodProps.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,96 @@ +// MethodProps.cpp + +#include "StdAfx.h" + +#include "MethodProps.h" +#include "../../Common/MyCom.h" + +static UInt64 k_LZMA = 0x030101; +// static UInt64 k_LZMA2 = 0x030102; + +HRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder) +{ + bool tryReduce = false; + UInt32 reducedDictionarySize = 1 << 10; + if (inSizeForReduce != 0 && (method.Id == k_LZMA /* || methodFull.MethodID == k_LZMA2 */)) + { + for (;;) + { + const UInt32 step = (reducedDictionarySize >> 1); + if (reducedDictionarySize >= *inSizeForReduce) + { + tryReduce = true; + break; + } + reducedDictionarySize += step; + if (reducedDictionarySize >= *inSizeForReduce) + { + tryReduce = true; + break; + } + if (reducedDictionarySize >= ((UInt32)3 << 30)) + break; + reducedDictionarySize += step; + } + } + + { + int numProperties = method.Properties.Size(); + CMyComPtr setCoderProperties; + coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); + if (setCoderProperties == NULL) + { + if (numProperties != 0) + return E_INVALIDARG; + } + else + { + CRecordVector propIDs; + NWindows::NCOM::CPropVariant *values = new NWindows::NCOM::CPropVariant[numProperties]; + HRESULT res = S_OK; + try + { + for (int i = 0; i < numProperties; i++) + { + const CProp &prop = method.Properties[i]; + propIDs.Add(prop.Id); + NWindows::NCOM::CPropVariant &value = values[i]; + value = prop.Value; + // if (tryReduce && prop.Id == NCoderPropID::kDictionarySize && value.vt == VT_UI4 && reducedDictionarySize < value.ulVal) + if (tryReduce) + if (prop.Id == NCoderPropID::kDictionarySize) + if (value.vt == VT_UI4) + if (reducedDictionarySize < value.ulVal) + value.ulVal = reducedDictionarySize; + } + CMyComPtr setCoderProperties; + coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); + res = setCoderProperties->SetCoderProperties(&propIDs.Front(), values, numProperties); + } + catch(...) + { + delete []values; + throw; + } + delete []values; + RINOK(res); + } + } + + /* + CMyComPtr writeCoderProperties; + coder->QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties); + if (writeCoderProperties != NULL) + { + CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp; + CMyComPtr outStream(outStreamSpec); + outStreamSpec->Init(); + RINOK(writeCoderProperties->WriteCoderProperties(outStream)); + size_t size = outStreamSpec->GetSize(); + filterProps.SetCapacity(size); + memmove(filterProps, outStreamSpec->GetBuffer(), size); + } + */ + return S_OK; +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/MethodProps.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/MethodProps.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,41 @@ +// MethodProps.h + +#ifndef __7Z_METHOD_PROPS_H +#define __7Z_METHOD_PROPS_H + +#include "MethodId.h" + +#include "../../Windows/PropVariant.h" +#include "../../Common/MyVector.h" +#include "../ICoder.h" + +struct CProp +{ + PROPID Id; + NWindows::NCOM::CPropVariant Value; +}; + +struct CMethod +{ + CMethodId Id; + CObjectVector Properties; +}; + +struct CMethodsMode +{ + CObjectVector Methods; + #ifdef COMPRESS_MT + UInt32 NumThreads; + #endif + + CMethodsMode() + #ifdef COMPRESS_MT + : NumThreads(1) + #endif + {} + bool IsEmpty() const { return Methods.IsEmpty() ; } +}; + +HRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/OffsetStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/OffsetStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,35 @@ +// OffsetStream.cpp + +#include "StdAfx.h" + +#include "Common/Defs.h" +#include "OffsetStream.h" + +HRESULT COffsetOutStream::Init(IOutStream *stream, UInt64 offset) +{ + _offset = offset; + _stream = stream; + return _stream->Seek(offset, STREAM_SEEK_SET, NULL); +} + +STDMETHODIMP COffsetOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + return _stream->Write(data, size, processedSize); +} + +STDMETHODIMP COffsetOutStream::Seek(Int64 offset, UInt32 seekOrigin, + UInt64 *newPosition) +{ + UInt64 absoluteNewPosition; + if (seekOrigin == STREAM_SEEK_SET) + offset += _offset; + HRESULT result = _stream->Seek(offset, seekOrigin, &absoluteNewPosition); + if (newPosition != NULL) + *newPosition = absoluteNewPosition - _offset; + return result; +} + +STDMETHODIMP COffsetOutStream::SetSize(Int64 newSize) +{ + return _stream->SetSize(_offset + newSize); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/OffsetStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/OffsetStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,25 @@ +// OffsetStream.h + +#ifndef __OFFSETSTREAM_H +#define __OFFSETSTREAM_H + +#include "Common/MyCom.h" +#include "../IStream.h" + +class COffsetOutStream: + public IOutStream, + public CMyUnknownImp +{ + UInt64 _offset; + CMyComPtr _stream; +public: + HRESULT Init(IOutStream *stream, UInt64 offset); + + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(SetSize)(Int64 newSize); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/OutBuffer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/OutBuffer.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,119 @@ +// OutByte.cpp + +#include "StdAfx.h" + +#include "OutBuffer.h" + +extern "C" +{ + #include "../../../C/Alloc.h" +} + +bool COutBuffer::Create(UInt32 bufferSize) +{ + const UInt32 kMinBlockSize = 1; + if (bufferSize < kMinBlockSize) + bufferSize = kMinBlockSize; + if (_buffer != 0 && _bufferSize == bufferSize) + return true; + Free(); + _bufferSize = bufferSize; + _buffer = (Byte *)::MidAlloc(bufferSize); + return (_buffer != 0); +} + +void COutBuffer::Free() +{ + ::MidFree(_buffer); + _buffer = 0; +} + +void COutBuffer::SetStream(ISequentialOutStream *stream) +{ + _stream = stream; +} + +void COutBuffer::Init() +{ + _streamPos = 0; + _limitPos = _bufferSize; + _pos = 0; + _processedSize = 0; + _overDict = false; + #ifdef _NO_EXCEPTIONS + ErrorCode = S_OK; + #endif +} + +UInt64 COutBuffer::GetProcessedSize() const +{ + UInt64 res = _processedSize + _pos - _streamPos; + if (_streamPos > _pos) + res += _bufferSize; + return res; +} + + +HRESULT COutBuffer::FlushPart() +{ + // _streamPos < _bufferSize + UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos); + HRESULT result = S_OK; + #ifdef _NO_EXCEPTIONS + result = ErrorCode; + #endif + if (_buffer2 != 0) + { + memmove(_buffer2, _buffer + _streamPos, size); + _buffer2 += size; + } + + if (_stream != 0 + #ifdef _NO_EXCEPTIONS + && (ErrorCode == S_OK) + #endif + ) + { + UInt32 processedSize = 0; + result = _stream->Write(_buffer + _streamPos, size, &processedSize); + size = processedSize; + } + _streamPos += size; + if (_streamPos == _bufferSize) + _streamPos = 0; + if (_pos == _bufferSize) + { + _overDict = true; + _pos = 0; + } + _limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize; + _processedSize += size; + return result; +} + +HRESULT COutBuffer::Flush() +{ + #ifdef _NO_EXCEPTIONS + if (ErrorCode != S_OK) + return ErrorCode; + #endif + + while(_streamPos != _pos) + { + HRESULT result = FlushPart(); + if (result != S_OK) + return result; + } + return S_OK; +} + +void COutBuffer::FlushWithCheck() +{ + HRESULT result = Flush(); + #ifdef _NO_EXCEPTIONS + ErrorCode = result; + #else + if (result != S_OK) + throw COutBufferException(result); + #endif +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/OutBuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/OutBuffer.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,64 @@ +// OutBuffer.h + +#ifndef __OUTBUFFER_H +#define __OUTBUFFER_H + +#include "../IStream.h" +#include "../../Common/MyCom.h" +#include "../../Common/MyException.h" + +#ifndef _NO_EXCEPTIONS +struct COutBufferException: public CSystemException +{ + COutBufferException(HRESULT errorCode): CSystemException(errorCode) {} +}; +#endif + +class COutBuffer +{ +protected: + Byte *_buffer; + UInt32 _pos; + UInt32 _limitPos; + UInt32 _streamPos; + UInt32 _bufferSize; + CMyComPtr _stream; + UInt64 _processedSize; + Byte *_buffer2; + bool _overDict; + + HRESULT FlushPart(); +public: + #ifdef _NO_EXCEPTIONS + HRESULT ErrorCode; + #endif + + COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {} + ~COutBuffer() { Free(); } + + bool Create(UInt32 bufferSize); + void Free(); + + void SetMemStream(Byte *buffer) { _buffer2 = buffer; } + void SetStream(ISequentialOutStream *stream); + void Init(); + HRESULT Flush(); + void FlushWithCheck(); + void ReleaseStream() { _stream.Release(); } + + void WriteByte(Byte b) + { + _buffer[_pos++] = b; + if(_pos == _limitPos) + FlushWithCheck(); + } + void WriteBytes(const void *data, size_t size) + { + for (size_t i = 0; i < size; i++) + WriteByte(((const Byte *)data)[i]); + } + + UInt64 GetProcessedSize() const; +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/ProgressUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/ProgressUtils.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,42 @@ +// ProgressUtils.h + +#include "StdAfx.h" + +#include "ProgressUtils.h" + +CLocalProgress::CLocalProgress() +{ + ProgressOffset = InSize = OutSize = 0; + SendRatio = SendProgress = true; +} + +void CLocalProgress::Init(IProgress *progress, bool inSizeIsMain) +{ + _ratioProgress.Release(); + _progress = progress; + _progress.QueryInterface(IID_ICompressProgressInfo, &_ratioProgress); + _inSizeIsMain = inSizeIsMain; +} + +STDMETHODIMP CLocalProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) +{ + UInt64 inSizeNew = InSize, outSizeNew = OutSize; + if (inSize) + inSizeNew += (*inSize); + if (outSize) + outSizeNew += (*outSize); + if (SendRatio && _ratioProgress) + { + RINOK(_ratioProgress->SetRatioInfo(&inSizeNew, &outSizeNew)); + } + inSizeNew += ProgressOffset; + outSizeNew += ProgressOffset; + if (SendProgress) + return _progress->SetCompleted(_inSizeIsMain ? &inSizeNew : &outSizeNew); + return S_OK; +} + +HRESULT CLocalProgress::SetCur() +{ + return SetRatioInfo(NULL, NULL); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/ProgressUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/ProgressUtils.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,34 @@ +// ProgressUtils.h + +#ifndef __PROGRESSUTILS_H +#define __PROGRESSUTILS_H + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" +#include "../IProgress.h" + +class CLocalProgress: + public ICompressProgressInfo, + public CMyUnknownImp +{ + CMyComPtr _progress; + CMyComPtr _ratioProgress; + bool _inSizeIsMain; +public: + UInt64 ProgressOffset; + UInt64 InSize; + UInt64 OutSize; + bool SendRatio; + bool SendProgress; + + CLocalProgress(); + void Init(IProgress *progress, bool inSizeIsMain); + HRESULT SetCur(); + + MY_UNKNOWN_IMP + + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/RegisterArc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/RegisterArc.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,36 @@ +// RegisterArc.h + +#ifndef __REGISTERARC_H +#define __REGISTERARC_H + +#include "../Archive/IArchive.h" + +typedef IInArchive * (*CreateInArchiveP)(); +typedef IOutArchive * (*CreateOutArchiveP)(); + +struct CArcInfo +{ + const wchar_t *Name; + const wchar_t *Ext; + const wchar_t *AddExt; + Byte ClassId; + Byte Signature[16]; + int SignatureSize; + bool KeepName; + CreateInArchiveP CreateInArchive; + CreateOutArchiveP CreateOutArchive; +}; + +void RegisterArc(const CArcInfo *arcInfo); + +#define REGISTER_ARC_NAME(x) CRegister ## x + +#define REGISTER_ARC_DEC_SIG(x) struct REGISTER_ARC_NAME(x) { \ + REGISTER_ARC_NAME(x)() { g_ArcInfo.Signature[0]--; RegisterArc(&g_ArcInfo); }}; \ + static REGISTER_ARC_NAME(x) g_RegisterArc; + +#define REGISTER_ARC(x) struct REGISTER_ARC_NAME(x) { \ + REGISTER_ARC_NAME(x)() { RegisterArc(&g_ArcInfo); }}; \ + static REGISTER_ARC_NAME(x) g_RegisterArc; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/RegisterCodec.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/RegisterCodec.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,33 @@ +// RegisterCodec.h + +#ifndef __REGISTERCODEC_H +#define __REGISTERCODEC_H + +#include "../Common/MethodId.h" + +typedef void * (*CreateCodecP)(); +struct CCodecInfo +{ + CreateCodecP CreateDecoder; + CreateCodecP CreateEncoder; + CMethodId Id; + const wchar_t *Name; + UInt32 NumInStreams; + bool IsFilter; +}; + +void RegisterCodec(const CCodecInfo *codecInfo); + +#define REGISTER_CODEC_NAME(x) CRegisterCodec ## x + +#define REGISTER_CODEC(x) struct REGISTER_CODEC_NAME(x) { \ + REGISTER_CODEC_NAME(x)() { RegisterCodec(&g_CodecInfo); }}; \ + static REGISTER_CODEC_NAME(x) g_RegisterCodec; + +#define REGISTER_CODECS_NAME(x) CRegisterCodecs ## x +#define REGISTER_CODECS(x) struct REGISTER_CODECS_NAME(x) { \ + REGISTER_CODECS_NAME(x)() { for (int i = 0; i < sizeof(g_CodecsInfo) / sizeof(g_CodecsInfo[0]); i++) \ + RegisterCodec(&g_CodecsInfo[i]); }}; \ + static REGISTER_CODECS_NAME(x) g_RegisterCodecs; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../Common/MyWindows.h" +#include "../../Common/NewHandler.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/StreamBinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/StreamBinder.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,150 @@ +// StreamBinder.cpp + +#include "StdAfx.h" + +#include "StreamBinder.h" +#include "../../Common/Defs.h" +#include "../../Common/MyCom.h" + +using namespace NWindows; +using namespace NSynchronization; + +class CSequentialInStreamForBinder: + public ISequentialInStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +private: + CStreamBinder *m_StreamBinder; +public: + ~CSequentialInStreamForBinder() { m_StreamBinder->CloseRead(); } + void SetBinder(CStreamBinder *streamBinder) { m_StreamBinder = streamBinder; } +}; + +STDMETHODIMP CSequentialInStreamForBinder::Read(void *data, UInt32 size, UInt32 *processedSize) + { return m_StreamBinder->Read(data, size, processedSize); } + +class CSequentialOutStreamForBinder: + public ISequentialOutStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + +private: + CStreamBinder *m_StreamBinder; +public: + ~CSequentialOutStreamForBinder() { m_StreamBinder->CloseWrite(); } + void SetBinder(CStreamBinder *streamBinder) { m_StreamBinder = streamBinder; } +}; + +STDMETHODIMP CSequentialOutStreamForBinder::Write(const void *data, UInt32 size, UInt32 *processedSize) + { return m_StreamBinder->Write(data, size, processedSize); } + + +////////////////////////// +// CStreamBinder +// (_thereAreBytesToReadEvent && _bufferSize == 0) means that stream is finished. + +HRes CStreamBinder::CreateEvents() +{ + RINOK(_allBytesAreWritenEvent.Create(true)); + RINOK(_thereAreBytesToReadEvent.Create()); + return _readStreamIsClosedEvent.Create(); +} + +void CStreamBinder::ReInit() +{ + _thereAreBytesToReadEvent.Reset(); + _readStreamIsClosedEvent.Reset(); + ProcessedSize = 0; +} + + + +void CStreamBinder::CreateStreams(ISequentialInStream **inStream, + ISequentialOutStream **outStream) +{ + CSequentialInStreamForBinder *inStreamSpec = new + CSequentialInStreamForBinder; + CMyComPtr inStreamLoc(inStreamSpec); + inStreamSpec->SetBinder(this); + *inStream = inStreamLoc.Detach(); + + CSequentialOutStreamForBinder *outStreamSpec = new + CSequentialOutStreamForBinder; + CMyComPtr outStreamLoc(outStreamSpec); + outStreamSpec->SetBinder(this); + *outStream = outStreamLoc.Detach(); + + _buffer = NULL; + _bufferSize= 0; + ProcessedSize = 0; +} + +HRESULT CStreamBinder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 sizeToRead = size; + if (size > 0) + { + RINOK(_thereAreBytesToReadEvent.Lock()); + sizeToRead = MyMin(_bufferSize, size); + if (_bufferSize > 0) + { + MoveMemory(data, _buffer, sizeToRead); + _buffer = ((const Byte *)_buffer) + sizeToRead; + _bufferSize -= sizeToRead; + if (_bufferSize == 0) + { + _thereAreBytesToReadEvent.Reset(); + _allBytesAreWritenEvent.Set(); + } + } + } + if (processedSize != NULL) + *processedSize = sizeToRead; + ProcessedSize += sizeToRead; + return S_OK; +} + +void CStreamBinder::CloseRead() +{ + _readStreamIsClosedEvent.Set(); +} + +HRESULT CStreamBinder::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (size > 0) + { + _buffer = data; + _bufferSize = size; + _allBytesAreWritenEvent.Reset(); + _thereAreBytesToReadEvent.Set(); + + HANDLE events[2]; + events[0] = _allBytesAreWritenEvent; + events[1] = _readStreamIsClosedEvent; + DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE); + if (waitResult != WAIT_OBJECT_0 + 0) + { + // ReadingWasClosed = true; + return S_FALSE; + } + // if(!_allBytesAreWritenEvent.Lock()) + // return E_FAIL; + } + if (processedSize != NULL) + *processedSize = size; + return S_OK; +} + +void CStreamBinder::CloseWrite() +{ + // _bufferSize must be = 0 + _thereAreBytesToReadEvent.Set(); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/StreamBinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/StreamBinder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,32 @@ +// StreamBinder.h + +#ifndef __STREAMBINDER_H +#define __STREAMBINDER_H + +#include "../IStream.h" +#include "../../Windows/Synchronization.h" + +class CStreamBinder +{ + NWindows::NSynchronization::CManualResetEvent _allBytesAreWritenEvent; + NWindows::NSynchronization::CManualResetEvent _thereAreBytesToReadEvent; + NWindows::NSynchronization::CManualResetEvent _readStreamIsClosedEvent; + UInt32 _bufferSize; + const void *_buffer; +public: + // bool ReadingWasClosed; + UInt64 ProcessedSize; + CStreamBinder() {} + HRes CreateEvents(); + + void CreateStreams(ISequentialInStream **inStream, + ISequentialOutStream **outStream); + HRESULT Read(void *data, UInt32 size, UInt32 *processedSize); + void CloseRead(); + + HRESULT Write(const void *data, UInt32 size, UInt32 *processedSize); + void CloseWrite(); + void ReInit(); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/StreamObjects.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/StreamObjects.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,68 @@ +// StreamObjects.cpp + +#include "StdAfx.h" + +#include "StreamObjects.h" +#include "../../Common/Defs.h" + + +STDMETHODIMP CSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 numBytesToRead = (UInt32)(MyMin(_pos + size, _size) - _pos); + memmove(data, _dataPointer + _pos, numBytesToRead); + _pos += numBytesToRead; + if(processedSize != NULL) + *processedSize = numBytesToRead; + return S_OK; +} + + +void CWriteBuffer::Write(const void *data, size_t size) +{ + size_t newCapacity = _size + size; + _buffer.EnsureCapacity(newCapacity); + memmove(_buffer + _size, data, size); + _size += size; +} + +STDMETHODIMP CSequentialOutStreamImp::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + _writeBuffer.Write(data, size); + if(processedSize != NULL) + *processedSize = size; + return S_OK; +} + +STDMETHODIMP CSequentialOutStreamImp2::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 newSize = size; + if (_pos + size > _size) + newSize = (UInt32)(_size - _pos); + memmove(_buffer + _pos, data, newSize); + if(processedSize != NULL) + *processedSize = newSize; + _pos += newSize; + if (newSize != size) + return E_FAIL; + return S_OK; +} + +STDMETHODIMP CSequentialInStreamSizeCount::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result = _stream->Read(data, size, &realProcessedSize); + _size += realProcessedSize; + if (processedSize != 0) + *processedSize = realProcessedSize; + return result; +} + +STDMETHODIMP CSequentialOutStreamSizeCount::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result = _stream->Write(data, size, &realProcessedSize); + _size += realProcessedSize; + if (processedSize != 0) + *processedSize = realProcessedSize; + return result; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/StreamObjects.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/StreamObjects.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,117 @@ +// StreamObjects.h + +#ifndef __STREAMOBJECTS_H +#define __STREAMOBJECTS_H + +#include "../../Common/DynamicBuffer.h" +#include "../../Common/MyCom.h" +#include "../IStream.h" + +class CSequentialInStreamImp: + public ISequentialInStream, + public CMyUnknownImp +{ + const Byte *_dataPointer; + size_t _size; + size_t _pos; + +public: + void Init(const Byte *dataPointer, size_t size) + { + _dataPointer = dataPointer; + _size = size; + _pos = 0; + } + + MY_UNKNOWN_IMP + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + + +class CWriteBuffer +{ + CByteDynamicBuffer _buffer; + size_t _size; +public: + CWriteBuffer(): _size(0) {} + void Init() { _size = 0; } + void Write(const void *data, size_t size); + size_t GetSize() const { return _size; } + const CByteDynamicBuffer& GetBuffer() const { return _buffer; } +}; + +class CSequentialOutStreamImp: + public ISequentialOutStream, + public CMyUnknownImp +{ + CWriteBuffer _writeBuffer; +public: + void Init() { _writeBuffer.Init(); } + size_t GetSize() const { return _writeBuffer.GetSize(); } + const CByteDynamicBuffer& GetBuffer() const { return _writeBuffer.GetBuffer(); } + + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +class CSequentialOutStreamImp2: + public ISequentialOutStream, + public CMyUnknownImp +{ + Byte *_buffer; + size_t _size; + size_t _pos; +public: + + void Init(Byte *buffer, size_t size) + { + _buffer = buffer; + _pos = 0; + _size = size; + } + + size_t GetPos() const { return _pos; } + + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +class CSequentialInStreamSizeCount: + public ISequentialInStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; +public: + void Init(ISequentialInStream *stream) + { + _stream = stream; + _size = 0; + } + UInt64 GetSize() const { return _size; } + + MY_UNKNOWN_IMP + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + +class CSequentialOutStreamSizeCount: + public ISequentialOutStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; +public: + void SetStream(ISequentialOutStream *stream) { _stream = stream; } + void Init() { _size = 0; } + UInt64 GetSize() const { return _size; } + + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/StreamUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/StreamUtils.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,44 @@ +// StreamUtils.cpp + +#include "StdAfx.h" + +#include "../../Common/MyCom.h" +#include "StreamUtils.h" + +HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize != 0) + *processedSize = 0; + while(size != 0) + { + UInt32 processedSizeLoc; + HRESULT res = stream->Read(data, size, &processedSizeLoc); + if (processedSize != 0) + *processedSize += processedSizeLoc; + data = (Byte *)((Byte *)data + processedSizeLoc); + size -= processedSizeLoc; + RINOK(res); + if (processedSizeLoc == 0) + return S_OK; + } + return S_OK; +} + +HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize != 0) + *processedSize = 0; + while(size != 0) + { + UInt32 processedSizeLoc; + HRESULT res = stream->Write(data, size, &processedSizeLoc); + if (processedSize != 0) + *processedSize += processedSizeLoc; + data = (const void *)((const Byte *)data + processedSizeLoc); + size -= processedSizeLoc; + RINOK(res); + if (processedSizeLoc == 0) + return E_FAIL; + } + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/StreamUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/StreamUtils.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,11 @@ +// StreamUtils.h + +#ifndef __STREAMUTILS_H +#define __STREAMUTILS_H + +#include "../IStream.h" + +HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize); +HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/VirtThread.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/VirtThread.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,45 @@ +// VirtThread.cpp + +#include "StdAfx.h" + +#include "VirtThread.h" + +static THREAD_FUNC_DECL CoderThread(void *p) +{ + for (;;) + { + CVirtThread *t = (CVirtThread *)p; + t->StartEvent.Lock(); + if (t->ExitEvent) + return 0; + t->Execute(); + t->FinishedEvent.Set(); + } +} + +HRes CVirtThread::Create() +{ + RINOK(StartEvent.CreateIfNotCreated()); + RINOK(FinishedEvent.CreateIfNotCreated()); + StartEvent.Reset(); + FinishedEvent.Reset(); + ExitEvent = false; + if (Thread.IsCreated()) + return S_OK; + return Thread.Create(CoderThread, this); +} + +void CVirtThread::Start() +{ + ExitEvent = false; + StartEvent.Set(); +} + +CVirtThread::~CVirtThread() +{ + ExitEvent = true; + if (StartEvent.IsCreated()) + StartEvent.Set(); + Thread.Wait(); +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Common/VirtThread.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Common/VirtThread.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,23 @@ +// VirtThread.h + +#ifndef __VIRTTHREAD_H +#define __VIRTTHREAD_H + +#include "../../Windows/Synchronization.h" +#include "../../Windows/Thread.h" + +struct CVirtThread +{ + NWindows::NSynchronization::CAutoResetEvent StartEvent; + NWindows::NSynchronization::CAutoResetEvent FinishedEvent; + NWindows::CThread Thread; + bool ExitEvent; + + ~CVirtThread(); + HRes Create(); + void Start(); + void WaitFinish() { FinishedEvent.Lock(); } + virtual void Execute() = 0; +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/ARM.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/ARM.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,19 @@ +// ARM.cpp + +#include "StdAfx.h" +#include "ARM.h" + +extern "C" +{ +#include "../../../../C/Compress/Branch/BranchARM.h" +} + +UInt32 CBC_ARM_Encoder::SubFilter(Byte *data, UInt32 size) +{ + return ::ARM_Convert(data, size, _bufferPos, 1); +} + +UInt32 CBC_ARM_Decoder::SubFilter(Byte *data, UInt32 size) +{ + return ::ARM_Convert(data, size, _bufferPos, 0); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/ARM.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/ARM.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// ARM.h + +#ifndef __ARM_H +#define __ARM_H + +#include "BranchCoder.h" + +MyClassA(BC_ARM, 0x05, 1) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/ARMThumb.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/ARMThumb.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,20 @@ +// ARMThumb.cpp + +#include "StdAfx.h" + +#include "ARMThumb.h" + +extern "C" +{ +#include "../../../../C/Compress/Branch/BranchARMThumb.h" +} + +UInt32 CBC_ARMThumb_Encoder::SubFilter(Byte *data, UInt32 size) +{ + return ::ARMThumb_Convert(data, size, _bufferPos, 1); +} + +UInt32 CBC_ARMThumb_Decoder::SubFilter(Byte *data, UInt32 size) +{ + return ::ARMThumb_Convert(data, size, _bufferPos, 0); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/ARMThumb.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/ARMThumb.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// ARMThumb.h + +#ifndef __ARMTHUMB_H +#define __ARMTHUMB_H + +#include "BranchCoder.h" + +MyClassA(BC_ARMThumb, 0x07, 1) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BCJ2Register.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BCJ2Register.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,18 @@ +// BranchRegister.cpp + +#include "StdAfx.h" + +#include "../../Common/RegisterCodec.h" + +#include "x86_2.h" +static void *CreateCodec() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CDecoder()); } +#ifndef EXTRACT_ONLY +static void *CreateCodecOut() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CEncoder()); } +#else +#define CreateCodecOut 0 +#endif + +static CCodecInfo g_CodecInfo = + { CreateCodec, CreateCodecOut, 0x0303011B, L"BCJ2", 4, false }; + +REGISTER_CODEC(BCJ2) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BCJRegister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BCJRegister.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,18 @@ +// BranchRegister.cpp + +#include "StdAfx.h" + +#include "../../Common/RegisterCodec.h" + +#include "x86.h" +static void *CreateCodec() { return (void *)(ICompressFilter *)(new CBCJ_x86_Decoder()); } +#ifndef EXTRACT_ONLY +static void *CreateCodecOut() { return (void *)(ICompressFilter *)(new CBCJ_x86_Encoder()); } +#else +#define CreateCodecOut 0 +#endif + +static CCodecInfo g_CodecInfo = + { CreateCodec, CreateCodecOut, 0x03030103, L"BCJ", 1, true }; + +REGISTER_CODEC(BCJ) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BranchCoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BranchCoder.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,18 @@ +// BranchCoder.cpp + +#include "StdAfx.h" +#include "BranchCoder.h" + +STDMETHODIMP CBranchConverter::Init() +{ + _bufferPos = 0; + SubInit(); + return S_OK; +} + +STDMETHODIMP_(UInt32) CBranchConverter::Filter(Byte *data, UInt32 size) +{ + UInt32 processedSize = SubFilter(data, size); + _bufferPos += processedSize; + return processedSize; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BranchCoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BranchCoder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,45 @@ +// BranchCoder.h + +#ifndef __BRANCH_CODER_H +#define __BRANCH_CODER_H + +#include "Common/MyCom.h" +#include "Common/Types.h" + +#include "../../ICoder.h" + +class CBranchConverter: + public ICompressFilter, + public CMyUnknownImp +{ +protected: + UInt32 _bufferPos; + virtual void SubInit() {} + virtual UInt32 SubFilter(Byte *data, UInt32 size) = 0; +public: + MY_UNKNOWN_IMP; + STDMETHOD(Init)(); + STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); +}; + +#define MyClassEncoderA(Name) class C ## Name: public CBranchConverter \ + { public: UInt32 SubFilter(Byte *data, UInt32 size); }; + +#define MyClassDecoderA(Name) class C ## Name: public CBranchConverter \ + { public: UInt32 SubFilter(Byte *data, UInt32 size); }; + +#define MyClassEncoderB(Name, ADD_ITEMS, ADD_INIT) class C ## Name: public CBranchConverter, public ADD_ITEMS \ + { public: UInt32 SubFilter(Byte *data, UInt32 size); ADD_INIT}; + +#define MyClassDecoderB(Name, ADD_ITEMS, ADD_INIT) class C ## Name: public CBranchConverter, public ADD_ITEMS \ + { public: UInt32 SubFilter(Byte *data, UInt32 size); ADD_INIT}; + +#define MyClassA(Name, id, subId) \ +MyClassEncoderA(Name ## _Encoder) \ +MyClassDecoderA(Name ## _Decoder) + +#define MyClassB(Name, id, subId, ADD_ITEMS, ADD_INIT) \ +MyClassEncoderB(Name ## _Encoder, ADD_ITEMS, ADD_INIT) \ +MyClassDecoderB(Name ## _Decoder, ADD_ITEMS, ADD_INIT) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BranchRegister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/BranchRegister.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,34 @@ +// BranchRegister.cpp + +#include "StdAfx.h" + +#include "../../Common/RegisterCodec.h" + +#include "PPC.h" +#include "IA64.h" +#include "ARM.h" +#include "ARMThumb.h" +#include "SPARC.h" + +#define CREATE_CODEC(x) \ + static void *CreateCodec ## x() { return (void *)(ICompressFilter *)(new C ## x ## _Decoder); } \ + static void *CreateCodec ## x ## Out() { return (void *)(ICompressFilter *)(new C ## x ## _Encoder); } + +CREATE_CODEC(BC_PPC_B) +CREATE_CODEC(BC_IA64) +CREATE_CODEC(BC_ARM) +CREATE_CODEC(BC_ARMThumb) +CREATE_CODEC(BC_SPARC) + +#define METHOD_ITEM(x, id1, id2, name) { CreateCodec ## x, CreateCodec ## x ## Out, 0x03030000 + (id1 * 256) + id2, name, 1, true } + +static CCodecInfo g_CodecsInfo[] = +{ + METHOD_ITEM(BC_PPC_B, 0x02, 0x05, L"BC_PPC_B"), + METHOD_ITEM(BC_IA64, 0x04, 1, L"BC_IA64"), + METHOD_ITEM(BC_ARM, 0x05, 1, L"BC_ARM"), + METHOD_ITEM(BC_ARMThumb,0x07, 1, L"BC_ARMThumb"), + METHOD_ITEM(BC_SPARC, 0x08, 0x05, L"BC_SPARC") +}; + +REGISTER_CODECS(Branch) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/IA64.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/IA64.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,19 @@ +// IA64.cpp + +#include "StdAfx.h" +#include "IA64.h" + +extern "C" +{ +#include "../../../../C/Compress/Branch/BranchIA64.h" +} + +UInt32 CBC_IA64_Encoder::SubFilter(Byte *data, UInt32 size) +{ + return ::IA64_Convert(data, size, _bufferPos, 1); +} + +UInt32 CBC_IA64_Decoder::SubFilter(Byte *data, UInt32 size) +{ + return ::IA64_Convert(data, size, _bufferPos, 0); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/IA64.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/IA64.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// IA64.h + +#ifndef __IA64_H +#define __IA64_H + +#include "BranchCoder.h" + +MyClassA(BC_IA64, 0x04, 1) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/PPC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/PPC.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,19 @@ +// PPC.cpp + +#include "StdAfx.h" +#include "PPC.h" + +extern "C" +{ +#include "../../../../C/Compress/Branch/BranchPPC.h" +} + +UInt32 CBC_PPC_B_Encoder::SubFilter(Byte *data, UInt32 size) +{ + return ::PPC_B_Convert(data, size, _bufferPos, 1); +} + +UInt32 CBC_PPC_B_Decoder::SubFilter(Byte *data, UInt32 size) +{ + return ::PPC_B_Convert(data, size, _bufferPos, 0); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/PPC.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/PPC.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// PPC.h + +#ifndef __PPC_H +#define __PPC_H + +#include "BranchCoder.h" + +MyClassA(BC_PPC_B, 0x02, 5) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/SPARC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/SPARC.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,19 @@ +// SPARC.cpp + +#include "StdAfx.h" +#include "SPARC.h" + +extern "C" +{ +#include "../../../../C/Compress/Branch/BranchSPARC.h" +} + +UInt32 CBC_SPARC_Encoder::SubFilter(Byte *data, UInt32 size) +{ + return ::SPARC_Convert(data, size, _bufferPos, 1); +} + +UInt32 CBC_SPARC_Decoder::SubFilter(Byte *data, UInt32 size) +{ + return ::SPARC_Convert(data, size, _bufferPos, 0); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/SPARC.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/SPARC.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// SPARC.h + +#ifndef __SPARC_H +#define __SPARC_H + +#include "BranchCoder.h" + +MyClassA(BC_SPARC, 0x08, 5) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,8 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/x86.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/x86.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,14 @@ +// x86.cpp + +#include "StdAfx.h" +#include "x86.h" + +UInt32 CBCJ_x86_Encoder::SubFilter(Byte *data, UInt32 size) +{ + return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 1); +} + +UInt32 CBCJ_x86_Decoder::SubFilter(Byte *data, UInt32 size) +{ + return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 0); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/x86.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/x86.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,21 @@ +// x86.h + +#ifndef __X86_H +#define __X86_H + +#include "BranchCoder.h" +extern "C" +{ +#include "../../../../C/Compress/Branch/BranchX86.h" +} + +struct CBranch86 +{ + UInt32 _prevMask; + void x86Init() { x86_Convert_Init(_prevMask); } +}; + +MyClassB(BCJ_x86, 0x01, 3, CBranch86 , + virtual void SubInit() { x86Init(); }) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/x86_2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/x86_2.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,392 @@ +// x86_2.cpp + +#include "StdAfx.h" +#include "x86_2.h" + +extern "C" +{ +#include "../../../../C/Alloc.h" +} + +namespace NCompress { +namespace NBcj2 { + +inline bool IsJcc(Byte b0, Byte b1) { return (b0 == 0x0F && (b1 & 0xF0) == 0x80); } +inline bool IsJ(Byte b0, Byte b1) { return ((b1 & 0xFE) == 0xE8 || IsJcc(b0, b1)); } +inline unsigned GetIndex(Byte b0, Byte b1) { return ((b1 == 0xE8) ? b0 : ((b1 == 0xE9) ? 256 : 257)); } + +#ifndef EXTRACT_ONLY + +static const int kBufferSize = 1 << 17; + +static bool inline Test86MSByte(Byte b) +{ + return (b == 0 || b == 0xFF); +} + +bool CEncoder::Create() +{ + if (!_mainStream.Create(1 << 16)) + return false; + if (!_callStream.Create(1 << 20)) + return false; + if (!_jumpStream.Create(1 << 20)) + return false; + if (!_rangeEncoder.Create(1 << 20)) + return false; + if (_buffer == 0) + { + _buffer = (Byte *)MidAlloc(kBufferSize); + if (_buffer == 0) + return false; + } + return true; +} + +CEncoder::~CEncoder() +{ + ::MidFree(_buffer); +} + +HRESULT CEncoder::Flush() +{ + RINOK(_mainStream.Flush()); + RINOK(_callStream.Flush()); + RINOK(_jumpStream.Flush()); + _rangeEncoder.FlushData(); + return _rangeEncoder.FlushStream(); +} + +const UInt32 kDefaultLimit = (1 << 24); + +HRESULT CEncoder::CodeReal(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 ** /* outSizes */, + UInt32 numOutStreams, + ICompressProgressInfo *progress) +{ + if (numInStreams != 1 || numOutStreams != 4) + return E_INVALIDARG; + + if (!Create()) + return E_OUTOFMEMORY; + + bool sizeIsDefined = false; + UInt64 inSize = 0; + if (inSizes != NULL) + if (inSizes[0] != NULL) + { + inSize = *inSizes[0]; + if (inSize <= kDefaultLimit) + sizeIsDefined = true; + } + + ISequentialInStream *inStream = inStreams[0]; + + _mainStream.SetStream(outStreams[0]); + _mainStream.Init(); + _callStream.SetStream(outStreams[1]); + _callStream.Init(); + _jumpStream.SetStream(outStreams[2]); + _jumpStream.Init(); + _rangeEncoder.SetStream(outStreams[3]); + _rangeEncoder.Init(); + for (int i = 0; i < 256 + 2; i++) + _statusEncoder[i].Init(); + CCoderReleaser releaser(this); + + CMyComPtr getSubStreamSize; + { + inStream->QueryInterface(IID_ICompressGetSubStreamSize, (void **)&getSubStreamSize); + } + + UInt32 nowPos = 0; + UInt64 nowPos64 = 0; + UInt32 bufferPos = 0; + + Byte prevByte = 0; + + UInt64 subStreamIndex = 0; + UInt64 subStreamStartPos = 0; + UInt64 subStreamEndPos = 0; + + for (;;) + { + UInt32 processedSize = 0; + for (;;) + { + UInt32 size = kBufferSize - (bufferPos + processedSize); + UInt32 processedSizeLoc; + if (size == 0) + break; + RINOK(inStream->Read(_buffer + bufferPos + processedSize, size, &processedSizeLoc)); + if (processedSizeLoc == 0) + break; + processedSize += processedSizeLoc; + } + UInt32 endPos = bufferPos + processedSize; + + if (endPos < 5) + { + // change it + for (bufferPos = 0; bufferPos < endPos; bufferPos++) + { + Byte b = _buffer[bufferPos]; + _mainStream.WriteByte(b); + UInt32 index; + if (b == 0xE8) + index = prevByte; + else if (b == 0xE9) + index = 256; + else if (IsJcc(prevByte, b)) + index = 257; + else + { + prevByte = b; + continue; + } + _statusEncoder[index].Encode(&_rangeEncoder, 0); + prevByte = b; + } + return Flush(); + } + + bufferPos = 0; + + UInt32 limit = endPos - 5; + while(bufferPos <= limit) + { + Byte b = _buffer[bufferPos]; + _mainStream.WriteByte(b); + if (!IsJ(prevByte, b)) + { + bufferPos++; + prevByte = b; + continue; + } + Byte nextByte = _buffer[bufferPos + 4]; + UInt32 src = + (UInt32(nextByte) << 24) | + (UInt32(_buffer[bufferPos + 3]) << 16) | + (UInt32(_buffer[bufferPos + 2]) << 8) | + (_buffer[bufferPos + 1]); + UInt32 dest = (nowPos + bufferPos + 5) + src; + // if (Test86MSByte(nextByte)) + bool convert; + if (getSubStreamSize != NULL) + { + UInt64 currentPos = (nowPos64 + bufferPos); + while (subStreamEndPos < currentPos) + { + UInt64 subStreamSize; + HRESULT result = getSubStreamSize->GetSubStreamSize(subStreamIndex, &subStreamSize); + if (result == S_OK) + { + subStreamStartPos = subStreamEndPos; + subStreamEndPos += subStreamSize; + subStreamIndex++; + } + else if (result == S_FALSE || result == E_NOTIMPL) + { + getSubStreamSize.Release(); + subStreamStartPos = 0; + subStreamEndPos = subStreamStartPos - 1; + } + else + return result; + } + if (getSubStreamSize == NULL) + { + if (sizeIsDefined) + convert = (dest < inSize); + else + convert = Test86MSByte(nextByte); + } + else if (subStreamEndPos - subStreamStartPos > kDefaultLimit) + convert = Test86MSByte(nextByte); + else + { + UInt64 dest64 = (currentPos + 5) + Int64(Int32(src)); + convert = (dest64 >= subStreamStartPos && dest64 < subStreamEndPos); + } + } + else if (sizeIsDefined) + convert = (dest < inSize); + else + convert = Test86MSByte(nextByte); + unsigned index = GetIndex(prevByte, b); + if (convert) + { + _statusEncoder[index].Encode(&_rangeEncoder, 1); + bufferPos += 5; + COutBuffer &s = (b == 0xE8) ? _callStream : _jumpStream; + for (int i = 24; i >= 0; i -= 8) + s.WriteByte((Byte)(dest >> i)); + prevByte = nextByte; + } + else + { + _statusEncoder[index].Encode(&_rangeEncoder, 0); + bufferPos++; + prevByte = b; + } + } + nowPos += bufferPos; + nowPos64 += bufferPos; + + if (progress != NULL) + { + /* + const UInt64 compressedSize = + _mainStream.GetProcessedSize() + + _callStream.GetProcessedSize() + + _jumpStream.GetProcessedSize() + + _rangeEncoder.GetProcessedSize(); + */ + RINOK(progress->SetRatioInfo(&nowPos64, NULL)); + } + + UInt32 i = 0; + while(bufferPos < endPos) + _buffer[i++] = _buffer[bufferPos++]; + bufferPos = i; + } +} + +STDMETHODIMP CEncoder::Code(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress) +{ + try + { + return CodeReal(inStreams, inSizes, numInStreams, + outStreams, outSizes,numOutStreams, progress); + } + catch(const COutBufferException &e) { return e.ErrorCode; } + catch(...) { return S_FALSE; } +} + +#endif + +HRESULT CDecoder::CodeReal(ISequentialInStream **inStreams, + const UInt64 ** /* inSizes */, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 ** /* outSizes */, + UInt32 numOutStreams, + ICompressProgressInfo *progress) +{ + if (numInStreams != 4 || numOutStreams != 1) + return E_INVALIDARG; + + if (!_mainInStream.Create(1 << 16)) + return E_OUTOFMEMORY; + if (!_callStream.Create(1 << 20)) + return E_OUTOFMEMORY; + if (!_jumpStream.Create(1 << 16)) + return E_OUTOFMEMORY; + if (!_rangeDecoder.Create(1 << 20)) + return E_OUTOFMEMORY; + if (!_outStream.Create(1 << 16)) + return E_OUTOFMEMORY; + + _mainInStream.SetStream(inStreams[0]); + _callStream.SetStream(inStreams[1]); + _jumpStream.SetStream(inStreams[2]); + _rangeDecoder.SetStream(inStreams[3]); + _outStream.SetStream(outStreams[0]); + + _mainInStream.Init(); + _callStream.Init(); + _jumpStream.Init(); + _rangeDecoder.Init(); + _outStream.Init(); + + for (int i = 0; i < 256 + 2; i++) + _statusDecoder[i].Init(); + + CCoderReleaser releaser(this); + + Byte prevByte = 0; + UInt32 processedBytes = 0; + for (;;) + { + if (processedBytes >= (1 << 20) && progress != NULL) + { + /* + const UInt64 compressedSize = + _mainInStream.GetProcessedSize() + + _callStream.GetProcessedSize() + + _jumpStream.GetProcessedSize() + + _rangeDecoder.GetProcessedSize(); + */ + const UInt64 nowPos64 = _outStream.GetProcessedSize(); + RINOK(progress->SetRatioInfo(NULL, &nowPos64)); + processedBytes = 0; + } + UInt32 i; + Byte b = 0; + const UInt32 kBurstSize = (1 << 18); + for (i = 0; i < kBurstSize; i++) + { + if (!_mainInStream.ReadByte(b)) + return Flush(); + _outStream.WriteByte(b); + if (IsJ(prevByte, b)) + break; + prevByte = b; + } + processedBytes += i; + if (i == kBurstSize) + continue; + unsigned index = GetIndex(prevByte, b); + if (_statusDecoder[index].Decode(&_rangeDecoder) == 1) + { + UInt32 src = 0; + CInBuffer &s = (b == 0xE8) ? _callStream : _jumpStream; + for (int i = 0; i < 4; i++) + { + Byte b0; + if(!s.ReadByte(b0)) + return S_FALSE; + src <<= 8; + src |= ((UInt32)b0); + } + UInt32 dest = src - (UInt32(_outStream.GetProcessedSize()) + 4) ; + _outStream.WriteByte((Byte)(dest)); + _outStream.WriteByte((Byte)(dest >> 8)); + _outStream.WriteByte((Byte)(dest >> 16)); + _outStream.WriteByte((Byte)(dest >> 24)); + prevByte = (Byte)(dest >> 24); + processedBytes += 4; + } + else + prevByte = b; + } +} + +STDMETHODIMP CDecoder::Code(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress) +{ + try + { + return CodeReal(inStreams, inSizes, numInStreams, + outStreams, outSizes,numOutStreams, progress); + } + catch(const CInBufferException &e) { return e.ErrorCode; } + catch(const COutBufferException &e) { return e.ErrorCode; } + catch(...) { return S_FALSE; } +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Branch/x86_2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Branch/x86_2.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,123 @@ +// x86_2.h + +#ifndef __BRANCH_X86_2_H +#define __BRANCH_X86_2_H + +#include "../../../Common/MyCom.h" +#include "../RangeCoder/RangeCoderBit.h" +#include "../../ICoder.h" + +namespace NCompress { +namespace NBcj2 { + +const int kNumMoveBits = 5; + +#ifndef EXTRACT_ONLY + +class CEncoder: + public ICompressCoder2, + public CMyUnknownImp +{ + Byte *_buffer; +public: + CEncoder(): _buffer(0) {}; + ~CEncoder(); + bool Create(); + + COutBuffer _mainStream; + COutBuffer _callStream; + COutBuffer _jumpStream; + NCompress::NRangeCoder::CEncoder _rangeEncoder; + NCompress::NRangeCoder::CBitEncoder _statusEncoder[256 + 2]; + + HRESULT Flush(); + void ReleaseStreams() + { + _mainStream.ReleaseStream(); + _callStream.ReleaseStream(); + _jumpStream.ReleaseStream(); + _rangeEncoder.ReleaseStream(); + } + + class CCoderReleaser + { + CEncoder *_coder; + public: + CCoderReleaser(CEncoder *coder): _coder(coder) {} + ~CCoderReleaser() { _coder->ReleaseStreams(); } + }; + +public: + + MY_UNKNOWN_IMP + + HRESULT CodeReal(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress); + STDMETHOD(Code)(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress); +}; + +#endif + +class CDecoder: + public ICompressCoder2, + public CMyUnknownImp +{ +public: + CInBuffer _mainInStream; + CInBuffer _callStream; + CInBuffer _jumpStream; + NCompress::NRangeCoder::CDecoder _rangeDecoder; + NCompress::NRangeCoder::CBitDecoder _statusDecoder[256 + 2]; + + COutBuffer _outStream; + + void ReleaseStreams() + { + _mainInStream.ReleaseStream(); + _callStream.ReleaseStream(); + _jumpStream.ReleaseStream(); + _rangeDecoder.ReleaseStream(); + _outStream.ReleaseStream(); + } + + HRESULT Flush() { return _outStream.Flush(); } + class CCoderReleaser + { + CDecoder *_coder; + public: + CCoderReleaser(CDecoder *coder): _coder(coder) {} + ~CCoderReleaser() { _coder->ReleaseStreams(); } + }; + +public: + MY_UNKNOWN_IMP + HRESULT CodeReal(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress); + STDMETHOD(Code)(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress); +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/ByteSwap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/ByteSwap.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,38 @@ +// ByteSwap.cpp + +#include "StdAfx.h" + +#include "ByteSwap.h" + +STDMETHODIMP CByteSwap2::Init() { return S_OK; } + +STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size) +{ + const UInt32 kStep = 2; + UInt32 i; + for (i = 0; i + kStep <= size; i += kStep) + { + Byte b = data[i]; + data[i] = data[i + 1]; + data[i + 1] = b; + } + return i; +} + +STDMETHODIMP CByteSwap4::Init() { return S_OK; } + +STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size) +{ + const UInt32 kStep = 4; + UInt32 i; + for (i = 0; i + kStep <= size; i += kStep) + { + Byte b0 = data[i]; + Byte b1 = data[i + 1]; + data[i] = data[i + 3]; + data[i + 1] = data[i + 2]; + data[i + 2] = b1; + data[i + 3] = b0; + } + return i; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/ByteSwap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/ByteSwap.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,37 @@ +// ByteSwap.h + +#ifndef __BYTESWAP_H +#define __BYTESWAP_H + +#include "../../ICoder.h" +#include "Common/MyCom.h" + +// {23170F69-40C1-278B-0203-020000000000} +DEFINE_GUID(CLSID_CCompressConvertByteSwap2, +0x23170F69, 0x40C1, 0x278B, 0x02, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00); + +// {23170F69-40C1-278B-0203-040000000000} +DEFINE_GUID(CLSID_CCompressConvertByteSwap4, +0x23170F69, 0x40C1, 0x278B, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00); + +class CByteSwap2: + public ICompressFilter, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + STDMETHOD(Init)(); + STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); +}; + +class CByteSwap4: + public ICompressFilter, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + STDMETHOD(Init)(); + STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/ByteSwapRegister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/ByteSwapRegister.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,17 @@ +// ByteSwapRegister.cpp + +#include "StdAfx.h" + +#include "../../Common/RegisterCodec.h" + +#include "ByteSwap.h" +static void *CreateCodec2() { return (void *)(ICompressFilter *)(new CByteSwap2); } +static void *CreateCodec4() { return (void *)(ICompressFilter *)(new CByteSwap4); } + +static CCodecInfo g_CodecsInfo[] = +{ + { CreateCodec2, CreateCodec4, 0x020302, L"Swap2", 1, true }, + { CreateCodec4, CreateCodec4, 0x020304, L"Swap4", 1, true } +}; + +REGISTER_CODECS(ByteSwap) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/ByteSwap/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,8 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/CodecExports.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/CodecExports.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,157 @@ +// CodecExports.cpp + +#include "StdAfx.h" + +#include "../../Common/ComTry.h" +#include "../../Windows/PropVariant.h" +#include "../Common/RegisterCodec.h" +#include "../ICoder.h" + +extern unsigned int g_NumCodecs; +extern const CCodecInfo *g_Codecs[]; + +static const UInt16 kDecodeId = 0x2790; + +DEFINE_GUID(CLSID_CCodec, +0x23170F69, 0x40C1, kDecodeId, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + +static inline HRESULT SetPropString(const char *s, unsigned int size, PROPVARIANT *value) +{ + if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0) + value->vt = VT_BSTR; + return S_OK; +} + +static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value) +{ + return SetPropString((const char *)&guid, sizeof(GUID), value); +} + +static HRESULT SetClassID(CMethodId id, bool encode, PROPVARIANT *value) +{ + GUID clsId = CLSID_CCodec; + for (int i = 0; i < sizeof(id); i++, id >>= 8) + clsId.Data4[i] = (Byte)(id & 0xFF); + if (encode) + clsId.Data3++; + return SetPropGUID(clsId, value); +} + +static HRESULT FindCodecClassId(const GUID *clsID, UInt32 isCoder2, bool isFilter, bool &encode, int &index) +{ + index = -1; + if (clsID->Data1 != CLSID_CCodec.Data1 || + clsID->Data2 != CLSID_CCodec.Data2 || + (clsID->Data3 & ~1) != kDecodeId) + return S_OK; + encode = (clsID->Data3 != kDecodeId); + UInt64 id = 0; + for (int j = 0; j < 8; j++) + id |= ((UInt64)clsID->Data4[j]) << (8 * j); + for (UInt32 i = 0; i < g_NumCodecs; i++) + { + const CCodecInfo &codec = *g_Codecs[i]; + if (id != codec.Id || encode && !codec.CreateEncoder || !encode && !codec.CreateDecoder) + continue; + if (!isFilter && codec.IsFilter || isFilter && !codec.IsFilter || + codec.NumInStreams != 1 && !isCoder2 || codec.NumInStreams == 1 && isCoder2) + return E_NOINTERFACE; + index = i; + return S_OK; + } + return S_OK; +} + +STDAPI CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject) +{ + COM_TRY_BEGIN + *outObject = 0; + bool isCoder = (*iid == IID_ICompressCoder) != 0; + bool isCoder2 = (*iid == IID_ICompressCoder2) != 0; + bool isFilter = (*iid == IID_ICompressFilter) != 0; + const CCodecInfo &codec = *g_Codecs[index]; + if (!isFilter && codec.IsFilter || isFilter && !codec.IsFilter || + codec.NumInStreams != 1 && !isCoder2 || codec.NumInStreams == 1 && isCoder2) + return E_NOINTERFACE; + if (encode) + { + if (!codec.CreateEncoder) + return CLASS_E_CLASSNOTAVAILABLE; + *outObject = codec.CreateEncoder(); + } + else + { + if (!codec.CreateDecoder) + return CLASS_E_CLASSNOTAVAILABLE; + *outObject = codec.CreateDecoder(); + } + if (isCoder) + ((ICompressCoder *)*outObject)->AddRef(); + else if (isCoder2) + ((ICompressCoder2 *)*outObject)->AddRef(); + else + ((ICompressFilter *)*outObject)->AddRef(); + return S_OK; + COM_TRY_END +} + +STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject) +{ + *outObject = 0; + bool isCoder = (*iid == IID_ICompressCoder) != 0; + bool isCoder2 = (*iid == IID_ICompressCoder2) != 0; + bool isFilter = (*iid == IID_ICompressFilter) != 0; + if (!isCoder && !isCoder2 && !isFilter) + return E_NOINTERFACE; + bool encode; + int codecIndex; + HRESULT res = FindCodecClassId(clsid, isCoder2, isFilter, encode, codecIndex); + if (res != S_OK) + return res; + if (codecIndex < 0) + return CLASS_E_CLASSNOTAVAILABLE; + return CreateCoder2(encode, codecIndex, iid, outObject); +} + +STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value) +{ + ::VariantClear((VARIANTARG *)value); + const CCodecInfo &codec = *g_Codecs[codecIndex]; + switch(propID) + { + case NMethodPropID::kID: + { + value->uhVal.QuadPart = (UInt64)codec.Id; + value->vt = VT_UI8; + break; + } + case NMethodPropID::kName: + if ((value->bstrVal = ::SysAllocString(codec.Name)) != 0) + value->vt = VT_BSTR; + break; + case NMethodPropID::kDecoder: + if (codec.CreateDecoder) + return SetClassID(codec.Id, false, value); + break; + case NMethodPropID::kEncoder: + if (codec.CreateEncoder) + return SetClassID(codec.Id, true, value); + break; + case NMethodPropID::kInStreams: + { + if (codec.NumInStreams != 1) + { + value->vt = VT_UI4; + value->ulVal = codec.NumInStreams; + } + break; + } + } + return S_OK; +} + +STDAPI GetNumberOfMethods(UINT32 *numCodecs) +{ + *numCodecs = g_NumCodecs; + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Copy/CopyCoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Copy/CopyCoder.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,62 @@ +// Compress/CopyCoder.cpp + +#include "StdAfx.h" + +extern "C" +{ +#include "../../../../C/Alloc.h" +} + +#include "CopyCoder.h" +#include "../../Common/StreamUtils.h" + +namespace NCompress { + +static const UInt32 kBufferSize = 1 << 17; + +CCopyCoder::~CCopyCoder() +{ + ::MidFree(_buffer); +} + +STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 *outSize, + ICompressProgressInfo *progress) +{ + if (_buffer == 0) + { + _buffer = (Byte *)::MidAlloc(kBufferSize); + if (_buffer == 0) + return E_OUTOFMEMORY; + } + + TotalSize = 0; + for (;;) + { + UInt32 realProcessedSize; + UInt32 size = kBufferSize; + if (outSize != 0) + if (size > *outSize - TotalSize) + size = (UInt32)(*outSize - TotalSize); + RINOK(inStream->Read(_buffer, size, &realProcessedSize)); + if (realProcessedSize == 0) + break; + RINOK(WriteStream(outStream, _buffer, realProcessedSize, NULL)); + TotalSize += realProcessedSize; + if (progress != NULL) + { + RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize)); + } + } + return S_OK; +} + +STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value) +{ + *value = TotalSize; + return S_OK; +} + +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Copy/CopyCoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Copy/CopyCoder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,33 @@ +// Compress/CopyCoder.h + +#ifndef __COMPRESS_COPYCODER_H +#define __COMPRESS_COPYCODER_H + +#include "../../ICoder.h" +#include "../../../Common/MyCom.h" + +namespace NCompress { + +class CCopyCoder: + public ICompressCoder, + public ICompressGetInStreamProcessedSize, + public CMyUnknownImp +{ + Byte *_buffer; +public: + UInt64 TotalSize; + CCopyCoder(): TotalSize(0) , _buffer(0) {}; + ~CCopyCoder(); + + MY_UNKNOWN_IMP1(ICompressGetInStreamProcessedSize) + + STDMETHOD(Code)(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress); + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); +}; + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Copy/CopyRegister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Copy/CopyRegister.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,13 @@ +// LZMARegister.cpp + +#include "StdAfx.h" + +#include "../../Common/RegisterCodec.h" + +#include "CopyCoder.h" +static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::CCopyCoder); } + +static CCodecInfo g_CodecInfo = +{ CreateCodec, CreateCodec, 0x00, L"Copy", 1, false }; + +REGISTER_CODEC(Copy) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Copy/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Copy/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/Copy/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/Copy/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,8 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZ/LZOutWindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZ/LZOutWindow.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,16 @@ +// LZOutWindow.cpp + +#include "StdAfx.h" + +#include "LZOutWindow.h" + +void CLZOutWindow::Init(bool solid) +{ + if(!solid) + COutBuffer::Init(); + #ifdef _NO_EXCEPTIONS + ErrorCode = S_OK; + #endif +} + + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZ/LZOutWindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZ/LZOutWindow.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,65 @@ +// LZOutWindow.h + +#ifndef __LZ_OUT_WINDOW_H +#define __LZ_OUT_WINDOW_H + +#include "../../IStream.h" +#include "../../Common/OutBuffer.h" + +#ifndef _NO_EXCEPTIONS +typedef COutBufferException CLZOutWindowException; +#endif + +class CLZOutWindow: public COutBuffer +{ +public: + void Init(bool solid = false); + + // distance >= 0, len > 0, + bool CopyBlock(UInt32 distance, UInt32 len) + { + UInt32 pos = _pos - distance - 1; + if (distance >= _pos) + { + if (!_overDict || distance >= _bufferSize) + return false; + pos += _bufferSize; + } + if (_limitPos - _pos > len && _bufferSize - pos > len) + { + const Byte *src = _buffer + pos; + Byte *dest = _buffer + _pos; + _pos += len; + do + *dest++ = *src++; + while(--len != 0); + } + else do + { + if (pos == _bufferSize) + pos = 0; + _buffer[_pos++] = _buffer[pos++]; + if (_pos == _limitPos) + FlushWithCheck(); + } + while(--len != 0); + return true; + } + + void PutByte(Byte b) + { + _buffer[_pos++] = b; + if (_pos == _limitPos) + FlushWithCheck(); + } + + Byte GetByte(UInt32 distance) const + { + UInt32 pos = _pos - distance - 1; + if (pos >= _bufferSize) + pos += _bufferSize; + return _buffer[pos]; + } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZ/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZ/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,6 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMA.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMA.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,82 @@ +// LZMA.h + +#ifndef __LZMA_H +#define __LZMA_H + +namespace NCompress { +namespace NLZMA { + +const UInt32 kNumRepDistances = 4; + +const int kNumStates = 12; + +const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; +const Byte kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; +const Byte kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; +const Byte kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + +class CState +{ +public: + Byte Index; + void Init() { Index = 0; } + void UpdateChar() { Index = kLiteralNextStates[Index]; } + void UpdateMatch() { Index = kMatchNextStates[Index]; } + void UpdateRep() { Index = kRepNextStates[Index]; } + void UpdateShortRep() { Index = kShortRepNextStates[Index]; } + bool IsCharState() const { return Index < 7; } +}; + +const int kNumPosSlotBits = 6; +const int kDicLogSizeMin = 0; +const int kDicLogSizeMax = 32; +const int kDistTableSizeMax = kDicLogSizeMax * 2; + +const UInt32 kNumLenToPosStates = 4; + +inline UInt32 GetLenToPosState(UInt32 len) +{ + len -= 2; + if (len < kNumLenToPosStates) + return len; + return kNumLenToPosStates - 1; +} + +namespace NLength { + +const int kNumPosStatesBitsMax = 4; +const UInt32 kNumPosStatesMax = (1 << kNumPosStatesBitsMax); + +const int kNumPosStatesBitsEncodingMax = 4; +const UInt32 kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); + +const int kNumLowBits = 3; +const int kNumMidBits = 3; +const int kNumHighBits = 8; +const UInt32 kNumLowSymbols = 1 << kNumLowBits; +const UInt32 kNumMidSymbols = 1 << kNumMidBits; +const UInt32 kNumSymbolsTotal = kNumLowSymbols + kNumMidSymbols + (1 << kNumHighBits); + +} + +const UInt32 kMatchMinLen = 2; +const UInt32 kMatchMaxLen = kMatchMinLen + NLength::kNumSymbolsTotal - 1; + +const int kNumAlignBits = 4; +const UInt32 kAlignTableSize = 1 << kNumAlignBits; +const UInt32 kAlignMask = (kAlignTableSize - 1); + +const UInt32 kStartPosModelIndex = 4; +const UInt32 kEndPosModelIndex = 14; +const UInt32 kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; + +const UInt32 kNumFullDistances = 1 << (kEndPosModelIndex / 2); + +const int kNumLitPosStatesBitsEncodingMax = 4; +const int kNumLitContextBitsMax = 8; + +const int kNumMoveBits = 5; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMADecoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMADecoder.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,338 @@ +// LZMADecoder.cpp + +#include "StdAfx.h" + +#include "LZMADecoder.h" +#include "../../../Common/Defs.h" + +namespace NCompress { +namespace NLZMA { + +const int kLenIdFinished = -1; +const int kLenIdNeedInit = -2; + +void CDecoder::Init() +{ + { + for(int i = 0; i < kNumStates; i++) + { + for (UInt32 j = 0; j <= _posStateMask; j++) + { + _isMatch[i][j].Init(); + _isRep0Long[i][j].Init(); + } + _isRep[i].Init(); + _isRepG0[i].Init(); + _isRepG1[i].Init(); + _isRepG2[i].Init(); + } + } + { + for (UInt32 i = 0; i < kNumLenToPosStates; i++) + _posSlotDecoder[i].Init(); + } + { + for(UInt32 i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) + _posDecoders[i].Init(); + } + _posAlignDecoder.Init(); + _lenDecoder.Init(_posStateMask + 1); + _repMatchLenDecoder.Init(_posStateMask + 1); + _literalDecoder.Init(); + + _state.Init(); + _reps[0] = _reps[1] = _reps[2] = _reps[3] = 0; +} + +HRESULT CDecoder::CodeSpec(UInt32 curSize) +{ + if (_outSizeDefined) + { + const UInt64 rem = _outSize - _outWindowStream.GetProcessedSize(); + if (curSize > rem) + curSize = (UInt32)rem; + } + + if (_remainLen == kLenIdFinished) + return S_OK; + if (_remainLen == kLenIdNeedInit) + { + _rangeDecoder.Init(); + Init(); + _remainLen = 0; + } + if (curSize == 0) + return S_OK; + + UInt32 rep0 = _reps[0]; + UInt32 rep1 = _reps[1]; + UInt32 rep2 = _reps[2]; + UInt32 rep3 = _reps[3]; + CState state = _state; + Byte previousByte; + + while(_remainLen > 0 && curSize > 0) + { + previousByte = _outWindowStream.GetByte(rep0); + _outWindowStream.PutByte(previousByte); + _remainLen--; + curSize--; + } + UInt64 nowPos64 = _outWindowStream.GetProcessedSize(); + if (nowPos64 == 0) + previousByte = 0; + else + previousByte = _outWindowStream.GetByte(0); + + while(curSize > 0) + { + { + #ifdef _NO_EXCEPTIONS + if (_rangeDecoder.Stream.ErrorCode != S_OK) + return _rangeDecoder.Stream.ErrorCode; + #endif + if (_rangeDecoder.Stream.WasFinished()) + return S_FALSE; + UInt32 posState = UInt32(nowPos64) & _posStateMask; + if (_isMatch[state.Index][posState].Decode(&_rangeDecoder) == 0) + { + if(!state.IsCharState()) + previousByte = _literalDecoder.DecodeWithMatchByte(&_rangeDecoder, + (UInt32)nowPos64, previousByte, _outWindowStream.GetByte(rep0)); + else + previousByte = _literalDecoder.DecodeNormal(&_rangeDecoder, + (UInt32)nowPos64, previousByte); + _outWindowStream.PutByte(previousByte); + state.UpdateChar(); + curSize--; + nowPos64++; + } + else + { + UInt32 len; + if(_isRep[state.Index].Decode(&_rangeDecoder) == 1) + { + len = 0; + if(_isRepG0[state.Index].Decode(&_rangeDecoder) == 0) + { + if(_isRep0Long[state.Index][posState].Decode(&_rangeDecoder) == 0) + { + state.UpdateShortRep(); + len = 1; + } + } + else + { + UInt32 distance; + if(_isRepG1[state.Index].Decode(&_rangeDecoder) == 0) + distance = rep1; + else + { + if (_isRepG2[state.Index].Decode(&_rangeDecoder) == 0) + distance = rep2; + else + { + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + if (len == 0) + { + len = _repMatchLenDecoder.Decode(&_rangeDecoder, posState) + kMatchMinLen; + state.UpdateRep(); + } + } + else + { + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + len = kMatchMinLen + _lenDecoder.Decode(&_rangeDecoder, posState); + state.UpdateMatch(); + UInt32 posSlot = _posSlotDecoder[GetLenToPosState(len)].Decode(&_rangeDecoder); + if (posSlot >= kStartPosModelIndex) + { + UInt32 numDirectBits = (posSlot >> 1) - 1; + rep0 = ((2 | (posSlot & 1)) << numDirectBits); + + if (posSlot < kEndPosModelIndex) + rep0 += NRangeCoder::ReverseBitTreeDecode(_posDecoders + + rep0 - posSlot - 1, &_rangeDecoder, numDirectBits); + else + { + rep0 += (_rangeDecoder.DecodeDirectBits( + numDirectBits - kNumAlignBits) << kNumAlignBits); + rep0 += _posAlignDecoder.ReverseDecode(&_rangeDecoder); + if (rep0 == 0xFFFFFFFF) + { + _remainLen = kLenIdFinished; + return S_OK; + } + } + } + else + rep0 = posSlot; + } + UInt32 locLen = len; + if (len > curSize) + locLen = (UInt32)curSize; + if (!_outWindowStream.CopyBlock(rep0, locLen)) + return S_FALSE; + previousByte = _outWindowStream.GetByte(0); + curSize -= locLen; + nowPos64 += locLen; + len -= locLen; + if (len != 0) + { + _remainLen = (Int32)len; + break; + } + + #ifdef _NO_EXCEPTIONS + if (_outWindowStream.ErrorCode != S_OK) + return _outWindowStream.ErrorCode; + #endif + } + } + } + if (_rangeDecoder.Stream.WasFinished()) + return S_FALSE; + _reps[0] = rep0; + _reps[1] = rep1; + _reps[2] = rep2; + _reps[3] = rep3; + _state = state; + + return S_OK; +} + +STDMETHODIMP CDecoder::CodeReal(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *, const UInt64 *outSize, + ICompressProgressInfo *progress) +{ + SetInStream(inStream); + _outWindowStream.SetStream(outStream); + SetOutStreamSize(outSize); + CDecoderFlusher flusher(this); + + for (;;) + { + UInt32 curSize = 1 << 18; + RINOK(CodeSpec(curSize)); + if (_remainLen == kLenIdFinished) + break; + if (progress != NULL) + { + UInt64 inSize = _rangeDecoder.GetProcessedSize(); + UInt64 nowPos64 = _outWindowStream.GetProcessedSize(); + RINOK(progress->SetRatioInfo(&inSize, &nowPos64)); + } + if (_outSizeDefined) + if (_outWindowStream.GetProcessedSize() >= _outSize) + break; + } + flusher.NeedFlush = false; + return Flush(); +} + + +#ifdef _NO_EXCEPTIONS + +#define LZMA_TRY_BEGIN +#define LZMA_TRY_END + +#else + +#define LZMA_TRY_BEGIN try { +#define LZMA_TRY_END } \ + catch(const CInBufferException &e) { return e.ErrorCode; } \ + catch(const CLZOutWindowException &e) { return e.ErrorCode; } \ + catch(...) { return S_FALSE; } + +#endif + + +STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, + ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress) +{ + LZMA_TRY_BEGIN + return CodeReal(inStream, outStream, inSize, outSize, progress); + LZMA_TRY_END +} + +STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *properties, UInt32 size) +{ + if (size < 5) + return E_INVALIDARG; + int lc = properties[0] % 9; + Byte remainder = (Byte)(properties[0] / 9); + int lp = remainder % 5; + int pb = remainder / 5; + if (pb > NLength::kNumPosStatesBitsMax) + return E_INVALIDARG; + _posStateMask = (1 << pb) - 1; + UInt32 dictionarySize = 0; + for (int i = 0; i < 4; i++) + dictionarySize += ((UInt32)(properties[1 + i])) << (i * 8); + if (!_outWindowStream.Create(dictionarySize)) + return E_OUTOFMEMORY; + if (!_literalDecoder.Create(lp, lc)) + return E_OUTOFMEMORY; + if (!_rangeDecoder.Create(1 << 20)) + return E_OUTOFMEMORY; + return S_OK; +} + +STDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value) +{ + *value = _rangeDecoder.GetProcessedSize(); + return S_OK; +} + +STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) +{ + _rangeDecoder.SetStream(inStream); + return S_OK; +} + +STDMETHODIMP CDecoder::ReleaseInStream() +{ + _rangeDecoder.ReleaseStream(); + return S_OK; +} + +STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize) +{ + _outSizeDefined = (outSize != NULL); + if (_outSizeDefined) + _outSize = *outSize; + _remainLen = kLenIdNeedInit; + _outWindowStream.Init(); + return S_OK; +} + +#ifndef NO_READ_FROM_CODER + +STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + LZMA_TRY_BEGIN + if (processedSize) + *processedSize = 0; + const UInt64 startPos = _outWindowStream.GetProcessedSize(); + _outWindowStream.SetMemStream((Byte *)data); + RINOK(CodeSpec(size)); + if (processedSize) + *processedSize = (UInt32)(_outWindowStream.GetProcessedSize() - startPos); + return Flush(); + LZMA_TRY_END +} + +#endif + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMADecoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMADecoder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,255 @@ +// LZMA/Decoder.h + +#ifndef __LZMA_DECODER_H +#define __LZMA_DECODER_H + +#include "../../../Common/MyCom.h" +#include "../../ICoder.h" +#include "../LZ/LZOutWindow.h" +#include "../RangeCoder/RangeCoderBitTree.h" + +extern "C" +{ + #include "../../../../C/Alloc.h" +} + +#include "LZMA.h" + +namespace NCompress { +namespace NLZMA { + +typedef NRangeCoder::CBitDecoder CMyBitDecoder; + +class CLiteralDecoder2 +{ + CMyBitDecoder _decoders[0x300]; +public: + void Init() + { + for (int i = 0; i < 0x300; i++) + _decoders[i].Init(); + } + Byte DecodeNormal(NRangeCoder::CDecoder *rangeDecoder) + { + UInt32 symbol = 1; + RC_INIT_VAR + do + { + // symbol = (symbol << 1) | _decoders[0][symbol].Decode(rangeDecoder); + RC_GETBIT(kNumMoveBits, _decoders[symbol].Prob, symbol) + } + while (symbol < 0x100); + RC_FLUSH_VAR + return (Byte)symbol; + } + Byte DecodeWithMatchByte(NRangeCoder::CDecoder *rangeDecoder, Byte matchByte) + { + UInt32 symbol = 1; + RC_INIT_VAR + do + { + UInt32 matchBit = (matchByte >> 7) & 1; + matchByte <<= 1; + // UInt32 bit = _decoders[1 + matchBit][symbol].Decode(rangeDecoder); + // symbol = (symbol << 1) | bit; + UInt32 bit; + RC_GETBIT2(kNumMoveBits, _decoders[0x100 + (matchBit << 8) + symbol].Prob, symbol, + bit = 0, bit = 1) + if (matchBit != bit) + { + while (symbol < 0x100) + { + // symbol = (symbol << 1) | _decoders[0][symbol].Decode(rangeDecoder); + RC_GETBIT(kNumMoveBits, _decoders[symbol].Prob, symbol) + } + break; + } + } + while (symbol < 0x100); + RC_FLUSH_VAR + return (Byte)symbol; + } +}; + +class CLiteralDecoder +{ + CLiteralDecoder2 *_coders; + int _numPrevBits; + int _numPosBits; + UInt32 _posMask; +public: + CLiteralDecoder(): _coders(0) {} + ~CLiteralDecoder() { Free(); } + void Free() + { + MyFree(_coders); + _coders = 0; + } + bool Create(int numPosBits, int numPrevBits) + { + if (_coders == 0 || (numPosBits + numPrevBits) != + (_numPrevBits + _numPosBits) ) + { + Free(); + UInt32 numStates = 1 << (numPosBits + numPrevBits); + _coders = (CLiteralDecoder2 *)MyAlloc(numStates * sizeof(CLiteralDecoder2)); + } + _numPosBits = numPosBits; + _posMask = (1 << numPosBits) - 1; + _numPrevBits = numPrevBits; + return (_coders != 0); + } + void Init() + { + UInt32 numStates = 1 << (_numPrevBits + _numPosBits); + for (UInt32 i = 0; i < numStates; i++) + _coders[i].Init(); + } + UInt32 GetState(UInt32 pos, Byte prevByte) const + { return ((pos & _posMask) << _numPrevBits) + (prevByte >> (8 - _numPrevBits)); } + Byte DecodeNormal(NRangeCoder::CDecoder *rangeDecoder, UInt32 pos, Byte prevByte) + { return _coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); } + Byte DecodeWithMatchByte(NRangeCoder::CDecoder *rangeDecoder, UInt32 pos, Byte prevByte, Byte matchByte) + { return _coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); } +}; + +namespace NLength { + +class CDecoder +{ + CMyBitDecoder _choice; + CMyBitDecoder _choice2; + NRangeCoder::CBitTreeDecoder _lowCoder[kNumPosStatesMax]; + NRangeCoder::CBitTreeDecoder _midCoder[kNumPosStatesMax]; + NRangeCoder::CBitTreeDecoder _highCoder; +public: + void Init(UInt32 numPosStates) + { + _choice.Init(); + _choice2.Init(); + for (UInt32 posState = 0; posState < numPosStates; posState++) + { + _lowCoder[posState].Init(); + _midCoder[posState].Init(); + } + _highCoder.Init(); + } + UInt32 Decode(NRangeCoder::CDecoder *rangeDecoder, UInt32 posState) + { + if(_choice.Decode(rangeDecoder) == 0) + return _lowCoder[posState].Decode(rangeDecoder); + if(_choice2.Decode(rangeDecoder) == 0) + return kNumLowSymbols + _midCoder[posState].Decode(rangeDecoder); + return kNumLowSymbols + kNumMidSymbols + _highCoder.Decode(rangeDecoder); + } +}; + +} + +class CDecoder: + public ICompressCoder, + public ICompressSetDecoderProperties2, + public ICompressGetInStreamProcessedSize, + #ifndef NO_READ_FROM_CODER + public ICompressSetInStream, + public ICompressSetOutStreamSize, + public ISequentialInStream, + #endif + public CMyUnknownImp +{ + CLZOutWindow _outWindowStream; + NRangeCoder::CDecoder _rangeDecoder; + + CMyBitDecoder _isMatch[kNumStates][NLength::kNumPosStatesMax]; + CMyBitDecoder _isRep[kNumStates]; + CMyBitDecoder _isRepG0[kNumStates]; + CMyBitDecoder _isRepG1[kNumStates]; + CMyBitDecoder _isRepG2[kNumStates]; + CMyBitDecoder _isRep0Long[kNumStates][NLength::kNumPosStatesMax]; + + NRangeCoder::CBitTreeDecoder _posSlotDecoder[kNumLenToPosStates]; + + CMyBitDecoder _posDecoders[kNumFullDistances - kEndPosModelIndex]; + NRangeCoder::CBitTreeDecoder _posAlignDecoder; + + NLength::CDecoder _lenDecoder; + NLength::CDecoder _repMatchLenDecoder; + + CLiteralDecoder _literalDecoder; + + UInt32 _posStateMask; + + /////////////////// + // State + UInt32 _reps[4]; + CState _state; + Int32 _remainLen; // -1 means end of stream. // -2 means need Init + UInt64 _outSize; + bool _outSizeDefined; + + void Init(); + HRESULT CodeSpec(UInt32 size); +public: + + #ifndef NO_READ_FROM_CODER + MY_UNKNOWN_IMP5( + ICompressSetDecoderProperties2, + ICompressGetInStreamProcessedSize, + ICompressSetInStream, + ICompressSetOutStreamSize, + ISequentialInStream) + #else + MY_UNKNOWN_IMP2( + ICompressSetDecoderProperties2, + ICompressGetInStreamProcessedSize) + #endif + + void ReleaseStreams() + { + _outWindowStream.ReleaseStream(); + ReleaseInStream(); + } + + class CDecoderFlusher + { + CDecoder *_decoder; + public: + bool NeedFlush; + CDecoderFlusher(CDecoder *decoder): _decoder(decoder), NeedFlush(true) {} + ~CDecoderFlusher() + { + if (NeedFlush) + _decoder->Flush(); + _decoder->ReleaseStreams(); + } + }; + + HRESULT Flush() { return _outWindowStream.Flush(); } + + STDMETHOD(CodeReal)(ISequentialInStream *inStream, + ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress); + + STDMETHOD(Code)(ISequentialInStream *inStream, + ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress); + + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); + + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); + + STDMETHOD(SetInStream)(ISequentialInStream *inStream); + STDMETHOD(ReleaseInStream)(); + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); + + #ifndef NO_READ_FROM_CODER + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + #endif + + CDecoder(): _outSizeDefined(false) {} + virtual ~CDecoder() {} +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMAEncoder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMAEncoder.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1547 @@ +// LZMA/Encoder.cpp + +#include "StdAfx.h" + +#include + +#ifdef _WIN32 +#define USE_ALLOCA +#endif + +#ifdef USE_ALLOCA +#ifdef _WIN32 +#include +#else +#include +#endif +#endif + +#include "../../../Common/Defs.h" +#include "../../Common/StreamUtils.h" + +#include "LZMAEncoder.h" + +// extern "C" { #include "../../../../C/7zCrc.h" } + +// #define SHOW_STAT + + +namespace NCompress { +namespace NLZMA { + +// struct CCrcInit { CCrcInit() { InitCrcTable(); } } g_CrcInit; + +const int kDefaultDictionaryLogSize = 22; +const UInt32 kNumFastBytesDefault = 0x20; + +#ifndef LZMA_LOG_BSR +Byte g_FastPos[1 << kNumLogBits]; + +class CFastPosInit +{ +public: + CFastPosInit() { Init(); } + void Init() + { + const Byte kFastSlots = kNumLogBits * 2; + int c = 2; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + + for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++) + { + UInt32 k = (1 << ((slotFast >> 1) - 1)); + for (UInt32 j = 0; j < k; j++, c++) + g_FastPos[c] = slotFast; + } + } +} g_FastPosInit; +#endif + +void CLiteralEncoder2::Encode(NRangeCoder::CEncoder *rangeEncoder, Byte symbol) +{ + UInt32 context = 1; + int i = 8; + do + { + i--; + UInt32 bit = (symbol >> i) & 1; + _encoders[context].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + } + while(i != 0); +} + +void CLiteralEncoder2::EncodeMatched(NRangeCoder::CEncoder *rangeEncoder, + Byte matchByte, Byte symbol) +{ + UInt32 context = 1; + int i = 8; + do + { + i--; + UInt32 bit = (symbol >> i) & 1; + UInt32 matchBit = (matchByte >> i) & 1; + _encoders[0x100 + (matchBit << 8) + context].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + if (matchBit != bit) + { + while(i != 0) + { + i--; + UInt32 bit = (symbol >> i) & 1; + _encoders[context].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + } + break; + } + } + while(i != 0); +} + +UInt32 CLiteralEncoder2::GetPrice(bool matchMode, Byte matchByte, Byte symbol) const +{ + UInt32 price = 0; + UInt32 context = 1; + int i = 8; + if (matchMode) + { + do + { + i--; + UInt32 matchBit = (matchByte >> i) & 1; + UInt32 bit = (symbol >> i) & 1; + price += _encoders[0x100 + (matchBit << 8) + context].GetPrice(bit); + context = (context << 1) | bit; + if (matchBit != bit) + break; + } + while (i != 0); + } + while(i != 0) + { + i--; + UInt32 bit = (symbol >> i) & 1; + price += _encoders[context].GetPrice(bit); + context = (context << 1) | bit; + } + return price; +}; + + +namespace NLength { + +void CEncoder::Init(UInt32 numPosStates) +{ + _choice.Init(); + _choice2.Init(); + for (UInt32 posState = 0; posState < numPosStates; posState++) + { + _lowCoder[posState].Init(); + _midCoder[posState].Init(); + } + _highCoder.Init(); +} + +void CEncoder::Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState) +{ + if(symbol < kNumLowSymbols) + { + _choice.Encode(rangeEncoder, 0); + _lowCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + _choice.Encode(rangeEncoder, 1); + if(symbol < kNumLowSymbols + kNumMidSymbols) + { + _choice2.Encode(rangeEncoder, 0); + _midCoder[posState].Encode(rangeEncoder, symbol - kNumLowSymbols); + } + else + { + _choice2.Encode(rangeEncoder, 1); + _highCoder.Encode(rangeEncoder, symbol - kNumLowSymbols - kNumMidSymbols); + } + } +} + +void CEncoder::SetPrices(UInt32 posState, UInt32 numSymbols, UInt32 *prices) const +{ + UInt32 a0 = _choice.GetPrice0(); + UInt32 a1 = _choice.GetPrice1(); + UInt32 b0 = a1 + _choice2.GetPrice0(); + UInt32 b1 = a1 + _choice2.GetPrice1(); + UInt32 i = 0; + for (i = 0; i < kNumLowSymbols; i++) + { + if (i >= numSymbols) + return; + prices[i] = a0 + _lowCoder[posState].GetPrice(i); + } + for (; i < kNumLowSymbols + kNumMidSymbols; i++) + { + if (i >= numSymbols) + return; + prices[i] = b0 + _midCoder[posState].GetPrice(i - kNumLowSymbols); + } + for (; i < numSymbols; i++) + prices[i] = b1 + _highCoder.GetPrice(i - kNumLowSymbols - kNumMidSymbols); +} + +} + +CEncoder::CEncoder(): + _numFastBytes(kNumFastBytesDefault), + _distTableSize(kDefaultDictionaryLogSize * 2), + _posStateBits(2), + _posStateMask(4 - 1), + _numLiteralPosStateBits(0), + _numLiteralContextBits(3), + _dictionarySize(1 << kDefaultDictionaryLogSize), + _matchFinderCycles(0), + #ifdef COMPRESS_MF_MT + _multiThread(false), + #endif + _writeEndMark(false) +{ + MatchFinder_Construct(&_matchFinderBase); + // _maxMode = false; + _fastMode = false; + #ifdef COMPRESS_MF_MT + MatchFinderMt_Construct(&_matchFinderMt); + _matchFinderMt.MatchFinder = &_matchFinderBase; + #endif +} + + +static void *SzAlloc(size_t size) { return BigAlloc(size); } +static void SzFree(void *address) { BigFree(address); } +ISzAlloc g_Alloc = { SzAlloc, SzFree }; + +CEncoder::~CEncoder() +{ + #ifdef COMPRESS_MF_MT + MatchFinderMt_Destruct(&_matchFinderMt, &g_Alloc); + #endif + MatchFinder_Free(&_matchFinderBase, &g_Alloc); +} + +static const UInt32 kBigHashDicLimit = (UInt32)1 << 24; + +HRESULT CEncoder::Create() +{ + if (!_rangeEncoder.Create(1 << 20)) + return E_OUTOFMEMORY; + bool btMode = (_matchFinderBase.btMode != 0); + #ifdef COMPRESS_MF_MT + _mtMode = (_multiThread && !_fastMode && btMode); + #endif + + if (!_literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits)) + return E_OUTOFMEMORY; + + _matchFinderBase.bigHash = (_dictionarySize > kBigHashDicLimit); + + UInt32 numCycles = 16 + (_numFastBytes >> 1); + if (!btMode) + numCycles >>= 1; + if (_matchFinderCycles != 0) + numCycles = _matchFinderCycles; + _matchFinderBase.cutValue = numCycles; + #ifdef COMPRESS_MF_MT + if (_mtMode) + { + RINOK(MatchFinderMt_Create(&_matchFinderMt, _dictionarySize, kNumOpts, _numFastBytes, kMatchMaxLen, &g_Alloc)); + _matchFinderObj = &_matchFinderMt; + MatchFinderMt_CreateVTable(&_matchFinderMt, &_matchFinder); + } + else + #endif + { + if (!MatchFinder_Create(&_matchFinderBase, _dictionarySize, kNumOpts, _numFastBytes, kMatchMaxLen, &g_Alloc)) + return E_OUTOFMEMORY; + _matchFinderObj = &_matchFinderBase; + MatchFinder_CreateVTable(&_matchFinderBase, &_matchFinder); + } + return S_OK; +} + +inline wchar_t GetUpperChar(wchar_t c) +{ + if (c >= 'a' && c <= 'z') + c -= 0x20; + return c; +} + +static int ParseMatchFinder(const wchar_t *s, int *btMode, UInt32 *numHashBytes /* , int *skipModeBits */) +{ + wchar_t c = GetUpperChar(*s++); + if (c == L'H') + { + if (GetUpperChar(*s++) != L'C') + return 0; + int numHashBytesLoc = (int)(*s++ - L'0'); + if (numHashBytesLoc < 4 || numHashBytesLoc > 4) + return 0; + if (*s++ != 0) + return 0; + *btMode = 0; + *numHashBytes = numHashBytesLoc; + return 1; + } + if (c != L'B') + return 0; + + if (GetUpperChar(*s++) != L'T') + return 0; + int numHashBytesLoc = (int)(*s++ - L'0'); + if (numHashBytesLoc < 2 || numHashBytesLoc > 4) + return 0; + c = GetUpperChar(*s++); + /* + int skipModeBitsLoc = 0; + if (c == L'D') + { + skipModeBitsLoc = 2; + c = GetUpperChar(*s++); + } + */ + if (c != L'\0') + return 0; + *btMode = 1; + *numHashBytes = numHashBytesLoc; + // *skipModeBits = skipModeBitsLoc; + return 1; +} + +STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, + const PROPVARIANT *properties, UInt32 numProperties) +{ + for (UInt32 i = 0; i < numProperties; i++) + { + const PROPVARIANT &prop = properties[i]; + switch(propIDs[i]) + { + case NCoderPropID::kNumFastBytes: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 numFastBytes = prop.ulVal; + if(numFastBytes < 5 || numFastBytes > kMatchMaxLen) + return E_INVALIDARG; + _numFastBytes = numFastBytes; + break; + } + case NCoderPropID::kMatchFinderCycles: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + _matchFinderCycles = prop.ulVal; + break; + } + case NCoderPropID::kAlgorithm: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 maximize = prop.ulVal; + _fastMode = (maximize == 0); + // _maxMode = (maximize >= 2); + break; + } + case NCoderPropID::kMatchFinder: + { + if (prop.vt != VT_BSTR) + return E_INVALIDARG; + if (!ParseMatchFinder(prop.bstrVal, &_matchFinderBase.btMode, &_matchFinderBase.numHashBytes /* , &_matchFinderBase.skipModeBits */)) + return E_INVALIDARG; + break; + } + case NCoderPropID::kMultiThread: + { + if (prop.vt != VT_BOOL) + return E_INVALIDARG; + #ifdef COMPRESS_MF_MT + Bool newMultiThread = (prop.boolVal == VARIANT_TRUE); + if (newMultiThread != _multiThread) + { + ReleaseMatchFinder(); + _multiThread = newMultiThread; + } + #endif + break; + } + case NCoderPropID::kNumThreads: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + #ifdef COMPRESS_MF_MT + Bool newMultiThread = (prop.ulVal > 1) ? True : False; + if (newMultiThread != _multiThread) + { + ReleaseMatchFinder(); + _multiThread = newMultiThread; + } + #endif + break; + } + case NCoderPropID::kDictionarySize: + { + const int kDicLogSizeMaxCompress = 30; // must be <= ((kNumLogBits - 1) * 2) + 7 = 31; + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 dictionarySize = prop.ulVal; + if (dictionarySize < UInt32(1 << kDicLogSizeMin) || + dictionarySize > UInt32(1 << kDicLogSizeMaxCompress)) + return E_INVALIDARG; + _dictionarySize = dictionarySize; + UInt32 dicLogSize; + for(dicLogSize = 0; dicLogSize < (UInt32)kDicLogSizeMaxCompress; dicLogSize++) + if (dictionarySize <= (UInt32(1) << dicLogSize)) + break; + _distTableSize = dicLogSize * 2; + break; + } + case NCoderPropID::kPosStateBits: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 value = prop.ulVal; + if (value > (UInt32)NLength::kNumPosStatesBitsEncodingMax) + return E_INVALIDARG; + _posStateBits = value; + _posStateMask = (1 << _posStateBits) - 1; + break; + } + case NCoderPropID::kLitPosBits: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 value = prop.ulVal; + if (value > (UInt32)kNumLitPosStatesBitsEncodingMax) + return E_INVALIDARG; + _numLiteralPosStateBits = value; + break; + } + case NCoderPropID::kLitContextBits: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 value = prop.ulVal; + if (value > (UInt32)kNumLitContextBitsMax) + return E_INVALIDARG; + _numLiteralContextBits = value; + break; + } + case NCoderPropID::kEndMarker: + { + if (prop.vt != VT_BOOL) + return E_INVALIDARG; + SetWriteEndMarkerMode(prop.boolVal == VARIANT_TRUE); + break; + } + default: + return E_INVALIDARG; + } + } + return S_OK; +} + +STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) +{ + const UInt32 kPropSize = 5; + Byte properties[kPropSize]; + properties[0] = (Byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); + for (int i = 0; i < 4; i++) + properties[1 + i] = Byte(_dictionarySize >> (8 * i)); + return WriteStream(outStream, properties, kPropSize, NULL); +} + +STDMETHODIMP CEncoder::SetOutStream(ISequentialOutStream *outStream) +{ + _rangeEncoder.SetStream(outStream); + return S_OK; +} + +STDMETHODIMP CEncoder::ReleaseOutStream() +{ + _rangeEncoder.ReleaseStream(); + return S_OK; +} + +HRESULT CEncoder::Init() +{ + CBaseState::Init(); + + _rangeEncoder.Init(); + + for(int i = 0; i < kNumStates; i++) + { + for (UInt32 j = 0; j <= _posStateMask; j++) + { + _isMatch[i][j].Init(); + _isRep0Long[i][j].Init(); + } + _isRep[i].Init(); + _isRepG0[i].Init(); + _isRepG1[i].Init(); + _isRepG2[i].Init(); + } + + _literalEncoder.Init(); + + { + for(UInt32 i = 0; i < kNumLenToPosStates; i++) + _posSlotEncoder[i].Init(); + } + { + for(UInt32 i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) + _posEncoders[i].Init(); + } + + _lenEncoder.Init(1 << _posStateBits); + _repMatchLenEncoder.Init(1 << _posStateBits); + + _posAlignEncoder.Init(); + + _longestMatchWasFound = false; + _optimumEndIndex = 0; + _optimumCurrentIndex = 0; + _additionalOffset = 0; + + return S_OK; +} + +#ifdef SHOW_STAT +static int ttt = 0; +#endif + +void CEncoder::MovePos(UInt32 num) +{ + #ifdef SHOW_STAT + ttt += num; + printf("\n MovePos %d", num); + #endif + if (num != 0) + { + _additionalOffset += num; + _matchFinder.Skip(_matchFinderObj, num); + } +} + +UInt32 CEncoder::Backward(UInt32 &backRes, UInt32 cur) +{ + _optimumEndIndex = cur; + UInt32 posMem = _optimum[cur].PosPrev; + UInt32 backMem = _optimum[cur].BackPrev; + do + { + if (_optimum[cur].Prev1IsChar) + { + _optimum[posMem].MakeAsChar(); + _optimum[posMem].PosPrev = posMem - 1; + if (_optimum[cur].Prev2) + { + _optimum[posMem - 1].Prev1IsChar = false; + _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; + _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; + } + } + UInt32 posPrev = posMem; + UInt32 backCur = backMem; + + backMem = _optimum[posPrev].BackPrev; + posMem = _optimum[posPrev].PosPrev; + + _optimum[posPrev].BackPrev = backCur; + _optimum[posPrev].PosPrev = cur; + cur = posPrev; + } + while(cur != 0); + backRes = _optimum[0].BackPrev; + _optimumCurrentIndex = _optimum[0].PosPrev; + return _optimumCurrentIndex; +} + +/* +Out: + (lenRes == 1) && (backRes == 0xFFFFFFFF) means Literal +*/ + +UInt32 CEncoder::GetOptimum(UInt32 position, UInt32 &backRes) +{ + if(_optimumEndIndex != _optimumCurrentIndex) + { + const COptimal &optimum = _optimum[_optimumCurrentIndex]; + UInt32 lenRes = optimum.PosPrev - _optimumCurrentIndex; + backRes = optimum.BackPrev; + _optimumCurrentIndex = optimum.PosPrev; + return lenRes; + } + _optimumCurrentIndex = _optimumEndIndex = 0; + + UInt32 numAvailableBytes = _matchFinder.GetNumAvailableBytes(_matchFinderObj); + + UInt32 lenMain, numDistancePairs; + if (!_longestMatchWasFound) + { + lenMain = ReadMatchDistances(numDistancePairs); + } + else + { + lenMain = _longestMatchLength; + numDistancePairs = _numDistancePairs; + _longestMatchWasFound = false; + } + + const Byte *data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1; + if (numAvailableBytes < 2) + { + backRes = (UInt32)(-1); + return 1; + } + if (numAvailableBytes > kMatchMaxLen) + numAvailableBytes = kMatchMaxLen; + + UInt32 reps[kNumRepDistances]; + UInt32 repLens[kNumRepDistances]; + UInt32 repMaxIndex = 0; + UInt32 i; + for(i = 0; i < kNumRepDistances; i++) + { + reps[i] = _repDistances[i]; + const Byte *data2 = data - (reps[i] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + { + repLens[i] = 0; + continue; + } + UInt32 lenTest; + for (lenTest = 2; lenTest < numAvailableBytes && data[lenTest] == data2[lenTest]; lenTest++); + repLens[i] = lenTest; + if (lenTest > repLens[repMaxIndex]) + repMaxIndex = i; + } + if(repLens[repMaxIndex] >= _numFastBytes) + { + backRes = repMaxIndex; + UInt32 lenRes = repLens[repMaxIndex]; + MovePos(lenRes - 1); + return lenRes; + } + + UInt32 *matchDistances = _matchDistances; + if(lenMain >= _numFastBytes) + { + backRes = matchDistances[numDistancePairs - 1] + kNumRepDistances; + MovePos(lenMain - 1); + return lenMain; + } + Byte currentByte = *data; + Byte matchByte = *(data - (reps[0] + 1)); + + if(lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) + { + backRes = (UInt32)-1; + return 1; + } + + _optimum[0].State = _state; + + UInt32 posState = (position & _posStateMask); + + _optimum[1].Price = _isMatch[_state.Index][posState].GetPrice0() + + _literalEncoder.GetSubCoder(position, _previousByte)->GetPrice(!_state.IsCharState(), matchByte, currentByte); + _optimum[1].MakeAsChar(); + + UInt32 matchPrice = _isMatch[_state.Index][posState].GetPrice1(); + UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); + + if(matchByte == currentByte) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); + if(shortRepPrice < _optimum[1].Price) + { + _optimum[1].Price = shortRepPrice; + _optimum[1].MakeAsShortRep(); + } + } + UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); + + if(lenEnd < 2) + { + backRes = _optimum[1].BackPrev; + return 1; + } + + _optimum[1].PosPrev = 0; + for (i = 0; i < kNumRepDistances; i++) + _optimum[0].Backs[i] = reps[i]; + + UInt32 len = lenEnd; + do + _optimum[len--].Price = kIfinityPrice; + while (len >= 2); + + for(i = 0; i < kNumRepDistances; i++) + { + UInt32 repLen = repLens[i]; + if (repLen < 2) + continue; + UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState); + do + { + UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); + COptimal &optimum = _optimum[repLen]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = i; + optimum.Prev1IsChar = false; + } + } + while(--repLen >= 2); + } + + UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); + + len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= lenMain) + { + UInt32 offs = 0; + while (len > matchDistances[offs]) + offs += 2; + for(; ; len++) + { + UInt32 distance = matchDistances[offs + 1]; + UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); + COptimal &optimum = _optimum[len]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = distance + kNumRepDistances; + optimum.Prev1IsChar = false; + } + if (len == matchDistances[offs]) + { + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + + UInt32 cur = 0; + + for (;;) + { + cur++; + if(cur == lenEnd) + { + return Backward(backRes, cur); + } + UInt32 numAvailableBytesFull = _matchFinder.GetNumAvailableBytes(_matchFinderObj); + UInt32 newLen, numDistancePairs; + newLen = ReadMatchDistances(numDistancePairs); + if(newLen >= _numFastBytes) + { + _numDistancePairs = numDistancePairs; + _longestMatchLength = newLen; + _longestMatchWasFound = true; + return Backward(backRes, cur); + } + position++; + COptimal &curOptimum = _optimum[cur]; + UInt32 posPrev = curOptimum.PosPrev; + CState state; + if (curOptimum.Prev1IsChar) + { + posPrev--; + if (curOptimum.Prev2) + { + state = _optimum[curOptimum.PosPrev2].State; + if (curOptimum.BackPrev2 < kNumRepDistances) + state.UpdateRep(); + else + state.UpdateMatch(); + } + else + state = _optimum[posPrev].State; + state.UpdateChar(); + } + else + state = _optimum[posPrev].State; + if (posPrev == cur - 1) + { + if (curOptimum.IsShortRep()) + state.UpdateShortRep(); + else + state.UpdateChar(); + } + else + { + UInt32 pos; + if (curOptimum.Prev1IsChar && curOptimum.Prev2) + { + posPrev = curOptimum.PosPrev2; + pos = curOptimum.BackPrev2; + state.UpdateRep(); + } + else + { + pos = curOptimum.BackPrev; + if (pos < kNumRepDistances) + state.UpdateRep(); + else + state.UpdateMatch(); + } + const COptimal &prevOptimum = _optimum[posPrev]; + if (pos < kNumRepDistances) + { + reps[0] = prevOptimum.Backs[pos]; + UInt32 i; + for(i = 1; i <= pos; i++) + reps[i] = prevOptimum.Backs[i - 1]; + for(; i < kNumRepDistances; i++) + reps[i] = prevOptimum.Backs[i]; + } + else + { + reps[0] = (pos - kNumRepDistances); + for(UInt32 i = 1; i < kNumRepDistances; i++) + reps[i] = prevOptimum.Backs[i - 1]; + } + } + curOptimum.State = state; + for(UInt32 i = 0; i < kNumRepDistances; i++) + curOptimum.Backs[i] = reps[i]; + UInt32 curPrice = curOptimum.Price; + const Byte *data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1; + const Byte currentByte = *data; + const Byte matchByte = *(data - (reps[0] + 1)); + + UInt32 posState = (position & _posStateMask); + + UInt32 curAnd1Price = curPrice + + _isMatch[state.Index][posState].GetPrice0() + + _literalEncoder.GetSubCoder(position, *(data - 1))->GetPrice(!state.IsCharState(), matchByte, currentByte); + + COptimal &nextOptimum = _optimum[cur + 1]; + + bool nextIsChar = false; + if (curAnd1Price < nextOptimum.Price) + { + nextOptimum.Price = curAnd1Price; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsChar(); + nextIsChar = true; + } + + UInt32 matchPrice = curPrice + _isMatch[state.Index][posState].GetPrice1(); + UInt32 repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); + + if(matchByte == currentByte && + !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); + if(shortRepPrice <= nextOptimum.Price) + { + nextOptimum.Price = shortRepPrice; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsShortRep(); + nextIsChar = true; + } + } + /* + if(newLen == 2 && matchDistances[2] >= kDistLimit2) // test it maybe set 2000 ? + continue; + */ + + numAvailableBytesFull = MyMin(kNumOpts - 1 - cur, numAvailableBytesFull); + UInt32 numAvailableBytes = numAvailableBytesFull; + + if (numAvailableBytes < 2) + continue; + if (numAvailableBytes > _numFastBytes) + numAvailableBytes = _numFastBytes; + if (!nextIsChar && matchByte != currentByte) // speed optimization + { + // try Literal + rep0 + const Byte *data2 = data - (reps[0] + 1); + UInt32 limit = MyMin(numAvailableBytesFull, _numFastBytes + 1); + UInt32 temp; + for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); + UInt32 lenTest2 = temp - 1; + if (lenTest2 >= 2) + { + CState state2 = state; + state2.UpdateChar(); + UInt32 posStateNext = (position + 1) & _posStateMask; + UInt32 nextRepMatchPrice = curAnd1Price + + _isMatch[state2.Index][posStateNext].GetPrice1() + + _isRep[state2.Index].GetPrice1(); + // for (; lenTest2 >= 2; lenTest2--) + { + UInt32 offset = cur + 1 + lenTest2; + while(lenEnd < offset) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice( + 0, lenTest2, state2, posStateNext); + COptimal &optimum = _optimum[offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = false; + } + } + } + } + + UInt32 startLen = 2; // speed optimization + for(UInt32 repIndex = 0; repIndex < kNumRepDistances; repIndex++) + { + // UInt32 repLen = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], newLen); // test it; + const Byte *data2 = data - (reps[repIndex] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + UInt32 lenTest; + for (lenTest = 2; lenTest < numAvailableBytes && data[lenTest] == data2[lenTest]; lenTest++); + while(lenEnd < cur + lenTest) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 lenTestTemp = lenTest; + UInt32 price = repMatchPrice + GetPureRepPrice(repIndex, state, posState); + do + { + UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(lenTest - 2, posState); + COptimal &optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = repIndex; + optimum.Prev1IsChar = false; + } + } + while(--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + // if (_maxMode) + { + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = MyMin(numAvailableBytesFull, lenTest2 + _numFastBytes); + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + CState state2 = state; + state2.UpdateRep(); + UInt32 posStateNext = (position + lenTest) & _posStateMask; + UInt32 curAndLenCharPrice = + price + _repMatchLenEncoder.GetPrice(lenTest - 2, posState) + + _isMatch[state2.Index][posStateNext].GetPrice0() + + _literalEncoder.GetSubCoder(position + lenTest, data[lenTest - 1])->GetPrice( + true, data2[lenTest], data[lenTest]); + state2.UpdateChar(); + posStateNext = (position + lenTest + 1) & _posStateMask; + UInt32 nextRepMatchPrice = curAndLenCharPrice + + _isMatch[state2.Index][posStateNext].GetPrice1() + + _isRep[state2.Index].GetPrice1(); + + // for(; lenTest2 >= 2; lenTest2--) + { + UInt32 offset = cur + lenTest + 1 + lenTest2; + while(lenEnd < offset) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice( + 0, lenTest2, state2, posStateNext); + COptimal &optimum = _optimum[offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = repIndex; + } + } + } + } + } + + // for(UInt32 lenTest = 2; lenTest <= newLen; lenTest++) + if (newLen > numAvailableBytes) + { + newLen = numAvailableBytes; + for (numDistancePairs = 0; newLen > matchDistances[numDistancePairs]; numDistancePairs += 2); + matchDistances[numDistancePairs] = newLen; + numDistancePairs += 2; + } + if (newLen >= startLen) + { + UInt32 normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); + while(lenEnd < cur + newLen) + _optimum[++lenEnd].Price = kIfinityPrice; + + UInt32 offs = 0; + while(startLen > matchDistances[offs]) + offs += 2; + UInt32 curBack = matchDistances[offs + 1]; + UInt32 posSlot = GetPosSlot2(curBack); + for(UInt32 lenTest = /*2*/ startLen; ; lenTest++) + { + UInt32 curAndLenPrice = normalMatchPrice; + UInt32 lenToPosState = GetLenToPosState(lenTest); + if (curBack < kNumFullDistances) + curAndLenPrice += _distancesPrices[lenToPosState][curBack]; + else + curAndLenPrice += _posSlotPrices[lenToPosState][posSlot] + _alignPrices[curBack & kAlignMask]; + + curAndLenPrice += _lenEncoder.GetPrice(lenTest - kMatchMinLen, posState); + + COptimal &optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = curBack + kNumRepDistances; + optimum.Prev1IsChar = false; + } + + if (/*_maxMode && */lenTest == matchDistances[offs]) + { + // Try Match + Literal + Rep0 + const Byte *data2 = data - (curBack + 1); + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = MyMin(numAvailableBytesFull, lenTest2 + _numFastBytes); + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + CState state2 = state; + state2.UpdateMatch(); + UInt32 posStateNext = (position + lenTest) & _posStateMask; + UInt32 curAndLenCharPrice = curAndLenPrice + + _isMatch[state2.Index][posStateNext].GetPrice0() + + _literalEncoder.GetSubCoder(position + lenTest, data[lenTest - 1])->GetPrice( + true, data2[lenTest], data[lenTest]); + state2.UpdateChar(); + posStateNext = (posStateNext + 1) & _posStateMask; + UInt32 nextRepMatchPrice = curAndLenCharPrice + + _isMatch[state2.Index][posStateNext].GetPrice1() + + _isRep[state2.Index].GetPrice1(); + + // for(; lenTest2 >= 2; lenTest2--) + { + UInt32 offset = cur + lenTest + 1 + lenTest2; + while(lenEnd < offset) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + COptimal &optimum = _optimum[offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = curBack + kNumRepDistances; + } + } + } + offs += 2; + if (offs == numDistancePairs) + break; + curBack = matchDistances[offs + 1]; + if (curBack >= kNumFullDistances) + posSlot = GetPosSlot2(curBack); + } + } + } + } +} + +static inline bool ChangePair(UInt32 smallDist, UInt32 bigDist) +{ + return ((bigDist >> 7) > smallDist); +} + +UInt32 CEncoder::ReadMatchDistances(UInt32 &numDistancePairs) +{ + UInt32 lenRes = 0; + numDistancePairs = _matchFinder.GetMatches(_matchFinderObj, _matchDistances); + #ifdef SHOW_STAT + printf("\n i = %d numPairs = %d ", ttt, numDistancePairs / 2); + if (ttt >= 61994) + ttt = ttt; + + ttt++; + for (UInt32 i = 0; i < numDistancePairs; i += 2) + printf("%2d %6d | ", _matchDistances[i], _matchDistances[i + 1]); + #endif + if (numDistancePairs > 0) + { + lenRes = _matchDistances[numDistancePairs - 2]; + if (lenRes == _numFastBytes) + { + UInt32 numAvail = _matchFinder.GetNumAvailableBytes(_matchFinderObj) + 1; + const Byte *pby = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1; + UInt32 distance = _matchDistances[numDistancePairs - 1] + 1; + if (numAvail > kMatchMaxLen) + numAvail = kMatchMaxLen; + + const Byte *pby2 = pby - distance; + for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); + } + } + _additionalOffset++; + return lenRes; +} + +UInt32 CEncoder::GetOptimumFast(UInt32 &backRes) +{ + UInt32 numAvailableBytes = _matchFinder.GetNumAvailableBytes(_matchFinderObj); + UInt32 lenMain, numDistancePairs; + if (!_longestMatchWasFound) + { + lenMain = ReadMatchDistances(numDistancePairs); + } + else + { + lenMain = _longestMatchLength; + numDistancePairs = _numDistancePairs; + _longestMatchWasFound = false; + } + + const Byte *data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1; + if (numAvailableBytes > kMatchMaxLen) + numAvailableBytes = kMatchMaxLen; + if (numAvailableBytes < 2) + { + backRes = (UInt32)(-1); + return 1; + } + + UInt32 repLens[kNumRepDistances]; + UInt32 repMaxIndex = 0; + + for(UInt32 i = 0; i < kNumRepDistances; i++) + { + const Byte *data2 = data - (_repDistances[i] + 1); + if (data[0] != data2[0] || data[1] != data2[1]) + { + repLens[i] = 0; + continue; + } + UInt32 len; + for (len = 2; len < numAvailableBytes && data[len] == data2[len]; len++); + if(len >= _numFastBytes) + { + backRes = i; + MovePos(len - 1); + return len; + } + repLens[i] = len; + if (len > repLens[repMaxIndex]) + repMaxIndex = i; + } + UInt32 *matchDistances = _matchDistances; + if(lenMain >= _numFastBytes) + { + backRes = matchDistances[numDistancePairs - 1] + kNumRepDistances; + MovePos(lenMain - 1); + return lenMain; + } + + UInt32 backMain = 0; // for GCC + if (lenMain >= 2) + { + backMain = matchDistances[numDistancePairs - 1]; + while (numDistancePairs > 2 && lenMain == matchDistances[numDistancePairs - 4] + 1) + { + if (!ChangePair(matchDistances[numDistancePairs - 3], backMain)) + break; + numDistancePairs -= 2; + lenMain = matchDistances[numDistancePairs - 2]; + backMain = matchDistances[numDistancePairs - 1]; + } + if (lenMain == 2 && backMain >= 0x80) + lenMain = 1; + } + + if (repLens[repMaxIndex] >= 2) + { + if (repLens[repMaxIndex] + 1 >= lenMain || + repLens[repMaxIndex] + 2 >= lenMain && (backMain > (1 << 9)) || + repLens[repMaxIndex] + 3 >= lenMain && (backMain > (1 << 15))) + { + backRes = repMaxIndex; + UInt32 lenRes = repLens[repMaxIndex]; + MovePos(lenRes - 1); + return lenRes; + } + } + + if (lenMain >= 2 && numAvailableBytes > 2) + { + numAvailableBytes = _matchFinder.GetNumAvailableBytes(_matchFinderObj); + _longestMatchLength = ReadMatchDistances(_numDistancePairs); + if (_longestMatchLength >= 2) + { + UInt32 newDistance = matchDistances[_numDistancePairs - 1]; + if (_longestMatchLength >= lenMain && newDistance < backMain || + _longestMatchLength == lenMain + 1 && !ChangePair(backMain, newDistance) || + _longestMatchLength > lenMain + 1 || + _longestMatchLength + 1 >= lenMain && lenMain >= 3 && ChangePair(newDistance, backMain)) + { + _longestMatchWasFound = true; + backRes = UInt32(-1); + return 1; + } + } + data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1; + for(UInt32 i = 0; i < kNumRepDistances; i++) + { + const Byte *data2 = data - (_repDistances[i] + 1); + if (data[1] != data2[1] || data[2] != data2[2]) + { + repLens[i] = 0; + continue; + } + UInt32 len; + for (len = 2; len < numAvailableBytes && data[len] == data2[len]; len++); + if (len + 1 >= lenMain) + { + _longestMatchWasFound = true; + backRes = UInt32(-1); + return 1; + } + } + backRes = backMain + kNumRepDistances; + MovePos(lenMain - 2); + return lenMain; + } + backRes = UInt32(-1); + return 1; +} + +HRESULT CEncoder::Flush(UInt32 nowPos) +{ + // ReleaseMFStream(); + if (_matchFinderBase.result != SZ_OK) + return _matchFinderBase.result; + WriteEndMarker(nowPos & _posStateMask); + _rangeEncoder.FlushData(); + return _rangeEncoder.FlushStream(); +} + +void CEncoder::WriteEndMarker(UInt32 posState) +{ + // This function for writing End Mark for stream version of LZMA. + // In current version this feature is not used. + if (!_writeEndMark) + return; + + _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 1); + _isRep[_state.Index].Encode(&_rangeEncoder, 0); + _state.UpdateMatch(); + UInt32 len = kMatchMinLen; // kMatchMaxLen; + _lenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode); + UInt32 posSlot = (1 << kNumPosSlotBits) - 1; + UInt32 lenToPosState = GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(&_rangeEncoder, posSlot); + UInt32 footerBits = 30; + UInt32 posReduced = (UInt32(1) << footerBits) - 1; + _rangeEncoder.EncodeDirectBits(posReduced >> kNumAlignBits, footerBits - kNumAlignBits); + _posAlignEncoder.ReverseEncode(&_rangeEncoder, posReduced & kAlignMask); +} + +HRESULT CEncoder::CodeReal(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress) +{ + // _needReleaseMFStream = false; + #ifdef COMPRESS_MF_MT + #ifdef USE_ALLOCA + alloca(0x300); + #endif + #endif + CCoderReleaser coderReleaser(this); + RINOK(SetStreams(inStream, outStream, inSize, outSize)); + for (;;) + { + UInt64 processedInSize; + UInt64 processedOutSize; + Int32 finished; + RINOK(CodeOneBlock(&processedInSize, &processedOutSize, &finished)); + if (finished != 0) + break; + if (progress != 0) + { + RINOK(progress->SetRatioInfo(&processedInSize, &processedOutSize)); + } + } + return S_OK; +} + +HRESULT CEncoder::SetStreams(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 * /* outSize */) +{ + _inStream = inStream; + _finished = false; + RINOK(Create()); + RINOK(SetOutStream(outStream)); + RINOK(Init()); + + if (!_fastMode) + { + FillDistancesPrices(); + FillAlignPrices(); + } + + _lenEncoder.SetTableSize(_numFastBytes + 1 - kMatchMinLen); + _lenEncoder.UpdateTables(1 << _posStateBits); + _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - kMatchMinLen); + _repMatchLenEncoder.UpdateTables(1 << _posStateBits); + + nowPos64 = 0; + return S_OK; +} + +static HRes MyRead(void *object, void *data, UInt32 size, UInt32 *processedSize) +{ + return (HRes)((CSeqInStream *)object)->RealStream->Read(data, size, processedSize); +} + +HRESULT CEncoder::CodeOneBlock(UInt64 *inSize, UInt64 *outSize, Int32 *finished) +{ + if (_inStream != 0) + { + _seqInStream.RealStream = _inStream; + _seqInStream.SeqInStream.Read = MyRead; + _matchFinderBase.stream = &_seqInStream.SeqInStream; + _matchFinder.Init(_matchFinderObj); + _needReleaseMFStream = true; + _inStream = 0; + } + + + *finished = 1; + if (_finished) + return _matchFinderBase.result; + _finished = true; + + if (nowPos64 == 0) + { + if (_matchFinder.GetNumAvailableBytes(_matchFinderObj) == 0) + return Flush((UInt32)nowPos64); + UInt32 len, numDistancePairs; + len = ReadMatchDistances(numDistancePairs); + UInt32 posState = UInt32(nowPos64) & _posStateMask; + _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 0); + _state.UpdateChar(); + Byte curByte = _matchFinder.GetIndexByte(_matchFinderObj, 0 - _additionalOffset); + _literalEncoder.GetSubCoder(UInt32(nowPos64), _previousByte)->Encode(&_rangeEncoder, curByte); + _previousByte = curByte; + _additionalOffset--; + nowPos64++; + } + + UInt32 nowPos32 = (UInt32)nowPos64; + UInt32 progressPosValuePrev = nowPos32; + + if (_matchFinder.GetNumAvailableBytes(_matchFinderObj) == 0) + return Flush(nowPos32); + + for (;;) + { + #ifdef _NO_EXCEPTIONS + if (_rangeEncoder.Stream.ErrorCode != S_OK) + return _rangeEncoder.Stream.ErrorCode; + #endif + UInt32 pos, len; + + if (_fastMode) + len = GetOptimumFast(pos); + else + len = GetOptimum(nowPos32, pos); + + UInt32 posState = nowPos32 & _posStateMask; + if(len == 1 && pos == 0xFFFFFFFF) + { + _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 0); + Byte curByte = _matchFinder.GetIndexByte(_matchFinderObj, 0 - _additionalOffset); + CLiteralEncoder2 *subCoder = _literalEncoder.GetSubCoder(nowPos32, _previousByte); + if(_state.IsCharState()) + subCoder->Encode(&_rangeEncoder, curByte); + else + { + Byte matchByte = _matchFinder.GetIndexByte(_matchFinderObj, 0 - _repDistances[0] - 1 - _additionalOffset); + subCoder->EncodeMatched(&_rangeEncoder, matchByte, curByte); + } + _state.UpdateChar(); + _previousByte = curByte; + } + else + { + _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 1); + if(pos < kNumRepDistances) + { + _isRep[_state.Index].Encode(&_rangeEncoder, 1); + if(pos == 0) + { + _isRepG0[_state.Index].Encode(&_rangeEncoder, 0); + _isRep0Long[_state.Index][posState].Encode(&_rangeEncoder, ((len == 1) ? 0 : 1)); + } + else + { + UInt32 distance = _repDistances[pos]; + _isRepG0[_state.Index].Encode(&_rangeEncoder, 1); + if (pos == 1) + _isRepG1[_state.Index].Encode(&_rangeEncoder, 0); + else + { + _isRepG1[_state.Index].Encode(&_rangeEncoder, 1); + _isRepG2[_state.Index].Encode(&_rangeEncoder, pos - 2); + if (pos == 3) + _repDistances[3] = _repDistances[2]; + _repDistances[2] = _repDistances[1]; + } + _repDistances[1] = _repDistances[0]; + _repDistances[0] = distance; + } + if (len == 1) + _state.UpdateShortRep(); + else + { + _repMatchLenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode); + _state.UpdateRep(); + } + } + else + { + _isRep[_state.Index].Encode(&_rangeEncoder, 0); + _state.UpdateMatch(); + _lenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode); + pos -= kNumRepDistances; + UInt32 posSlot = GetPosSlot(pos); + _posSlotEncoder[GetLenToPosState(len)].Encode(&_rangeEncoder, posSlot); + + if (posSlot >= kStartPosModelIndex) + { + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + UInt32 posReduced = pos - base; + + if (posSlot < kEndPosModelIndex) + NRangeCoder::ReverseBitTreeEncode(_posEncoders + base - posSlot - 1, + &_rangeEncoder, footerBits, posReduced); + else + { + _rangeEncoder.EncodeDirectBits(posReduced >> kNumAlignBits, footerBits - kNumAlignBits); + _posAlignEncoder.ReverseEncode(&_rangeEncoder, posReduced & kAlignMask); + _alignPriceCount++; + } + } + _repDistances[3] = _repDistances[2]; + _repDistances[2] = _repDistances[1]; + _repDistances[1] = _repDistances[0]; + _repDistances[0] = pos; + _matchPriceCount++; + } + _previousByte = _matchFinder.GetIndexByte(_matchFinderObj, len - 1 - _additionalOffset); + } + _additionalOffset -= len; + nowPos32 += len; + if (_additionalOffset == 0) + { + if (!_fastMode) + { + if (_matchPriceCount >= (1 << 7)) + FillDistancesPrices(); + if (_alignPriceCount >= kAlignTableSize) + FillAlignPrices(); + } + if (_matchFinder.GetNumAvailableBytes(_matchFinderObj) == 0) + return Flush(nowPos32); + if (nowPos32 - progressPosValuePrev >= (1 << 14)) + { + nowPos64 += nowPos32 - progressPosValuePrev; + *inSize = nowPos64; + *outSize = _rangeEncoder.GetProcessedSize(); + _finished = false; + *finished = 0; + return _matchFinderBase.result; + } + } + } +} + +STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, + ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress) +{ + #ifndef _NO_EXCEPTIONS + try + { + #endif + return CodeReal(inStream, outStream, inSize, outSize, progress); + #ifndef _NO_EXCEPTIONS + } + catch(const COutBufferException &e) { return e.ErrorCode; } + catch(...) { return E_FAIL; } + #endif +} + +void CEncoder::FillDistancesPrices() +{ + UInt32 tempPrices[kNumFullDistances]; + for (UInt32 i = kStartPosModelIndex; i < kNumFullDistances; i++) + { + UInt32 posSlot = GetPosSlot(i); + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + tempPrices[i] = NRangeCoder::ReverseBitTreeGetPrice(_posEncoders + + base - posSlot - 1, footerBits, i - base); + } + + for (UInt32 lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) + { + UInt32 posSlot; + NRangeCoder::CBitTreeEncoder &encoder = _posSlotEncoder[lenToPosState]; + UInt32 *posSlotPrices = _posSlotPrices[lenToPosState]; + for (posSlot = 0; posSlot < _distTableSize; posSlot++) + posSlotPrices[posSlot] = encoder.GetPrice(posSlot); + for (posSlot = kEndPosModelIndex; posSlot < _distTableSize; posSlot++) + posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << NRangeCoder::kNumBitPriceShiftBits); + + UInt32 *distancesPrices = _distancesPrices[lenToPosState]; + UInt32 i; + for (i = 0; i < kStartPosModelIndex; i++) + distancesPrices[i] = posSlotPrices[i]; + for (; i < kNumFullDistances; i++) + distancesPrices[i] = posSlotPrices[GetPosSlot(i)] + tempPrices[i]; + } + _matchPriceCount = 0; +} + +void CEncoder::FillAlignPrices() +{ + for (UInt32 i = 0; i < kAlignTableSize; i++) + _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); + _alignPriceCount = 0; +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMAEncoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMAEncoder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,465 @@ +// LZMA/Encoder.h + +#ifndef __LZMA_ENCODER_H +#define __LZMA_ENCODER_H + +#include "../../../Common/MyCom.h" +#include "../../ICoder.h" + +extern "C" +{ + #include "../../../../C/Alloc.h" + #include "../../../../C/Compress/Lz/MatchFinder.h" + #ifdef COMPRESS_MF_MT + #include "../../../../C/Compress/Lz/MatchFinderMt.h" + #endif +} + +#include "../RangeCoder/RangeCoderBitTree.h" + +#include "LZMA.h" + +namespace NCompress { +namespace NLZMA { + +typedef NRangeCoder::CBitEncoder CMyBitEncoder; + +class CBaseState +{ +protected: + CState _state; + Byte _previousByte; + UInt32 _repDistances[kNumRepDistances]; + void Init() + { + _state.Init(); + _previousByte = 0; + for(UInt32 i = 0 ; i < kNumRepDistances; i++) + _repDistances[i] = 0; + } +}; + +struct COptimal +{ + CState State; + + bool Prev1IsChar; + bool Prev2; + + UInt32 PosPrev2; + UInt32 BackPrev2; + + UInt32 Price; + UInt32 PosPrev; // posNext; + UInt32 BackPrev; + UInt32 Backs[kNumRepDistances]; + void MakeAsChar() { BackPrev = UInt32(-1); Prev1IsChar = false; } + void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; } + bool IsShortRep() { return (BackPrev == 0); } +}; + + +// #define LZMA_LOG_BRANCH + +#if _MSC_VER >= 1400 +// Must give gain in core 2. but slower ~2% on k8. +// #define LZMA_LOG_BSR +#endif + +#ifndef LZMA_LOG_BSR +static const int kNumLogBits = 13; // don't change it ! +extern Byte g_FastPos[]; +#endif +inline UInt32 GetPosSlot(UInt32 pos) +{ + #ifdef LZMA_LOG_BSR + if (pos < 2) + return pos; + unsigned long index; + _BitScanReverse(&index, pos); + return (index + index) + ((pos >> (index - 1)) & 1); + #else + if (pos < (1 << kNumLogBits)) + return g_FastPos[pos]; + if (pos < (1 << (kNumLogBits * 2 - 1))) + return g_FastPos[pos >> (kNumLogBits - 1)] + (kNumLogBits - 1) * 2; + return g_FastPos[pos >> (kNumLogBits - 1) * 2] + (kNumLogBits - 1) * 4; + #endif +} + +inline UInt32 GetPosSlot2(UInt32 pos) +{ + #ifdef LZMA_LOG_BSR + unsigned long index; + _BitScanReverse(&index, pos); + return (index + index) + ((pos >> (index - 1)) & 1); + #else + #ifdef LZMA_LOG_BRANCH + if (pos < (1 << (kNumLogBits + 6))) + return g_FastPos[pos >> 6] + 12; + if (pos < (1 << (kNumLogBits * 2 + 5))) + return g_FastPos[pos >> (kNumLogBits + 5)] + (kNumLogBits + 5) * 2; + return g_FastPos[pos >> (kNumLogBits * 2 + 4)] + (kNumLogBits * 2 + 4) * 2; + #else + // it's faster with VC6-32bit. + UInt32 s = 6 + ((kNumLogBits - 1) & (UInt32)((Int32)(((1 << (kNumLogBits + 6)) - 1) - pos) >> 31)); + return g_FastPos[pos >> s] + (s * 2); + #endif + #endif +} + +const UInt32 kIfinityPrice = 0xFFFFFFF; + +const UInt32 kNumOpts = 1 << 12; + + +class CLiteralEncoder2 +{ + CMyBitEncoder _encoders[0x300]; +public: + void Init() + { + for (int i = 0; i < 0x300; i++) + _encoders[i].Init(); + } + void Encode(NRangeCoder::CEncoder *rangeEncoder, Byte symbol); + void EncodeMatched(NRangeCoder::CEncoder *rangeEncoder, Byte matchByte, Byte symbol); + UInt32 GetPrice(bool matchMode, Byte matchByte, Byte symbol) const; +}; + +class CLiteralEncoder +{ + CLiteralEncoder2 *_coders; + int _numPrevBits; + int _numPosBits; + UInt32 _posMask; +public: + CLiteralEncoder(): _coders(0) {} + ~CLiteralEncoder() { Free(); } + void Free() + { + MyFree(_coders); + _coders = 0; + } + bool Create(int numPosBits, int numPrevBits) + { + if (_coders == 0 || (numPosBits + numPrevBits) != (_numPrevBits + _numPosBits)) + { + Free(); + UInt32 numStates = 1 << (numPosBits + numPrevBits); + _coders = (CLiteralEncoder2 *)MyAlloc(numStates * sizeof(CLiteralEncoder2)); + } + _numPosBits = numPosBits; + _posMask = (1 << numPosBits) - 1; + _numPrevBits = numPrevBits; + return (_coders != 0); + } + void Init() + { + UInt32 numStates = 1 << (_numPrevBits + _numPosBits); + for (UInt32 i = 0; i < numStates; i++) + _coders[i].Init(); + } + CLiteralEncoder2 *GetSubCoder(UInt32 pos, Byte prevByte) + { return &_coders[((pos & _posMask) << _numPrevBits) + (prevByte >> (8 - _numPrevBits))]; } +}; + +namespace NLength { + +class CEncoder +{ + CMyBitEncoder _choice; + CMyBitEncoder _choice2; + NRangeCoder::CBitTreeEncoder _lowCoder[kNumPosStatesEncodingMax]; + NRangeCoder::CBitTreeEncoder _midCoder[kNumPosStatesEncodingMax]; + NRangeCoder::CBitTreeEncoder _highCoder; +public: + void Init(UInt32 numPosStates); + void Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState); + void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32 *prices) const; +}; + +const UInt32 kNumSpecSymbols = kNumLowSymbols + kNumMidSymbols; + +class CPriceTableEncoder: public CEncoder +{ + UInt32 _prices[kNumPosStatesEncodingMax][kNumSymbolsTotal]; + UInt32 _tableSize; + UInt32 _counters[kNumPosStatesEncodingMax]; +public: + void SetTableSize(UInt32 tableSize) { _tableSize = tableSize; } + UInt32 GetPrice(UInt32 symbol, UInt32 posState) const { return _prices[posState][symbol]; } + void UpdateTable(UInt32 posState) + { + SetPrices(posState, _tableSize, _prices[posState]); + _counters[posState] = _tableSize; + } + void UpdateTables(UInt32 numPosStates) + { + for (UInt32 posState = 0; posState < numPosStates; posState++) + UpdateTable(posState); + } + void Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState, bool updatePrice) + { + CEncoder::Encode(rangeEncoder, symbol, posState); + if (updatePrice) + if (--_counters[posState] == 0) + UpdateTable(posState); + } +}; + +} + +typedef struct _CSeqInStream +{ + ISeqInStream SeqInStream; + CMyComPtr RealStream; +} CSeqInStream; + + +class CEncoder : + public ICompressCoder, + public ICompressSetOutStream, + public ICompressSetCoderProperties, + public ICompressWriteCoderProperties, + public CBaseState, + public CMyUnknownImp +{ + NRangeCoder::CEncoder _rangeEncoder; + + IMatchFinder _matchFinder; + void *_matchFinderObj; + + #ifdef COMPRESS_MF_MT + Bool _multiThread; + Bool _mtMode; + CMatchFinderMt _matchFinderMt; + #endif + + CMatchFinder _matchFinderBase; + #ifdef COMPRESS_MF_MT + Byte _pad1[kMtCacheLineDummy]; + #endif + + COptimal _optimum[kNumOpts]; + + CMyBitEncoder _isMatch[kNumStates][NLength::kNumPosStatesEncodingMax]; + CMyBitEncoder _isRep[kNumStates]; + CMyBitEncoder _isRepG0[kNumStates]; + CMyBitEncoder _isRepG1[kNumStates]; + CMyBitEncoder _isRepG2[kNumStates]; + CMyBitEncoder _isRep0Long[kNumStates][NLength::kNumPosStatesEncodingMax]; + + NRangeCoder::CBitTreeEncoder _posSlotEncoder[kNumLenToPosStates]; + + CMyBitEncoder _posEncoders[kNumFullDistances - kEndPosModelIndex]; + NRangeCoder::CBitTreeEncoder _posAlignEncoder; + + NLength::CPriceTableEncoder _lenEncoder; + NLength::CPriceTableEncoder _repMatchLenEncoder; + + CLiteralEncoder _literalEncoder; + + UInt32 _matchDistances[kMatchMaxLen * 2 + 2 + 1]; + + bool _fastMode; + // bool _maxMode; + UInt32 _numFastBytes; + UInt32 _longestMatchLength; + UInt32 _numDistancePairs; + + UInt32 _additionalOffset; + + UInt32 _optimumEndIndex; + UInt32 _optimumCurrentIndex; + + bool _longestMatchWasFound; + + UInt32 _posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; + + UInt32 _distancesPrices[kNumLenToPosStates][kNumFullDistances]; + + UInt32 _alignPrices[kAlignTableSize]; + UInt32 _alignPriceCount; + + UInt32 _distTableSize; + + UInt32 _posStateBits; + UInt32 _posStateMask; + UInt32 _numLiteralPosStateBits; + UInt32 _numLiteralContextBits; + + UInt32 _dictionarySize; + + UInt32 _matchPriceCount; + UInt64 nowPos64; + bool _finished; + ISequentialInStream *_inStream; + + CSeqInStream _seqInStream; + + UInt32 _matchFinderCycles; + // int _numSkip + + bool _writeEndMark; + + bool _needReleaseMFStream; + + void ReleaseMatchFinder() + { + _matchFinder.Init = 0; + _seqInStream.RealStream.Release(); + } + + void ReleaseMFStream() + { + if (_matchFinderObj && _needReleaseMFStream) + { + #ifdef COMPRESS_MF_MT + if (_mtMode) + MatchFinderMt_ReleaseStream(&_matchFinderMt); + #endif + _needReleaseMFStream = false; + } + _seqInStream.RealStream.Release(); + } + + UInt32 ReadMatchDistances(UInt32 &numDistancePairs); + + void MovePos(UInt32 num); + UInt32 GetRepLen1Price(CState state, UInt32 posState) const + { + return _isRepG0[state.Index].GetPrice0() + + _isRep0Long[state.Index][posState].GetPrice0(); + } + + UInt32 GetPureRepPrice(UInt32 repIndex, CState state, UInt32 posState) const + { + UInt32 price; + if(repIndex == 0) + { + price = _isRepG0[state.Index].GetPrice0(); + price += _isRep0Long[state.Index][posState].GetPrice1(); + } + else + { + price = _isRepG0[state.Index].GetPrice1(); + if (repIndex == 1) + price += _isRepG1[state.Index].GetPrice0(); + else + { + price += _isRepG1[state.Index].GetPrice1(); + price += _isRepG2[state.Index].GetPrice(repIndex - 2); + } + } + return price; + } + UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, CState state, UInt32 posState) const + { + return _repMatchLenEncoder.GetPrice(len - kMatchMinLen, posState) + + GetPureRepPrice(repIndex, state, posState); + } + /* + UInt32 GetPosLen2Price(UInt32 pos, UInt32 posState) const + { + if (pos >= kNumFullDistances) + return kIfinityPrice; + return _distancesPrices[0][pos] + _lenEncoder.GetPrice(0, posState); + } + UInt32 GetPosLen3Price(UInt32 pos, UInt32 len, UInt32 posState) const + { + UInt32 price; + UInt32 lenToPosState = GetLenToPosState(len); + if (pos < kNumFullDistances) + price = _distancesPrices[lenToPosState][pos]; + else + price = _posSlotPrices[lenToPosState][GetPosSlot2(pos)] + + _alignPrices[pos & kAlignMask]; + return price + _lenEncoder.GetPrice(len - kMatchMinLen, posState); + } + */ + UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState) const + { + UInt32 price; + UInt32 lenToPosState = GetLenToPosState(len); + if (pos < kNumFullDistances) + price = _distancesPrices[lenToPosState][pos]; + else + price = _posSlotPrices[lenToPosState][GetPosSlot2(pos)] + + _alignPrices[pos & kAlignMask]; + return price + _lenEncoder.GetPrice(len - kMatchMinLen, posState); + } + + UInt32 Backward(UInt32 &backRes, UInt32 cur); + UInt32 GetOptimum(UInt32 position, UInt32 &backRes); + UInt32 GetOptimumFast(UInt32 &backRes); + + void FillDistancesPrices(); + void FillAlignPrices(); + + void ReleaseStreams() + { + ReleaseMFStream(); + ReleaseOutStream(); + } + + HRESULT Flush(UInt32 nowPos); + class CCoderReleaser + { + CEncoder *_coder; + public: + CCoderReleaser(CEncoder *coder): _coder(coder) {} + ~CCoderReleaser() { _coder->ReleaseStreams(); } + }; + friend class CCoderReleaser; + + void WriteEndMarker(UInt32 posState); + +public: + CEncoder(); + void SetWriteEndMarkerMode(bool writeEndMarker) + { _writeEndMark= writeEndMarker; } + + HRESULT Create(); + + MY_UNKNOWN_IMP3( + ICompressSetOutStream, + ICompressSetCoderProperties, + ICompressWriteCoderProperties + ) + + HRESULT Init(); + + // ICompressCoder interface + HRESULT SetStreams(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize); + HRESULT CodeOneBlock(UInt64 *inSize, UInt64 *outSize, Int32 *finished); + + HRESULT CodeReal(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress); + + // ICompressCoder interface + STDMETHOD(Code)(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress); + + // ICompressSetCoderProperties2 + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, + const PROPVARIANT *properties, UInt32 numProperties); + + // ICompressWriteCoderProperties + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + + STDMETHOD(SetOutStream)(ISequentialOutStream *outStream); + STDMETHOD(ReleaseOutStream)(); + + virtual ~CEncoder(); +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMARegister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/LZMARegister.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,19 @@ +// LZMARegister.cpp + +#include "StdAfx.h" + +#include "../../Common/RegisterCodec.h" + +#include "LZMADecoder.h" +static void *CreateCodec() { return (void *)(ICompressCoder *)(new NCompress::NLZMA::CDecoder); } +#ifndef EXTRACT_ONLY +#include "LZMAEncoder.h" +static void *CreateCodecOut() { return (void *)(ICompressCoder *)(new NCompress::NLZMA::CEncoder); } +#else +#define CreateCodecOut 0 +#endif + +static CCodecInfo g_CodecInfo = + { CreateCodec, CreateCodecOut, 0x030101, L"LZMA", 1, false }; + +REGISTER_CODEC(LZMA) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,8 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,504 @@ +# Microsoft Developer Studio Project File - Name="AloneLZMA" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=AloneLZMA - Win32 DebugU +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "AloneLZMA.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "AloneLZMA.mak" CFG="AloneLZMA - Win32 DebugU" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "AloneLZMA - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "AloneLZMA - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "AloneLZMA - Win32 ReleaseU" (based on "Win32 (x86) Console Application") +!MESSAGE "AloneLZMA - Win32 DebugU" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "AloneLZMA - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\\" /D "NDEBUG" /D "_MBCS" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /FAcs /Yu"StdAfx.h" /FD /c +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\UTIL\lzma.exe" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "AloneLZMA - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\..\\" /D "_DEBUG" /D "_MBCS" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /GZ /c +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\UTIL\lzma.exe" /pdbtype:sept + +!ELSEIF "$(CFG)" == "AloneLZMA - Win32 ReleaseU" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "ReleaseU" +# PROP BASE Intermediate_Dir "ReleaseU" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "ReleaseU" +# PROP Intermediate_Dir "ReleaseU" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "EXCLUDE_COM" /D "NO_REGISTRY" /D "FORMAT_7Z" /D "FORMAT_BZIP2" /D "FORMAT_ZIP" /D "FORMAT_TAR" /D "FORMAT_GZIP" /D "COMPRESS_LZMA" /D "COMPRESS_BCJ_X86" /D "COMPRESS_BCJ2" /D "COMPRESS_COPY" /D "COMPRESS_MF_PAT" /D "COMPRESS_MF_BT" /D "COMPRESS_PPMD" /D "COMPRESS_DEFLATE" /D "COMPRESS_IMPLODE" /D "COMPRESS_BZIP2" /D "CRYPTO_ZIP" /Yu"StdAfx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\\" /D "NDEBUG" /D "UNICODE" /D "_UNICODE" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /c +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\UTIL\7za2.exe" /opt:NOWIN98 +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\UTIL\lzma.exe" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "AloneLZMA - Win32 DebugU" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "DebugU" +# PROP BASE Intermediate_Dir "DebugU" +# PROP BASE Ignore_Export_Lib 0 +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "DebugU" +# PROP Intermediate_Dir "DebugU" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "EXCLUDE_COM" /D "NO_REGISTRY" /D "FORMAT_7Z" /D "FORMAT_BZIP2" /D "FORMAT_ZIP" /D "FORMAT_TAR" /D "FORMAT_GZIP" /D "COMPRESS_LZMA" /D "COMPRESS_BCJ_X86" /D "COMPRESS_BCJ2" /D "COMPRESS_COPY" /D "COMPRESS_MF_PAT" /D "COMPRESS_MF_BT" /D "COMPRESS_PPMD" /D "COMPRESS_DEFLATE" /D "COMPRESS_IMPLODE" /D "COMPRESS_BZIP2" /D "CRYPTO_ZIP" /D "_MBCS" /Yu"StdAfx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\\" /D "_DEBUG" /D "_UNICODE" /D "UNICODE" /D "WIN32" /D "_CONSOLE" /D "COMPRESS_MF_MT" /D "BENCH_MT" /Yu"StdAfx.h" /FD /GZ /c +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\UTIL\7za2.exe" /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\UTIL\lzma.exe" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "AloneLZMA - Win32 Release" +# Name "AloneLZMA - Win32 Debug" +# Name "AloneLZMA - Win32 ReleaseU" +# Name "AloneLZMA - Win32 DebugU" +# Begin Group "Spec" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"StdAfx.h" +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Compress" + +# PROP Default_Filter "" +# Begin Group "LZMA" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\LZMA\LZMA.h +# End Source File +# Begin Source File + +SOURCE=..\LZMA\LZMADecoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\LZMA\LZMADecoder.h +# End Source File +# Begin Source File + +SOURCE=..\LZMA\LZMAEncoder.cpp +# End Source File +# Begin Source File + +SOURCE=..\LZMA\LZMAEncoder.h +# End Source File +# End Group +# Begin Group "RangeCoder" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\RangeCoder\RangeCoder.h +# End Source File +# Begin Source File + +SOURCE=..\RangeCoder\RangeCoderBit.cpp +# End Source File +# Begin Source File + +SOURCE=..\RangeCoder\RangeCoderBit.h +# End Source File +# Begin Source File + +SOURCE=..\RangeCoder\RangeCoderBitTree.h +# End Source File +# Begin Source File + +SOURCE=..\RangeCoder\RangeCoderOpt.h +# End Source File +# End Group +# Begin Group "LZ" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\LZ\LZOutWindow.cpp +# End Source File +# Begin Source File + +SOURCE=..\LZ\LZOutWindow.h +# End Source File +# End Group +# End Group +# Begin Group "Windows" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\Windows\FileIO.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileIO.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Synchronization.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Synchronization.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Thread.h +# End Source File +# End Group +# Begin Group "Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\Common\CommandLineParser.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\CommandLineParser.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\CRC.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Defs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\Defs.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\IntToString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\IntToString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyCom.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyWindows.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringConvert.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringConvert.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringToInt.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringToInt.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Types.h +# End Source File +# End Group +# Begin Group "7zip Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Common\FileStreams.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FileStreams.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\InBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\InBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\OutBuffer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\OutBuffer.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamUtils.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\StreamUtils.h +# End Source File +# End Group +# Begin Group "C" + +# PROP Default_Filter "" +# Begin Group "C-Lz" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\MatchFinder.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\MatchFinder.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\MatchFinderMt.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lz\MatchFinderMt.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Threads.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Threads.h +# End Source File +# End Group +# Begin Group "LZMA_C" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lzma\LzmaDecode.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lzma\LzmaDecode.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Lzma\LzmaTypes.h +# End Source File +# End Group +# Begin Group "Branch" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchTypes.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchX86.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Compress\Branch\BranchX86.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\..\..\C\7zCrc.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\7zCrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Alloc.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Alloc.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Types.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\ICoder.h +# End Source File +# Begin Source File + +SOURCE=.\LzmaAlone.cpp +# End Source File +# Begin Source File + +SOURCE=.\LzmaBench.cpp +# End Source File +# Begin Source File + +SOURCE=.\LzmaBench.h +# End Source File +# Begin Source File + +SOURCE=.\LzmaBenchCon.cpp +# End Source File +# Begin Source File + +SOURCE=.\LzmaBenchCon.h +# End Source File +# Begin Source File + +SOURCE=.\LzmaRam.cpp +# End Source File +# Begin Source File + +SOURCE=.\LzmaRam.h +# End Source File +# Begin Source File + +SOURCE=.\LzmaRamDecode.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=.\LzmaRamDecode.h +# End Source File +# End Target +# End Project diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsw --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsw Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "AloneLZMA"=.\AloneLZMA.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,554 @@ +// LzmaAlone.cpp + +#include "StdAfx.h" + +#include "../../../Common/MyWindows.h" +#include "../../../Common/MyInitGuid.h" + +#include + +#if defined(_WIN32) || defined(OS2) || defined(MSDOS) +#include +#include +#define MY_SET_BINARY_MODE(file) _setmode(_fileno(file), O_BINARY) +#else +#define MY_SET_BINARY_MODE(file) +#endif + +#include "../../../Common/CommandLineParser.h" +#include "../../../Common/StringConvert.h" +#include "../../../Common/StringToInt.h" + +#include "../../Common/FileStreams.h" +#include "../../Common/StreamUtils.h" + +#include "../LZMA/LZMADecoder.h" +#include "../LZMA/LZMAEncoder.h" + +#include "LzmaBenchCon.h" +#include "LzmaRam.h" + +#ifdef COMPRESS_MF_MT +#include "../../../Windows/System.h" +#endif + +#include "../../MyVersion.h" + +extern "C" +{ +#include "LzmaRamDecode.h" +} + +using namespace NCommandLineParser; + +#ifdef _WIN32 +bool g_IsNT = false; +static inline bool IsItWindowsNT() +{ + OSVERSIONINFO versionInfo; + versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); + if (!::GetVersionEx(&versionInfo)) + return false; + return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); +} +#endif + +static const char *kCantAllocate = "Can not allocate memory"; +static const char *kReadError = "Read error"; +static const char *kWriteError = "Write error"; + +namespace NKey { +enum Enum +{ + kHelp1 = 0, + kHelp2, + kMode, + kDictionary, + kFastBytes, + kMatchFinderCycles, + kLitContext, + kLitPos, + kPosBits, + kMatchFinder, + kMultiThread, + kEOS, + kStdIn, + kStdOut, + kFilter86 +}; +} + +static const CSwitchForm kSwitchForms[] = +{ + { L"?", NSwitchType::kSimple, false }, + { L"H", NSwitchType::kSimple, false }, + { L"A", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"D", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"FB", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"MC", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"LC", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"LP", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"PB", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"MF", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"MT", NSwitchType::kUnLimitedPostString, false, 0 }, + { L"EOS", NSwitchType::kSimple, false }, + { L"SI", NSwitchType::kSimple, false }, + { L"SO", NSwitchType::kSimple, false }, + { L"F86", NSwitchType::kPostChar, false, 0, 0, L"+" } +}; + +static const int kNumSwitches = sizeof(kSwitchForms) / sizeof(kSwitchForms[0]); + +static void PrintHelp() +{ + fprintf(stderr, "\nUsage: LZMA inputFile outputFile [...]\n" + " e: encode file\n" + " d: decode file\n" + " b: Benchmark\n" + "\n" + " -a{N}: set compression mode - [0, 1], default: 1 (max)\n" + " -d{N}: set dictionary - [0,30], default: 23 (8MB)\n" + " -fb{N}: set number of fast bytes - [5, 273], default: 128\n" + " -mc{N}: set number of cycles for match finder\n" + " -lc{N}: set number of literal context bits - [0, 8], default: 3\n" + " -lp{N}: set number of literal pos bits - [0, 4], default: 0\n" + " -pb{N}: set number of pos bits - [0, 4], default: 2\n" + " -mf{MF_ID}: set Match Finder: [bt2, bt3, bt4, hc4], default: bt4\n" + " -mt{N}: set number of CPU threads\n" + " -eos: write End Of Stream marker\n" + " -si: read data from stdin\n" + " -so: write data to stdout\n" + ); +} + +static void PrintHelpAndExit(const char *s) +{ + fprintf(stderr, "\nError: %s\n\n", s); + PrintHelp(); + throw -1; +} + +static void IncorrectCommand() +{ + PrintHelpAndExit("Incorrect command"); +} + +static void WriteArgumentsToStringList(int numArguments, const char *arguments[], + UStringVector &strings) +{ + for(int i = 1; i < numArguments; i++) + strings.Add(MultiByteToUnicodeString(arguments[i])); +} + +static bool GetNumber(const wchar_t *s, UInt32 &value) +{ + value = 0; + if (MyStringLen(s) == 0) + return false; + const wchar_t *end; + UInt64 res = ConvertStringToUInt64(s, &end); + if (*end != L'\0') + return false; + if (res > 0xFFFFFFFF) + return false; + value = UInt32(res); + return true; +} + +int main2(int n, const char *args[]) +{ + #ifdef _WIN32 + g_IsNT = IsItWindowsNT(); + #endif + + fprintf(stderr, "\nLZMA " MY_VERSION_COPYRIGHT_DATE "\n"); + + if (n == 1) + { + PrintHelp(); + return 0; + } + + bool unsupportedTypes = (sizeof(Byte) != 1 || sizeof(UInt32) < 4 || sizeof(UInt64) < 4); + if (unsupportedTypes) + { + fprintf(stderr, "Unsupported base types. Edit Common/Types.h and recompile"); + return 1; + } + + UStringVector commandStrings; + WriteArgumentsToStringList(n, args, commandStrings); + CParser parser(kNumSwitches); + try + { + parser.ParseStrings(kSwitchForms, commandStrings); + } + catch(...) + { + IncorrectCommand(); + } + + if(parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs) + { + PrintHelp(); + return 0; + } + const UStringVector &nonSwitchStrings = parser.NonSwitchStrings; + + int paramIndex = 0; + if (paramIndex >= nonSwitchStrings.Size()) + IncorrectCommand(); + const UString &command = nonSwitchStrings[paramIndex++]; + + bool dictionaryIsDefined = false; + UInt32 dictionary = (UInt32)-1; + if(parser[NKey::kDictionary].ThereIs) + { + UInt32 dicLog; + if (!GetNumber(parser[NKey::kDictionary].PostStrings[0], dicLog)) + IncorrectCommand(); + dictionary = 1 << dicLog; + dictionaryIsDefined = true; + } + UString mf = L"BT4"; + if (parser[NKey::kMatchFinder].ThereIs) + mf = parser[NKey::kMatchFinder].PostStrings[0]; + + UInt32 numThreads = (UInt32)-1; + + #ifdef COMPRESS_MF_MT + if (parser[NKey::kMultiThread].ThereIs) + { + UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors(); + const UString &s = parser[NKey::kMultiThread].PostStrings[0]; + if (s.IsEmpty()) + numThreads = numCPUs; + else + if (!GetNumber(s, numThreads)) + IncorrectCommand(); + } + #endif + + if (command.CompareNoCase(L"b") == 0) + { + const UInt32 kNumDefaultItereations = 1; + UInt32 numIterations = kNumDefaultItereations; + { + if (paramIndex < nonSwitchStrings.Size()) + if (!GetNumber(nonSwitchStrings[paramIndex++], numIterations)) + numIterations = kNumDefaultItereations; + } + return LzmaBenchCon(stderr, numIterations, numThreads, dictionary); + } + + if (numThreads == (UInt32)-1) + numThreads = 1; + + bool encodeMode = false; + if (command.CompareNoCase(L"e") == 0) + encodeMode = true; + else if (command.CompareNoCase(L"d") == 0) + encodeMode = false; + else + IncorrectCommand(); + + bool stdInMode = parser[NKey::kStdIn].ThereIs; + bool stdOutMode = parser[NKey::kStdOut].ThereIs; + + CMyComPtr inStream; + CInFileStream *inStreamSpec = 0; + if (stdInMode) + { + inStream = new CStdInFileStream; + MY_SET_BINARY_MODE(stdin); + } + else + { + if (paramIndex >= nonSwitchStrings.Size()) + IncorrectCommand(); + const UString &inputName = nonSwitchStrings[paramIndex++]; + inStreamSpec = new CInFileStream; + inStream = inStreamSpec; + if (!inStreamSpec->Open(GetSystemString(inputName))) + { + fprintf(stderr, "\nError: can not open input file %s\n", + (const char *)GetOemString(inputName)); + return 1; + } + } + + CMyComPtr outStream; + COutFileStream *outStreamSpec = NULL; + if (stdOutMode) + { + outStream = new CStdOutFileStream; + MY_SET_BINARY_MODE(stdout); + } + else + { + if (paramIndex >= nonSwitchStrings.Size()) + IncorrectCommand(); + const UString &outputName = nonSwitchStrings[paramIndex++]; + outStreamSpec = new COutFileStream; + outStream = outStreamSpec; + if (!outStreamSpec->Create(GetSystemString(outputName), true)) + { + fprintf(stderr, "\nError: can not open output file %s\n", + (const char *)GetOemString(outputName)); + return 1; + } + } + + if (parser[NKey::kFilter86].ThereIs) + { + // -f86 switch is for x86 filtered mode: BCJ + LZMA. + if (parser[NKey::kEOS].ThereIs || stdInMode) + throw "Can not use stdin in this mode"; + UInt64 fileSize; + inStreamSpec->File.GetLength(fileSize); + if (fileSize > 0xF0000000) + throw "File is too big"; + UInt32 inSize = (UInt32)fileSize; + Byte *inBuffer = 0; + if (inSize != 0) + { + inBuffer = (Byte *)MyAlloc((size_t)inSize); + if (inBuffer == 0) + throw kCantAllocate; + } + + UInt32 processedSize; + if (ReadStream(inStream, inBuffer, (UInt32)inSize, &processedSize) != S_OK) + throw "Can not read"; + if ((UInt32)inSize != processedSize) + throw "Read size error"; + + Byte *outBuffer = 0; + size_t outSizeProcessed; + if (encodeMode) + { + // we allocate 105% of original size for output buffer + size_t outSize = (size_t)fileSize / 20 * 21 + (1 << 16); + if (outSize != 0) + { + outBuffer = (Byte *)MyAlloc((size_t)outSize); + if (outBuffer == 0) + throw kCantAllocate; + } + if (!dictionaryIsDefined) + dictionary = 1 << 23; + int res = LzmaRamEncode(inBuffer, inSize, outBuffer, outSize, &outSizeProcessed, + dictionary, parser[NKey::kFilter86].PostCharIndex == 0 ? SZ_FILTER_YES : SZ_FILTER_AUTO); + if (res != 0) + { + fprintf(stderr, "\nEncoder error = %d\n", (int)res); + return 1; + } + } + else + { + size_t outSize; + if (LzmaRamGetUncompressedSize(inBuffer, inSize, &outSize) != 0) + throw "data error"; + if (outSize != 0) + { + outBuffer = (Byte *)MyAlloc(outSize); + if (outBuffer == 0) + throw kCantAllocate; + } + int res = LzmaRamDecompress(inBuffer, inSize, outBuffer, outSize, &outSizeProcessed, malloc, free); + if (res != 0) + throw "LzmaDecoder error"; + } + if (WriteStream(outStream, outBuffer, (UInt32)outSizeProcessed, &processedSize) != S_OK) + throw kWriteError; + MyFree(outBuffer); + MyFree(inBuffer); + return 0; + } + + + UInt64 fileSize; + if (encodeMode) + { + NCompress::NLZMA::CEncoder *encoderSpec = new NCompress::NLZMA::CEncoder; + CMyComPtr encoder = encoderSpec; + + if (!dictionaryIsDefined) + dictionary = 1 << 23; + + UInt32 posStateBits = 2; + UInt32 litContextBits = 3; // for normal files + // UInt32 litContextBits = 0; // for 32-bit data + UInt32 litPosBits = 0; + // UInt32 litPosBits = 2; // for 32-bit data + UInt32 algorithm = 1; + UInt32 numFastBytes = 128; + UInt32 matchFinderCycles = 16 + numFastBytes / 2; + bool matchFinderCyclesDefined = false; + + bool eos = parser[NKey::kEOS].ThereIs || stdInMode; + + if(parser[NKey::kMode].ThereIs) + if (!GetNumber(parser[NKey::kMode].PostStrings[0], algorithm)) + IncorrectCommand(); + + if(parser[NKey::kFastBytes].ThereIs) + if (!GetNumber(parser[NKey::kFastBytes].PostStrings[0], numFastBytes)) + IncorrectCommand(); + matchFinderCyclesDefined = parser[NKey::kMatchFinderCycles].ThereIs; + if (matchFinderCyclesDefined) + if (!GetNumber(parser[NKey::kMatchFinderCycles].PostStrings[0], matchFinderCycles)) + IncorrectCommand(); + if(parser[NKey::kLitContext].ThereIs) + if (!GetNumber(parser[NKey::kLitContext].PostStrings[0], litContextBits)) + IncorrectCommand(); + if(parser[NKey::kLitPos].ThereIs) + if (!GetNumber(parser[NKey::kLitPos].PostStrings[0], litPosBits)) + IncorrectCommand(); + if(parser[NKey::kPosBits].ThereIs) + if (!GetNumber(parser[NKey::kPosBits].PostStrings[0], posStateBits)) + IncorrectCommand(); + + PROPID propIDs[] = + { + NCoderPropID::kDictionarySize, + NCoderPropID::kPosStateBits, + NCoderPropID::kLitContextBits, + NCoderPropID::kLitPosBits, + NCoderPropID::kAlgorithm, + NCoderPropID::kNumFastBytes, + NCoderPropID::kMatchFinder, + NCoderPropID::kEndMarker, + NCoderPropID::kNumThreads, + NCoderPropID::kMatchFinderCycles, + }; + const int kNumPropsMax = sizeof(propIDs) / sizeof(propIDs[0]); + + PROPVARIANT properties[kNumPropsMax]; + for (int p = 0; p < 6; p++) + properties[p].vt = VT_UI4; + + properties[0].ulVal = (UInt32)dictionary; + properties[1].ulVal = (UInt32)posStateBits; + properties[2].ulVal = (UInt32)litContextBits; + properties[3].ulVal = (UInt32)litPosBits; + properties[4].ulVal = (UInt32)algorithm; + properties[5].ulVal = (UInt32)numFastBytes; + + properties[6].vt = VT_BSTR; + properties[6].bstrVal = (BSTR)(const wchar_t *)mf; + + properties[7].vt = VT_BOOL; + properties[7].boolVal = eos ? VARIANT_TRUE : VARIANT_FALSE; + + properties[8].vt = VT_UI4; + properties[8].ulVal = (UInt32)numThreads; + + // it must be last in property list + properties[9].vt = VT_UI4; + properties[9].ulVal = (UInt32)matchFinderCycles; + + int numProps = kNumPropsMax; + if (!matchFinderCyclesDefined) + numProps--; + + if (encoderSpec->SetCoderProperties(propIDs, properties, numProps) != S_OK) + IncorrectCommand(); + encoderSpec->WriteCoderProperties(outStream); + + if (eos || stdInMode) + fileSize = (UInt64)(Int64)-1; + else + inStreamSpec->File.GetLength(fileSize); + + for (int i = 0; i < 8; i++) + { + Byte b = Byte(fileSize >> (8 * i)); + if (outStream->Write(&b, 1, 0) != S_OK) + { + fprintf(stderr, kWriteError); + return 1; + } + } + HRESULT result = encoder->Code(inStream, outStream, 0, 0, 0); + if (result == E_OUTOFMEMORY) + { + fprintf(stderr, "\nError: Can not allocate memory\n"); + return 1; + } + else if (result != S_OK) + { + fprintf(stderr, "\nEncoder error = %X\n", (unsigned int)result); + return 1; + } + } + else + { + NCompress::NLZMA::CDecoder *decoderSpec = new NCompress::NLZMA::CDecoder; + CMyComPtr decoder = decoderSpec; + const UInt32 kPropertiesSize = 5; + Byte properties[kPropertiesSize]; + UInt32 processedSize; + if (ReadStream(inStream, properties, kPropertiesSize, &processedSize) != S_OK) + { + fprintf(stderr, kReadError); + return 1; + } + if (processedSize != kPropertiesSize) + { + fprintf(stderr, kReadError); + return 1; + } + if (decoderSpec->SetDecoderProperties2(properties, kPropertiesSize) != S_OK) + { + fprintf(stderr, "SetDecoderProperties error"); + return 1; + } + fileSize = 0; + for (int i = 0; i < 8; i++) + { + Byte b; + if (inStream->Read(&b, 1, &processedSize) != S_OK) + { + fprintf(stderr, kReadError); + return 1; + } + if (processedSize != 1) + { + fprintf(stderr, kReadError); + return 1; + } + fileSize |= ((UInt64)b) << (8 * i); + } + if (decoder->Code(inStream, outStream, 0, &fileSize, 0) != S_OK) + { + fprintf(stderr, "Decoder error"); + return 1; + } + } + if (outStreamSpec != NULL) + { + if (outStreamSpec->Close() != S_OK) + { + fprintf(stderr, "File closing error"); + return 1; + } + } + return 0; +} + +int main(int n, const char *args[]) +{ + try { return main2(n, args); } + catch(const char *s) + { + fprintf(stderr, "\nError: %s\n", s); + return 1; + } + catch(...) + { + fprintf(stderr, "\nError\n"); + return 1; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1024 @@ +// LzmaBench.cpp + +#include "StdAfx.h" + +#include "LzmaBench.h" + +#ifndef _WIN32 +#define USE_POSIX_TIME +#define USE_POSIX_TIME2 +#endif + +#ifdef USE_POSIX_TIME +#include +#ifdef USE_POSIX_TIME2 +#include +#endif +#endif + +#ifdef _WIN32 +#define USE_ALLOCA +#endif + +#ifdef USE_ALLOCA +#ifdef _WIN32 +#include +#else +#include +#endif +#endif + +extern "C" +{ +#include "../../../../C/Alloc.h" +#include "../../../../C/7zCrc.h" +} +#include "../../../Common/MyCom.h" +#include "../../ICoder.h" + +#ifdef BENCH_MT +#include "../../../Windows/Thread.h" +#include "../../../Windows/Synchronization.h" +#endif + +#ifdef EXTERNAL_LZMA +#include "../../../Windows/PropVariant.h" +#else +#include "../LZMA/LZMADecoder.h" +#include "../LZMA/LZMAEncoder.h" +#endif + +static const UInt32 kUncompressMinBlockSize = 1 << 26; +static const UInt32 kAdditionalSize = (1 << 16); +static const UInt32 kCompressedAdditionalSize = (1 << 10); +static const UInt32 kMaxLzmaPropSize = 5; + +class CBaseRandomGenerator +{ + UInt32 A1; + UInt32 A2; +public: + CBaseRandomGenerator() { Init(); } + void Init() { A1 = 362436069; A2 = 521288629;} + UInt32 GetRnd() + { + return + ((A1 = 36969 * (A1 & 0xffff) + (A1 >> 16)) << 16) + + ((A2 = 18000 * (A2 & 0xffff) + (A2 >> 16)) ); + } +}; + +class CBenchBuffer +{ +public: + size_t BufferSize; + Byte *Buffer; + CBenchBuffer(): Buffer(0) {} + virtual ~CBenchBuffer() { Free(); } + void Free() + { + ::MidFree(Buffer); + Buffer = 0; + } + bool Alloc(size_t bufferSize) + { + if (Buffer != 0 && BufferSize == bufferSize) + return true; + Free(); + Buffer = (Byte *)::MidAlloc(bufferSize); + BufferSize = bufferSize; + return (Buffer != 0); + } +}; + +class CBenchRandomGenerator: public CBenchBuffer +{ + CBaseRandomGenerator *RG; +public: + void Set(CBaseRandomGenerator *rg) { RG = rg; } + UInt32 GetVal(UInt32 &res, int numBits) + { + UInt32 val = res & (((UInt32)1 << numBits) - 1); + res >>= numBits; + return val; + } + UInt32 GetLen(UInt32 &res) + { + UInt32 len = GetVal(res, 2); + return GetVal(res, 1 + len); + } + void Generate() + { + UInt32 pos = 0; + UInt32 rep0 = 1; + while (pos < BufferSize) + { + UInt32 res = RG->GetRnd(); + res >>= 1; + if (GetVal(res, 1) == 0 || pos < 1024) + Buffer[pos++] = (Byte)(res & 0xFF); + else + { + UInt32 len; + len = 1 + GetLen(res); + if (GetVal(res, 3) != 0) + { + len += GetLen(res); + do + { + UInt32 ppp = GetVal(res, 5) + 6; + res = RG->GetRnd(); + if (ppp > 30) + continue; + rep0 = /* (1 << ppp) +*/ GetVal(res, ppp); + res = RG->GetRnd(); + } + while (rep0 >= pos); + rep0++; + } + + for (UInt32 i = 0; i < len && pos < BufferSize; i++, pos++) + Buffer[pos] = Buffer[pos - rep0]; + } + } + } +}; + + +class CBenchmarkInStream: + public ISequentialInStream, + public CMyUnknownImp +{ + const Byte *Data; + size_t Pos; + size_t Size; +public: + MY_UNKNOWN_IMP + void Init(const Byte *data, size_t size) + { + Data = data; + Size = size; + Pos = 0; + } + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CBenchmarkInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + size_t remain = Size - Pos; + UInt32 kMaxBlockSize = (1 << 20); + if (size > kMaxBlockSize) + size = kMaxBlockSize; + if (size > remain) + size = (UInt32)remain; + for (UInt32 i = 0; i < size; i++) + ((Byte *)data)[i] = Data[Pos + i]; + Pos += size; + if(processedSize != NULL) + *processedSize = size; + return S_OK; +} + +class CBenchmarkOutStream: + public ISequentialOutStream, + public CBenchBuffer, + public CMyUnknownImp +{ + // bool _overflow; +public: + UInt32 Pos; + // CBenchmarkOutStream(): _overflow(false) {} + void Init() + { + // _overflow = false; + Pos = 0; + } + MY_UNKNOWN_IMP + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CBenchmarkOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + size_t curSize = BufferSize - Pos; + if (curSize > size) + curSize = size; + memcpy(Buffer + Pos, data, curSize); + Pos += (UInt32)curSize; + if(processedSize != NULL) + *processedSize = (UInt32)curSize; + if (curSize != size) + { + // _overflow = true; + return E_FAIL; + } + return S_OK; +} + +class CCrcOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ +public: + UInt32 Crc; + MY_UNKNOWN_IMP + void Init() { Crc = CRC_INIT_VAL; } + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CCrcOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + Crc = CrcUpdate(Crc, data, size); + if (processedSize != NULL) + *processedSize = size; + return S_OK; +} + +static UInt64 GetTimeCount() +{ + #ifdef USE_POSIX_TIME + #ifdef USE_POSIX_TIME2 + timeval v; + if (gettimeofday(&v, 0) == 0) + return (UInt64)(v.tv_sec) * 1000000 + v.tv_usec; + return (UInt64)time(NULL) * 1000000; + #else + return time(NULL); + #endif + #else + /* + LARGE_INTEGER value; + if (::QueryPerformanceCounter(&value)) + return value.QuadPart; + */ + return GetTickCount(); + #endif +} + +static UInt64 GetFreq() +{ + #ifdef USE_POSIX_TIME + #ifdef USE_POSIX_TIME2 + return 1000000; + #else + return 1; + #endif + #else + /* + LARGE_INTEGER value; + if (::QueryPerformanceFrequency(&value)) + return value.QuadPart; + */ + return 1000; + #endif +} + +#ifndef USE_POSIX_TIME +static inline UInt64 GetTime64(const FILETIME &t) { return ((UInt64)t.dwHighDateTime << 32) | t.dwLowDateTime; } +#endif +static UInt64 GetUserTime() +{ + #ifdef USE_POSIX_TIME + return clock(); + #else + FILETIME creationTime, exitTime, kernelTime, userTime; + if (::GetProcessTimes(::GetCurrentProcess(), &creationTime, &exitTime, &kernelTime, &userTime) != 0) + return GetTime64(userTime) + GetTime64(kernelTime); + return (UInt64)GetTickCount() * 10000; + #endif +} + +static UInt64 GetUserFreq() +{ + #ifdef USE_POSIX_TIME + return CLOCKS_PER_SEC; + #else + return 10000000; + #endif +} + +class CBenchProgressStatus +{ + #ifdef BENCH_MT + NWindows::NSynchronization::CCriticalSection CS; + #endif +public: + HRESULT Res; + bool EncodeMode; + void SetResult(HRESULT res) + { + #ifdef BENCH_MT + NWindows::NSynchronization::CCriticalSectionLock lock(CS); + #endif + Res = res; + } + HRESULT GetResult() + { + #ifdef BENCH_MT + NWindows::NSynchronization::CCriticalSectionLock lock(CS); + #endif + return Res; + } +}; + +class CBenchProgressInfo: + public ICompressProgressInfo, + public CMyUnknownImp +{ +public: + CBenchProgressStatus *Status; + CBenchInfo BenchInfo; + HRESULT Res; + IBenchCallback *callback; + CBenchProgressInfo(): callback(0) {} + MY_UNKNOWN_IMP + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); +}; + +void SetStartTime(CBenchInfo &bi) +{ + bi.GlobalFreq = GetFreq(); + bi.UserFreq = GetUserFreq(); + bi.GlobalTime = ::GetTimeCount(); + bi.UserTime = ::GetUserTime(); +} + +void SetFinishTime(const CBenchInfo &biStart, CBenchInfo &dest) +{ + dest.GlobalFreq = GetFreq(); + dest.UserFreq = GetUserFreq(); + dest.GlobalTime = ::GetTimeCount() - biStart.GlobalTime; + dest.UserTime = ::GetUserTime() - biStart.UserTime; +} + +STDMETHODIMP CBenchProgressInfo::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) +{ + HRESULT res = Status->GetResult(); + if (res != S_OK) + return res; + if (!callback) + return res; + CBenchInfo info = BenchInfo; + SetFinishTime(BenchInfo, info); + if (Status->EncodeMode) + { + info.UnpackSize = *inSize; + info.PackSize = *outSize; + res = callback->SetEncodeResult(info, false); + } + else + { + info.PackSize = BenchInfo.PackSize + *inSize; + info.UnpackSize = BenchInfo.UnpackSize + *outSize; + res = callback->SetDecodeResult(info, false); + } + if (res != S_OK) + Status->SetResult(res); + return res; +} + +static const int kSubBits = 8; + +static UInt32 GetLogSize(UInt32 size) +{ + for (int i = kSubBits; i < 32; i++) + for (UInt32 j = 0; j < (1 << kSubBits); j++) + if (size <= (((UInt32)1) << i) + (j << (i - kSubBits))) + return (i << kSubBits) + j; + return (32 << kSubBits); +} + +static void NormalizeVals(UInt64 &v1, UInt64 &v2) +{ + while (v1 > 1000000) + { + v1 >>= 1; + v2 >>= 1; + } +} + +UInt64 GetUsage(const CBenchInfo &info) +{ + UInt64 userTime = info.UserTime; + UInt64 userFreq = info.UserFreq; + UInt64 globalTime = info.GlobalTime; + UInt64 globalFreq = info.GlobalFreq; + NormalizeVals(userTime, userFreq); + NormalizeVals(globalFreq, globalTime); + if (userFreq == 0) + userFreq = 1; + if (globalTime == 0) + globalTime = 1; + return userTime * globalFreq * 1000000 / userFreq / globalTime; +} + +UInt64 GetRatingPerUsage(const CBenchInfo &info, UInt64 rating) +{ + UInt64 userTime = info.UserTime; + UInt64 userFreq = info.UserFreq; + UInt64 globalTime = info.GlobalTime; + UInt64 globalFreq = info.GlobalFreq; + NormalizeVals(userFreq, userTime); + NormalizeVals(globalTime, globalFreq); + if (globalFreq == 0) + globalFreq = 1; + if (userTime == 0) + userTime = 1; + return userFreq * globalTime / globalFreq * rating / userTime; +} + +static UInt64 MyMultDiv64(UInt64 value, UInt64 elapsedTime, UInt64 freq) +{ + UInt64 elTime = elapsedTime; + NormalizeVals(freq, elTime); + if (elTime == 0) + elTime = 1; + return value * freq / elTime; +} + +UInt64 GetCompressRating(UInt32 dictionarySize, UInt64 elapsedTime, UInt64 freq, UInt64 size) +{ + UInt64 t = GetLogSize(dictionarySize) - (kBenchMinDicLogSize << kSubBits); + // UInt64 numCommandsForOne = 1000 + ((t * t * 7) >> (2 * kSubBits)); // AMD K8 + UInt64 numCommandsForOne = 870 + ((t * t * 5) >> (2 * kSubBits)); // Intel Core2 + + UInt64 numCommands = (UInt64)(size) * numCommandsForOne; + return MyMultDiv64(numCommands, elapsedTime, freq); +} + +UInt64 GetDecompressRating(UInt64 elapsedTime, UInt64 freq, UInt64 outSize, UInt64 inSize, UInt32 numIterations) +{ + // UInt64 numCommands = (inSize * 216 + outSize * 14) * numIterations; // AMD K8 + UInt64 numCommands = (inSize * 220 + outSize * 8) * numIterations; // Intel Core2 + return MyMultDiv64(numCommands, elapsedTime, freq); +} + +#ifdef EXTERNAL_LZMA +typedef UInt32 (WINAPI * CreateObjectPointer)(const GUID *clsID, + const GUID *interfaceID, void **outObject); +#endif + +struct CEncoderInfo; + +struct CEncoderInfo +{ + #ifdef BENCH_MT + NWindows::CThread thread[2]; + #endif + CMyComPtr encoder; + CBenchProgressInfo *progressInfoSpec[2]; + CMyComPtr progressInfo[2]; + UInt32 NumIterations; + #ifdef USE_ALLOCA + size_t AllocaSize; + #endif + + struct CDecoderInfo + { + CEncoderInfo *Encoder; + UInt32 DecoderIndex; + #ifdef USE_ALLOCA + size_t AllocaSize; + #endif + bool CallbackMode; + }; + CDecoderInfo decodersInfo[2]; + + CMyComPtr decoders[2]; + HRESULT Results[2]; + CBenchmarkOutStream *outStreamSpec; + CMyComPtr outStream; + IBenchCallback *callback; + UInt32 crc; + UInt32 kBufferSize; + UInt32 compressedSize; + CBenchRandomGenerator rg; + CBenchmarkOutStream *propStreamSpec; + CMyComPtr propStream; + HRESULT Init(UInt32 dictionarySize, UInt32 numThreads, CBaseRandomGenerator *rg); + HRESULT Encode(); + HRESULT Decode(UInt32 decoderIndex); + + CEncoderInfo(): outStreamSpec(0), callback(0), propStreamSpec(0) {} + + #ifdef BENCH_MT + static THREAD_FUNC_DECL EncodeThreadFunction(void *param) + { + CEncoderInfo *encoder = (CEncoderInfo *)param; + #ifdef USE_ALLOCA + alloca(encoder->AllocaSize); + #endif + HRESULT res = encoder->Encode(); + encoder->Results[0] = res; + if (res != S_OK) + encoder->progressInfoSpec[0]->Status->SetResult(res); + + return 0; + } + static THREAD_FUNC_DECL DecodeThreadFunction(void *param) + { + CDecoderInfo *decoder = (CDecoderInfo *)param; + #ifdef USE_ALLOCA + alloca(decoder->AllocaSize); + #endif + CEncoderInfo *encoder = decoder->Encoder; + encoder->Results[decoder->DecoderIndex] = encoder->Decode(decoder->DecoderIndex); + return 0; + } + + HRESULT CreateEncoderThread() + { + return thread[0].Create(EncodeThreadFunction, this); + } + + HRESULT CreateDecoderThread(int index, bool callbackMode + #ifdef USE_ALLOCA + , size_t allocaSize + #endif + ) + { + CDecoderInfo &decoder = decodersInfo[index]; + decoder.DecoderIndex = index; + decoder.Encoder = this; + #ifdef USE_ALLOCA + decoder.AllocaSize = allocaSize; + #endif + decoder.CallbackMode = callbackMode; + return thread[index].Create(DecodeThreadFunction, &decoder); + } + #endif +}; + +HRESULT CEncoderInfo::Init(UInt32 dictionarySize, UInt32 numThreads, CBaseRandomGenerator *rgLoc) +{ + rg.Set(rgLoc); + kBufferSize = dictionarySize + kAdditionalSize; + UInt32 kCompressedBufferSize = (kBufferSize / 2) + kCompressedAdditionalSize; + if (!rg.Alloc(kBufferSize)) + return E_OUTOFMEMORY; + rg.Generate(); + crc = CrcCalc(rg.Buffer, rg.BufferSize); + + outStreamSpec = new CBenchmarkOutStream; + if (!outStreamSpec->Alloc(kCompressedBufferSize)) + return E_OUTOFMEMORY; + + outStream = outStreamSpec; + + propStreamSpec = 0; + if (!propStream) + { + propStreamSpec = new CBenchmarkOutStream; + propStream = propStreamSpec; + } + if (!propStreamSpec->Alloc(kMaxLzmaPropSize)) + return E_OUTOFMEMORY; + propStreamSpec->Init(); + + PROPID propIDs[] = + { + NCoderPropID::kDictionarySize, + NCoderPropID::kMultiThread + }; + const int kNumProps = sizeof(propIDs) / sizeof(propIDs[0]); + PROPVARIANT properties[kNumProps]; + properties[0].vt = VT_UI4; + properties[0].ulVal = (UInt32)dictionarySize; + + properties[1].vt = VT_BOOL; + properties[1].boolVal = (numThreads > 1) ? VARIANT_TRUE : VARIANT_FALSE; + + { + CMyComPtr setCoderProperties; + RINOK(encoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties)); + if (!setCoderProperties) + return E_FAIL; + RINOK(setCoderProperties->SetCoderProperties(propIDs, properties, kNumProps)); + + CMyComPtr writeCoderProperties; + encoder.QueryInterface(IID_ICompressWriteCoderProperties, &writeCoderProperties); + if (writeCoderProperties) + { + RINOK(writeCoderProperties->WriteCoderProperties(propStream)); + } + } + return S_OK; +} + +HRESULT CEncoderInfo::Encode() +{ + CBenchmarkInStream *inStreamSpec = new CBenchmarkInStream; + CMyComPtr inStream = inStreamSpec; + inStreamSpec->Init(rg.Buffer, rg.BufferSize); + outStreamSpec->Init(); + + RINOK(encoder->Code(inStream, outStream, 0, 0, progressInfo[0])); + compressedSize = outStreamSpec->Pos; + encoder.Release(); + return S_OK; +} + +HRESULT CEncoderInfo::Decode(UInt32 decoderIndex) +{ + CBenchmarkInStream *inStreamSpec = new CBenchmarkInStream; + CMyComPtr inStream = inStreamSpec; + CMyComPtr &decoder = decoders[decoderIndex]; + + CMyComPtr compressSetDecoderProperties; + decoder.QueryInterface(IID_ICompressSetDecoderProperties2, &compressSetDecoderProperties); + if (!compressSetDecoderProperties) + return E_FAIL; + + CCrcOutStream *crcOutStreamSpec = new CCrcOutStream; + CMyComPtr crcOutStream = crcOutStreamSpec; + + CBenchProgressInfo *pi = progressInfoSpec[decoderIndex]; + pi->BenchInfo.UnpackSize = 0; + pi->BenchInfo.PackSize = 0; + + for (UInt32 j = 0; j < NumIterations; j++) + { + inStreamSpec->Init(outStreamSpec->Buffer, compressedSize); + crcOutStreamSpec->Init(); + + RINOK(compressSetDecoderProperties->SetDecoderProperties2(propStreamSpec->Buffer, propStreamSpec->Pos)); + UInt64 outSize = kBufferSize; + RINOK(decoder->Code(inStream, crcOutStream, 0, &outSize, progressInfo[decoderIndex])); + if (CRC_GET_DIGEST(crcOutStreamSpec->Crc) != crc) + return S_FALSE; + pi->BenchInfo.UnpackSize += kBufferSize; + pi->BenchInfo.PackSize += compressedSize; + } + decoder.Release(); + return S_OK; +} + +static const UInt32 kNumThreadsMax = (1 << 16); + +struct CBenchEncoders +{ + CEncoderInfo *encoders; + CBenchEncoders(UInt32 num): encoders(0) { encoders = new CEncoderInfo[num]; } + ~CBenchEncoders() { delete []encoders; } +}; + +HRESULT LzmaBench( + #ifdef EXTERNAL_LZMA + CCodecs *codecs, + #endif + UInt32 numThreads, UInt32 dictionarySize, IBenchCallback *callback) +{ + UInt32 numEncoderThreads = + #ifdef BENCH_MT + (numThreads > 1 ? numThreads / 2 : 1); + #else + 1; + #endif + UInt32 numSubDecoderThreads = + #ifdef BENCH_MT + (numThreads > 1 ? 2 : 1); + #else + 1; + #endif + if (dictionarySize < (1 << kBenchMinDicLogSize) || numThreads < 1 || numEncoderThreads > kNumThreadsMax) + { + return E_INVALIDARG; + } + + CBenchEncoders encodersSpec(numEncoderThreads); + CEncoderInfo *encoders = encodersSpec.encoders; + + #ifdef EXTERNAL_LZMA + UString name = L"LZMA"; + #endif + + UInt32 i; + for (i = 0; i < numEncoderThreads; i++) + { + CEncoderInfo &encoder = encoders[i]; + encoder.callback = (i == 0) ? callback : 0; + + #ifdef EXTERNAL_LZMA + RINOK(codecs->CreateCoder(name, true, encoder.encoder)); + #else + encoder.encoder = new NCompress::NLZMA::CEncoder; + #endif + for (UInt32 j = 0; j < numSubDecoderThreads; j++) + { + #ifdef EXTERNAL_LZMA + RINOK(codecs->CreateCoder(name, false, encoder.decoders[j])); + #else + encoder.decoders[j] = new NCompress::NLZMA::CDecoder; + #endif + } + } + + CBaseRandomGenerator rg; + rg.Init(); + for (i = 0; i < numEncoderThreads; i++) + { + RINOK(encoders[i].Init(dictionarySize, numThreads, &rg)); + } + + CBenchProgressStatus status; + status.Res = S_OK; + status.EncodeMode = true; + + for (i = 0; i < numEncoderThreads; i++) + { + CEncoderInfo &encoder = encoders[i]; + for (int j = 0; j < 2; j++) + { + encoder.progressInfo[j] = encoder.progressInfoSpec[j] = new CBenchProgressInfo; + encoder.progressInfoSpec[j]->Status = &status; + } + if (i == 0) + { + encoder.progressInfoSpec[0]->callback = callback; + encoder.progressInfoSpec[0]->BenchInfo.NumIterations = numEncoderThreads; + SetStartTime(encoder.progressInfoSpec[0]->BenchInfo); + } + + #ifdef BENCH_MT + if (numEncoderThreads > 1) + { + #ifdef USE_ALLOCA + encoder.AllocaSize = (i * 16 * 21) & 0x7FF; + #endif + RINOK(encoder.CreateEncoderThread()) + } + else + #endif + { + RINOK(encoder.Encode()); + } + } + #ifdef BENCH_MT + if (numEncoderThreads > 1) + for (i = 0; i < numEncoderThreads; i++) + encoders[i].thread[0].Wait(); + #endif + + RINOK(status.Res); + + CBenchInfo info; + + SetFinishTime(encoders[0].progressInfoSpec[0]->BenchInfo, info); + info.UnpackSize = 0; + info.PackSize = 0; + info.NumIterations = 1; // progressInfoSpec->NumIterations; + for (i = 0; i < numEncoderThreads; i++) + { + CEncoderInfo &encoder = encoders[i]; + info.UnpackSize += encoder.kBufferSize; + info.PackSize += encoder.compressedSize; + } + RINOK(callback->SetEncodeResult(info, true)); + + + status.Res = S_OK; + status.EncodeMode = false; + + UInt32 numDecoderThreads = numEncoderThreads * numSubDecoderThreads; + for (i = 0; i < numEncoderThreads; i++) + { + CEncoderInfo &encoder = encoders[i]; + encoder.NumIterations = 2 + kUncompressMinBlockSize / encoder.kBufferSize; + + if (i == 0) + { + encoder.progressInfoSpec[0]->callback = callback; + encoder.progressInfoSpec[0]->BenchInfo.NumIterations = numDecoderThreads; + SetStartTime(encoder.progressInfoSpec[0]->BenchInfo); + } + + #ifdef BENCH_MT + if (numDecoderThreads > 1) + { + for (UInt32 j = 0; j < numSubDecoderThreads; j++) + { + size_t allocaSize = ((i * numSubDecoderThreads + j) * 16 * 21) & 0x7FF; + HRESULT res = encoder.CreateDecoderThread(j, (i == 0 && j == 0) + #ifdef USE_ALLOCA + , allocaSize + #endif + ); + RINOK(res); + } + } + else + #endif + { + RINOK(encoder.Decode(0)); + } + } + #ifdef BENCH_MT + HRESULT res = S_OK; + if (numDecoderThreads > 1) + for (i = 0; i < numEncoderThreads; i++) + for (UInt32 j = 0; j < numSubDecoderThreads; j++) + { + CEncoderInfo &encoder = encoders[i]; + encoder.thread[j].Wait(); + if (encoder.Results[j] != S_OK) + res = encoder.Results[j]; + } + RINOK(res); + #endif + RINOK(status.Res); + SetFinishTime(encoders[0].progressInfoSpec[0]->BenchInfo, info); + info.UnpackSize = 0; + info.PackSize = 0; + info.NumIterations = numSubDecoderThreads * encoders[0].NumIterations; + for (i = 0; i < numEncoderThreads; i++) + { + CEncoderInfo &encoder = encoders[i]; + info.UnpackSize += encoder.kBufferSize; + info.PackSize += encoder.compressedSize; + } + RINOK(callback->SetDecodeResult(info, false)); + RINOK(callback->SetDecodeResult(info, true)); + return S_OK; +} + + +inline UInt64 GetLZMAUsage(bool multiThread, UInt32 dictionary) +{ + UInt32 hs = dictionary - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + hs |= 0xFFFF; + if (hs > (1 << 24)) + hs >>= 1; + hs++; + return ((hs + (1 << 16)) + (UInt64)dictionary * 2) * 4 + (UInt64)dictionary * 3 / 2 + + (1 << 20) + (multiThread ? (6 << 20) : 0); +} + +UInt64 GetBenchMemoryUsage(UInt32 numThreads, UInt32 dictionary) +{ + const UInt32 kBufferSize = dictionary; + const UInt32 kCompressedBufferSize = (kBufferSize / 2); + UInt32 numSubThreads = (numThreads > 1) ? 2 : 1; + UInt32 numBigThreads = numThreads / numSubThreads; + return (kBufferSize + kCompressedBufferSize + + GetLZMAUsage((numThreads > 1), dictionary) + (2 << 20)) * numBigThreads; +} + +static bool CrcBig(const void *data, UInt32 size, UInt32 numCycles, UInt32 crcBase) +{ + for (UInt32 i = 0; i < numCycles; i++) + if (CrcCalc(data, size) != crcBase) + return false; + return true; +} + +#ifdef BENCH_MT +struct CCrcInfo +{ + NWindows::CThread Thread; + const Byte *Data; + UInt32 Size; + UInt32 NumCycles; + UInt32 Crc; + bool Res; + void Wait() + { + Thread.Wait(); + Thread.Close(); + } +}; + +static THREAD_FUNC_DECL CrcThreadFunction(void *param) +{ + CCrcInfo *p = (CCrcInfo *)param; + p->Res = CrcBig(p->Data, p->Size, p->NumCycles, p->Crc); + return 0; +} + +struct CCrcThreads +{ + UInt32 NumThreads; + CCrcInfo *Items; + CCrcThreads(): Items(0), NumThreads(0) {} + void WaitAll() + { + for (UInt32 i = 0; i < NumThreads; i++) + Items[i].Wait(); + NumThreads = 0; + } + ~CCrcThreads() + { + WaitAll(); + delete []Items; + } +}; +#endif + +static UInt32 CrcCalc1(const Byte *buf, UInt32 size) +{ + UInt32 crc = CRC_INIT_VAL;; + for (UInt32 i = 0; i < size; i++) + crc = CRC_UPDATE_BYTE(crc, buf[i]); + return CRC_GET_DIGEST(crc); +} + +static void RandGen(Byte *buf, UInt32 size, CBaseRandomGenerator &RG) +{ + for (UInt32 i = 0; i < size; i++) + buf[i] = (Byte)RG.GetRnd(); +} + +static UInt32 RandGenCrc(Byte *buf, UInt32 size, CBaseRandomGenerator &RG) +{ + RandGen(buf, size, RG); + return CrcCalc1(buf, size); +} + +bool CrcInternalTest() +{ + CBenchBuffer buffer; + const UInt32 kBufferSize0 = (1 << 8); + const UInt32 kBufferSize1 = (1 << 10); + const UInt32 kCheckSize = (1 << 5); + if (!buffer.Alloc(kBufferSize0 + kBufferSize1)) + return false; + Byte *buf = buffer.Buffer; + UInt32 i; + for (i = 0; i < kBufferSize0; i++) + buf[i] = (Byte)i; + UInt32 crc1 = CrcCalc1(buf, kBufferSize0); + if (crc1 != 0x29058C73) + return false; + CBaseRandomGenerator RG; + RandGen(buf + kBufferSize0, kBufferSize1, RG); + for (i = 0; i < kBufferSize0 + kBufferSize1 - kCheckSize; i++) + for (UInt32 j = 0; j < kCheckSize; j++) + if (CrcCalc1(buf + i, j) != CrcCalc(buf + i, j)) + return false; + return true; +} + +HRESULT CrcBench(UInt32 numThreads, UInt32 bufferSize, UInt64 &speed) +{ + if (numThreads == 0) + numThreads = 1; + + CBenchBuffer buffer; + size_t totalSize = (size_t)bufferSize * numThreads; + if (totalSize / numThreads != bufferSize) + return E_OUTOFMEMORY; + if (!buffer.Alloc(totalSize)) + return E_OUTOFMEMORY; + + Byte *buf = buffer.Buffer; + CBaseRandomGenerator RG; + UInt32 numCycles = ((UInt32)1 << 30) / ((bufferSize >> 2) + 1) + 1; + + UInt64 timeVal; + #ifdef BENCH_MT + CCrcThreads threads; + if (numThreads > 1) + { + threads.Items = new CCrcInfo[numThreads]; + UInt32 i; + for (i = 0; i < numThreads; i++) + { + CCrcInfo &info = threads.Items[i]; + Byte *data = buf + (size_t)bufferSize * i; + info.Data = data; + info.NumCycles = numCycles; + info.Size = bufferSize; + info.Crc = RandGenCrc(data, bufferSize, RG); + } + timeVal = GetTimeCount(); + for (i = 0; i < numThreads; i++) + { + CCrcInfo &info = threads.Items[i]; + RINOK(info.Thread.Create(CrcThreadFunction, &info)); + threads.NumThreads++; + } + threads.WaitAll(); + for (i = 0; i < numThreads; i++) + if (!threads.Items[i].Res) + return S_FALSE; + } + else + #endif + { + UInt32 crc = RandGenCrc(buf, bufferSize, RG); + timeVal = GetTimeCount(); + if (!CrcBig(buf, bufferSize, numCycles, crc)) + return S_FALSE; + } + timeVal = GetTimeCount() - timeVal; + if (timeVal == 0) + timeVal = 1; + + UInt64 size = (UInt64)numCycles * totalSize; + speed = MyMultDiv64(size, timeVal, GetFreq()); + return S_OK; +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,48 @@ +// LzmaBench.h + +#ifndef __LZMABENCH_H +#define __LZMABENCH_H + +#include +#include "../../../Common/Types.h" +#ifdef EXTERNAL_LZMA +#include "../../UI/Common/LoadCodecs.h" +#endif + +struct CBenchInfo +{ + UInt64 GlobalTime; + UInt64 GlobalFreq; + UInt64 UserTime; + UInt64 UserFreq; + UInt64 UnpackSize; + UInt64 PackSize; + UInt32 NumIterations; + CBenchInfo(): NumIterations(0) {} +}; + +struct IBenchCallback +{ + virtual HRESULT SetEncodeResult(const CBenchInfo &info, bool final) = 0; + virtual HRESULT SetDecodeResult(const CBenchInfo &info, bool final) = 0; +}; + +UInt64 GetUsage(const CBenchInfo &benchOnfo); +UInt64 GetRatingPerUsage(const CBenchInfo &info, UInt64 rating); +UInt64 GetCompressRating(UInt32 dictionarySize, UInt64 elapsedTime, UInt64 freq, UInt64 size); +UInt64 GetDecompressRating(UInt64 elapsedTime, UInt64 freq, UInt64 outSize, UInt64 inSize, UInt32 numIterations); + +HRESULT LzmaBench( + #ifdef EXTERNAL_LZMA + CCodecs *codecs, + #endif + UInt32 numThreads, UInt32 dictionarySize, IBenchCallback *callback); + +const int kBenchMinDicLogSize = 18; + +UInt64 GetBenchMemoryUsage(UInt32 numThreads, UInt32 dictionary); + +bool CrcInternalTest(); +HRESULT CrcBench(UInt32 numThreads, UInt32 bufferSize, UInt64 &speed); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,311 @@ +// LzmaBenchCon.cpp + +#include "StdAfx.h" + +#include + +#include "LzmaBench.h" +#include "LzmaBenchCon.h" +#include "../../../Common/IntToString.h" + +#if defined(BENCH_MT) || defined(_WIN32) +#include "../../../Windows/System.h" +#endif + +#ifdef BREAK_HANDLER +#include "../../UI/Console/ConsoleClose.h" +#endif +#include "../../../Common/MyCom.h" + +struct CTotalBenchRes +{ + UInt64 NumIterations; + UInt64 Rating; + UInt64 Usage; + UInt64 RPU; + void Init() { NumIterations = 0; Rating = 0; Usage = 0; RPU = 0; } + void Normalize() + { + if (NumIterations == 0) + return; + Rating /= NumIterations; + Usage /= NumIterations; + RPU /= NumIterations; + NumIterations = 1; + } + void SetMid(const CTotalBenchRes &r1, const CTotalBenchRes &r2) + { + Rating = (r1.Rating + r2.Rating) / 2; + Usage = (r1.Usage + r2.Usage) / 2; + RPU = (r1.RPU + r2.RPU) / 2; + NumIterations = (r1.NumIterations + r2.NumIterations) / 2; + } +}; + +struct CBenchCallback: public IBenchCallback +{ + CTotalBenchRes EncodeRes; + CTotalBenchRes DecodeRes; + FILE *f; + void Init() { EncodeRes.Init(); DecodeRes.Init(); } + void Normalize() { EncodeRes.Normalize(); DecodeRes.Normalize(); } + UInt32 dictionarySize; + HRESULT SetEncodeResult(const CBenchInfo &info, bool final); + HRESULT SetDecodeResult(const CBenchInfo &info, bool final); +}; + +static void NormalizeVals(UInt64 &v1, UInt64 &v2) +{ + while (v1 > 1000000) + { + v1 >>= 1; + v2 >>= 1; + } +} + +static UInt64 MyMultDiv64(UInt64 value, UInt64 elapsedTime, UInt64 freq) +{ + UInt64 elTime = elapsedTime; + NormalizeVals(freq, elTime); + if (elTime == 0) + elTime = 1; + return value * freq / elTime; +} + +static void PrintNumber(FILE *f, UInt64 value, int size) +{ + char s[32]; + ConvertUInt64ToString(value, s); + fprintf(f, " "); + for (int len = (int)strlen(s); len < size; len++) + fprintf(f, " "); + fprintf(f, "%s", s); +} + +static void PrintRating(FILE *f, UInt64 rating) +{ + PrintNumber(f, rating / 1000000, 6); +} + +static void PrintResults(FILE *f, UInt64 usage, UInt64 rpu, UInt64 rating) +{ + PrintNumber(f, (usage + 5000) / 10000, 5); + PrintRating(f, rpu); + PrintRating(f, rating); +} + + +static void PrintResults(FILE *f, const CBenchInfo &info, UInt64 rating, CTotalBenchRes &res) +{ + UInt64 speed = MyMultDiv64(info.UnpackSize, info.GlobalTime, info.GlobalFreq); + PrintNumber(f, speed / 1024, 7); + UInt64 usage = GetUsage(info); + UInt64 rpu = GetRatingPerUsage(info, rating); + PrintResults(f, usage, rpu, rating); + res.NumIterations++; + res.RPU += rpu; + res.Rating += rating; + res.Usage += usage; +} + +static void PrintTotals(FILE *f, const CTotalBenchRes &res) +{ + fprintf(f, " "); + PrintResults(f, res.Usage, res.RPU, res.Rating); +} + + +HRESULT CBenchCallback::SetEncodeResult(const CBenchInfo &info, bool final) +{ + #ifdef BREAK_HANDLER + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + #endif + + if (final) + { + UInt64 rating = GetCompressRating(dictionarySize, info.GlobalTime, info.GlobalFreq, info.UnpackSize); + PrintResults(f, info, rating, EncodeRes); + } + return S_OK; +} + +static const char *kSep = " | "; + + +HRESULT CBenchCallback::SetDecodeResult(const CBenchInfo &info, bool final) +{ + #ifdef BREAK_HANDLER + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + #endif + if (final) + { + UInt64 rating = GetDecompressRating(info.GlobalTime, info.GlobalFreq, info.UnpackSize, info.PackSize, info.NumIterations); + fprintf(f, kSep); + CBenchInfo info2 = info; + info2.UnpackSize *= info2.NumIterations; + info2.PackSize *= info2.NumIterations; + info2.NumIterations = 1; + PrintResults(f, info2, rating, DecodeRes); + } + return S_OK; +} + +static void PrintRequirements(FILE *f, const char *sizeString, UInt64 size, const char *threadsString, UInt32 numThreads) +{ + fprintf(f, "\nRAM %s ", sizeString); + PrintNumber(f, (size >> 20), 5); + fprintf(f, " MB, # %s %3d", threadsString, (unsigned int)numThreads); +} + +HRESULT LzmaBenchCon( + #ifdef EXTERNAL_LZMA + CCodecs *codecs, + #endif + FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary) +{ + if (!CrcInternalTest()) + return S_FALSE; + #ifdef BENCH_MT + UInt64 ramSize = NWindows::NSystem::GetRamSize(); // + UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors(); + PrintRequirements(f, "size: ", ramSize, "CPU hardware threads:", numCPUs); + if (numThreads == (UInt32)-1) + numThreads = numCPUs; + if (numThreads > 1) + numThreads &= ~1; + if (dictionary == (UInt32)-1) + { + int dicSizeLog; + for (dicSizeLog = 25; dicSizeLog > kBenchMinDicLogSize; dicSizeLog--) + if (GetBenchMemoryUsage(numThreads, ((UInt32)1 << dicSizeLog)) + (8 << 20) <= ramSize) + break; + dictionary = (1 << dicSizeLog); + } + #else + if (dictionary == (UInt32)-1) + dictionary = (1 << 22); + numThreads = 1; + #endif + + PrintRequirements(f, "usage:", GetBenchMemoryUsage(numThreads, dictionary), "Benchmark threads: ", numThreads); + + CBenchCallback callback; + callback.Init(); + callback.f = f; + + fprintf(f, "\n\nDict Compressing | Decompressing\n "); + int j; + for (j = 0; j < 2; j++) + { + fprintf(f, " Speed Usage R/U Rating"); + if (j == 0) + fprintf(f, kSep); + } + fprintf(f, "\n "); + for (j = 0; j < 2; j++) + { + fprintf(f, " KB/s %% MIPS MIPS"); + if (j == 0) + fprintf(f, kSep); + } + fprintf(f, "\n\n"); + for (UInt32 i = 0; i < numIterations; i++) + { + const int kStartDicLog = 22; + int pow = (dictionary < ((UInt32)1 << kStartDicLog)) ? kBenchMinDicLogSize : kStartDicLog; + while (((UInt32)1 << pow) > dictionary) + pow--; + for (; ((UInt32)1 << pow) <= dictionary; pow++) + { + fprintf(f, "%2d:", pow); + callback.dictionarySize = (UInt32)1 << pow; + HRESULT res = LzmaBench( + #ifdef EXTERNAL_LZMA + codecs, + #endif + numThreads, callback.dictionarySize, &callback); + fprintf(f, "\n"); + RINOK(res); + } + } + callback.Normalize(); + fprintf(f, "----------------------------------------------------------------\nAvr:"); + PrintTotals(f, callback.EncodeRes); + fprintf(f, " "); + PrintTotals(f, callback.DecodeRes); + fprintf(f, "\nTot:"); + CTotalBenchRes midRes; + midRes.SetMid(callback.EncodeRes, callback.DecodeRes); + PrintTotals(f, midRes); + fprintf(f, "\n"); + return S_OK; +} + +struct CTempValues +{ + UInt64 *Values; + CTempValues(UInt32 num) { Values = new UInt64[num]; } + ~CTempValues() { delete []Values; } +}; + +HRESULT CrcBenchCon(FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary) +{ + if (!CrcInternalTest()) + return S_FALSE; + + #ifdef BENCH_MT + UInt64 ramSize = NWindows::NSystem::GetRamSize(); + UInt32 numCPUs = NWindows::NSystem::GetNumberOfProcessors(); + PrintRequirements(f, "size: ", ramSize, "CPU hardware threads:", numCPUs); + if (numThreads == (UInt32)-1) + numThreads = numCPUs; + #else + numThreads = 1; + #endif + if (dictionary == (UInt32)-1) + dictionary = (1 << 24); + + CTempValues speedTotals(numThreads); + fprintf(f, "\n\nSize"); + for (UInt32 ti = 0; ti < numThreads; ti++) + { + fprintf(f, " %5d", ti + 1); + speedTotals.Values[ti] = 0; + } + fprintf(f, "\n\n"); + + UInt64 numSteps = 0; + for (UInt32 i = 0; i < numIterations; i++) + { + for (int pow = 10; pow < 32; pow++) + { + UInt32 bufSize = (UInt32)1 << pow; + if (bufSize > dictionary) + break; + fprintf(f, "%2d: ", pow); + UInt64 speed; + for (UInt32 ti = 0; ti < numThreads; ti++) + { + #ifdef BREAK_HANDLER + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + #endif + RINOK(CrcBench(ti + 1, bufSize, speed)); + PrintNumber(f, (speed >> 20), 5); + speedTotals.Values[ti] += speed; + } + fprintf(f, "\n"); + numSteps++; + } + } + if (numSteps != 0) + { + fprintf(f, "\nAvg:"); + for (UInt32 ti = 0; ti < numThreads; ti++) + PrintNumber(f, ((speedTotals.Values[ti] / numSteps) >> 20), 5); + fprintf(f, "\n"); + } + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,20 @@ +// LzmaBenchCon.h + +#ifndef __LZMABENCHCON_H +#define __LZMABENCHCON_H + +#include +#include "../../../Common/Types.h" +#ifdef EXTERNAL_LZMA +#include "../../UI/Common/LoadCodecs.h" +#endif +HRESULT LzmaBenchCon( + #ifdef EXTERNAL_LZMA + CCodecs *codecs, + #endif + FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary); + +HRESULT CrcBenchCon(FILE *f, UInt32 numIterations, UInt32 numThreads, UInt32 dictionary); + +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRam.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRam.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,226 @@ +// LzmaRam.cpp + +#include "StdAfx.h" +#include "../../../Common/Types.h" +#include "../LZMA/LZMADecoder.h" +#include "../LZMA/LZMAEncoder.h" +#include "LzmaRam.h" + +extern "C" +{ + #include "../../../../C/Compress/Branch/BranchX86.h" +} + +class CInStreamRam: + public ISequentialInStream, + public CMyUnknownImp +{ + const Byte *Data; + size_t Size; + size_t Pos; +public: + MY_UNKNOWN_IMP + void Init(const Byte *data, size_t size) + { + Data = data; + Size = size; + Pos = 0; + } + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CInStreamRam::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (size > (Size - Pos)) + size = (UInt32)(Size - Pos); + for (UInt32 i = 0; i < size; i++) + ((Byte *)data)[i] = Data[Pos + i]; + Pos += size; + if(processedSize != NULL) + *processedSize = size; + return S_OK; +} + +class COutStreamRam: + public ISequentialOutStream, + public CMyUnknownImp +{ + size_t Size; +public: + Byte *Data; + size_t Pos; + bool Overflow; + void Init(Byte *data, size_t size) + { + Data = data; + Size = size; + Pos = 0; + Overflow = false; + } + void SetPos(size_t pos) + { + Overflow = false; + Pos = pos; + } + MY_UNKNOWN_IMP + HRESULT WriteByte(Byte b) + { + if (Pos >= Size) + { + Overflow = true; + return E_FAIL; + } + Data[Pos++] = b; + return S_OK; + } + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP COutStreamRam::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 i; + for (i = 0; i < size && Pos < Size; i++) + Data[Pos++] = ((const Byte *)data)[i]; + if(processedSize != NULL) + *processedSize = i; + if (i != size) + { + Overflow = true; + return E_FAIL; + } + return S_OK; +} + +#define SZ_RAM_E_FAIL (1) +#define SZ_RAM_E_OUTOFMEMORY (2) +#define SZE_OUT_OVERFLOW (3) + +int LzmaRamEncode( + const Byte *inBuffer, size_t inSize, + Byte *outBuffer, size_t outSize, size_t *outSizeProcessed, + UInt32 dictionarySize, ESzFilterMode filterMode) +{ + #ifndef _NO_EXCEPTIONS + try { + #endif + + *outSizeProcessed = 0; + const size_t kIdSize = 1; + const size_t kLzmaPropsSize = 5; + const size_t kMinDestSize = kIdSize + kLzmaPropsSize + 8; + if (outSize < kMinDestSize) + return SZE_OUT_OVERFLOW; + NCompress::NLZMA::CEncoder *encoderSpec = new NCompress::NLZMA::CEncoder; + CMyComPtr encoder = encoderSpec; + + PROPID propIDs[] = + { + NCoderPropID::kAlgorithm, + NCoderPropID::kDictionarySize, + NCoderPropID::kNumFastBytes, + }; + const int kNumProps = sizeof(propIDs) / sizeof(propIDs[0]); + PROPVARIANT properties[kNumProps]; + properties[0].vt = VT_UI4; + properties[1].vt = VT_UI4; + properties[2].vt = VT_UI4; + properties[0].ulVal = (UInt32)2; + properties[1].ulVal = (UInt32)dictionarySize; + properties[2].ulVal = (UInt32)64; + + if (encoderSpec->SetCoderProperties(propIDs, properties, kNumProps) != S_OK) + return 1; + + COutStreamRam *outStreamSpec = new COutStreamRam; + if (outStreamSpec == 0) + return SZ_RAM_E_OUTOFMEMORY; + CMyComPtr outStream = outStreamSpec; + CInStreamRam *inStreamSpec = new CInStreamRam; + if (inStreamSpec == 0) + return SZ_RAM_E_OUTOFMEMORY; + CMyComPtr inStream = inStreamSpec; + + outStreamSpec->Init(outBuffer, outSize); + if (outStreamSpec->WriteByte(0) != S_OK) + return SZE_OUT_OVERFLOW; + + if (encoderSpec->WriteCoderProperties(outStream) != S_OK) + return SZE_OUT_OVERFLOW; + if (outStreamSpec->Pos != kIdSize + kLzmaPropsSize) + return 1; + + int i; + for (i = 0; i < 8; i++) + { + UInt64 t = (UInt64)(inSize); + if (outStreamSpec->WriteByte((Byte)((t) >> (8 * i))) != S_OK) + return SZE_OUT_OVERFLOW; + } + + Byte *filteredStream = 0; + + bool useFilter = (filterMode != SZ_FILTER_NO); + if (useFilter) + { + if (inSize != 0) + { + filteredStream = (Byte *)MyAlloc(inSize); + if (filteredStream == 0) + return SZ_RAM_E_OUTOFMEMORY; + memmove(filteredStream, inBuffer, inSize); + } + UInt32 x86State; + x86_Convert_Init(x86State); + x86_Convert(filteredStream, (SizeT)inSize, 0, &x86State, 1); + } + + size_t minSize = 0; + int numPasses = (filterMode == SZ_FILTER_AUTO) ? 3 : 1; + bool bestIsFiltered = false; + int mainResult = 0; + size_t startPos = outStreamSpec->Pos; + for (i = 0; i < numPasses; i++) + { + if (numPasses > 1 && i == numPasses - 1 && !bestIsFiltered) + break; + outStreamSpec->SetPos(startPos); + bool curModeIsFiltered = false; + if (useFilter && i == 0) + curModeIsFiltered = true; + if (numPasses > 1 && i == numPasses - 1) + curModeIsFiltered = true; + + inStreamSpec->Init(curModeIsFiltered ? filteredStream : inBuffer, inSize); + + HRESULT lzmaResult = encoder->Code(inStream, outStream, 0, 0, 0); + + mainResult = 0; + if (lzmaResult == E_OUTOFMEMORY) + { + mainResult = SZ_RAM_E_OUTOFMEMORY; + break; + } + if (i == 0 || outStreamSpec->Pos <= minSize) + { + minSize = outStreamSpec->Pos; + bestIsFiltered = curModeIsFiltered; + } + if (outStreamSpec->Overflow) + mainResult = SZE_OUT_OVERFLOW; + else if (lzmaResult != S_OK) + { + mainResult = SZ_RAM_E_FAIL; + break; + } + } + *outSizeProcessed = outStreamSpec->Pos; + if (bestIsFiltered) + outBuffer[0] = 1; + if (useFilter) + MyFree(filteredStream); + return mainResult; + + #ifndef _NO_EXCEPTIONS + } catch(...) { return SZ_RAM_E_OUTOFMEMORY; } + #endif +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRam.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRam.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,46 @@ +// LzmaRam.h + +#ifndef __LzmaRam_h +#define __LzmaRam_h + +#include +#include "../../../Common/Types.h" + +/* +LzmaRamEncode: BCJ + LZMA RAM->RAM compressing. +It uses .lzma format, but it writes one additional byte to .lzma file: + 0: - no filter + 1: - x86(BCJ) filter. + +To provide best compression ratio dictionarySize mustbe >= inSize + +LzmaRamEncode allocates Data with MyAlloc/BigAlloc functions. +RAM Requirements: + RamSize = dictionarySize * 9.5 + 6MB + FilterBlockSize + FilterBlockSize = 0, if useFilter == false + FilterBlockSize = inSize, if useFilter == true + + Return code: + 0 - OK + 1 - Unspecified Error + 2 - Memory allocating error + 3 - Output buffer OVERFLOW + +If you use SZ_FILTER_AUTO mode, then encoder will use 2 or 3 passes: + 2 passes when FILTER_NO provides better compression. + 3 passes when FILTER_YES provides better compression. +*/ + +enum ESzFilterMode +{ + SZ_FILTER_NO, + SZ_FILTER_YES, + SZ_FILTER_AUTO +}; + +int LzmaRamEncode( + const Byte *inBuffer, size_t inSize, + Byte *outBuffer, size_t outSize, size_t *outSizeProcessed, + UInt32 dictionarySize, ESzFilterMode filterMode); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.c Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,78 @@ +/* LzmaRamDecode.c */ + +#include "LzmaRamDecode.h" +#ifdef _SZ_ONE_DIRECTORY +#include "LzmaDecode.h" +#include "BranchX86.h" +#else +#include "../../../../C/Compress/Lzma/LzmaDecode.h" +#include "../../../../C/Compress/Branch/BranchX86.h" +#endif + +#define LZMA_PROPS_SIZE 14 +#define LZMA_SIZE_OFFSET 6 + +int LzmaRamGetUncompressedSize( + const unsigned char *inBuffer, + size_t inSize, + size_t *outSize) +{ + unsigned int i; + if (inSize < LZMA_PROPS_SIZE) + return 1; + *outSize = 0; + for(i = 0; i < sizeof(size_t); i++) + *outSize += ((size_t)inBuffer[LZMA_SIZE_OFFSET + i]) << (8 * i); + for(; i < 8; i++) + if (inBuffer[LZMA_SIZE_OFFSET + i] != 0) + return 1; + return 0; +} + +#define SZE_DATA_ERROR (1) +#define SZE_OUTOFMEMORY (2) + +int LzmaRamDecompress( + const unsigned char *inBuffer, + size_t inSize, + unsigned char *outBuffer, + size_t outSize, + size_t *outSizeProcessed, + void * (*allocFunc)(size_t size), + void (*freeFunc)(void *)) +{ + CLzmaDecoderState state; /* it's about 24 bytes structure, if int is 32-bit */ + int result; + SizeT outSizeProcessedLoc; + SizeT inProcessed; + int useFilter; + + if (inSize < LZMA_PROPS_SIZE) + return 1; + useFilter = inBuffer[0]; + + *outSizeProcessed = 0; + if (useFilter > 1) + return 1; + + if (LzmaDecodeProperties(&state.Properties, inBuffer + 1, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK) + return 1; + state.Probs = (CProb *)allocFunc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); + if (state.Probs == 0) + return SZE_OUTOFMEMORY; + + result = LzmaDecode(&state, + inBuffer + LZMA_PROPS_SIZE, (SizeT)inSize - LZMA_PROPS_SIZE, &inProcessed, + outBuffer, (SizeT)outSize, &outSizeProcessedLoc); + freeFunc(state.Probs); + if (result != LZMA_RESULT_OK) + return 1; + *outSizeProcessed = (size_t)outSizeProcessedLoc; + if (useFilter == 1) + { + UInt32 x86State; + x86_Convert_Init(x86State); + x86_Convert(outBuffer, (SizeT)outSizeProcessedLoc, 0, &x86State, 0); + } + return 0; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,55 @@ +/* LzmaRamDecode.h */ + +#ifndef __LzmaRamDecode_h +#define __LzmaRamDecode_h + +#include + +/* +LzmaRamGetUncompressedSize: + In: + inBuffer - input data + inSize - input data size + Out: + outSize - uncompressed size + Return code: + 0 - OK + 1 - Error in headers +*/ + +int LzmaRamGetUncompressedSize( + const unsigned char *inBuffer, + size_t inSize, + size_t *outSize); + + +/* +LzmaRamDecompress: + In: + inBuffer - input data + inSize - input data size + outBuffer - output data + outSize - output size + allocFunc - alloc function (can be malloc) + freeFunc - free function (can be free) + Out: + outSizeProcessed - processed size + Return code: + 0 - OK + 1 - Error in headers / data stream + 2 - Memory allocating error + +Memory requirements depend from properties of LZMA stream. +With default lzma settings it's about 16 KB. +*/ + +int LzmaRamDecompress( + const unsigned char *inBuffer, + size_t inSize, + unsigned char *outBuffer, + size_t outSize, + size_t *outSizeProcessed, + void * (*allocFunc)(size_t size), + void (*freeFunc)(void *)); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,8 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/makefile Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,136 @@ +PROG = lzma.exe +CFLAGS = $(CFLAGS) \ + -DCOMPRESS_MF_MT \ + -DBENCH_MT \ + +LIBS = $(LIBS) oleaut32.lib user32.lib + +!IFDEF CPU +LIBS = $(LIBS) bufferoverflowU.lib +CFLAGS = $(CFLAGS) -GS- -Zc:forScope -W4 -Wp64 -DUNICODE -D_UNICODE +!ENDIF + +!IFNDEF O +!IFDEF CPU +O=$(CPU) +!ELSE +O=O +!ENDIF +!ENDIF + +!IFDEF MY_STATIC_LINK +!IFNDEF MY_SINGLE_THREAD +CFLAGS = $(CFLAGS) -MT +!ENDIF +!ELSE +CFLAGS = $(CFLAGS) -MD +!ENDIF + +CFLAGS = $(CFLAGS) -nologo -EHsc -c -Fo$O/ +CFLAGS_O1 = $(CFLAGS) -O1 +CFLAGS_O2 = $(CFLAGS) -O2 + +LFLAGS = $(LFLAGS) -nologo -OPT:NOWIN98 + +PROGPATH = $O\$(PROG) + +COMPL_O1 = $(CPP) $(CFLAGS_O1) $** +COMPL_O2 = $(CPP) $(CFLAGS_O2) $** +COMPL = $(CPP) $(CFLAGS_O1) $** + + +LZMA_OBJS = \ + $O\LzmaAlone.obj \ + $O\LzmaBench.obj \ + $O\LzmaBenchCon.obj \ + $O\LzmaRam.obj \ + +LZMA_OPT_OBJS = \ + $O\LZMADecoder.obj \ + $O\LZMAEncoder.obj \ + +COMMON_OBJS = \ + $O\CommandLineParser.obj \ + $O\CRC.obj \ + $O\IntToString.obj \ + $O\MyString.obj \ + $O\StringConvert.obj \ + $O\StringToInt.obj \ + $O\MyVector.obj + +WIN_OBJS = \ + $O\System.obj + +7ZIP_COMMON_OBJS = \ + $O\InBuffer.obj \ + $O\OutBuffer.obj \ + $O\StreamUtils.obj \ + +LZ_OBJS = \ + $O\LZOutWindow.obj \ + +C_OBJS = \ + $O\Alloc.obj \ + $O\7zCrc.obj \ + $O\Threads.obj \ + +C_LZ_OBJS = \ + $O\MatchFinder.obj \ + $O\MatchFinderMt.obj \ + +OBJS = \ + $(LZMA_OBJS) \ + $(LZMA_OPT_OBJS) \ + $(COMMON_OBJS) \ + $(WIN_OBJS) \ + $(7ZIP_COMMON_OBJS) \ + $(LZ_OBJS) \ + $(C_OBJS) \ + $(C_LZ_OBJS) \ + $O\LzmaRamDecode.obj \ + $O\LzmaDecode.obj \ + $O\FileStreams.obj \ + $O\FileIO.obj \ + $O\RangeCoderBit.obj \ + $O\BranchX86.obj \ + +all: $(PROGPATH) + +clean: + -del /Q $(PROGPATH) $O\*.exe $O\*.dll $O\*.obj $O\*.lib $O\*.exp $O\*.res $O\*.pch + +$O: + if not exist "$O" mkdir "$O" + +$(PROGPATH): $O $(OBJS) + link $(LFLAGS) -out:$(PROGPATH) $(OBJS) $(LIBS) + + +$(LZMA_OBJS): $(*B).cpp + $(COMPL) +$(LZMA_OPT_OBJS): ../LZMA/$(*B).cpp + $(COMPL_O2) +$(COMMON_OBJS): ../../../Common/$(*B).cpp + $(COMPL) +$(WIN_OBJS): ../../../Windows/$(*B).cpp + $(COMPL) +$(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp + $(COMPL) +$(LZ_OBJS): ../LZ/$(*B).cpp + $(COMPL) +$O\RangeCoderBit.obj: ../RangeCoder/$(*B).cpp + $(COMPL) +$O\LzmaRamDecode.obj: LzmaRamDecode.c + $(COMPL_O1) +$O\LzmaDecode.obj: ../../../../C/Compress/Lzma/LzmaDecode.c + $(COMPL_O2) +$O\BranchX86.obj: ../../../../C/Compress/Branch/BranchX86.c + $(COMPL_O2) +$O\FileStreams.obj: ../../Common/FileStreams.cpp + $(COMPL) +$O\FileIO.obj: ../../../Windows/FileIO.cpp + $(COMPL) +$(C_OBJS): ../../../../C/$(*B).c + $(COMPL_O2) +$(C_LZ_OBJS): ../../../../C/Compress/Lz/$(*B).c + $(COMPL_O2) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/makefile.gcc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/makefile.gcc Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,139 @@ +PROG = lzma +CXX = g++ -O2 -Wall +CXX_C = gcc -O2 -Wall +LIB = -lm +RM = rm -f +CFLAGS = -c + +ifdef SystemDrive +IS_MINGW = 1 +endif + +ifdef IS_MINGW +FILE_IO =FileIO +FILE_IO_2 =Windows/$(FILE_IO) +LIB2 = -luuid +else +FILE_IO =C_FileIO +FILE_IO_2 =Common/$(FILE_IO) +endif + +OBJS = \ + LzmaAlone.o \ + LzmaBench.o \ + LzmaBenchCon.o \ + LzmaRam.o \ + LZMADecoder.o \ + LZMAEncoder.o \ + LZOutWindow.o \ + RangeCoderBit.o \ + InBuffer.o \ + OutBuffer.o \ + FileStreams.o \ + StreamUtils.o \ + $(FILE_IO).o \ + CommandLineParser.o \ + CRC.o \ + IntToString.o \ + MyString.o \ + StringConvert.o \ + StringToInt.o \ + MyVector.o \ + 7zCrc.o \ + Alloc.o \ + BranchX86.o \ + MatchFinder.o \ + LzmaDecode.o \ + LzmaRamDecode.o \ + + +all: $(PROG) + +$(PROG): $(OBJS) + $(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB) $(LIB2) + +LzmaAlone.o: LzmaAlone.cpp + $(CXX) $(CFLAGS) LzmaAlone.cpp + +LzmaBench.o: LzmaBench.cpp + $(CXX) $(CFLAGS) LzmaBench.cpp + +LzmaBenchCon.o: LzmaBenchCon.cpp + $(CXX) $(CFLAGS) LzmaBenchCon.cpp + +LzmaRam.o: LzmaRam.cpp + $(CXX) $(CFLAGS) LzmaRam.cpp + +LZMADecoder.o: ../LZMA/LZMADecoder.cpp + $(CXX) $(CFLAGS) ../LZMA/LZMADecoder.cpp + +LZMAEncoder.o: ../LZMA/LZMAEncoder.cpp + $(CXX) $(CFLAGS) ../LZMA/LZMAEncoder.cpp + +LZOutWindow.o: ../LZ/LZOutWindow.cpp + $(CXX) $(CFLAGS) ../LZ/LZOutWindow.cpp + +RangeCoderBit.o: ../RangeCoder/RangeCoderBit.cpp + $(CXX) $(CFLAGS) ../RangeCoder/RangeCoderBit.cpp + +InBuffer.o: ../../Common/InBuffer.cpp + $(CXX) $(CFLAGS) ../../Common/InBuffer.cpp + +OutBuffer.o: ../../Common/OutBuffer.cpp + $(CXX) $(CFLAGS) ../../Common/OutBuffer.cpp + +FileStreams.o: ../../Common/FileStreams.cpp + $(CXX) $(CFLAGS) ../../Common/FileStreams.cpp + +StreamUtils.o: ../../Common/StreamUtils.cpp + $(CXX) $(CFLAGS) ../../Common/StreamUtils.cpp + +$(FILE_IO).o: ../../../$(FILE_IO_2).cpp + $(CXX) $(CFLAGS) ../../../$(FILE_IO_2).cpp + + +CommandLineParser.o: ../../../Common/CommandLineParser.cpp + $(CXX) $(CFLAGS) ../../../Common/CommandLineParser.cpp + +CRC.o: ../../../Common/CRC.cpp + $(CXX) $(CFLAGS) ../../../Common/CRC.cpp + +MyWindows.o: ../../../Common/MyWindows.cpp + $(CXX) $(CFLAGS) ../../../Common/MyWindows.cpp + +IntToString.o: ../../../Common/IntToString.cpp + $(CXX) $(CFLAGS) ../../../Common/IntToString.cpp + +MyString.o: ../../../Common/MyString.cpp + $(CXX) $(CFLAGS) ../../../Common/MyString.cpp + +StringConvert.o: ../../../Common/StringConvert.cpp + $(CXX) $(CFLAGS) ../../../Common/StringConvert.cpp + +StringToInt.o: ../../../Common/StringToInt.cpp + $(CXX) $(CFLAGS) ../../../Common/StringToInt.cpp + +MyVector.o: ../../../Common/MyVector.cpp + $(CXX) $(CFLAGS) ../../../Common/MyVector.cpp + +7zCrc.o: ../../../../C/7zCrc.c + $(CXX_C) $(CFLAGS) ../../../../C/7zCrc.c + +Alloc.o: ../../../../C/Alloc.c + $(CXX_C) $(CFLAGS) ../../../../C/Alloc.c + +BranchX86.o: ../../../../C/Compress/Branch/BranchX86.c + $(CXX_C) $(CFLAGS) ../../../../C/Compress/Branch/BranchX86.c + +MatchFinder.o: ../../../../C/Compress/Lz/MatchFinder.c + $(CXX_C) $(CFLAGS) ../../../../C/Compress/Lz/MatchFinder.c + +LzmaDecode.o: ../../../../C/Compress/Lzma/LzmaDecode.c + $(CXX_C) $(CFLAGS) ../../../../C/Compress/Lzma/LzmaDecode.c + +LzmaRamDecode.o: LzmaRamDecode.c + $(CXX_C) $(CFLAGS) LzmaRamDecode.c + +clean: + -$(RM) $(PROG) $(OBJS) + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,205 @@ +// Compress/RangeCoder/RangeCoder.h + +#ifndef __COMPRESS_RANGECODER_H +#define __COMPRESS_RANGECODER_H + +#include "../../Common/InBuffer.h" +#include "../../Common/OutBuffer.h" + +namespace NCompress { +namespace NRangeCoder { + +const int kNumTopBits = 24; +const UInt32 kTopValue = (1 << kNumTopBits); + +class CEncoder +{ + UInt32 _cacheSize; + Byte _cache; +public: + UInt64 Low; + UInt32 Range; + COutBuffer Stream; + bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); } + + void SetStream(ISequentialOutStream *stream) { Stream.SetStream(stream); } + void Init() + { + Stream.Init(); + Low = 0; + Range = 0xFFFFFFFF; + _cacheSize = 1; + _cache = 0; + } + + void FlushData() + { + // Low += 1; + for(int i = 0; i < 5; i++) + ShiftLow(); + } + + HRESULT FlushStream() { return Stream.Flush(); } + + void ReleaseStream() { Stream.ReleaseStream(); } + + void Encode(UInt32 start, UInt32 size, UInt32 total) + { + Low += start * (Range /= total); + Range *= size; + while (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + + void ShiftLow() + { + if ((UInt32)Low < (UInt32)0xFF000000 || (int)(Low >> 32) != 0) + { + Byte temp = _cache; + do + { + Stream.WriteByte((Byte)(temp + (Byte)(Low >> 32))); + temp = 0xFF; + } + while(--_cacheSize != 0); + _cache = (Byte)((UInt32)Low >> 24); + } + _cacheSize++; + Low = (UInt32)Low << 8; + } + + void EncodeDirectBits(UInt32 value, int numTotalBits) + { + for (int i = numTotalBits - 1; i >= 0; i--) + { + Range >>= 1; + if (((value >> i) & 1) == 1) + Low += Range; + if (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + } + + void EncodeBit(UInt32 size0, UInt32 numTotalBits, UInt32 symbol) + { + UInt32 newBound = (Range >> numTotalBits) * size0; + if (symbol == 0) + Range = newBound; + else + { + Low += newBound; + Range -= newBound; + } + while (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + + UInt64 GetProcessedSize() { return Stream.GetProcessedSize() + _cacheSize + 4; } +}; + +class CDecoder +{ +public: + CInBuffer Stream; + UInt32 Range; + UInt32 Code; + bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); } + + void Normalize() + { + while (Range < kTopValue) + { + Code = (Code << 8) | Stream.ReadByte(); + Range <<= 8; + } + } + + void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); } + void Init() + { + Stream.Init(); + Code = 0; + Range = 0xFFFFFFFF; + for(int i = 0; i < 5; i++) + Code = (Code << 8) | Stream.ReadByte(); + } + + void ReleaseStream() { Stream.ReleaseStream(); } + + UInt32 GetThreshold(UInt32 total) + { + return (Code) / ( Range /= total); + } + + void Decode(UInt32 start, UInt32 size) + { + Code -= start * Range; + Range *= size; + Normalize(); + } + + UInt32 DecodeDirectBits(int numTotalBits) + { + UInt32 range = Range; + UInt32 code = Code; + UInt32 result = 0; + for (int i = numTotalBits; i != 0; i--) + { + range >>= 1; + /* + result <<= 1; + if (code >= range) + { + code -= range; + result |= 1; + } + */ + UInt32 t = (code - range) >> 31; + code -= range & (t - 1); + result = (result << 1) | (1 - t); + + if (range < kTopValue) + { + code = (code << 8) | Stream.ReadByte(); + range <<= 8; + } + } + Range = range; + Code = code; + return result; + } + + UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits) + { + UInt32 newBound = (Range >> numTotalBits) * size0; + UInt32 symbol; + if (Code < newBound) + { + symbol = 0; + Range = newBound; + } + else + { + symbol = 1; + Code -= newBound; + Range -= newBound; + } + Normalize(); + return symbol; + } + + UInt64 GetProcessedSize() {return Stream.GetProcessedSize(); } +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoderBit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoderBit.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,80 @@ +// Compress/RangeCoder/RangeCoderBit.cpp + +#include "StdAfx.h" + +#include "RangeCoderBit.h" + +namespace NCompress { +namespace NRangeCoder { + +UInt32 CPriceTables::ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; +static CPriceTables g_PriceTables; + +CPriceTables::CPriceTables() { Init(); } + +void CPriceTables::Init() +{ + const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); + for(int i = kNumBits - 1; i >= 0; i--) + { + UInt32 start = 1 << (kNumBits - i - 1); + UInt32 end = 1 << (kNumBits - i); + for (UInt32 j = start; j < end; j++) + ProbPrices[j] = (i << kNumBitPriceShiftBits) + + (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); + } + + /* + // simplest: bad solution + for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++) + ProbPrices[i] = kBitPrice; + */ + + /* + const double kDummyMultMid = (1.0 / kBitPrice) / 2; + const double kDummyMultMid = 0; + // float solution + double ln2 = log(double(2)); + double lnAll = log(double(kBitModelTotal >> kNumMoveReducingBits)); + for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++) + ProbPrices[i] = UInt32((fabs(lnAll - log(double(i))) / ln2 + kDummyMultMid) * kBitPrice); + */ + + /* + // experimental, slow, solution: + for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++) + { + const int kCyclesBits = 5; + const UInt32 kCycles = (1 << kCyclesBits); + + UInt32 range = UInt32(-1); + UInt32 bitCount = 0; + for (UInt32 j = 0; j < kCycles; j++) + { + range >>= (kNumBitModelTotalBits - kNumMoveReducingBits); + range *= i; + while(range < (1 << 31)) + { + range <<= 1; + bitCount++; + } + } + bitCount <<= kNumBitPriceShiftBits; + range -= (1 << 31); + for (int k = kNumBitPriceShiftBits - 1; k >= 0; k--) + { + range <<= 1; + if (range > (1 << 31)) + { + bitCount += (1 << k); + range -= (1 << 31); + } + } + ProbPrices[i] = (bitCount + // + (1 << (kCyclesBits - 1)) + ) >> kCyclesBits; + } + */ +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoderBit.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoderBit.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,120 @@ +// Compress/RangeCoder/RangeCoderBit.h + +#ifndef __COMPRESS_RANGECODER_BIT_H +#define __COMPRESS_RANGECODER_BIT_H + +#include "RangeCoder.h" + +namespace NCompress { +namespace NRangeCoder { + +const int kNumBitModelTotalBits = 11; +const UInt32 kBitModelTotal = (1 << kNumBitModelTotalBits); + +const int kNumMoveReducingBits = 2; + +const int kNumBitPriceShiftBits = 6; +const UInt32 kBitPrice = 1 << kNumBitPriceShiftBits; + +class CPriceTables +{ +public: + static UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; + static void Init(); + CPriceTables(); +}; + +template +class CBitModel +{ +public: + UInt32 Prob; + void UpdateModel(UInt32 symbol) + { + /* + Prob -= (Prob + ((symbol - 1) & ((1 << numMoveBits) - 1))) >> numMoveBits; + Prob += (1 - symbol) << (kNumBitModelTotalBits - numMoveBits); + */ + if (symbol == 0) + Prob += (kBitModelTotal - Prob) >> numMoveBits; + else + Prob -= (Prob) >> numMoveBits; + } +public: + void Init() { Prob = kBitModelTotal / 2; } +}; + +template +class CBitEncoder: public CBitModel +{ +public: + void Encode(CEncoder *encoder, UInt32 symbol) + { + /* + encoder->EncodeBit(this->Prob, kNumBitModelTotalBits, symbol); + this->UpdateModel(symbol); + */ + UInt32 newBound = (encoder->Range >> kNumBitModelTotalBits) * this->Prob; + if (symbol == 0) + { + encoder->Range = newBound; + this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits; + } + else + { + encoder->Low += newBound; + encoder->Range -= newBound; + this->Prob -= (this->Prob) >> numMoveBits; + } + if (encoder->Range < kTopValue) + { + encoder->Range <<= 8; + encoder->ShiftLow(); + } + } + UInt32 GetPrice(UInt32 symbol) const + { + return CPriceTables::ProbPrices[ + (((this->Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; + } + UInt32 GetPrice0() const { return CPriceTables::ProbPrices[this->Prob >> kNumMoveReducingBits]; } + UInt32 GetPrice1() const { return CPriceTables::ProbPrices[(kBitModelTotal - this->Prob) >> kNumMoveReducingBits]; } +}; + + +template +class CBitDecoder: public CBitModel +{ +public: + UInt32 Decode(CDecoder *decoder) + { + UInt32 newBound = (decoder->Range >> kNumBitModelTotalBits) * this->Prob; + if (decoder->Code < newBound) + { + decoder->Range = newBound; + this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits; + if (decoder->Range < kTopValue) + { + decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte(); + decoder->Range <<= 8; + } + return 0; + } + else + { + decoder->Range -= newBound; + decoder->Code -= newBound; + this->Prob -= (this->Prob) >> numMoveBits; + if (decoder->Range < kTopValue) + { + decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte(); + decoder->Range <<= 8; + } + return 1; + } + } +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoderBitTree.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoderBitTree.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,161 @@ +// Compress/RangeCoder/RangeCoderBitTree.h + +#ifndef __COMPRESS_RANGECODER_BIT_TREE_H +#define __COMPRESS_RANGECODER_BIT_TREE_H + +#include "RangeCoderBit.h" +#include "RangeCoderOpt.h" + +namespace NCompress { +namespace NRangeCoder { + +template +class CBitTreeEncoder +{ + CBitEncoder Models[1 << NumBitLevels]; +public: + void Init() + { + for(UInt32 i = 1; i < (1 << NumBitLevels); i++) + Models[i].Init(); + } + void Encode(CEncoder *rangeEncoder, UInt32 symbol) + { + UInt32 modelIndex = 1; + for (int bitIndex = NumBitLevels; bitIndex != 0 ;) + { + bitIndex--; + UInt32 bit = (symbol >> bitIndex) & 1; + Models[modelIndex].Encode(rangeEncoder, bit); + modelIndex = (modelIndex << 1) | bit; + } + }; + void ReverseEncode(CEncoder *rangeEncoder, UInt32 symbol) + { + UInt32 modelIndex = 1; + for (int i = 0; i < NumBitLevels; i++) + { + UInt32 bit = symbol & 1; + Models[modelIndex].Encode(rangeEncoder, bit); + modelIndex = (modelIndex << 1) | bit; + symbol >>= 1; + } + } + UInt32 GetPrice(UInt32 symbol) const + { + symbol |= (1 << NumBitLevels); + UInt32 price = 0; + while (symbol != 1) + { + price += Models[symbol >> 1].GetPrice(symbol & 1); + symbol >>= 1; + } + return price; + } + UInt32 ReverseGetPrice(UInt32 symbol) const + { + UInt32 price = 0; + UInt32 modelIndex = 1; + for (int i = NumBitLevels; i != 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += Models[modelIndex].GetPrice(bit); + modelIndex = (modelIndex << 1) | bit; + } + return price; + } +}; + +template +class CBitTreeDecoder +{ + CBitDecoder Models[1 << NumBitLevels]; +public: + void Init() + { + for(UInt32 i = 1; i < (1 << NumBitLevels); i++) + Models[i].Init(); + } + UInt32 Decode(CDecoder *rangeDecoder) + { + UInt32 modelIndex = 1; + RC_INIT_VAR + for(int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--) + { + // modelIndex = (modelIndex << 1) + Models[modelIndex].Decode(rangeDecoder); + RC_GETBIT(numMoveBits, Models[modelIndex].Prob, modelIndex) + } + RC_FLUSH_VAR + return modelIndex - (1 << NumBitLevels); + }; + UInt32 ReverseDecode(CDecoder *rangeDecoder) + { + UInt32 modelIndex = 1; + UInt32 symbol = 0; + RC_INIT_VAR + for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + // UInt32 bit = Models[modelIndex].Decode(rangeDecoder); + // modelIndex <<= 1; + // modelIndex += bit; + // symbol |= (bit << bitIndex); + RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex)) + } + RC_FLUSH_VAR + return symbol; + } +}; + +template +void ReverseBitTreeEncode(CBitEncoder *Models, + CEncoder *rangeEncoder, int NumBitLevels, UInt32 symbol) +{ + UInt32 modelIndex = 1; + for (int i = 0; i < NumBitLevels; i++) + { + UInt32 bit = symbol & 1; + Models[modelIndex].Encode(rangeEncoder, bit); + modelIndex = (modelIndex << 1) | bit; + symbol >>= 1; + } +} + +template +UInt32 ReverseBitTreeGetPrice(CBitEncoder *Models, + UInt32 NumBitLevels, UInt32 symbol) +{ + UInt32 price = 0; + UInt32 modelIndex = 1; + for (int i = NumBitLevels; i != 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += Models[modelIndex].GetPrice(bit); + modelIndex = (modelIndex << 1) | bit; + } + return price; +} + +template +UInt32 ReverseBitTreeDecode(CBitDecoder *Models, + CDecoder *rangeDecoder, int NumBitLevels) +{ + UInt32 modelIndex = 1; + UInt32 symbol = 0; + RC_INIT_VAR + for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + // UInt32 bit = Models[modelIndex].Decode(rangeDecoder); + // modelIndex <<= 1; + // modelIndex += bit; + // symbol |= (bit << bitIndex); + RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex)) + } + RC_FLUSH_VAR + return symbol; +} + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoderOpt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/RangeCoderOpt.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,31 @@ +// Compress/RangeCoder/RangeCoderOpt.h + +#ifndef __COMPRESS_RANGECODER_OPT_H +#define __COMPRESS_RANGECODER_OPT_H + +#define RC_INIT_VAR \ + UInt32 range = rangeDecoder->Range; \ + UInt32 code = rangeDecoder->Code; + +#define RC_FLUSH_VAR \ + rangeDecoder->Range = range; \ + rangeDecoder->Code = code; + +#define RC_NORMALIZE \ + if (range < NCompress::NRangeCoder::kTopValue) \ + { code = (code << 8) | rangeDecoder->Stream.ReadByte(); range <<= 8; } + +#define RC_GETBIT2(numMoveBits, prob, mi, A0, A1) \ + { UInt32 bound = (range >> NCompress::NRangeCoder::kNumBitModelTotalBits) * prob; \ + if (code < bound) \ + { A0; range = bound; \ + prob += (NCompress::NRangeCoder::kBitModelTotal - prob) >> numMoveBits; \ + mi <<= 1; } \ + else \ + { A1; range -= bound; code -= bound; prob -= (prob) >> numMoveBits; \ + mi = (mi + mi) + 1; }} \ + RC_NORMALIZE + +#define RC_GETBIT(numMoveBits, prob, mi) RC_GETBIT2(numMoveBits, prob, mi, ; , ;) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/Compress/RangeCoder/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,6 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/ICoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/ICoder.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,185 @@ +// ICoder.h + +#ifndef __ICODER_H +#define __ICODER_H + +#include "IStream.h" + +#define CODER_INTERFACE(i, x) DECL_INTERFACE(i, 4, x) + +CODER_INTERFACE(ICompressProgressInfo, 0x04) +{ + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE; +}; + +CODER_INTERFACE(ICompressCoder, 0x05) +{ + STDMETHOD(Code)(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *inSize, + const UInt64 *outSize, + ICompressProgressInfo *progress) PURE; +}; + +CODER_INTERFACE(ICompressCoder2, 0x18) +{ + STDMETHOD(Code)(ISequentialInStream **inStreams, + const UInt64 **inSizes, + UInt32 numInStreams, + ISequentialOutStream **outStreams, + const UInt64 **outSizes, + UInt32 numOutStreams, + ICompressProgressInfo *progress) PURE; +}; + +namespace NCoderPropID +{ + enum EEnum + { + kDictionarySize = 0x400, + kUsedMemorySize, + kOrder, + kPosStateBits = 0x440, + kLitContextBits, + kLitPosBits, + kNumFastBytes = 0x450, + kMatchFinder, + kMatchFinderCycles, + kNumPasses = 0x460, + kAlgorithm = 0x470, + kMultiThread = 0x480, + kNumThreads, + kEndMarker = 0x490 + }; +} + +CODER_INTERFACE(ICompressSetCoderProperties, 0x20) +{ + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, + const PROPVARIANT *properties, UInt32 numProperties) PURE; +}; + +/* +CODER_INTERFACE(ICompressSetCoderProperties, 0x21) +{ + STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE; +}; +*/ + +CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22) +{ + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE; +}; + +CODER_INTERFACE(ICompressWriteCoderProperties, 0x23) +{ + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStreams) PURE; +}; + +CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24) +{ + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE; +}; + +CODER_INTERFACE(ICompressSetCoderMt, 0x25) +{ + STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE; +}; + +CODER_INTERFACE(ICompressGetSubStreamSize, 0x30) +{ + STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE; +}; + +CODER_INTERFACE(ICompressSetInStream, 0x31) +{ + STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE; + STDMETHOD(ReleaseInStream)() PURE; +}; + +CODER_INTERFACE(ICompressSetOutStream, 0x32) +{ + STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE; + STDMETHOD(ReleaseOutStream)() PURE; +}; + +CODER_INTERFACE(ICompressSetInStreamSize, 0x33) +{ + STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE; +}; + +CODER_INTERFACE(ICompressSetOutStreamSize, 0x34) +{ + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE; +}; + +CODER_INTERFACE(ICompressFilter, 0x40) +{ + STDMETHOD(Init)() PURE; + STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE; + // Filter return outSize (UInt32) + // if (outSize <= size): Filter have converted outSize bytes + // if (outSize > size): Filter have not converted anything. + // and it needs at least outSize bytes to convert one block + // (it's for crypto block algorithms). +}; + +CODER_INTERFACE(ICompressCodecsInfo, 0x60) +{ + STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods) PURE; + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(CreateDecoder)(UInt32 index, const GUID *iid, void **coder) PURE; + STDMETHOD(CreateEncoder)(UInt32 index, const GUID *iid, void **coder) PURE; +}; +CODER_INTERFACE(ISetCompressCodecsInfo, 0x61) +{ + STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo) PURE; +}; + +CODER_INTERFACE(ICryptoProperties, 0x80) +{ + STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE; + STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE; +}; + +/* +CODER_INTERFACE(ICryptoResetSalt, 0x88) +{ + STDMETHOD(ResetSalt)() PURE; +}; +*/ + +CODER_INTERFACE(ICryptoResetInitVector, 0x8C) +{ + STDMETHOD(ResetInitVector)() PURE; +}; + +CODER_INTERFACE(ICryptoSetPassword, 0x90) +{ + STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE; +}; + +CODER_INTERFACE(ICryptoSetCRC, 0xA0) +{ + STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE; +}; + +////////////////////// +// It's for DLL file +namespace NMethodPropID +{ + enum EEnum + { + kID, + kName, + kDecoder, + kEncoder, + kInStreams, + kOutStreams, + kDescription, + kDecoderIsAssigned, + kEncoderIsAssigned + }; +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/IDecl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/IDecl.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,15 @@ +// IDecl.h + +#ifndef __IDECL_H +#define __IDECL_H + +#include "../Common/MyUnknown.h" + +#define DECL_INTERFACE_SUB(i, base, groupId, subId) \ +DEFINE_GUID(IID_ ## i, \ +0x23170F69, 0x40C1, 0x278A, 0, 0, 0, (groupId), 0, (subId), 0, 0); \ +struct i: public base + +#define DECL_INTERFACE(i, groupId, subId) DECL_INTERFACE_SUB(i, IUnknown, groupId, subId) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/IPassword.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/IPassword.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// IPassword.h + +#ifndef __IPASSWORD_H +#define __IPASSWORD_H + +#include "../Common/MyUnknown.h" +#include "../Common/Types.h" + +#include "IDecl.h" + +#define PASSWORD_INTERFACE(i, x) DECL_INTERFACE(i, 5, x) + +PASSWORD_INTERFACE(ICryptoGetTextPassword, 0x10) +{ + STDMETHOD(CryptoGetTextPassword)(BSTR *password) PURE; +}; + +PASSWORD_INTERFACE(ICryptoGetTextPassword2, 0x11) +{ + STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password) PURE; +}; + +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/IProgress.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/IProgress.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,30 @@ +// Interface/IProgress.h + +#ifndef __IPROGRESS_H +#define __IPROGRESS_H + +#include "../Common/MyUnknown.h" +#include "../Common/Types.h" + +#include "IDecl.h" + +DECL_INTERFACE(IProgress, 0, 5) +{ + STDMETHOD(SetTotal)(UInt64 total) PURE; + STDMETHOD(SetCompleted)(const UInt64 *completeValue) PURE; +}; + +/* +// {23170F69-40C1-278A-0000-000000050002} +DEFINE_GUID(IID_IProgress2, +0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02); +MIDL_INTERFACE("23170F69-40C1-278A-0000-000000050002") +IProgress2: public IUnknown +{ +public: + STDMETHOD(SetTotal)(const UInt64 *total) PURE; + STDMETHOD(SetCompleted)(const UInt64 *completeValue) PURE; +}; +*/ + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/IStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/IStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,58 @@ +// IStream.h + +#ifndef __ISTREAM_H +#define __ISTREAM_H + +#include "../Common/MyUnknown.h" +#include "../Common/Types.h" + +#include "IDecl.h" + +#define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x) +#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x) + +STREAM_INTERFACE(ISequentialInStream, 0x01) +{ + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE; + /* + Out: if size != 0, return_value = S_OK and (*processedSize == 0), + then there are no more bytes in stream. + if (size > 0) && there are bytes in stream, + this function must read at least 1 byte. + This function is allowed to read less than number of remaining bytes in stream. + You must call Read function in loop, if you need exact amount of data + */ +}; + +STREAM_INTERFACE(ISequentialOutStream, 0x02) +{ + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE; + /* + if (size > 0) this function must write at least 1 byte. + This function is allowed to write less than "size". + You must call Write function in loop, if you need to write exact amount of data + */ +}; + +STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03) +{ + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; +}; + +STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04) +{ + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; + STDMETHOD(SetSize)(Int64 newSize) PURE; +}; + +STREAM_INTERFACE(IStreamGetSize, 0x06) +{ + STDMETHOD(GetSize)(UInt64 *size) PURE; +}; + +STREAM_INTERFACE(IOutStreamFlush, 0x07) +{ + STDMETHOD(Flush)() PURE; +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/MyVersion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/MyVersion.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,8 @@ +#define MY_VER_MAJOR 4 +#define MY_VER_MINOR 57 +#define MY_VER_BUILD 0 +#define MY_VERSION "4.57" +#define MY_7ZIP_VERSION "7-Zip 4.57" +#define MY_DATE "2007-12-06" +#define MY_COPYRIGHT "Copyright (c) 1999-2007 Igor Pavlov" +#define MY_VERSION_COPYRIGHT_DATE MY_VERSION " " MY_COPYRIGHT " " MY_DATE diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/MyVersionInfo.rc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/MyVersionInfo.rc Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,45 @@ +#include +#include "MyVersion.h" + +#define MY_VER MY_VER_MAJOR,MY_VER_MINOR,MY_VER_BUILD,0 + +#ifdef DEBUG +#define DBG_FL VS_FF_DEBUG +#else +#define DBG_FL 0 +#endif + +#define MY_VERSION_INFO(fileType, descr, intName, origName) \ +LANGUAGE 9, 1 \ +1 VERSIONINFO \ + FILEVERSION MY_VER \ + PRODUCTVERSION MY_VER \ + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK \ + FILEFLAGS DBG_FL \ + FILEOS VOS_NT_WINDOWS32 \ + FILETYPE fileType \ + FILESUBTYPE 0x0L \ +BEGIN \ + BLOCK "StringFileInfo" \ + BEGIN \ + BLOCK "040904b0" \ + BEGIN \ + VALUE "CompanyName", "Igor Pavlov" \ + VALUE "FileDescription", descr \ + VALUE "FileVersion", MY_VERSION \ + VALUE "InternalName", intName \ + VALUE "LegalCopyright", MY_COPYRIGHT \ + VALUE "OriginalFilename", origName \ + VALUE "ProductName", "7-Zip" \ + VALUE "ProductVersion", MY_VERSION \ + END \ + END \ + BLOCK "VarFileInfo" \ + BEGIN \ + VALUE "Translation", 0x409, 1200 \ + END \ +END + +#define MY_VERSION_INFO_APP(descr, intName) MY_VERSION_INFO(VFT_APP, descr, intName, intName ".exe") + +#define MY_VERSION_INFO_DLL(descr, intName) MY_VERSION_INFO(VFT_DLL, descr, intName, intName ".dll") diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/PropID.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/PropID.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,60 @@ +// Interface/PropID.h + +#ifndef __INTERFACE_PROPID_H +#define __INTERFACE_PROPID_H + +enum +{ + kpidNoProperty = 0, + + kpidHandlerItemIndex = 2, + kpidPath, + kpidName, + kpidExtension, + kpidIsFolder, + kpidSize, + kpidPackedSize, + kpidAttributes, + kpidCreationTime, + kpidLastAccessTime, + kpidLastWriteTime, + kpidSolid, + kpidCommented, + kpidEncrypted, + kpidSplitBefore, + kpidSplitAfter, + kpidDictionarySize, + kpidCRC, + kpidType, + kpidIsAnti, + kpidMethod, + kpidHostOS, + kpidFileSystem, + kpidUser, + kpidGroup, + kpidBlock, + kpidComment, + kpidPosition, + kpidPrefix, + kpidNumSubFolders, + kpidNumSubFiles, + kpidUnpackVer, + kpidVolume, + kpidIsVolume, + kpidOffset, + kpidLinks, + kpidNumBlocks, + kpidNumVolumes, + + kpidTotalSize = 0x1100, + kpidFreeSpace, + kpidClusterSize, + kpidVolumeName, + + kpidLocalName = 0x1200, + kpidProvider, + + kpidUserDefined = 0x10000 +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Client7z/Client7z.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Client7z/Client7z.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,880 @@ +// Client7z.cpp + +#include "StdAfx.h" + +#include "Common/MyInitGuid.h" +#include "Common/StringConvert.h" +#include "Common/IntToString.h" + +#include "Windows/PropVariant.h" +#include "Windows/PropVariantConversions.h" +#include "Windows/DLL.h" +#include "Windows/FileDir.h" +#include "Windows/FileName.h" +#include "Windows/FileFind.h" + +#include "../../Common/FileStreams.h" +#include "../../Archive/IArchive.h" +#include "../../IPassword.h" +#include "../../MyVersion.h" + + +// {23170F69-40C1-278A-1000-000110070000} +DEFINE_GUID(CLSID_CFormat7z, + 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x07, 0x00, 0x00); + +using namespace NWindows; + +#define kDllName "7z.dll" + +static const char *kCopyrightString = MY_7ZIP_VERSION +" (" kDllName " client) " +MY_COPYRIGHT " " MY_DATE; + +static const char *kHelpString = +"Usage: Client7z.exe [a | l | x ] archive.7z [fileName ...]\n" +"Examples:\n" +" Client7z.exe a archive.7z f1.txt f2.txt : compress two files to archive.7z\n" +" Client7z.exe l archive.7z : List contents of archive.7z\n" +" Client7z.exe x archive.7z : eXtract files from archive.7z\n"; + + +typedef UINT32 (WINAPI * CreateObjectFunc)( + const GUID *clsID, + const GUID *interfaceID, + void **outObject); + +#ifdef _WIN32 +#ifndef _UNICODE +bool g_IsNT = false; +static inline bool IsItWindowsNT() +{ + OSVERSIONINFO versionInfo; + versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); + if (!::GetVersionEx(&versionInfo)) + return false; + return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); +} +#endif +#endif + +void PrintString(const UString &s) +{ + printf("%s", (LPCSTR)GetOemString(s)); +} + +void PrintString(const AString &s) +{ + printf("%s", (LPCSTR)s); +} + +void PrintNewLine() +{ + PrintString("\n"); +} + +void PrintStringLn(const AString &s) +{ + PrintString(s); + PrintNewLine(); +} + +void PrintError(const AString &s) +{ + PrintNewLine(); + PrintString(s); + PrintNewLine(); +} + +static HRESULT IsArchiveItemProp(IInArchive *archive, UInt32 index, PROPID propID, bool &result) +{ + NCOM::CPropVariant prop; + RINOK(archive->GetProperty(index, propID, &prop)); + if(prop.vt == VT_BOOL) + result = VARIANT_BOOLToBool(prop.boolVal); + else if (prop.vt == VT_EMPTY) + result = false; + else + return E_FAIL; + return S_OK; +} + +static HRESULT IsArchiveItemFolder(IInArchive *archive, UInt32 index, bool &result) +{ + return IsArchiveItemProp(archive, index, kpidIsFolder, result); +} + + +static const wchar_t *kEmptyFileAlias = L"[Content]"; + + +////////////////////////////////////////////////////////////// +// Archive Open callback class + + +class CArchiveOpenCallback: + public IArchiveOpenCallback, + public ICryptoGetTextPassword, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP1(ICryptoGetTextPassword) + + STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes); + STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes); + + STDMETHOD(CryptoGetTextPassword)(BSTR *password); + + bool PasswordIsDefined; + UString Password; + + CArchiveOpenCallback() : PasswordIsDefined(false) {} +}; + +STDMETHODIMP CArchiveOpenCallback::SetTotal(const UInt64 * /* files */, const UInt64 * /* bytes */) +{ + return S_OK; +} + +STDMETHODIMP CArchiveOpenCallback::SetCompleted(const UInt64 * /* files */, const UInt64 * /* bytes */) +{ + return S_OK; +} + +STDMETHODIMP CArchiveOpenCallback::CryptoGetTextPassword(BSTR *password) +{ + if (!PasswordIsDefined) + { + // You can ask real password here from user + // Password = GetPassword(OutStream); + // PasswordIsDefined = true; + PrintError("Password is not defined"); + return E_ABORT; + } + CMyComBSTR tempName(Password); + *password = tempName.Detach(); + return S_OK; +} + + +////////////////////////////////////////////////////////////// +// Archive Extracting callback class + +static const wchar_t *kCantDeleteOutputFile = L"ERROR: Can not delete output file "; + +static const char *kTestingString = "Testing "; +static const char *kExtractingString = "Extracting "; +static const char *kSkippingString = "Skipping "; + +static const char *kUnsupportedMethod = "Unsupported Method"; +static const char *kCRCFailed = "CRC Failed"; +static const char *kDataError = "Data Error"; +static const char *kUnknownError = "Unknown Error"; + +class CArchiveExtractCallback: + public IArchiveExtractCallback, + public ICryptoGetTextPassword, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP1(ICryptoGetTextPassword) + + // IProgress + STDMETHOD(SetTotal)(UInt64 size); + STDMETHOD(SetCompleted)(const UInt64 *completeValue); + + // IArchiveExtractCallback + STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode); + STDMETHOD(PrepareOperation)(Int32 askExtractMode); + STDMETHOD(SetOperationResult)(Int32 resultEOperationResult); + + // ICryptoGetTextPassword + STDMETHOD(CryptoGetTextPassword)(BSTR *aPassword); + +private: + CMyComPtr _archiveHandler; + UString _directoryPath; // Output directory + UString _filePath; // name inside arcvhive + UString _diskFilePath; // full path to file on disk + bool _extractMode; + struct CProcessedFileInfo + { + FILETIME UTCLastWriteTime; + UInt32 Attributes; + bool IsDirectory; + bool AttributesAreDefined; + bool UTCLastWriteTimeIsDefined; + } _processedFileInfo; + + COutFileStream *_outFileStreamSpec; + CMyComPtr _outFileStream; + +public: + void Init(IInArchive *archiveHandler, const UString &directoryPath); + + UInt64 NumErrors; + bool PasswordIsDefined; + UString Password; + + CArchiveExtractCallback() : PasswordIsDefined(false) {} +}; + +void CArchiveExtractCallback::Init(IInArchive *archiveHandler, const UString &directoryPath) +{ + NumErrors = 0; + _archiveHandler = archiveHandler; + _directoryPath = directoryPath; + NFile::NName::NormalizeDirPathPrefix(_directoryPath); +} + +STDMETHODIMP CArchiveExtractCallback::SetTotal(UInt64 /* size */) +{ + return S_OK; +} + +STDMETHODIMP CArchiveExtractCallback::SetCompleted(const UInt64 * /* completeValue */) +{ + return S_OK; +} + +STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, + ISequentialOutStream **outStream, Int32 askExtractMode) +{ + *outStream = 0; + _outFileStream.Release(); + + { + // Get Name + NCOM::CPropVariant propVariant; + RINOK(_archiveHandler->GetProperty(index, kpidPath, &propVariant)); + + UString fullPath; + if(propVariant.vt == VT_EMPTY) + fullPath = kEmptyFileAlias; + else + { + if(propVariant.vt != VT_BSTR) + return E_FAIL; + fullPath = propVariant.bstrVal; + } + _filePath = fullPath; + } + + if (askExtractMode != NArchive::NExtract::NAskMode::kExtract) + return S_OK; + + { + // Get Attributes + NCOM::CPropVariant propVariant; + RINOK(_archiveHandler->GetProperty(index, kpidAttributes, &propVariant)); + if (propVariant.vt == VT_EMPTY) + { + _processedFileInfo.Attributes = 0; + _processedFileInfo.AttributesAreDefined = false; + } + else + { + if (propVariant.vt != VT_UI4) + throw "incorrect item"; + _processedFileInfo.Attributes = propVariant.ulVal; + _processedFileInfo.AttributesAreDefined = true; + } + } + + RINOK(IsArchiveItemFolder(_archiveHandler, index, _processedFileInfo.IsDirectory)); + + { + // Get Modified Time + NCOM::CPropVariant propVariant; + RINOK(_archiveHandler->GetProperty(index, kpidLastWriteTime, &propVariant)); + _processedFileInfo.UTCLastWriteTimeIsDefined = false; + switch(propVariant.vt) + { + case VT_EMPTY: + // _processedFileInfo.UTCLastWriteTime = _utcLastWriteTimeDefault; + break; + case VT_FILETIME: + _processedFileInfo.UTCLastWriteTime = propVariant.filetime; + _processedFileInfo.UTCLastWriteTimeIsDefined = true; + break; + default: + return E_FAIL; + } + + } + { + // Get Size + NCOM::CPropVariant propVariant; + RINOK(_archiveHandler->GetProperty(index, kpidSize, &propVariant)); + bool newFileSizeDefined = (propVariant.vt != VT_EMPTY); + UInt64 newFileSize; + if (newFileSizeDefined) + newFileSize = ConvertPropVariantToUInt64(propVariant); + } + + + { + // Create folders for file + int slashPos = _filePath.ReverseFind(WCHAR_PATH_SEPARATOR); + if (slashPos >= 0) + NFile::NDirectory::CreateComplexDirectory(_directoryPath + _filePath.Left(slashPos)); + } + + UString fullProcessedPath = _directoryPath + _filePath; + _diskFilePath = fullProcessedPath; + + if (_processedFileInfo.IsDirectory) + { + NFile::NDirectory::CreateComplexDirectory(fullProcessedPath); + } + else + { + NFile::NFind::CFileInfoW fileInfo; + if(NFile::NFind::FindFile(fullProcessedPath, fileInfo)) + { + if (!NFile::NDirectory::DeleteFileAlways(fullProcessedPath)) + { + PrintString(UString(kCantDeleteOutputFile) + fullProcessedPath); + return E_ABORT; + } + } + + _outFileStreamSpec = new COutFileStream; + CMyComPtr outStreamLoc(_outFileStreamSpec); + if (!_outFileStreamSpec->Open(fullProcessedPath, CREATE_ALWAYS)) + { + PrintString((UString)L"can not open output file " + fullProcessedPath); + return E_ABORT; + } + _outFileStream = outStreamLoc; + *outStream = outStreamLoc.Detach(); + } + return S_OK; +} + +STDMETHODIMP CArchiveExtractCallback::PrepareOperation(Int32 askExtractMode) +{ + _extractMode = false; + switch (askExtractMode) + { + case NArchive::NExtract::NAskMode::kExtract: + _extractMode = true; + }; + switch (askExtractMode) + { + case NArchive::NExtract::NAskMode::kExtract: + PrintString(kExtractingString); + break; + case NArchive::NExtract::NAskMode::kTest: + PrintString(kTestingString); + break; + case NArchive::NExtract::NAskMode::kSkip: + PrintString(kSkippingString); + break; + }; + PrintString(_filePath); + return S_OK; +} + +STDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 operationResult) +{ + switch(operationResult) + { + case NArchive::NExtract::NOperationResult::kOK: + break; + default: + { + NumErrors++; + PrintString(" "); + switch(operationResult) + { + case NArchive::NExtract::NOperationResult::kUnSupportedMethod: + PrintString(kUnsupportedMethod); + break; + case NArchive::NExtract::NOperationResult::kCRCError: + PrintString(kCRCFailed); + break; + case NArchive::NExtract::NOperationResult::kDataError: + PrintString(kDataError); + break; + default: + PrintString(kUnknownError); + } + } + } + + if (_outFileStream != NULL) + { + if (_processedFileInfo.UTCLastWriteTimeIsDefined) + _outFileStreamSpec->SetLastWriteTime(&_processedFileInfo.UTCLastWriteTime); + RINOK(_outFileStreamSpec->Close()); + } + _outFileStream.Release(); + if (_extractMode && _processedFileInfo.AttributesAreDefined) + NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attributes); + PrintNewLine(); + return S_OK; +} + + +STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password) +{ + if (!PasswordIsDefined) + { + // You can ask real password here from user + // Password = GetPassword(OutStream); + // PasswordIsDefined = true; + PrintError("Password is not defined"); + return E_ABORT; + } + CMyComBSTR tempName(Password); + *password = tempName.Detach(); + return S_OK; +} + + + +////////////////////////////////////////////////////////////// +// Archive Creating callback class + +struct CDirItem +{ + UInt32 Attributes; + FILETIME CreationTime; + FILETIME LastAccessTime; + FILETIME LastWriteTime; + UInt64 Size; + UString Name; + UString FullPath; + bool IsDirectory() const { return (Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0 ; } +}; + +class CArchiveUpdateCallback: + public IArchiveUpdateCallback2, + public ICryptoGetTextPassword2, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP2(IArchiveUpdateCallback2, ICryptoGetTextPassword2) + + // IProgress + STDMETHOD(SetTotal)(UInt64 size); + STDMETHOD(SetCompleted)(const UInt64 *completeValue); + + // IUpdateCallback2 + STDMETHOD(EnumProperties)(IEnumSTATPROPSTG **enumerator); + STDMETHOD(GetUpdateItemInfo)(UInt32 index, + Int32 *newData, Int32 *newProperties, UInt32 *indexInArchive); + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream); + STDMETHOD(SetOperationResult)(Int32 operationResult); + STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size); + STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream); + + STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password); + +public: + CRecordVector VolumesSizes; + UString VolName; + UString VolExt; + + UString DirPrefix; + const CObjectVector *DirItems; + + bool PasswordIsDefined; + UString Password; + bool AskPassword; + + bool m_NeedBeClosed; + + UStringVector FailedFiles; + CRecordVector FailedCodes; + + CArchiveUpdateCallback(): PasswordIsDefined(false), AskPassword(false), DirItems(0) {}; + + ~CArchiveUpdateCallback() { Finilize(); } + HRESULT Finilize(); + + void Init(const CObjectVector *dirItems) + { + DirItems = dirItems; + m_NeedBeClosed = false; + FailedFiles.Clear(); + FailedCodes.Clear(); + } +}; + +STDMETHODIMP CArchiveUpdateCallback::SetTotal(UInt64 /* size */) +{ + return S_OK; +} + +STDMETHODIMP CArchiveUpdateCallback::SetCompleted(const UInt64 * /* completeValue */) +{ + return S_OK; +} + + +STDMETHODIMP CArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG ** /* enumerator */) +{ + return E_NOTIMPL; +} + +STDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 /* index */, + Int32 *newData, Int32 *newProperties, UInt32 *indexInArchive) +{ + if(newData != NULL) + *newData = BoolToInt(true); + if(newProperties != NULL) + *newProperties = BoolToInt(true); + if(indexInArchive != NULL) + *indexInArchive = UInt32(-1); + return S_OK; +} + +STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) +{ + NWindows::NCOM::CPropVariant propVariant; + + if (propID == kpidIsAnti) + { + propVariant = false; + propVariant.Detach(value); + return S_OK; + } + + { + const CDirItem &dirItem = (*DirItems)[index]; + switch(propID) + { + case kpidPath: + propVariant = dirItem.Name; + break; + case kpidIsFolder: + propVariant = dirItem.IsDirectory(); + break; + case kpidSize: + propVariant = dirItem.Size; + break; + case kpidAttributes: + propVariant = dirItem.Attributes; + break; + case kpidLastAccessTime: + propVariant = dirItem.LastAccessTime; + break; + case kpidCreationTime: + propVariant = dirItem.CreationTime; + break; + case kpidLastWriteTime: + propVariant = dirItem.LastWriteTime; + break; + } + } + propVariant.Detach(value); + return S_OK; +} + +HRESULT CArchiveUpdateCallback::Finilize() +{ + if (m_NeedBeClosed) + { + PrintNewLine(); + m_NeedBeClosed = false; + } + return S_OK; +} + +static void GetStream2(const wchar_t *name) +{ + PrintString("Compressing "); + if (name[0] == 0) + name = kEmptyFileAlias; + PrintString(name); +} + +STDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream) +{ + RINOK(Finilize()); + + const CDirItem &dirItem = (*DirItems)[index]; + GetStream2(dirItem.Name); + + if(dirItem.IsDirectory()) + return S_OK; + + { + CInFileStream *inStreamSpec = new CInFileStream; + CMyComPtr inStreamLoc(inStreamSpec); + UString path = DirPrefix + dirItem.FullPath; + if(!inStreamSpec->Open(path)) + { + DWORD sysError = ::GetLastError(); + FailedCodes.Add(sysError); + FailedFiles.Add(path); + // if (systemError == ERROR_SHARING_VIOLATION) + { + PrintNewLine(); + PrintError("WARNING: can't open file"); + // PrintString(NError::MyFormatMessageW(systemError)); + return S_FALSE; + } + // return sysError; + } + *inStream = inStreamLoc.Detach(); + } + return S_OK; +} + +STDMETHODIMP CArchiveUpdateCallback::SetOperationResult(Int32 /* operationResult */) +{ + m_NeedBeClosed = true; + return S_OK; +} + +STDMETHODIMP CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size) +{ + if (VolumesSizes.Size() == 0) + return S_FALSE; + if (index >= (UInt32)VolumesSizes.Size()) + index = VolumesSizes.Size() - 1; + *size = VolumesSizes[index]; + return S_OK; +} + +STDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream) +{ + wchar_t temp[32]; + ConvertUInt64ToString(index + 1, temp); + UString res = temp; + while (res.Length() < 2) + res = UString(L'0') + res; + UString fileName = VolName; + fileName += L'.'; + fileName += res; + fileName += VolExt; + COutFileStream *streamSpec = new COutFileStream; + CMyComPtr streamLoc(streamSpec); + if(!streamSpec->Create(fileName, false)) + return ::GetLastError(); + *volumeStream = streamLoc.Detach(); + return S_OK; +} + +STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) +{ + if (!PasswordIsDefined) + { + if (AskPassword) + { + // You can ask real password here from user + // Password = GetPassword(OutStream); + // PasswordIsDefined = true; + PrintError("Password is not defined"); + return E_ABORT; + } + } + *passwordIsDefined = BoolToInt(PasswordIsDefined); + CMyComBSTR tempName(Password); + *password = tempName.Detach(); + return S_OK; +} + + + +////////////////////////////////////////////////////////////////////////// +// Main function + +int +#ifdef _MSC_VER +__cdecl +#endif +main(int argc, char* argv[]) +{ + #ifdef _WIN32 + #ifndef _UNICODE + g_IsNT = IsItWindowsNT(); + #endif + #endif + + PrintStringLn(kCopyrightString); + + if (argc < 3) + { + PrintStringLn(kHelpString); + return 1; + } + NWindows::NDLL::CLibrary library; + if (!library.Load(TEXT(kDllName))) + { + PrintError("Can not load library"); + return 1; + } + CreateObjectFunc createObjectFunc = (CreateObjectFunc)library.GetProcAddress("CreateObject"); + if (createObjectFunc == 0) + { + PrintError("Can not get CreateObject"); + return 1; + } + + AString command = argv[1]; + UString archiveName = GetUnicodeString(argv[2], CP_OEMCP); + if (command.CompareNoCase("a") == 0) + { + // create archive command + if (argc < 4) + { + PrintStringLn(kHelpString); + return 1; + } + CObjectVector dirItems; + int i; + for (i = 3; i < argc; i++) + { + CDirItem item; + UString name = GetUnicodeString(argv[i], CP_OEMCP); + + NFile::NFind::CFileInfoW fileInfo; + if (!NFile::NFind::FindFile(name, fileInfo)) + { + PrintString(UString(L"Can't find file") + name); + return 1; + } + + item.Attributes = fileInfo.Attributes; + item.Size = fileInfo.Size; + item.CreationTime = fileInfo.CreationTime; + item.LastAccessTime = fileInfo.LastAccessTime; + item.LastWriteTime = fileInfo.LastWriteTime; + item.Name = name; + item.FullPath = name; + dirItems.Add(item); + } + COutFileStream *outFileStreamSpec = new COutFileStream; + CMyComPtr outFileStream = outFileStreamSpec; + if (!outFileStreamSpec->Create(archiveName, false)) + { + PrintError("can't create archive file"); + return 1; + } + + CMyComPtr outArchive; + if (createObjectFunc(&CLSID_CFormat7z, &IID_IOutArchive, (void **)&outArchive) != S_OK) + { + PrintError("Can not get class object"); + return 1; + } + + CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback; + CMyComPtr updateCallback(updateCallbackSpec); + updateCallbackSpec->Init(&dirItems); + // updateCallbackSpec->PasswordIsDefined = true; + // updateCallbackSpec->Password = L"1"; + + HRESULT result = outArchive->UpdateItems(outFileStream, dirItems.Size(), updateCallback); + updateCallbackSpec->Finilize(); + if (result != S_OK) + { + PrintError("Update Error"); + return 1; + } + for (i = 0; i < updateCallbackSpec->FailedFiles.Size(); i++) + { + PrintNewLine(); + PrintString((UString)L"Error for file: " + updateCallbackSpec->FailedFiles[i]); + } + if (updateCallbackSpec->FailedFiles.Size() != 0) + return 1; + } + else + { + if (argc != 3) + { + PrintStringLn(kHelpString); + return 1; + } + + bool listCommand; + if (command.CompareNoCase("l") == 0) + listCommand = true; + else if (command.CompareNoCase("x") == 0) + listCommand = false; + else + { + PrintError("incorrect command"); + return 1; + } + + CMyComPtr archive; + if (createObjectFunc(&CLSID_CFormat7z, &IID_IInArchive, (void **)&archive) != S_OK) + { + PrintError("Can not get class object"); + return 1; + } + + CInFileStream *fileSpec = new CInFileStream; + CMyComPtr file = fileSpec; + + if (!fileSpec->Open(archiveName)) + { + PrintError("Can not open archive file"); + return 1; + } + + { + CArchiveOpenCallback *openCallbackSpec = new CArchiveOpenCallback; + CMyComPtr openCallback(openCallbackSpec); + openCallbackSpec->PasswordIsDefined = false; + // openCallbackSpec->PasswordIsDefined = true; + // openCallbackSpec->Password = L"1"; + + if (archive->Open(file, 0, openCallback) != S_OK) + { + PrintError("Can not open archive"); + return 1; + } + } + + if (listCommand) + { + // List command + UInt32 numItems = 0; + archive->GetNumberOfItems(&numItems); + for (UInt32 i = 0; i < numItems; i++) + { + { + // Get uncompressed size of file + NWindows::NCOM::CPropVariant propVariant; + archive->GetProperty(i, kpidSize, &propVariant); + UString s = ConvertPropVariantToString(propVariant); + PrintString(s); + PrintString(" "); + } + { + // Get name of file + NWindows::NCOM::CPropVariant propVariant; + archive->GetProperty(i, kpidPath, &propVariant); + UString s = ConvertPropVariantToString(propVariant); + PrintString(s); + } + PrintString("\n"); + } + } + else + { + // Extract command + CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback; + CMyComPtr extractCallback(extractCallbackSpec); + extractCallbackSpec->Init(archive, L""); // second parameter is output folder path + extractCallbackSpec->PasswordIsDefined = false; + // extractCallbackSpec->PasswordIsDefined = true; + // extractCallbackSpec->Password = L"1"; + HRESULT result = archive->Extract(NULL, (UInt32)(Int32)(-1), false, extractCallback); + if (result != S_OK) + { + PrintError("Extract Error"); + return 1; + } + } + } + return 0; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Client7z/Client7z.dsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Client7z/Client7z.dsp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,226 @@ +# Microsoft Developer Studio Project File - Name="Client7z" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Client7z - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Client7z.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Client7z.mak" CFG="Client7z - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Client7z - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Client7z - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Client7z - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\\" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "Client7z - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\\" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "Client7z - Win32 Release" +# Name "Client7z - Win32 Debug" +# Begin Group "Spec" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Windows" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\Windows\DLL.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\DLL.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileDir.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileDir.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileFind.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileFind.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileIO.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileIO.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileName.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\FileName.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariant.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariant.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariantConversions.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\PropVariantConversions.h +# End Source File +# End Group +# Begin Group "Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\..\Common\IntToString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\IntToString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringConvert.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringConvert.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Wildcard.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Wildcard.h +# End Source File +# End Group +# Begin Group "7zip Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Common\FileStreams.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\FileStreams.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\Client7z.cpp +# End Source File +# End Target +# End Project diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Client7z/Client7z.dsw --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Client7z/Client7z.dsw Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Client7z"=.\Client7z.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Client7z/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Client7z/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Client7z/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Client7z/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include +#include + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Client7z/makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Client7z/makefile Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,45 @@ +PROG = 7z.exe +LIBS = $(LIBS) user32.lib oleaut32.lib advapi32.lib +CFLAGS = $(CFLAGS) -I ../../../ + +CONSOLE_OBJS = \ + $O\Client7z.obj \ + +COMMON_OBJS = \ + $O\IntToString.obj \ + $O\NewHandler.obj \ + $O\MyString.obj \ + $O\StringConvert.obj \ + $O\StringToInt.obj \ + $O\MyVector.obj \ + $O\Wildcard.obj \ + +WIN_OBJS = \ + $O\DLL.obj \ + $O\FileDir.obj \ + $O\FileFind.obj \ + $O\FileIO.obj \ + $O\FileName.obj \ + $O\PropVariant.obj \ + $O\PropVariantConversions.obj \ + +7ZIP_COMMON_OBJS = \ + $O\FileStreams.obj \ + +OBJS = \ + $O\StdAfx.obj \ + $(CONSOLE_OBJS) \ + $(COMMON_OBJS) \ + $(WIN_OBJS) \ + $(7ZIP_COMMON_OBJS) \ + +!include "../../../Build.mak" + +$(CONSOLE_OBJS): $(*B).cpp + $(COMPL) +$(COMMON_OBJS): ../../../Common/$(*B).cpp + $(COMPL) +$(WIN_OBJS): ../../../Windows/$(*B).cpp + $(COMPL) +$(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp + $(COMPL) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveCommandLine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveCommandLine.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1003 @@ +// ArchiveCommandLine.cpp + +#include "StdAfx.h" + +#ifdef _WIN32 +#include +#endif +#include + +#include "Common/ListFileUtils.h" +#include "Common/StringConvert.h" +#include "Common/StringToInt.h" + +#include "Windows/FileName.h" +#include "Windows/FileDir.h" +#ifdef _WIN32 +#include "Windows/FileMapping.h" +#include "Windows/Synchronization.h" +#endif + +#include "ArchiveCommandLine.h" +#include "UpdateAction.h" +#include "Update.h" +#include "SortUtils.h" +#include "EnumDirItems.h" + +extern bool g_CaseSensitive; + +#if _MSC_VER >= 1400 +#define MY_isatty_fileno(x) _isatty(_fileno(x)) +#else +#define MY_isatty_fileno(x) isatty(fileno(x)) +#endif + +#define MY_IS_TERMINAL(x) (MY_isatty_fileno(x) != 0); + +using namespace NCommandLineParser; +using namespace NWindows; +using namespace NFile; + +namespace NKey { +enum Enum +{ + kHelp1 = 0, + kHelp2, + kHelp3, + kDisableHeaders, + kDisablePercents, + kArchiveType, + kYes, + kPassword, + kProperty, + kOutputDir, + kWorkingDir, + kInclude, + kExclude, + kArInclude, + kArExclude, + kNoArName, + kUpdate, + kVolume, + kRecursed, + kSfx, + kStdIn, + kStdOut, + kOverwrite, + kEmail, + kShowDialog, + kLargePages, + kCharSet, + kTechMode, + kShareForWrite, + kCaseSensitive +}; + +} + + +static const wchar_t kRecursedIDChar = 'R'; +static const wchar_t *kRecursedPostCharSet = L"0-"; + +namespace NRecursedPostCharIndex { + enum EEnum + { + kWildCardRecursionOnly = 0, + kNoRecursion = 1 + }; +} + +static const char kImmediateNameID = '!'; +static const char kMapNameID = '#'; +static const char kFileListID = '@'; + +static const char kSomeCludePostStringMinSize = 2; // at least <@|!>ame must be +static const char kSomeCludeAfterRecursedPostStringMinSize = 2; // at least <@|!>ame must be + +static const wchar_t *kOverwritePostCharSet = L"asut"; + +NExtract::NOverwriteMode::EEnum k_OverwriteModes[] = +{ + NExtract::NOverwriteMode::kWithoutPrompt, + NExtract::NOverwriteMode::kSkipExisting, + NExtract::NOverwriteMode::kAutoRename, + NExtract::NOverwriteMode::kAutoRenameExisting +}; + +static const CSwitchForm kSwitchForms[] = + { + { L"?", NSwitchType::kSimple, false }, + { L"H", NSwitchType::kSimple, false }, + { L"-HELP", NSwitchType::kSimple, false }, + { L"BA", NSwitchType::kSimple, false }, + { L"BD", NSwitchType::kSimple, false }, + { L"T", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"Y", NSwitchType::kSimple, false }, + { L"P", NSwitchType::kUnLimitedPostString, false, 0 }, + { L"M", NSwitchType::kUnLimitedPostString, true, 1 }, + { L"O", NSwitchType::kUnLimitedPostString, false, 1 }, + { L"W", NSwitchType::kUnLimitedPostString, false, 0 }, + { L"I", NSwitchType::kUnLimitedPostString, true, kSomeCludePostStringMinSize}, + { L"X", NSwitchType::kUnLimitedPostString, true, kSomeCludePostStringMinSize}, + { L"AI", NSwitchType::kUnLimitedPostString, true, kSomeCludePostStringMinSize}, + { L"AX", NSwitchType::kUnLimitedPostString, true, kSomeCludePostStringMinSize}, + { L"AN", NSwitchType::kSimple, false }, + { L"U", NSwitchType::kUnLimitedPostString, true, 1}, + { L"V", NSwitchType::kUnLimitedPostString, true, 1}, + { L"R", NSwitchType::kPostChar, false, 0, 0, kRecursedPostCharSet }, + { L"SFX", NSwitchType::kUnLimitedPostString, false, 0 }, + { L"SI", NSwitchType::kUnLimitedPostString, false, 0 }, + { L"SO", NSwitchType::kSimple, false, 0 }, + { L"AO", NSwitchType::kPostChar, false, 1, 1, kOverwritePostCharSet}, + { L"SEML", NSwitchType::kUnLimitedPostString, false, 0}, + { L"AD", NSwitchType::kSimple, false }, + { L"SLP", NSwitchType::kUnLimitedPostString, false, 0}, + { L"SCS", NSwitchType::kUnLimitedPostString, false, 0}, + { L"SLT", NSwitchType::kSimple, false }, + { L"SSW", NSwitchType::kSimple, false }, + { L"SSC", NSwitchType::kPostChar, false, 0, 0, L"-" } + }; + +static const CCommandForm g_CommandForms[] = +{ + { L"A", false }, + { L"U", false }, + { L"D", false }, + { L"T", false }, + { L"E", false }, + { L"X", false }, + { L"L", false }, + { L"B", false }, + { L"I", false } +}; + +static const int kNumCommandForms = sizeof(g_CommandForms) / sizeof(g_CommandForms[0]); + +static const wchar_t *kUniversalWildcard = L"*"; +static const int kMinNonSwitchWords = 1; +static const int kCommandIndex = 0; + +// --------------------------- +// exception messages + +static const char *kUserErrorMessage = "Incorrect command line"; +static const char *kIncorrectListFile = "Incorrect item in listfile.\nCheck charset encoding and -scs switch."; +static const char *kIncorrectWildCardInListFile = "Incorrect wildcard in listfile"; +static const char *kIncorrectWildCardInCommandLine = "Incorrect wildcard in command line"; +static const char *kTerminalOutError = "I won't write compressed data to a terminal"; +static const char *kSameTerminalError = "I won't write data and program's messages to same terminal"; + +static void ThrowException(const char *errorMessage) +{ + throw CArchiveCommandLineException(errorMessage); +}; + +static void ThrowUserErrorException() +{ + ThrowException(kUserErrorMessage); +}; + +// --------------------------- + +bool CArchiveCommand::IsFromExtractGroup() const +{ + switch(CommandType) + { + case NCommandType::kTest: + case NCommandType::kExtract: + case NCommandType::kFullExtract: + return true; + default: + return false; + } +} + +NExtract::NPathMode::EEnum CArchiveCommand::GetPathMode() const +{ + switch(CommandType) + { + case NCommandType::kTest: + case NCommandType::kFullExtract: + return NExtract::NPathMode::kFullPathnames; + default: + return NExtract::NPathMode::kNoPathnames; + } +} + +bool CArchiveCommand::IsFromUpdateGroup() const +{ + return (CommandType == NCommandType::kAdd || + CommandType == NCommandType::kUpdate || + CommandType == NCommandType::kDelete); +} + +static NRecursedType::EEnum GetRecursedTypeFromIndex(int index) +{ + switch (index) + { + case NRecursedPostCharIndex::kWildCardRecursionOnly: + return NRecursedType::kWildCardOnlyRecursed; + case NRecursedPostCharIndex::kNoRecursion: + return NRecursedType::kNonRecursed; + default: + return NRecursedType::kRecursed; + } +} + +static bool ParseArchiveCommand(const UString &commandString, CArchiveCommand &command) +{ + UString commandStringUpper = commandString; + commandStringUpper.MakeUpper(); + UString postString; + int commandIndex = ParseCommand(kNumCommandForms, g_CommandForms, commandStringUpper, + postString) ; + if (commandIndex < 0) + return false; + command.CommandType = (NCommandType::EEnum)commandIndex; + return true; +} + +// ------------------------------------------------------------------ +// filenames functions + +static bool AddNameToCensor(NWildcard::CCensor &wildcardCensor, + const UString &name, bool include, NRecursedType::EEnum type) +{ + bool isWildCard = DoesNameContainWildCard(name); + bool recursed = false; + + switch (type) + { + case NRecursedType::kWildCardOnlyRecursed: + recursed = isWildCard; + break; + case NRecursedType::kRecursed: + recursed = true; + break; + case NRecursedType::kNonRecursed: + recursed = false; + break; + } + wildcardCensor.AddItem(include, name, recursed); + return true; +} + +static void AddToCensorFromListFile(NWildcard::CCensor &wildcardCensor, + LPCWSTR fileName, bool include, NRecursedType::EEnum type, UINT codePage) +{ + UStringVector names; + if (!ReadNamesFromListFile(fileName, names, codePage)) + throw kIncorrectListFile; + for (int i = 0; i < names.Size(); i++) + if (!AddNameToCensor(wildcardCensor, names[i], include, type)) + throw kIncorrectWildCardInListFile; +} + +static void AddCommandLineWildCardToCensr(NWildcard::CCensor &wildcardCensor, + const UString &name, bool include, NRecursedType::EEnum recursedType) +{ + if (!AddNameToCensor(wildcardCensor, name, include, recursedType)) + throw kIncorrectWildCardInCommandLine; +} + +static void AddToCensorFromNonSwitchesStrings( + int startIndex, + NWildcard::CCensor &wildcardCensor, + const UStringVector &nonSwitchStrings, NRecursedType::EEnum type, + bool thereAreSwitchIncludes, UINT codePage) +{ + if(nonSwitchStrings.Size() == startIndex && (!thereAreSwitchIncludes)) + AddCommandLineWildCardToCensr(wildcardCensor, kUniversalWildcard, true, type); + for(int i = startIndex; i < nonSwitchStrings.Size(); i++) + { + const UString &s = nonSwitchStrings[i]; + if (s[0] == kFileListID) + AddToCensorFromListFile(wildcardCensor, s.Mid(1), true, type, codePage); + else + AddCommandLineWildCardToCensr(wildcardCensor, s, true, type); + } +} + +#ifdef _WIN32 +static void ParseMapWithPaths(NWildcard::CCensor &wildcardCensor, + const UString &switchParam, bool include, + NRecursedType::EEnum commonRecursedType) +{ + int splitPos = switchParam.Find(L':'); + if (splitPos < 0) + ThrowUserErrorException(); + UString mappingName = switchParam.Left(splitPos); + + UString switchParam2 = switchParam.Mid(splitPos + 1); + splitPos = switchParam2.Find(L':'); + if (splitPos < 0) + ThrowUserErrorException(); + + UString mappingSize = switchParam2.Left(splitPos); + UString eventName = switchParam2.Mid(splitPos + 1); + + UInt64 dataSize64 = ConvertStringToUInt64(mappingSize, NULL); + UInt32 dataSize = (UInt32)dataSize64; + { + CFileMapping fileMapping; + if (!fileMapping.Open(FILE_MAP_READ, false, GetSystemString(mappingName))) + ThrowException("Can not open mapping"); + LPVOID data = fileMapping.MapViewOfFile(FILE_MAP_READ, 0, dataSize); + if (data == NULL) + ThrowException("MapViewOfFile error"); + try + { + const wchar_t *curData = (const wchar_t *)data; + if (*curData != 0) + ThrowException("Incorrect mapping data"); + UInt32 numChars = dataSize / sizeof(wchar_t); + UString name; + for (UInt32 i = 1; i < numChars; i++) + { + wchar_t c = curData[i]; + if (c == L'\0') + { + AddCommandLineWildCardToCensr(wildcardCensor, + name, include, commonRecursedType); + name.Empty(); + } + else + name += c; + } + if (!name.IsEmpty()) + ThrowException("data error"); + } + catch(...) + { + UnmapViewOfFile(data); + throw; + } + UnmapViewOfFile(data); + } + + { + NSynchronization::CManualResetEvent event; + if (event.Open(EVENT_MODIFY_STATE, false, GetSystemString(eventName)) == S_OK) + event.Set(); + } +} +#endif + +static void AddSwitchWildCardsToCensor(NWildcard::CCensor &wildcardCensor, + const UStringVector &strings, bool include, + NRecursedType::EEnum commonRecursedType, UINT codePage) +{ + for(int i = 0; i < strings.Size(); i++) + { + const UString &name = strings[i]; + NRecursedType::EEnum recursedType; + int pos = 0; + if (name.Length() < kSomeCludePostStringMinSize) + ThrowUserErrorException(); + if (::MyCharUpper(name[pos]) == kRecursedIDChar) + { + pos++; + int index = UString(kRecursedPostCharSet).Find(name[pos]); + recursedType = GetRecursedTypeFromIndex(index); + if (index >= 0) + pos++; + } + else + recursedType = commonRecursedType; + if (name.Length() < pos + kSomeCludeAfterRecursedPostStringMinSize) + ThrowUserErrorException(); + UString tail = name.Mid(pos + 1); + if (name[pos] == kImmediateNameID) + AddCommandLineWildCardToCensr(wildcardCensor, tail, include, recursedType); + else if (name[pos] == kFileListID) + AddToCensorFromListFile(wildcardCensor, tail, include, recursedType, codePage); + #ifdef _WIN32 + else if (name[pos] == kMapNameID) + ParseMapWithPaths(wildcardCensor, tail, include, recursedType); + #endif + else + ThrowUserErrorException(); + } +} + +#ifdef _WIN32 + +// This code converts all short file names to long file names. + +static void ConvertToLongName(const UString &prefix, UString &name) +{ + if (name.IsEmpty() || DoesNameContainWildCard(name)) + return; + NFind::CFileInfoW fileInfo; + if (NFind::FindFile(prefix + name, fileInfo)) + name = fileInfo.Name; +} + +static void ConvertToLongNames(const UString &prefix, CObjectVector &items) +{ + for (int i = 0; i < items.Size(); i++) + { + NWildcard::CItem &item = items[i]; + if (item.Recursive || item.PathParts.Size() != 1) + continue; + ConvertToLongName(prefix, item.PathParts.Front()); + } +} + +static void ConvertToLongNames(const UString &prefix, NWildcard::CCensorNode &node) +{ + ConvertToLongNames(prefix, node.IncludeItems); + ConvertToLongNames(prefix, node.ExcludeItems); + int i; + for (i = 0; i < node.SubNodes.Size(); i++) + ConvertToLongName(prefix, node.SubNodes[i].Name); + // mix folders with same name + for (i = 0; i < node.SubNodes.Size(); i++) + { + NWildcard::CCensorNode &nextNode1 = node.SubNodes[i]; + for (int j = i + 1; j < node.SubNodes.Size();) + { + const NWildcard::CCensorNode &nextNode2 = node.SubNodes[j]; + if (nextNode1.Name.CompareNoCase(nextNode2.Name) == 0) + { + nextNode1.IncludeItems += nextNode2.IncludeItems; + nextNode1.ExcludeItems += nextNode2.ExcludeItems; + node.SubNodes.Delete(j); + } + else + j++; + } + } + for (i = 0; i < node.SubNodes.Size(); i++) + { + NWildcard::CCensorNode &nextNode = node.SubNodes[i]; + ConvertToLongNames(prefix + nextNode.Name + wchar_t(NFile::NName::kDirDelimiter), nextNode); + } +} + +static void ConvertToLongNames(NWildcard::CCensor &censor) +{ + for (int i = 0; i < censor.Pairs.Size(); i++) + { + NWildcard::CPair &pair = censor.Pairs[i]; + ConvertToLongNames(pair.Prefix, pair.Head); + } +} + +#endif + +static NUpdateArchive::NPairAction::EEnum GetUpdatePairActionType(int i) +{ + switch(i) + { + case NUpdateArchive::NPairAction::kIgnore: return NUpdateArchive::NPairAction::kIgnore; + case NUpdateArchive::NPairAction::kCopy: return NUpdateArchive::NPairAction::kCopy; + case NUpdateArchive::NPairAction::kCompress: return NUpdateArchive::NPairAction::kCompress; + case NUpdateArchive::NPairAction::kCompressAsAnti: return NUpdateArchive::NPairAction::kCompressAsAnti; + } + throw 98111603; +} + +const UString kUpdatePairStateIDSet = L"PQRXYZW"; +const int kUpdatePairStateNotSupportedActions[] = {2, 2, 1, -1, -1, -1, -1}; + +const UString kUpdatePairActionIDSet = L"0123"; //Ignore, Copy, Compress, Create Anti + +const wchar_t *kUpdateIgnoreItselfPostStringID = L"-"; +const wchar_t kUpdateNewArchivePostCharID = '!'; + + +static bool ParseUpdateCommandString2(const UString &command, + NUpdateArchive::CActionSet &actionSet, UString &postString) +{ + for(int i = 0; i < command.Length();) + { + wchar_t c = MyCharUpper(command[i]); + int statePos = kUpdatePairStateIDSet.Find(c); + if (statePos < 0) + { + postString = command.Mid(i); + return true; + } + i++; + if (i >= command.Length()) + return false; + int actionPos = kUpdatePairActionIDSet.Find(::MyCharUpper(command[i])); + if (actionPos < 0) + return false; + actionSet.StateActions[statePos] = GetUpdatePairActionType(actionPos); + if (kUpdatePairStateNotSupportedActions[statePos] == actionPos) + return false; + i++; + } + postString.Empty(); + return true; +} + +static void ParseUpdateCommandString(CUpdateOptions &options, + const UStringVector &updatePostStrings, + const NUpdateArchive::CActionSet &defaultActionSet) +{ + for(int i = 0; i < updatePostStrings.Size(); i++) + { + const UString &updateString = updatePostStrings[i]; + if(updateString.CompareNoCase(kUpdateIgnoreItselfPostStringID) == 0) + { + if(options.UpdateArchiveItself) + { + options.UpdateArchiveItself = false; + options.Commands.Delete(0); + } + } + else + { + NUpdateArchive::CActionSet actionSet = defaultActionSet; + + UString postString; + if (!ParseUpdateCommandString2(updateString, actionSet, postString)) + ThrowUserErrorException(); + if(postString.IsEmpty()) + { + if(options.UpdateArchiveItself) + options.Commands[0].ActionSet = actionSet; + } + else + { + if(MyCharUpper(postString[0]) != kUpdateNewArchivePostCharID) + ThrowUserErrorException(); + CUpdateArchiveCommand uc; + UString archivePath = postString.Mid(1); + if (archivePath.IsEmpty()) + ThrowUserErrorException(); + uc.UserArchivePath = archivePath; + uc.ActionSet = actionSet; + options.Commands.Add(uc); + } + } + } +} + +static const char kByteSymbol = 'B'; +static const char kKiloSymbol = 'K'; +static const char kMegaSymbol = 'M'; +static const char kGigaSymbol = 'G'; + +static bool ParseComplexSize(const UString &src, UInt64 &result) +{ + UString s = src; + s.MakeUpper(); + + const wchar_t *start = s; + const wchar_t *end; + UInt64 number = ConvertStringToUInt64(start, &end); + int numDigits = (int)(end - start); + if (numDigits == 0 || s.Length() > numDigits + 1) + return false; + if (s.Length() == numDigits) + { + result = number; + return true; + } + int numBits; + switch (s[numDigits]) + { + case kByteSymbol: + result = number; + return true; + case kKiloSymbol: + numBits = 10; + break; + case kMegaSymbol: + numBits = 20; + break; + case kGigaSymbol: + numBits = 30; + break; + default: + return false; + } + if (number >= ((UInt64)1 << (64 - numBits))) + return false; + result = number << numBits; + return true; +} + +static void SetAddCommandOptions( + NCommandType::EEnum commandType, + const CParser &parser, + CUpdateOptions &options) +{ + NUpdateArchive::CActionSet defaultActionSet; + switch(commandType) + { + case NCommandType::kAdd: + defaultActionSet = NUpdateArchive::kAddActionSet; + break; + case NCommandType::kDelete: + defaultActionSet = NUpdateArchive::kDeleteActionSet; + break; + default: + defaultActionSet = NUpdateArchive::kUpdateActionSet; + } + + options.UpdateArchiveItself = true; + + options.Commands.Clear(); + CUpdateArchiveCommand updateMainCommand; + updateMainCommand.ActionSet = defaultActionSet; + options.Commands.Add(updateMainCommand); + if(parser[NKey::kUpdate].ThereIs) + ParseUpdateCommandString(options, parser[NKey::kUpdate].PostStrings, + defaultActionSet); + if(parser[NKey::kWorkingDir].ThereIs) + { + const UString &postString = parser[NKey::kWorkingDir].PostStrings[0]; + if (postString.IsEmpty()) + NDirectory::MyGetTempPath(options.WorkingDir); + else + options.WorkingDir = postString; + } + options.SfxMode = parser[NKey::kSfx].ThereIs; + if (options.SfxMode) + options.SfxModule = parser[NKey::kSfx].PostStrings[0]; + + if (parser[NKey::kVolume].ThereIs) + { + const UStringVector &sv = parser[NKey::kVolume].PostStrings; + for (int i = 0; i < sv.Size(); i++) + { + UInt64 size; + if (!ParseComplexSize(sv[i], size)) + ThrowException("Incorrect volume size"); + options.VolumesSizes.Add(size); + } + } +} + +static void SetMethodOptions(const CParser &parser, CObjectVector &properties) +{ + if (parser[NKey::kProperty].ThereIs) + { + // options.MethodMode.Properties.Clear(); + for(int i = 0; i < parser[NKey::kProperty].PostStrings.Size(); i++) + { + CProperty property; + const UString &postString = parser[NKey::kProperty].PostStrings[i]; + int index = postString.Find(L'='); + if (index < 0) + property.Name = postString; + else + { + property.Name = postString.Left(index); + property.Value = postString.Mid(index + 1); + } + properties.Add(property); + } + } +} + +CArchiveCommandLineParser::CArchiveCommandLineParser(): + parser(sizeof(kSwitchForms) / sizeof(kSwitchForms[0])) {} + +void CArchiveCommandLineParser::Parse1(const UStringVector &commandStrings, + CArchiveCommandLineOptions &options) +{ + try + { + parser.ParseStrings(kSwitchForms, commandStrings); + } + catch(...) + { + ThrowUserErrorException(); + } + + options.IsInTerminal = MY_IS_TERMINAL(stdin); + options.IsStdOutTerminal = MY_IS_TERMINAL(stdout); + options.IsStdErrTerminal = MY_IS_TERMINAL(stderr); + options.StdOutMode = parser[NKey::kStdOut].ThereIs; + options.EnableHeaders = !parser[NKey::kDisableHeaders].ThereIs; + options.HelpMode = parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs || parser[NKey::kHelp3].ThereIs; + + #ifdef _WIN32 + options.LargePages = false; + if (parser[NKey::kLargePages].ThereIs) + { + const UString &postString = parser[NKey::kLargePages].PostStrings.Front(); + if (postString.IsEmpty()) + options.LargePages = true; + } + #endif +} + +struct CCodePagePair +{ + const wchar_t *Name; + UINT CodePage; +}; + +static CCodePagePair g_CodePagePairs[] = +{ + { L"UTF-8", CP_UTF8 }, + { L"WIN", CP_ACP }, + { L"DOS", CP_OEMCP } +}; + +static const int kNumCodePages = sizeof(g_CodePagePairs) / sizeof(g_CodePagePairs[0]); + +static bool ConvertStringToUInt32(const wchar_t *s, UInt32 &v) +{ + const wchar_t *end; + UInt64 number = ConvertStringToUInt64(s, &end); + if (*end != 0) + return false; + if (number > (UInt32)0xFFFFFFFF) + return false; + v = (UInt32)number; + return true; +} + +void CArchiveCommandLineParser::Parse2(CArchiveCommandLineOptions &options) +{ + const UStringVector &nonSwitchStrings = parser.NonSwitchStrings; + int numNonSwitchStrings = nonSwitchStrings.Size(); + if(numNonSwitchStrings < kMinNonSwitchWords) + ThrowUserErrorException(); + + if (!ParseArchiveCommand(nonSwitchStrings[kCommandIndex], options.Command)) + ThrowUserErrorException(); + + options.TechMode = parser[NKey::kTechMode].ThereIs; + + if (parser[NKey::kCaseSensitive].ThereIs) + g_CaseSensitive = (parser[NKey::kCaseSensitive].PostCharIndex < 0); + + NRecursedType::EEnum recursedType; + if (parser[NKey::kRecursed].ThereIs) + recursedType = GetRecursedTypeFromIndex(parser[NKey::kRecursed].PostCharIndex); + else + recursedType = NRecursedType::kNonRecursed; + + UINT codePage = CP_UTF8; + if (parser[NKey::kCharSet].ThereIs) + { + UString name = parser[NKey::kCharSet].PostStrings.Front(); + name.MakeUpper(); + int i; + for (i = 0; i < kNumCodePages; i++) + { + const CCodePagePair &pair = g_CodePagePairs[i]; + if (name.Compare(pair.Name) == 0) + { + codePage = pair.CodePage; + break; + } + } + if (i >= kNumCodePages) + ThrowUserErrorException(); + } + + bool thereAreSwitchIncludes = false; + if (parser[NKey::kInclude].ThereIs) + { + thereAreSwitchIncludes = true; + AddSwitchWildCardsToCensor(options.WildcardCensor, + parser[NKey::kInclude].PostStrings, true, recursedType, codePage); + } + if (parser[NKey::kExclude].ThereIs) + AddSwitchWildCardsToCensor(options.WildcardCensor, + parser[NKey::kExclude].PostStrings, false, recursedType, codePage); + + int curCommandIndex = kCommandIndex + 1; + bool thereIsArchiveName = !parser[NKey::kNoArName].ThereIs && + options.Command.CommandType != NCommandType::kBenchmark && + options.Command.CommandType != NCommandType::kInfo; + if (thereIsArchiveName) + { + if(curCommandIndex >= numNonSwitchStrings) + ThrowUserErrorException(); + options.ArchiveName = nonSwitchStrings[curCommandIndex++]; + } + + AddToCensorFromNonSwitchesStrings( + curCommandIndex, options.WildcardCensor, + nonSwitchStrings, recursedType, thereAreSwitchIncludes, codePage); + + options.YesToAll = parser[NKey::kYes].ThereIs; + + bool isExtractGroupCommand = options.Command.IsFromExtractGroup(); + + options.PasswordEnabled = parser[NKey::kPassword].ThereIs; + + if(options.PasswordEnabled) + options.Password = parser[NKey::kPassword].PostStrings[0]; + + options.StdInMode = parser[NKey::kStdIn].ThereIs; + options.ShowDialog = parser[NKey::kShowDialog].ThereIs; + + if(isExtractGroupCommand || options.Command.CommandType == NCommandType::kList) + { + if (options.StdInMode) + ThrowException("Reading archives from stdin is not implemented"); + if (!options.WildcardCensor.AllAreRelative()) + ThrowException("Cannot use absolute pathnames for this command"); + + NWildcard::CCensor archiveWildcardCensor; + + if (parser[NKey::kArInclude].ThereIs) + { + AddSwitchWildCardsToCensor(archiveWildcardCensor, + parser[NKey::kArInclude].PostStrings, true, NRecursedType::kNonRecursed, codePage); + } + if (parser[NKey::kArExclude].ThereIs) + AddSwitchWildCardsToCensor(archiveWildcardCensor, + parser[NKey::kArExclude].PostStrings, false, NRecursedType::kNonRecursed, codePage); + + if (thereIsArchiveName) + AddCommandLineWildCardToCensr(archiveWildcardCensor, options.ArchiveName, true, NRecursedType::kNonRecursed); + + #ifdef _WIN32 + ConvertToLongNames(archiveWildcardCensor); + #endif + + archiveWildcardCensor.ExtendExclude(); + + CObjectVector dirItems; + { + UStringVector errorPaths; + CRecordVector errorCodes; + HRESULT res = EnumerateItems(archiveWildcardCensor, dirItems, NULL, errorPaths, errorCodes); + if (res != S_OK || errorPaths.Size() > 0) + throw "cannot find archive"; + } + UStringVector archivePaths; + int i; + for (i = 0; i < dirItems.Size(); i++) + { + const CDirItem &dirItem = dirItems[i]; + if (!dirItem.IsDirectory()) + archivePaths.Add(dirItem.FullPath); + } + + if (archivePaths.Size() == 0) + throw "there is no such archive"; + + UStringVector archivePathsFull; + + for (i = 0; i < archivePaths.Size(); i++) + { + UString fullPath; + NFile::NDirectory::MyGetFullPathName(archivePaths[i], fullPath); + archivePathsFull.Add(fullPath); + } + CIntVector indices; + SortFileNames(archivePathsFull, indices); + options.ArchivePathsSorted.Reserve(indices.Size()); + options.ArchivePathsFullSorted.Reserve(indices.Size()); + for (i = 0; i < indices.Size(); i++) + { + options.ArchivePathsSorted.Add(archivePaths[indices[i]]); + options.ArchivePathsFullSorted.Add(archivePathsFull[indices[i]]); + } + + if (isExtractGroupCommand) + { + SetMethodOptions(parser, options.ExtractProperties); + if (options.StdOutMode && options.IsStdOutTerminal && options.IsStdErrTerminal) + throw kSameTerminalError; + if(parser[NKey::kOutputDir].ThereIs) + { + options.OutputDir = parser[NKey::kOutputDir].PostStrings[0]; + NFile::NName::NormalizeDirPathPrefix(options.OutputDir); + } + + options.OverwriteMode = NExtract::NOverwriteMode::kAskBefore; + if(parser[NKey::kOverwrite].ThereIs) + options.OverwriteMode = + k_OverwriteModes[parser[NKey::kOverwrite].PostCharIndex]; + else if (options.YesToAll) + options.OverwriteMode = NExtract::NOverwriteMode::kWithoutPrompt; + } + } + else if(options.Command.IsFromUpdateGroup()) + { + CUpdateOptions &updateOptions = options.UpdateOptions; + + if(parser[NKey::kArchiveType].ThereIs) + options.ArcType = parser[NKey::kArchiveType].PostStrings[0]; + + SetAddCommandOptions(options.Command.CommandType, parser, updateOptions); + + SetMethodOptions(parser, updateOptions.MethodMode.Properties); + + if (parser[NKey::kShareForWrite].ThereIs) + updateOptions.OpenShareForWrite = true; + + options.EnablePercents = !parser[NKey::kDisablePercents].ThereIs; + + if (options.EnablePercents) + { + if ((options.StdOutMode && !options.IsStdErrTerminal) || + (!options.StdOutMode && !options.IsStdOutTerminal)) + options.EnablePercents = false; + } + + updateOptions.EMailMode = parser[NKey::kEmail].ThereIs; + if (updateOptions.EMailMode) + { + updateOptions.EMailAddress = parser[NKey::kEmail].PostStrings.Front(); + if (updateOptions.EMailAddress.Length() > 0) + if (updateOptions.EMailAddress[0] == L'.') + { + updateOptions.EMailRemoveAfter = true; + updateOptions.EMailAddress.Delete(0); + } + } + + updateOptions.StdOutMode = options.StdOutMode; + updateOptions.StdInMode = options.StdInMode; + + if (updateOptions.StdOutMode && updateOptions.EMailMode) + throw "stdout mode and email mode cannot be combined"; + if (updateOptions.StdOutMode && options.IsStdOutTerminal) + throw kTerminalOutError; + if(updateOptions.StdInMode) + updateOptions.StdInFileName = parser[NKey::kStdIn].PostStrings.Front(); + + #ifdef _WIN32 + ConvertToLongNames(options.WildcardCensor); + #endif + } + else if(options.Command.CommandType == NCommandType::kBenchmark) + { + options.NumThreads = (UInt32)-1; + options.DictionarySize = (UInt32)-1; + options.NumIterations = 1; + if (curCommandIndex < numNonSwitchStrings) + { + if (!ConvertStringToUInt32(nonSwitchStrings[curCommandIndex++], options.NumIterations)) + ThrowUserErrorException(); + } + for (int i = 0; i < parser[NKey::kProperty].PostStrings.Size(); i++) + { + UString postString = parser[NKey::kProperty].PostStrings[i]; + postString.MakeUpper(); + if (postString.Length() < 2) + ThrowUserErrorException(); + if (postString[0] == 'D') + { + int pos = 1; + if (postString[pos] == '=') + pos++; + UInt32 logSize; + if (!ConvertStringToUInt32((const wchar_t *)postString + pos, logSize)) + ThrowUserErrorException(); + if (logSize > 31) + ThrowUserErrorException(); + options.DictionarySize = 1 << logSize; + } + else if (postString[0] == 'M' && postString[1] == 'T' ) + { + int pos = 2; + if (postString[pos] == '=') + pos++; + if (postString[pos] != 0) + if (!ConvertStringToUInt32((const wchar_t *)postString + pos, options.NumThreads)) + ThrowUserErrorException(); + } + else if (postString[0] == 'M' && postString[1] == '=' ) + { + int pos = 2; + if (postString[pos] != 0) + options.Method = postString.Mid(2); + } + else + ThrowUserErrorException(); + } + } + else if(options.Command.CommandType == NCommandType::kInfo) + { + } + else + ThrowUserErrorException(); + options.WildcardCensor.ExtendExclude(); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveCommandLine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveCommandLine.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,104 @@ +// ArchiveCommandLine.h + +#ifndef __ARCHIVECOMMANDLINE_H +#define __ARCHIVECOMMANDLINE_H + +#include "Common/Wildcard.h" +#include "Common/CommandLineParser.h" + +#include "Extract.h" +#include "Update.h" + +struct CArchiveCommandLineException: public AString +{ + CArchiveCommandLineException(const char *errorMessage): AString(errorMessage) {} +}; + +namespace NCommandType { enum EEnum +{ + kAdd = 0, + kUpdate, + kDelete, + kTest, + kExtract, + kFullExtract, + kList, + kBenchmark, + kInfo +};} + +namespace NRecursedType { enum EEnum +{ + kRecursed, + kWildCardOnlyRecursed, + kNonRecursed +};} + +struct CArchiveCommand +{ + NCommandType::EEnum CommandType; + bool IsFromExtractGroup() const; + bool IsFromUpdateGroup() const; + bool IsTestMode() const { return CommandType == NCommandType::kTest; } + NExtract::NPathMode::EEnum GetPathMode() const; +}; + +struct CArchiveCommandLineOptions +{ + bool HelpMode; + + #ifdef _WIN32 + bool LargePages; + #endif + + bool IsInTerminal; + bool IsStdOutTerminal; + bool IsStdErrTerminal; + bool StdInMode; + bool StdOutMode; + bool EnableHeaders; + + bool YesToAll; + bool ShowDialog; + // NWildcard::CCensor ArchiveWildcardCensor; + NWildcard::CCensor WildcardCensor; + + CArchiveCommand Command; + UString ArchiveName; + + bool PasswordEnabled; + UString Password; + + bool TechMode; + // Extract + bool AppendName; + UString OutputDir; + NExtract::NOverwriteMode::EEnum OverwriteMode; + UStringVector ArchivePathsSorted; + UStringVector ArchivePathsFullSorted; + CObjectVector ExtractProperties; + + CUpdateOptions UpdateOptions; + UString ArcType; + bool EnablePercents; + + // Benchmark + UInt32 NumIterations; + UInt32 NumThreads; + UInt32 DictionarySize; + UString Method; + + + CArchiveCommandLineOptions(): StdInMode(false), StdOutMode(false) {}; +}; + +class CArchiveCommandLineParser +{ + NCommandLineParser::CParser parser; +public: + CArchiveCommandLineParser(); + void Parse1(const UStringVector &commandStrings, CArchiveCommandLineOptions &options); + void Parse2(CArchiveCommandLineOptions &options); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,479 @@ +// ArchiveExtractCallback.cpp + +#include "StdAfx.h" + +#include "ArchiveExtractCallback.h" + +#include "Common/Wildcard.h" +#include "Common/StringConvert.h" +#include "Common/ComTry.h" + +#include "Windows/FileDir.h" +#include "Windows/FileFind.h" +#include "Windows/Time.h" +#include "Windows/Defs.h" +#include "Windows/PropVariant.h" + +#include "Windows/PropVariantConversions.h" + +#include "../../Common/FilePathAutoRename.h" + +#include "../Common/ExtractingFilePath.h" +#include "OpenArchive.h" + +using namespace NWindows; + +static const wchar_t *kCantAutoRename = L"ERROR: Can not create file with auto name"; +static const wchar_t *kCantRenameFile = L"ERROR: Can not rename existing file "; +static const wchar_t *kCantDeleteOutputFile = L"ERROR: Can not delete output file "; + + +void CArchiveExtractCallback::Init( + IInArchive *archiveHandler, + IFolderArchiveExtractCallback *extractCallback2, + bool stdOutMode, + const UString &directoryPath, + const UStringVector &removePathParts, + const UString &itemDefaultName, + const FILETIME &utcLastWriteTimeDefault, + UInt32 attributesDefault, + UInt64 packSize) +{ + _stdOutMode = stdOutMode; + _numErrors = 0; + _unpTotal = 1; + _packTotal = packSize; + + _extractCallback2 = extractCallback2; + _compressProgress.Release(); + _extractCallback2.QueryInterface(IID_ICompressProgressInfo, &_compressProgress); + + LocalProgressSpec->Init(extractCallback2, true); + LocalProgressSpec->SendProgress = false; + + _itemDefaultName = itemDefaultName; + _utcLastWriteTimeDefault = utcLastWriteTimeDefault; + _attributesDefault = attributesDefault; + _removePathParts = removePathParts; + _archiveHandler = archiveHandler; + _directoryPath = directoryPath; + NFile::NName::NormalizeDirPathPrefix(_directoryPath); +} + +STDMETHODIMP CArchiveExtractCallback::SetTotal(UInt64 size) +{ + COM_TRY_BEGIN + _unpTotal = size; + if (!_multiArchives && _extractCallback2) + return _extractCallback2->SetTotal(size); + return S_OK; + COM_TRY_END +} + +static void NormalizeVals(UInt64 &v1, UInt64 &v2) +{ + const UInt64 kMax = (UInt64)1 << 31; + while (v1 > kMax) + { + v1 >>= 1; + v2 >>= 1; + } +} + +static UInt64 MyMultDiv64(UInt64 unpCur, UInt64 unpTotal, UInt64 packTotal) +{ + NormalizeVals(packTotal, unpTotal); + NormalizeVals(unpCur, unpTotal); + if (unpTotal == 0) + unpTotal = 1; + return unpCur * packTotal / unpTotal; +} + +STDMETHODIMP CArchiveExtractCallback::SetCompleted(const UInt64 *completeValue) +{ + COM_TRY_BEGIN + if (!_extractCallback2) + return S_OK; + + if (_multiArchives) + { + if (completeValue != NULL) + { + UInt64 packCur = LocalProgressSpec->InSize + MyMultDiv64(*completeValue, _unpTotal, _packTotal); + return _extractCallback2->SetCompleted(&packCur); + } + } + return _extractCallback2->SetCompleted(completeValue); + COM_TRY_END +} + +STDMETHODIMP CArchiveExtractCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) +{ + COM_TRY_BEGIN + return _localProgress->SetRatioInfo(inSize, outSize); + COM_TRY_END +} + +void CArchiveExtractCallback::CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath) +{ + fullPath = _directoryPath; + for(int i = 0; i < dirPathParts.Size(); i++) + { + if (i > 0) + fullPath += wchar_t(NFile::NName::kDirDelimiter); + fullPath += dirPathParts[i]; + NFile::NDirectory::MyCreateDirectory(fullPath); + } +} + +static UString MakePathNameFromParts(const UStringVector &parts) +{ + UString result; + for(int i = 0; i < parts.Size(); i++) + { + if(i != 0) + result += wchar_t(NFile::NName::kDirDelimiter); + result += parts[i]; + } + return result; +} + + +HRESULT CArchiveExtractCallback::GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined) +{ + filetimeIsDefined = false; + NCOM::CPropVariant prop; + RINOK(_archiveHandler->GetProperty(index, propID, &prop)); + if (prop.vt == VT_FILETIME) + { + filetime = prop.filetime; + filetimeIsDefined = (filetime.dwHighDateTime != 0 || filetime.dwLowDateTime != 0); + } + else if (prop.vt != VT_EMPTY) + return E_FAIL; + return S_OK; +} + +STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) +{ + COM_TRY_BEGIN + *outStream = 0; + _outFileStream.Release(); + + _encrypted = false; + _isSplit = false; + _curSize = 0; + + UString fullPath; + + RINOK(GetArchiveItemPath(_archiveHandler, index, _itemDefaultName, fullPath)); + RINOK(IsArchiveItemFolder(_archiveHandler, index, _processedFileInfo.IsDirectory)); + + _filePath = fullPath; + + { + NCOM::CPropVariant prop; + RINOK(_archiveHandler->GetProperty(index, kpidPosition, &prop)); + if (prop.vt != VT_EMPTY) + { + if (prop.vt != VT_UI8) + return E_FAIL; + _position = prop.uhVal.QuadPart; + _isSplit = true; + } + } + + RINOK(IsArchiveItemProp(_archiveHandler, index, kpidEncrypted, _encrypted)); + + bool newFileSizeDefined; + UInt64 newFileSize; + { + NCOM::CPropVariant prop; + RINOK(_archiveHandler->GetProperty(index, kpidSize, &prop)); + newFileSizeDefined = (prop.vt != VT_EMPTY); + if (newFileSizeDefined) + { + newFileSize = ConvertPropVariantToUInt64(prop); + _curSize = newFileSize; + } + } + + if(askExtractMode == NArchive::NExtract::NAskMode::kExtract) + { + if (_stdOutMode) + { + CMyComPtr outStreamLoc = new CStdOutFileStream; + *outStream = outStreamLoc.Detach(); + return S_OK; + } + + { + NCOM::CPropVariant prop; + RINOK(_archiveHandler->GetProperty(index, kpidAttributes, &prop)); + if (prop.vt == VT_EMPTY) + { + _processedFileInfo.Attributes = _attributesDefault; + _processedFileInfo.AttributesAreDefined = false; + } + else + { + if (prop.vt != VT_UI4) + return E_FAIL; + _processedFileInfo.Attributes = prop.ulVal; + _processedFileInfo.AttributesAreDefined = true; + } + } + + RINOK(GetTime(index, kpidCreationTime, _processedFileInfo.CreationTime, + _processedFileInfo.IsCreationTimeDefined)); + RINOK(GetTime(index, kpidLastWriteTime, _processedFileInfo.LastWriteTime, + _processedFileInfo.IsLastWriteTimeDefined)); + RINOK(GetTime(index, kpidLastAccessTime, _processedFileInfo.LastAccessTime, + _processedFileInfo.IsLastAccessTimeDefined)); + + bool isAnti = false; + RINOK(IsArchiveItemProp(_archiveHandler, index, kpidIsAnti, isAnti)); + + UStringVector pathParts; + SplitPathToParts(fullPath, pathParts); + + if(pathParts.IsEmpty()) + return E_FAIL; + int numRemovePathParts = 0; + switch(_pathMode) + { + case NExtract::NPathMode::kFullPathnames: + break; + case NExtract::NPathMode::kCurrentPathnames: + { + numRemovePathParts = _removePathParts.Size(); + if (pathParts.Size() <= numRemovePathParts) + return E_FAIL; + for (int i = 0; i < numRemovePathParts; i++) + if (_removePathParts[i].CompareNoCase(pathParts[i]) != 0) + return E_FAIL; + break; + } + case NExtract::NPathMode::kNoPathnames: + { + numRemovePathParts = pathParts.Size() - 1; + break; + } + } + pathParts.Delete(0, numRemovePathParts); + MakeCorrectPath(pathParts); + UString processedPath = MakePathNameFromParts(pathParts); + if (!isAnti) + { + if (!_processedFileInfo.IsDirectory) + { + if (!pathParts.IsEmpty()) + pathParts.DeleteBack(); + } + + if (!pathParts.IsEmpty()) + { + UString fullPathNew; + CreateComplexDirectory(pathParts, fullPathNew); + if (_processedFileInfo.IsDirectory) + NFile::NDirectory::SetDirTime(fullPathNew, + (WriteCreated && _processedFileInfo.IsCreationTimeDefined) ? &_processedFileInfo.CreationTime : NULL, + (WriteAccessed && _processedFileInfo.IsLastAccessTimeDefined) ? &_processedFileInfo.LastAccessTime : NULL, + (WriteModified && _processedFileInfo.IsLastWriteTimeDefined) ? &_processedFileInfo.LastWriteTime : &_utcLastWriteTimeDefault); + } + } + + + UString fullProcessedPath = _directoryPath + processedPath; + + if(_processedFileInfo.IsDirectory) + { + _diskFilePath = fullProcessedPath; + if (isAnti) + NFile::NDirectory::MyRemoveDirectory(_diskFilePath); + return S_OK; + } + + if (!_isSplit) + { + NFile::NFind::CFileInfoW fileInfo; + if(NFile::NFind::FindFile(fullProcessedPath, fileInfo)) + { + switch(_overwriteMode) + { + case NExtract::NOverwriteMode::kSkipExisting: + return S_OK; + case NExtract::NOverwriteMode::kAskBefore: + { + Int32 overwiteResult; + RINOK(_extractCallback2->AskOverwrite( + fullProcessedPath, &fileInfo.LastWriteTime, &fileInfo.Size, fullPath, + _processedFileInfo.IsLastWriteTimeDefined ? &_processedFileInfo.LastWriteTime : NULL, + newFileSizeDefined ? &newFileSize : NULL, + &overwiteResult)) + + switch(overwiteResult) + { + case NOverwriteAnswer::kCancel: + return E_ABORT; + case NOverwriteAnswer::kNo: + return S_OK; + case NOverwriteAnswer::kNoToAll: + _overwriteMode = NExtract::NOverwriteMode::kSkipExisting; + return S_OK; + case NOverwriteAnswer::kYesToAll: + _overwriteMode = NExtract::NOverwriteMode::kWithoutPrompt; + break; + case NOverwriteAnswer::kYes: + break; + case NOverwriteAnswer::kAutoRename: + _overwriteMode = NExtract::NOverwriteMode::kAutoRename; + break; + default: + return E_FAIL; + } + } + } + if (_overwriteMode == NExtract::NOverwriteMode::kAutoRename) + { + if (!AutoRenamePath(fullProcessedPath)) + { + UString message = UString(kCantAutoRename) + fullProcessedPath; + RINOK(_extractCallback2->MessageError(message)); + return E_FAIL; + } + } + else if (_overwriteMode == NExtract::NOverwriteMode::kAutoRenameExisting) + { + UString existPath = fullProcessedPath; + if (!AutoRenamePath(existPath)) + { + UString message = kCantAutoRename + fullProcessedPath; + RINOK(_extractCallback2->MessageError(message)); + return E_FAIL; + } + if(!NFile::NDirectory::MyMoveFile(fullProcessedPath, existPath)) + { + UString message = UString(kCantRenameFile) + fullProcessedPath; + RINOK(_extractCallback2->MessageError(message)); + return E_FAIL; + } + } + else + if (!NFile::NDirectory::DeleteFileAlways(fullProcessedPath)) + { + UString message = UString(kCantDeleteOutputFile) + fullProcessedPath; + RINOK(_extractCallback2->MessageError(message)); + return S_OK; + // return E_FAIL; + } + } + } + if (!isAnti) + { + _outFileStreamSpec = new COutFileStream; + CMyComPtr outStreamLoc(_outFileStreamSpec); + if (!_outFileStreamSpec->Open(fullProcessedPath, _isSplit ? OPEN_ALWAYS: CREATE_ALWAYS)) + { + // if (::GetLastError() != ERROR_FILE_EXISTS || !isSplit) + { + UString message = L"can not open output file " + fullProcessedPath; + RINOK(_extractCallback2->MessageError(message)); + return S_OK; + } + } + if (_isSplit) + { + RINOK(_outFileStreamSpec->Seek(_position, STREAM_SEEK_SET, NULL)); + } + _outFileStream = outStreamLoc; + *outStream = outStreamLoc.Detach(); + } + _diskFilePath = fullProcessedPath; + } + else + { + *outStream = NULL; + } + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CArchiveExtractCallback::PrepareOperation(Int32 askExtractMode) +{ + COM_TRY_BEGIN + _extractMode = false; + switch (askExtractMode) + { + case NArchive::NExtract::NAskMode::kExtract: + _extractMode = true; + }; + return _extractCallback2->PrepareOperation(_filePath, _processedFileInfo.IsDirectory, + askExtractMode, _isSplit ? &_position: 0); + COM_TRY_END +} + +STDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 operationResult) +{ + COM_TRY_BEGIN + switch(operationResult) + { + case NArchive::NExtract::NOperationResult::kOK: + case NArchive::NExtract::NOperationResult::kUnSupportedMethod: + case NArchive::NExtract::NOperationResult::kCRCError: + case NArchive::NExtract::NOperationResult::kDataError: + break; + default: + _outFileStream.Release(); + return E_FAIL; + } + if (_outFileStream != NULL) + { + _outFileStreamSpec->SetTime( + (WriteCreated && _processedFileInfo.IsCreationTimeDefined) ? &_processedFileInfo.CreationTime : NULL, + (WriteAccessed && _processedFileInfo.IsLastAccessTimeDefined) ? &_processedFileInfo.LastAccessTime : NULL, + (WriteModified && _processedFileInfo.IsLastWriteTimeDefined) ? &_processedFileInfo.LastWriteTime : &_utcLastWriteTimeDefault); + _curSize = _outFileStreamSpec->ProcessedSize; + RINOK(_outFileStreamSpec->Close()); + _outFileStream.Release(); + } + UnpackSize += _curSize; + if (_processedFileInfo.IsDirectory) + NumFolders++; + else + NumFiles++; + + if (_extractMode && _processedFileInfo.AttributesAreDefined) + NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attributes); + RINOK(_extractCallback2->SetOperationResult(operationResult, _encrypted)); + return S_OK; + COM_TRY_END +} + +/* +STDMETHODIMP CArchiveExtractCallback::GetInStream( + const wchar_t *name, ISequentialInStream **inStream) +{ + COM_TRY_BEGIN + CInFileStream *inFile = new CInFileStream; + CMyComPtr inStreamTemp = inFile; + if (!inFile->Open(_srcDirectoryPrefix + name)) + return ::GetLastError(); + *inStream = inStreamTemp.Detach(); + return S_OK; + COM_TRY_END +} +*/ + +STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password) +{ + COM_TRY_BEGIN + if (!_cryptoGetTextPassword) + { + RINOK(_extractCallback2.QueryInterface(IID_ICryptoGetTextPassword, + &_cryptoGetTextPassword)); + } + return _cryptoGetTextPassword->CryptoGetTextPassword(password); + COM_TRY_END +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveExtractCallback.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveExtractCallback.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,139 @@ +// ArchiveExtractCallback.h + +#ifndef __ARCHIVEEXTRACTCALLBACK_H +#define __ARCHIVEEXTRACTCALLBACK_H + +#include "../../Archive/IArchive.h" +#include "IFileExtractCallback.h" + +#include "Common/MyString.h" +#include "Common/MyCom.h" + +#include "../../Common/FileStreams.h" +#include "../../Common/ProgressUtils.h" +#include "../../IPassword.h" + +#include "ExtractMode.h" + +class CArchiveExtractCallback: + public IArchiveExtractCallback, + // public IArchiveVolumeExtractCallback, + public ICryptoGetTextPassword, + public ICompressProgressInfo, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP2(ICryptoGetTextPassword, ICompressProgressInfo) + // COM_INTERFACE_ENTRY(IArchiveVolumeExtractCallback) + + // IProgress + STDMETHOD(SetTotal)(UInt64 size); + STDMETHOD(SetCompleted)(const UInt64 *completeValue); + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); + + // IExtractCallBack + STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode); + STDMETHOD(PrepareOperation)(Int32 askExtractMode); + STDMETHOD(SetOperationResult)(Int32 resultEOperationResult); + + // IArchiveVolumeExtractCallback + // STDMETHOD(GetInStream)(const wchar_t *name, ISequentialInStream **inStream); + + // ICryptoGetTextPassword + STDMETHOD(CryptoGetTextPassword)(BSTR *aPassword); + +private: + CMyComPtr _archiveHandler; + CMyComPtr _extractCallback2; + CMyComPtr _compressProgress; + CMyComPtr _cryptoGetTextPassword; + UString _directoryPath; + NExtract::NPathMode::EEnum _pathMode; + NExtract::NOverwriteMode::EEnum _overwriteMode; + + UString _filePath; + UInt64 _position; + bool _isSplit; + + UString _diskFilePath; + + bool _extractMode; + + bool WriteModified; + bool WriteCreated; + bool WriteAccessed; + + bool _encrypted; + + struct CProcessedFileInfo + { + FILETIME CreationTime; + FILETIME LastWriteTime; + FILETIME LastAccessTime; + UInt32 Attributes; + + bool IsCreationTimeDefined; + bool IsLastWriteTimeDefined; + bool IsLastAccessTimeDefined; + + bool IsDirectory; + bool AttributesAreDefined; + } _processedFileInfo; + + UInt64 _curSize; + COutFileStream *_outFileStreamSpec; + CMyComPtr _outFileStream; + UStringVector _removePathParts; + + UString _itemDefaultName; + FILETIME _utcLastWriteTimeDefault; + UInt32 _attributesDefault; + bool _stdOutMode; + + void CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath); + HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined); +public: + CArchiveExtractCallback(): + WriteModified(true), + WriteCreated(false), + WriteAccessed(false), + _multiArchives(false) + { + LocalProgressSpec = new CLocalProgress(); + _localProgress = LocalProgressSpec; + } + + CLocalProgress *LocalProgressSpec; + CMyComPtr _localProgress; + UInt64 _packTotal; + UInt64 _unpTotal; + + bool _multiArchives; + UInt64 NumFolders; + UInt64 NumFiles; + UInt64 UnpackSize; + + void InitForMulti(bool multiArchives, + NExtract::NPathMode::EEnum pathMode, + NExtract::NOverwriteMode::EEnum overwriteMode) + { + _multiArchives = multiArchives; NumFolders = NumFiles = UnpackSize = 0; + _pathMode = pathMode; + _overwriteMode = overwriteMode; + } + + void Init( + IInArchive *archiveHandler, + IFolderArchiveExtractCallback *extractCallback2, + bool stdOutMode, + const UString &directoryPath, + const UStringVector &removePathParts, + const UString &itemDefaultName, + const FILETIME &utcLastWriteTimeDefault, + UInt32 attributesDefault, + UInt64 packSize); + + UInt64 _numErrors; +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveName.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveName.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,46 @@ +// ArchiveName.cpp + +#include "StdAfx.h" + +#include "Windows/FileFind.h" +#include "Windows/FileDir.h" + +using namespace NWindows; + +UString CreateArchiveName(const UString &srcName, bool fromPrev, bool keepName) +{ + UString resultName = L"Archive"; + if (fromPrev) + { + UString dirPrefix; + if (NFile::NDirectory::GetOnlyDirPrefix(srcName, dirPrefix)) + { + if (dirPrefix.Length() > 0) + if (dirPrefix[dirPrefix.Length() - 1] == '\\') + { + dirPrefix.Delete(dirPrefix.Length() - 1); + NFile::NFind::CFileInfoW fileInfo; + if (NFile::NFind::FindFile(dirPrefix, fileInfo)) + resultName = fileInfo.Name; + } + } + } + else + { + NFile::NFind::CFileInfoW fileInfo; + if (!NFile::NFind::FindFile(srcName, fileInfo)) + return resultName; + resultName = fileInfo.Name; + if (!fileInfo.IsDirectory() && !keepName) + { + int dotPos = resultName.ReverseFind('.'); + if (dotPos > 0) + { + UString archiveName2 = resultName.Left(dotPos); + if (archiveName2.ReverseFind('.') < 0) + resultName = archiveName2; + } + } + } + return resultName; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveName.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveName.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// ArchiveName.h + +#ifndef __ARCHIVENAME_H +#define __ARCHIVENAME_H + +#include "Common/MyString.h" + +UString CreateArchiveName(const UString &srcName, bool fromPrev, bool keepName); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,137 @@ +// ArchiveOpenCallback.cpp + +#include "StdAfx.h" + +#include "ArchiveOpenCallback.h" + +#include "Common/StringConvert.h" +#include "Common/ComTry.h" +#include "Windows/PropVariant.h" + +#include "../../Common/FileStreams.h" + +using namespace NWindows; + +STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes) +{ + COM_TRY_BEGIN + if (!Callback) + return S_OK; + return Callback->SetTotal(files, bytes); + COM_TRY_END +} + +STDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *bytes) +{ + COM_TRY_BEGIN + if (!Callback) + return S_OK; + return Callback->SetTotal(files, bytes); + COM_TRY_END +} + +STDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value) +{ + COM_TRY_BEGIN + NCOM::CPropVariant propVariant; + if (_subArchiveMode) + { + switch(propID) + { + case kpidName: + propVariant = _subArchiveName; + break; + } + propVariant.Detach(value); + return S_OK; + } + switch(propID) + { + case kpidName: + propVariant = _fileInfo.Name; + break; + case kpidIsFolder: + propVariant = _fileInfo.IsDirectory(); + break; + case kpidSize: + propVariant = _fileInfo.Size; + break; + case kpidAttributes: + propVariant = (UInt32)_fileInfo.Attributes; + break; + case kpidLastAccessTime: + propVariant = _fileInfo.LastAccessTime; + break; + case kpidCreationTime: + propVariant = _fileInfo.CreationTime; + break; + case kpidLastWriteTime: + propVariant = _fileInfo.LastWriteTime; + break; + } + propVariant.Detach(value); + return S_OK; + COM_TRY_END +} + +int COpenCallbackImp::FindName(const UString &name) +{ + for (int i = 0; i < FileNames.Size(); i++) + if (name.CompareNoCase(FileNames[i]) == 0) + return i; + return -1; +} + +struct CInFileStreamVol: public CInFileStream +{ + UString Name; + COpenCallbackImp *OpenCallbackImp; + CMyComPtr OpenCallbackRef; + ~CInFileStreamVol() + { + int index = OpenCallbackImp->FindName(Name); + if (index >= 0) + OpenCallbackImp->FileNames.Delete(index); + } +}; + +STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStream) +{ + COM_TRY_BEGIN + if (_subArchiveMode) + return S_FALSE; + if (Callback) + { + RINOK(Callback->CheckBreak()); + } + *inStream = NULL; + UString fullPath = _folderPrefix + name; + if (!NFile::NFind::FindFile(fullPath, _fileInfo)) + return S_FALSE; + if (_fileInfo.IsDirectory()) + return S_FALSE; + CInFileStreamVol *inFile = new CInFileStreamVol; + CMyComPtr inStreamTemp = inFile; + if (!inFile->Open(fullPath)) + return ::GetLastError(); + *inStream = inStreamTemp.Detach(); + inFile->Name = name; + inFile->OpenCallbackImp = this; + inFile->OpenCallbackRef = this; + FileNames.Add(name); + TotalSize += _fileInfo.Size; + return S_OK; + COM_TRY_END +} + +#ifndef _NO_CRYPTO +STDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password) +{ + COM_TRY_BEGIN + if (!Callback) + return E_NOTIMPL; + return Callback->CryptoGetTextPassword(password); + COM_TRY_END +} +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,93 @@ +// ArchiveOpenCallback.h + +#ifndef __ARCHIVE_OPEN_CALLBACK_H +#define __ARCHIVE_OPEN_CALLBACK_H + +#include "Common/MyString.h" +#include "Common/MyCom.h" +#include "Windows/FileFind.h" + +#ifndef _NO_CRYPTO +#include "../../IPassword.h" +#endif +#include "../../Archive/IArchive.h" + +struct IOpenCallbackUI +{ + virtual HRESULT CheckBreak() = 0; + virtual HRESULT SetTotal(const UInt64 *files, const UInt64 *bytes) = 0; + virtual HRESULT SetCompleted(const UInt64 *files, const UInt64 *bytes) = 0; + #ifndef _NO_CRYPTO + virtual HRESULT CryptoGetTextPassword(BSTR *password) = 0; + virtual HRESULT GetPasswordIfAny(UString &password) = 0; + virtual bool WasPasswordAsked() = 0; + virtual void ClearPasswordWasAskedFlag() = 0; + #endif +}; + +class COpenCallbackImp: + public IArchiveOpenCallback, + public IArchiveOpenVolumeCallback, + public IArchiveOpenSetSubArchiveName, + #ifndef _NO_CRYPTO + public ICryptoGetTextPassword, + #endif + public CMyUnknownImp +{ +public: + #ifndef _NO_CRYPTO + MY_UNKNOWN_IMP3( + IArchiveOpenVolumeCallback, + ICryptoGetTextPassword, + IArchiveOpenSetSubArchiveName + ) + #else + MY_UNKNOWN_IMP2( + IArchiveOpenVolumeCallback, + IArchiveOpenSetSubArchiveName + ) + #endif + + STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes); + STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes); + + // IArchiveOpenVolumeCallback + STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value); + STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream); + + #ifndef _NO_CRYPTO + // ICryptoGetTextPassword + STDMETHOD(CryptoGetTextPassword)(BSTR *password); + #endif + + STDMETHOD(SetSubArchiveName(const wchar_t *name)) + { + _subArchiveMode = true; + _subArchiveName = name; + return S_OK; + } + +private: + UString _folderPrefix; + NWindows::NFile::NFind::CFileInfoW _fileInfo; + bool _subArchiveMode; + UString _subArchiveName; +public: + UStringVector FileNames; + IOpenCallbackUI *Callback; + UInt64 TotalSize; + + COpenCallbackImp(): Callback(NULL) {} + void Init(const UString &folderPrefix, const UString &fileName) + { + _folderPrefix = folderPrefix; + if (!NWindows::NFile::NFind::FindFile(_folderPrefix + fileName, _fileInfo)) + throw 1; + FileNames.Clear(); + _subArchiveMode = false; + TotalSize = 0; + } + int FindName(const UString &name); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/DefaultName.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/DefaultName.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,26 @@ +// DefaultName.cpp + +#include "StdAfx.h" + +#include "DefaultName.h" + +static const wchar_t *kEmptyFileAlias = L"[Content]"; + +UString GetDefaultName2(const UString &fileName, + const UString &extension, const UString &addSubExtension) +{ + int extLength = extension.Length(); + int fileNameLength = fileName.Length(); + if (fileNameLength > extLength + 1) + { + int dotPos = fileNameLength - (extLength + 1); + if (fileName[dotPos] == '.') + if (extension.CompareNoCase(fileName.Mid(dotPos + 1)) == 0) + return fileName.Left(dotPos) + addSubExtension; + } + int dotPos = fileName.ReverseFind(L'.'); + if (dotPos > 0) + return fileName.Left(dotPos) + addSubExtension; + return kEmptyFileAlias; +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/DefaultName.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/DefaultName.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,11 @@ +// DefaultName.h + +#ifndef __DEFAULTNAME_H +#define __DEFAULTNAME_H + +#include "Common/MyString.h" + +UString GetDefaultName2(const UString &fileName, + const UString &extension, const UString &addSubExtension); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/DirItem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/DirItem.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,34 @@ +// DirItem.h + +#ifndef __DIR_ITEM_H +#define __DIR_ITEM_H + +#include "Common/MyString.h" +#include "Common/Types.h" + +struct CDirItem +{ + UInt32 Attributes; + FILETIME CreationTime; + FILETIME LastAccessTime; + FILETIME LastWriteTime; + UInt64 Size; + UString Name; + UString FullPath; + bool IsDirectory() const { return (Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0 ; } +}; + +struct CArchiveItem +{ + bool IsDirectory; + // DWORD Attributes; + // NWindows::NCOM::CPropVariant LastWriteTime; + FILETIME LastWriteTime; + bool SizeIsDefined; + UInt64 Size; + UString Name; + bool Censored; + int IndexInServer; +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/EnumDirItems.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/EnumDirItems.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,281 @@ +// EnumDirItems.cpp + +#include "StdAfx.h" + +#include "Common/StringConvert.h" +#include "Common/Wildcard.h" +#include "Common/MyCom.h" + +#include "EnumDirItems.h" + +using namespace NWindows; +using namespace NFile; +using namespace NName; + +void AddDirFileInfo( + const UString &prefix, // prefix for logical path + const UString &fullPathName, // path on disk: can be relative to some basePrefix + const NFind::CFileInfoW &fileInfo, + CObjectVector &dirItems) +{ + CDirItem item; + item.Attributes = fileInfo.Attributes; + item.Size = fileInfo.Size; + item.CreationTime = fileInfo.CreationTime; + item.LastAccessTime = fileInfo.LastAccessTime; + item.LastWriteTime = fileInfo.LastWriteTime; + item.Name = prefix + fileInfo.Name; + item.FullPath = fullPathName; + dirItems.Add(item); +} + +static void EnumerateDirectory( + const UString &baseFolderPrefix, // base (disk) prefix for scanning + const UString &directory, // additional disk prefix starting from baseFolderPrefix + const UString &prefix, // logical prefix + CObjectVector &dirItems, + UStringVector &errorPaths, + CRecordVector &errorCodes) +{ + NFind::CEnumeratorW enumerator(baseFolderPrefix + directory + wchar_t(kAnyStringWildcard)); + for (;;) + { + NFind::CFileInfoW fileInfo; + bool found; + if (!enumerator.Next(fileInfo, found)) + { + errorCodes.Add(::GetLastError()); + errorPaths.Add(baseFolderPrefix + directory); + return; + } + if (!found) + break; + AddDirFileInfo(prefix, directory + fileInfo.Name, fileInfo, dirItems); + if (fileInfo.IsDirectory()) + { + EnumerateDirectory(baseFolderPrefix, directory + fileInfo.Name + wchar_t(kDirDelimiter), + prefix + fileInfo.Name + wchar_t(kDirDelimiter), dirItems, errorPaths, errorCodes); + } + } +} + +void EnumerateDirItems( + const UString &baseFolderPrefix, // base (disk) prefix for scanning + const UStringVector &fileNames, // names relative to baseFolderPrefix + const UString &archiveNamePrefix, + CObjectVector &dirItems, + UStringVector &errorPaths, + CRecordVector &errorCodes) +{ + for(int i = 0; i < fileNames.Size(); i++) + { + const UString &fileName = fileNames[i]; + NFind::CFileInfoW fileInfo; + if (!NFind::FindFile(baseFolderPrefix + fileName, fileInfo)) + { + errorCodes.Add(::GetLastError()); + errorPaths.Add(baseFolderPrefix + fileName); + continue; + } + AddDirFileInfo(archiveNamePrefix, fileName, fileInfo, dirItems); + if (fileInfo.IsDirectory()) + { + EnumerateDirectory(baseFolderPrefix, fileName + wchar_t(kDirDelimiter), + archiveNamePrefix + fileInfo.Name + wchar_t(kDirDelimiter), + dirItems, errorPaths, errorCodes); + } + } +} + +static HRESULT EnumerateDirItems( + const NWildcard::CCensorNode &curNode, + const UString &diskPrefix, // full disk path prefix + const UString &archivePrefix, // prefix from root + const UStringVector &addArchivePrefix, // prefix from curNode + CObjectVector &dirItems, + bool enterToSubFolders, + IEnumDirItemCallback *callback, + UStringVector &errorPaths, + CRecordVector &errorCodes) +{ + if (!enterToSubFolders) + if (curNode.NeedCheckSubDirs()) + enterToSubFolders = true; + if (callback) + RINOK(callback->CheckBreak()); + + // try direct_names case at first + if (addArchivePrefix.IsEmpty() && !enterToSubFolders) + { + // check that all names are direct + int i; + for (i = 0; i < curNode.IncludeItems.Size(); i++) + { + const NWildcard::CItem &item = curNode.IncludeItems[i]; + if (item.Recursive || item.PathParts.Size() != 1) + break; + const UString &name = item.PathParts.Front(); + if (name.IsEmpty() || DoesNameContainWildCard(name)) + break; + } + if (i == curNode.IncludeItems.Size()) + { + // all names are direct (no wildcards) + // so we don't need file_system's dir enumerator + CRecordVector needEnterVector; + for (i = 0; i < curNode.IncludeItems.Size(); i++) + { + const NWildcard::CItem &item = curNode.IncludeItems[i]; + const UString &name = item.PathParts.Front(); + const UString fullPath = diskPrefix + name; + NFind::CFileInfoW fileInfo; + if (!NFind::FindFile(fullPath, fileInfo)) + { + errorCodes.Add(::GetLastError()); + errorPaths.Add(fullPath); + continue; + } + bool isDir = fileInfo.IsDirectory(); + if (isDir && !item.ForDir || !isDir && !item.ForFile) + { + errorCodes.Add((DWORD)E_FAIL); + errorPaths.Add(fullPath); + continue; + } + const UString realName = fileInfo.Name; + const UString realDiskPath = diskPrefix + realName; + { + UStringVector pathParts; + pathParts.Add(fileInfo.Name); + if (curNode.CheckPathToRoot(false, pathParts, !isDir)) + continue; + } + AddDirFileInfo(archivePrefix, realDiskPath, fileInfo, dirItems); + if (!isDir) + continue; + + UStringVector addArchivePrefixNew; + const NWildcard::CCensorNode *nextNode = 0; + int index = curNode.FindSubNode(name); + if (index >= 0) + { + for (int t = needEnterVector.Size(); t <= index; t++) + needEnterVector.Add(true); + needEnterVector[index] = false; + nextNode = &curNode.SubNodes[index]; + } + else + { + nextNode = &curNode; + addArchivePrefixNew.Add(name); // don't change it to realName. It's for shortnames support + } + RINOK(EnumerateDirItems(*nextNode, + realDiskPath + wchar_t(kDirDelimiter), + archivePrefix + realName + wchar_t(kDirDelimiter), + addArchivePrefixNew, dirItems, true, callback, errorPaths, errorCodes)); + } + for (i = 0; i < curNode.SubNodes.Size(); i++) + { + if (i < needEnterVector.Size()) + if (!needEnterVector[i]) + continue; + const NWildcard::CCensorNode &nextNode = curNode.SubNodes[i]; + const UString fullPath = diskPrefix + nextNode.Name; + NFind::CFileInfoW fileInfo; + if (!NFind::FindFile(fullPath, fileInfo)) + { + if (!nextNode.AreThereIncludeItems()) + continue; + errorCodes.Add(::GetLastError()); + errorPaths.Add(fullPath); + continue; + } + if (!fileInfo.IsDirectory()) + { + errorCodes.Add((DWORD)E_FAIL); + errorPaths.Add(fullPath); + continue; + } + RINOK(EnumerateDirItems(nextNode, + diskPrefix + fileInfo.Name + wchar_t(kDirDelimiter), + archivePrefix + fileInfo.Name + wchar_t(kDirDelimiter), + UStringVector(), dirItems, false, callback, errorPaths, errorCodes)); + } + return S_OK; + } + } + + + NFind::CEnumeratorW enumerator(diskPrefix + wchar_t(kAnyStringWildcard)); + for (;;) + { + NFind::CFileInfoW fileInfo; + bool found; + if (!enumerator.Next(fileInfo, found)) + { + errorCodes.Add(::GetLastError()); + errorPaths.Add(diskPrefix); + break; + } + if (!found) + break; + + if (callback) + RINOK(callback->CheckBreak()); + const UString &name = fileInfo.Name; + bool enterToSubFolders2 = enterToSubFolders; + UStringVector addArchivePrefixNew = addArchivePrefix; + addArchivePrefixNew.Add(name); + { + UStringVector addArchivePrefixNewTemp(addArchivePrefixNew); + if (curNode.CheckPathToRoot(false, addArchivePrefixNewTemp, !fileInfo.IsDirectory())) + continue; + } + if (curNode.CheckPathToRoot(true, addArchivePrefixNew, !fileInfo.IsDirectory())) + { + AddDirFileInfo(archivePrefix, diskPrefix + name, fileInfo, dirItems); + if (fileInfo.IsDirectory()) + enterToSubFolders2 = true; + } + if (!fileInfo.IsDirectory()) + continue; + + const NWildcard::CCensorNode *nextNode = 0; + if (addArchivePrefix.IsEmpty()) + { + int index = curNode.FindSubNode(name); + if (index >= 0) + nextNode = &curNode.SubNodes[index]; + } + if (!enterToSubFolders2 && nextNode == 0) + continue; + + addArchivePrefixNew = addArchivePrefix; + if (nextNode == 0) + { + nextNode = &curNode; + addArchivePrefixNew.Add(name); + } + RINOK(EnumerateDirItems(*nextNode, + diskPrefix + name + wchar_t(kDirDelimiter), + archivePrefix + name + wchar_t(kDirDelimiter), + addArchivePrefixNew, dirItems, enterToSubFolders2, callback, errorPaths, errorCodes)); + } + return S_OK; +} + +HRESULT EnumerateItems( + const NWildcard::CCensor &censor, + CObjectVector &dirItems, + IEnumDirItemCallback *callback, + UStringVector &errorPaths, + CRecordVector &errorCodes) +{ + for (int i = 0; i < censor.Pairs.Size(); i++) + { + const NWildcard::CPair &pair = censor.Pairs[i]; + RINOK(EnumerateDirItems(pair.Head, pair.Prefix, L"", UStringVector(), dirItems, false, + callback, errorPaths, errorCodes)); + } + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/EnumDirItems.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/EnumDirItems.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,39 @@ +// EnumDirItems.h + +#ifndef __ENUM_DIR_ITEMS_H +#define __ENUM_DIR_ITEMS_H + +#include "Common/Wildcard.h" +#include "DirItem.h" + +#include "Windows/FileFind.h" + +void AddDirFileInfo( + const UString &prefix, + const UString &fullPathName, + const NWindows::NFile::NFind::CFileInfoW &fileInfo, + CObjectVector &dirItems); + + +void EnumerateDirItems( + const UString &baseFolderPrefix, + const UStringVector &fileNames, + const UString &archiveNamePrefix, + CObjectVector &dirItems, + UStringVector &errorPaths, + CRecordVector &errorCodes); + +struct IEnumDirItemCallback +{ + virtual HRESULT CheckBreak() { return S_OK; } +}; + + +HRESULT EnumerateItems( + const NWildcard::CCensor &censor, + CObjectVector &dirItems, + IEnumDirItemCallback *callback, + UStringVector &errorPaths, + CRecordVector &errorCodes); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ExitCode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ExitCode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,27 @@ +// ExitCode.h + +#ifndef __EXIT_CODE_H +#define __EXIT_CODE_H + +namespace NExitCode { + +enum EEnum { + + kSuccess = 0, // Successful operation + kWarning = 1, // Non fatal error(s) occurred + kFatalError = 2, // A fatal error occurred + // kCRCError = 3, // A CRC error occurred when unpacking + // kLockedArchive = 4, // Attempt to modify an archive previously locked + // kWriteError = 5, // Write to disk error + // kOpenError = 6, // Open file error + kUserError = 7, // Command line option error + kMemoryError = 8, // Not enough memory for operation + // kCreateFileError = 9, // Create file error + + kUserBreak = 255 // User stopped the process + +}; + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/Extract.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/Extract.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,187 @@ +// Extract.cpp + +#include "StdAfx.h" + +#include "Extract.h" + +#include "Windows/Defs.h" +#include "Windows/FileDir.h" + +#include "OpenArchive.h" +#include "SetProperties.h" + +using namespace NWindows; + +HRESULT DecompressArchive( + IInArchive *archive, + UInt64 packSize, + const UString &defaultName, + const NWildcard::CCensorNode &wildcardCensor, + const CExtractOptions &options, + IExtractCallbackUI *callback, + CArchiveExtractCallback *extractCallbackSpec, + UString &errorMessage) +{ + CRecordVector realIndices; + UInt32 numItems; + RINOK(archive->GetNumberOfItems(&numItems)); + + for(UInt32 i = 0; i < numItems; i++) + { + UString filePath; + RINOK(GetArchiveItemPath(archive, i, options.DefaultItemName, filePath)); + bool isFolder; + RINOK(IsArchiveItemFolder(archive, i, isFolder)); + if (!wildcardCensor.CheckPath(filePath, !isFolder)) + continue; + realIndices.Add(i); + } + if (realIndices.Size() == 0) + { + callback->ThereAreNoFiles(); + return S_OK; + } + + UStringVector removePathParts; + + UString outDir = options.OutputDir; + outDir.Replace(L"*", defaultName); + if(!outDir.IsEmpty()) + if(!NFile::NDirectory::CreateComplexDirectory(outDir)) + { + HRESULT res = ::GetLastError(); + if (res == S_OK) + res = E_FAIL; + errorMessage = ((UString)L"Can not create output directory ") + outDir; + return res; + } + + extractCallbackSpec->Init( + archive, + callback, + options.StdOutMode, + outDir, + removePathParts, + options.DefaultItemName, + options.ArchiveFileInfo.LastWriteTime, + options.ArchiveFileInfo.Attributes, + packSize); + + #ifdef COMPRESS_MT + RINOK(SetProperties(archive, options.Properties)); + #endif + + HRESULT result = archive->Extract(&realIndices.Front(), + realIndices.Size(), options.TestMode? 1: 0, extractCallbackSpec); + + return callback->ExtractResult(result); +} + +HRESULT DecompressArchives( + CCodecs *codecs, + UStringVector &archivePaths, UStringVector &archivePathsFull, + const NWildcard::CCensorNode &wildcardCensor, + const CExtractOptions &optionsSpec, + IOpenCallbackUI *openCallback, + IExtractCallbackUI *extractCallback, + UString &errorMessage, + CDecompressStat &stat) +{ + stat.Clear(); + CExtractOptions options = optionsSpec; + int i; + UInt64 totalPackSize = 0; + CRecordVector archiveSizes; + for (i = 0; i < archivePaths.Size(); i++) + { + const UString &archivePath = archivePaths[i]; + NFile::NFind::CFileInfoW archiveFileInfo; + if (!NFile::NFind::FindFile(archivePath, archiveFileInfo)) + throw "there is no such archive"; + if (archiveFileInfo.IsDirectory()) + throw "can't decompress folder"; + archiveSizes.Add(archiveFileInfo.Size); + totalPackSize += archiveFileInfo.Size; + } + CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback; + CMyComPtr ec(extractCallbackSpec); + bool multi = (archivePaths.Size() > 1); + extractCallbackSpec->InitForMulti(multi, options.PathMode, options.OverwriteMode); + if (multi) + { + RINOK(extractCallback->SetTotal(totalPackSize)); + } + for (i = 0; i < archivePaths.Size(); i++) + { + const UString &archivePath = archivePaths[i]; + NFile::NFind::CFileInfoW archiveFileInfo; + if (!NFile::NFind::FindFile(archivePath, archiveFileInfo)) + throw "there is no such archive"; + + if (archiveFileInfo.IsDirectory()) + throw "there is no such archive"; + + options.ArchiveFileInfo = archiveFileInfo; + + #ifndef _NO_CRYPTO + openCallback->ClearPasswordWasAskedFlag(); + #endif + + RINOK(extractCallback->BeforeOpen(archivePath)); + CArchiveLink archiveLink; + HRESULT result = MyOpenArchive(codecs, archivePath, archiveLink, openCallback); + + bool crypted = false; + #ifndef _NO_CRYPTO + crypted = openCallback->WasPasswordAsked(); + #endif + + RINOK(extractCallback->OpenResult(archivePath, result, crypted)); + if (result != S_OK) + continue; + + for (int v = 0; v < archiveLink.VolumePaths.Size(); v++) + { + int index = archivePathsFull.FindInSorted(archiveLink.VolumePaths[v]); + if (index >= 0 && index > i) + { + archivePaths.Delete(index); + archivePathsFull.Delete(index); + totalPackSize -= archiveSizes[index]; + archiveSizes.Delete(index); + } + } + if (archiveLink.VolumePaths.Size() != 0) + { + totalPackSize += archiveLink.VolumesSize; + RINOK(extractCallback->SetTotal(totalPackSize)); + } + + #ifndef _NO_CRYPTO + UString password; + RINOK(openCallback->GetPasswordIfAny(password)); + if (!password.IsEmpty()) + { + RINOK(extractCallback->SetPassword(password)); + } + #endif + + options.DefaultItemName = archiveLink.GetDefaultItemName(); + RINOK(DecompressArchive( + archiveLink.GetArchive(), + archiveFileInfo.Size + archiveLink.VolumesSize, + archiveLink.GetDefaultItemName(), + wildcardCensor, options, extractCallback, extractCallbackSpec, errorMessage)); + extractCallbackSpec->LocalProgressSpec->InSize += archiveFileInfo.Size + + archiveLink.VolumesSize; + extractCallbackSpec->LocalProgressSpec->OutSize = extractCallbackSpec->UnpackSize; + if (!errorMessage.IsEmpty()) + return E_FAIL; + } + stat.NumFolders = extractCallbackSpec->NumFolders; + stat.NumFiles = extractCallbackSpec->NumFiles; + stat.UnpackSize = extractCallbackSpec->UnpackSize; + stat.NumArchives = archivePaths.Size(); + stat.PackSize = extractCallbackSpec->LocalProgressSpec->InSize; + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/Extract.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/Extract.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,77 @@ +// Extract.h + +#ifndef __EXTRACT_H +#define __EXTRACT_H + +#include "Common/Wildcard.h" +#include "Windows/FileFind.h" + +#include "../../Archive/IArchive.h" + +#include "ArchiveExtractCallback.h" +#include "ArchiveOpenCallback.h" +#include "ExtractMode.h" +#include "Property.h" + +#include "../Common/LoadCodecs.h" + +class CExtractOptions +{ +public: + bool StdOutMode; + bool TestMode; + NExtract::NPathMode::EEnum PathMode; + + UString OutputDir; + bool YesToAll; + UString DefaultItemName; + NWindows::NFile::NFind::CFileInfoW ArchiveFileInfo; + + // bool ShowDialog; + // bool PasswordEnabled; + // UString Password; + #ifdef COMPRESS_MT + CObjectVector Properties; + #endif + + NExtract::NOverwriteMode::EEnum OverwriteMode; + + #ifdef EXTERNAL_CODECS + CCodecs *Codecs; + #endif + + CExtractOptions(): + StdOutMode(false), + YesToAll(false), + TestMode(false), + PathMode(NExtract::NPathMode::kFullPathnames), + OverwriteMode(NExtract::NOverwriteMode::kAskBefore) + {} + + /* + bool FullPathMode() const { return (ExtractMode == NExtractMode::kTest) || + (ExtractMode == NExtractMode::kFullPath); } + */ +}; + +struct CDecompressStat +{ + UInt64 NumArchives; + UInt64 UnpackSize; + UInt64 PackSize; + UInt64 NumFolders; + UInt64 NumFiles; + void Clear() { NumArchives = PackSize = UnpackSize = NumFolders = NumFiles = 0; } +}; + +HRESULT DecompressArchives( + CCodecs *codecs, + UStringVector &archivePaths, UStringVector &archivePathsFull, + const NWildcard::CCensorNode &wildcardCensor, + const CExtractOptions &options, + IOpenCallbackUI *openCallback, + IExtractCallbackUI *extractCallback, + UString &errorMessage, + CDecompressStat &stat); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ExtractMode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ExtractMode.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,31 @@ +// ExtractMode.h + +#ifndef __EXTRACT_MODE_H +#define __EXTRACT_MODE_H + +namespace NExtract { + + namespace NPathMode + { + enum EEnum + { + kFullPathnames, + kCurrentPathnames, + kNoPathnames + }; + } + + namespace NOverwriteMode + { + enum EEnum + { + kAskBefore, + kWithoutPrompt, + kSkipExisting, + kAutoRename, + kAutoRenameExisting + }; + } +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ExtractingFilePath.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ExtractingFilePath.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,96 @@ +// ExtractingFilePath.cpp + +#include "StdAfx.h" +#include "ExtractingFilePath.h" + +static UString ReplaceIncorrectChars(const UString &s) +{ + #ifdef _WIN32 + UString res; + for (int i = 0; i < s.Length(); i++) + { + wchar_t c = s[i]; + if (c < 0x20 || c == '*' || c == '?' || c == '<' || c == '>' || c == '|' || c == ':' || c == '"') + c = '_'; + res += c; + } + return res; + #else + return s; + #endif +} + +#ifdef _WIN32 +static const wchar_t *g_ReservedNames[] = +{ + L"CON", L"PRN", L"AUX", L"NUL" +}; + +static bool CheckTail(const UString &name, int len) +{ + int dotPos = name.Find(L'.'); + if (dotPos < 0) + dotPos = name.Length(); + UString s = name.Left(dotPos); + s.TrimRight(); + return (s.Length() != len); +} + +static bool CheckNameNum(const UString &name, const wchar_t *reservedName) +{ + int len = MyStringLen(reservedName); + if (name.Length() <= len) + return true; + if (name.Left(len).CompareNoCase(reservedName) != 0) + return true; + wchar_t c = name[len]; + if (c < L'0' || c > L'9') + return true; + return CheckTail(name, len + 1); +} + +static bool IsSupportedName(const UString &name) +{ + for (int i = 0; i < sizeof(g_ReservedNames) / sizeof(g_ReservedNames[0]); i++) + { + const wchar_t *reservedName = g_ReservedNames[i]; + int len = MyStringLen(reservedName); + if (name.Length() < len) + continue; + if (name.Left(len).CompareNoCase(reservedName) != 0) + continue; + if (!CheckTail(name, len)) + return false; + } + if (!CheckNameNum(name, L"COM")) + return false; + return CheckNameNum(name, L"LPT"); +} +#endif + +static UString GetCorrectFileName(const UString &path) +{ + if (path == L".." || path == L".") + return UString(); + return ReplaceIncorrectChars(path); +} + +void MakeCorrectPath(UStringVector &pathParts) +{ + for (int i = 0; i < pathParts.Size();) + { + UString &s = pathParts[i]; + s = GetCorrectFileName(s); + if (s.IsEmpty()) + pathParts.Delete(i); + else + { + #ifdef _WIN32 + if (!IsSupportedName(s)) + s = (UString)L"_" + s; + #endif + i++; + } + } +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ExtractingFilePath.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ExtractingFilePath.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// ExtractingFilePath.h + +#ifndef __EXTRACTINGFILEPATH_H +#define __EXTRACTINGFILEPATH_H + +#include "Common/MyString.h" + +void MakeCorrectPath(UStringVector &pathParts); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/IFileExtractCallback.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/IFileExtractCallback.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,43 @@ +// IFileExtractCallback.h + +#ifndef __IFILEEXTRACTCALLBACK_H +#define __IFILEEXTRACTCALLBACK_H + +#include "Common/MyString.h" +#include "../../IDecl.h" + +namespace NOverwriteAnswer +{ + enum EEnum + { + kYes, + kYesToAll, + kNo, + kNoToAll, + kAutoRename, + kCancel + }; +} + +DECL_INTERFACE_SUB(IFolderArchiveExtractCallback, IProgress, 0x01, 0x07) +{ +public: + STDMETHOD(AskOverwrite)( + const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize, + const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize, + Int32 *answer) PURE; + STDMETHOD(PrepareOperation)(const wchar_t *name, bool isFolder, Int32 askExtractMode, const UInt64 *position) PURE; + STDMETHOD(MessageError)(const wchar_t *message) PURE; + STDMETHOD(SetOperationResult)(Int32 operationResult, bool encrypted) PURE; +}; + +struct IExtractCallbackUI: IFolderArchiveExtractCallback +{ + virtual HRESULT BeforeOpen(const wchar_t *name) = 0; + virtual HRESULT OpenResult(const wchar_t *name, HRESULT result, bool encrypted) = 0; + virtual HRESULT ThereAreNoFiles() = 0; + virtual HRESULT ExtractResult(HRESULT result) = 0; + virtual HRESULT SetPassword(const UString &password) = 0; +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/LoadCodecs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/LoadCodecs.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,644 @@ +// LoadCodecs.cpp + +#include "StdAfx.h" + +#include "LoadCodecs.h" + +#include "../../../Common/MyCom.h" +#ifdef NEW_FOLDER_INTERFACE +#include "../../../Common/StringToInt.h" +#endif +#include "../../../Windows/PropVariant.h" + +#include "../../ICoder.h" +#include "../../Common/RegisterArc.h" + +#ifdef EXTERNAL_CODECS +#include "../../../Windows/FileFind.h" +#include "../../../Windows/DLL.h" +#ifdef NEW_FOLDER_INTERFACE +#include "../../../Windows/ResourceString.h" +static const UINT kIconTypesResId = 100; +#endif + +#ifdef _WIN32 +#include "Windows/Registry.h" +#endif + +using namespace NWindows; +using namespace NFile; + +#ifdef _WIN32 +extern HINSTANCE g_hInstance; +#endif + +static CSysString GetLibraryFolderPrefix() +{ + #ifdef _WIN32 + TCHAR fullPath[MAX_PATH + 1]; + ::GetModuleFileName(g_hInstance, fullPath, MAX_PATH); + CSysString path = fullPath; + int pos = path.ReverseFind(TEXT(CHAR_PATH_SEPARATOR)); + return path.Left(pos + 1); + #else + return CSysString(); // FIX IT + #endif +} + +#define kCodecsFolderName TEXT("Codecs") +#define kFormatsFolderName TEXT("Formats") +static TCHAR *kMainDll = TEXT("7z.dll"); + +#ifdef _WIN32 +static LPCTSTR kRegistryPath = TEXT("Software\\7-zip"); +static LPCTSTR kProgramPathValue = TEXT("Path"); +static bool ReadPathFromRegistry(HKEY baseKey, CSysString &path) +{ + NRegistry::CKey key; + if(key.Open(baseKey, kRegistryPath, KEY_READ) == ERROR_SUCCESS) + if (key.QueryValue(kProgramPathValue, path) == ERROR_SUCCESS) + { + NName::NormalizeDirPathPrefix(path); + return true; + } + return false; +} + +#endif + +CSysString GetBaseFolderPrefixFromRegistry() +{ + CSysString moduleFolderPrefix = GetLibraryFolderPrefix(); + NFind::CFileInfo fileInfo; + if (NFind::FindFile(moduleFolderPrefix + kMainDll, fileInfo)) + if (!fileInfo.IsDirectory()) + return moduleFolderPrefix; + if (NFind::FindFile(moduleFolderPrefix + kCodecsFolderName, fileInfo)) + if (fileInfo.IsDirectory()) + return moduleFolderPrefix; + if (NFind::FindFile(moduleFolderPrefix + kFormatsFolderName, fileInfo)) + if (fileInfo.IsDirectory()) + return moduleFolderPrefix; + #ifdef _WIN32 + CSysString path; + if (ReadPathFromRegistry(HKEY_CURRENT_USER, path)) + return path; + if (ReadPathFromRegistry(HKEY_LOCAL_MACHINE, path)) + return path; + #endif + return moduleFolderPrefix; +} + +typedef UInt32 (WINAPI *GetNumberOfMethodsFunc)(UInt32 *numMethods); +typedef UInt32 (WINAPI *GetNumberOfFormatsFunc)(UInt32 *numFormats); +typedef UInt32 (WINAPI *GetHandlerPropertyFunc)(PROPID propID, PROPVARIANT *value); +typedef UInt32 (WINAPI *GetHandlerPropertyFunc2)(UInt32 index, PROPID propID, PROPVARIANT *value); +typedef UInt32 (WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *iid, void **outObject); +typedef UInt32 (WINAPI *SetLargePageModeFunc)(); + + +static HRESULT GetCoderClass(GetMethodPropertyFunc getMethodProperty, UInt32 index, + PROPID propId, CLSID &clsId, bool &isAssigned) +{ + NWindows::NCOM::CPropVariant prop; + isAssigned = false; + RINOK(getMethodProperty(index, propId, &prop)); + if (prop.vt == VT_BSTR) + { + isAssigned = true; + clsId = *(const GUID *)prop.bstrVal; + } + else if (prop.vt != VT_EMPTY) + return E_FAIL; + return S_OK; +} + +HRESULT CCodecs::LoadCodecs() +{ + CCodecLib &lib = Libs.Back(); + lib.GetMethodProperty = (GetMethodPropertyFunc)lib.Lib.GetProcAddress("GetMethodProperty"); + if (lib.GetMethodProperty == NULL) + return S_OK; + + UInt32 numMethods = 1; + GetNumberOfMethodsFunc getNumberOfMethodsFunc = (GetNumberOfMethodsFunc)lib.Lib.GetProcAddress("GetNumberOfMethods"); + if (getNumberOfMethodsFunc != NULL) + { + RINOK(getNumberOfMethodsFunc(&numMethods)); + } + + for(UInt32 i = 0; i < numMethods; i++) + { + CDllCodecInfo info; + info.LibIndex = Libs.Size() - 1; + info.CodecIndex = i; + + RINOK(GetCoderClass(lib.GetMethodProperty, i, NMethodPropID::kEncoder, info.Encoder, info.EncoderIsAssigned)); + RINOK(GetCoderClass(lib.GetMethodProperty, i, NMethodPropID::kDecoder, info.Decoder, info.DecoderIsAssigned)); + + Codecs.Add(info); + } + return S_OK; +} + +static HRESULT ReadProp( + GetHandlerPropertyFunc getProp, + GetHandlerPropertyFunc2 getProp2, + UInt32 index, PROPID propID, NCOM::CPropVariant &prop) +{ + if (getProp2) + return getProp2(index, propID, &prop);; + return getProp(propID, &prop); +} + +static HRESULT ReadBoolProp( + GetHandlerPropertyFunc getProp, + GetHandlerPropertyFunc2 getProp2, + UInt32 index, PROPID propID, bool &res) +{ + NCOM::CPropVariant prop; + RINOK(ReadProp(getProp, getProp2, index, propID, prop)); + if (prop.vt == VT_BOOL) + res = VARIANT_BOOLToBool(prop.boolVal); + else if (prop.vt != VT_EMPTY) + return E_FAIL; + return S_OK; +} + +static HRESULT ReadStringProp( + GetHandlerPropertyFunc getProp, + GetHandlerPropertyFunc2 getProp2, + UInt32 index, PROPID propID, UString &res) +{ + NCOM::CPropVariant prop; + RINOK(ReadProp(getProp, getProp2, index, propID, prop)); + if (prop.vt == VT_BSTR) + res = prop.bstrVal; + else if (prop.vt != VT_EMPTY) + return E_FAIL; + return S_OK; +} + +#endif + +static const unsigned int kNumArcsMax = 32; +static unsigned int g_NumArcs = 0; +static const CArcInfo *g_Arcs[kNumArcsMax]; +void RegisterArc(const CArcInfo *arcInfo) +{ + if (g_NumArcs < kNumArcsMax) + g_Arcs[g_NumArcs++] = arcInfo; +} + +static void SplitString(const UString &srcString, UStringVector &destStrings) +{ + destStrings.Clear(); + UString s; + int len = srcString.Length(); + if (len == 0) + return; + for (int i = 0; i < len; i++) + { + wchar_t c = srcString[i]; + if (c == L' ') + { + if (!s.IsEmpty()) + { + destStrings.Add(s); + s.Empty(); + } + } + else + s += c; + } + if (!s.IsEmpty()) + destStrings.Add(s); +} + +void CArcInfoEx::AddExts(const wchar_t* ext, const wchar_t* addExt) +{ + UStringVector exts, addExts; + SplitString(ext, exts); + if (addExt != 0) + SplitString(addExt, addExts); + for (int i = 0; i < exts.Size(); i++) + { + CArcExtInfo extInfo; + extInfo.Ext = exts[i]; + if (i < addExts.Size()) + { + extInfo.AddExt = addExts[i]; + if (extInfo.AddExt == L"*") + extInfo.AddExt.Empty(); + } + Exts.Add(extInfo); + } +} + +#ifdef EXTERNAL_CODECS + +HRESULT CCodecs::LoadFormats() +{ + const NDLL::CLibrary &lib = Libs.Back().Lib; + GetHandlerPropertyFunc getProp = 0; + GetHandlerPropertyFunc2 getProp2 = (GetHandlerPropertyFunc2) + lib.GetProcAddress("GetHandlerProperty2"); + if (getProp2 == NULL) + { + getProp = (GetHandlerPropertyFunc) + lib.GetProcAddress("GetHandlerProperty"); + if (getProp == NULL) + return S_OK; + } + + UInt32 numFormats = 1; + GetNumberOfFormatsFunc getNumberOfFormats = (GetNumberOfFormatsFunc) + lib.GetProcAddress("GetNumberOfFormats"); + if (getNumberOfFormats != NULL) + { + RINOK(getNumberOfFormats(&numFormats)); + } + if (getProp2 == NULL) + numFormats = 1; + + for(UInt32 i = 0; i < numFormats; i++) + { + CArcInfoEx item; + item.LibIndex = Libs.Size() - 1; + item.FormatIndex = i; + + RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kName, item.Name)); + + NCOM::CPropVariant prop; + if (ReadProp(getProp, getProp2, i, NArchive::kClassID, prop) != S_OK) + continue; + if (prop.vt != VT_BSTR) + continue; + item.ClassID = *(const GUID *)prop.bstrVal; + prop.Clear(); + + UString ext, addExt; + RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kExtension, ext)); + RINOK(ReadStringProp(getProp, getProp2, i, NArchive::kAddExtension, addExt)); + item.AddExts(ext, addExt); + + ReadBoolProp(getProp, getProp2, i, NArchive::kUpdate, item.UpdateEnabled); + if (item.UpdateEnabled) + ReadBoolProp(getProp, getProp2, i, NArchive::kKeepName, item.KeepName); + + if (ReadProp(getProp, getProp2, i, NArchive::kStartSignature, prop) == S_OK) + if (prop.vt == VT_BSTR) + { + UINT len = ::SysStringByteLen(prop.bstrVal); + item.StartSignature.SetCapacity(len); + memmove(item.StartSignature, prop.bstrVal, len); + } + Formats.Add(item); + } + return S_OK; +} + +#ifdef NEW_FOLDER_INTERFACE +void CCodecLib::LoadIcons() +{ + UString iconTypes = MyLoadStringW((HMODULE)Lib, kIconTypesResId); + UStringVector pairs; + SplitString(iconTypes, pairs); + for (int i = 0; i < pairs.Size(); i++) + { + const UString &s = pairs[i]; + int pos = s.Find(L':'); + if (pos < 0) + continue; + CIconPair iconPair; + const wchar_t *end; + UString num = s.Mid(pos + 1); + iconPair.IconIndex = (UInt32)ConvertStringToUInt64(num, &end); + if (*end != L'\0') + continue; + iconPair.Ext = s.Left(pos); + IconPairs.Add(iconPair); + } +} + +int CCodecLib::FindIconIndex(const UString &ext) const +{ + for (int i = 0; i < IconPairs.Size(); i++) + { + const CIconPair &pair = IconPairs[i]; + if (ext.CompareNoCase(pair.Ext) == 0) + return pair.IconIndex; + } + return -1; +} +#endif + +#ifdef _7ZIP_LARGE_PAGES +extern "C" +{ + extern SIZE_T g_LargePageSize; +} +#endif + +HRESULT CCodecs::LoadDll(const CSysString &dllPath) +{ + { + NDLL::CLibrary library; + if (!library.LoadEx(dllPath, LOAD_LIBRARY_AS_DATAFILE)) + return S_OK; + } + Libs.Add(CCodecLib()); + CCodecLib &lib = Libs.Back(); + #ifdef NEW_FOLDER_INTERFACE + lib.Path = dllPath; + #endif + bool used = false; + HRESULT res = S_OK; + if (lib.Lib.Load(dllPath)) + { + #ifdef NEW_FOLDER_INTERFACE + lib.LoadIcons(); + #endif + + #ifdef _7ZIP_LARGE_PAGES + if (g_LargePageSize != 0) + { + SetLargePageModeFunc setLargePageMode = (SetLargePageModeFunc)lib.Lib.GetProcAddress("SetLargePageMode"); + if (setLargePageMode != 0) + setLargePageMode(); + } + #endif + + lib.CreateObject = (CreateObjectFunc)lib.Lib.GetProcAddress("CreateObject"); + if (lib.CreateObject != 0) + { + int startSize = Codecs.Size(); + res = LoadCodecs(); + used = (Codecs.Size() != startSize); + if (res == S_OK) + { + startSize = Formats.Size(); + res = LoadFormats(); + used = used || (Formats.Size() != startSize); + } + } + } + if (!used) + Libs.DeleteBack(); + return res; +} + +HRESULT CCodecs::LoadDllsFromFolder(const CSysString &folderPrefix) +{ + NFile::NFind::CEnumerator enumerator(folderPrefix + CSysString(TEXT("*"))); + NFile::NFind::CFileInfo fileInfo; + while (enumerator.Next(fileInfo)) + { + if (fileInfo.IsDirectory()) + continue; + RINOK(LoadDll(folderPrefix + fileInfo.Name)); + } + return S_OK; +} + +#endif + +#ifndef _SFX +static inline void SetBuffer(CByteBuffer &bb, const Byte *data, int size) +{ + bb.SetCapacity(size); + memmove((Byte *)bb, data, size); +} +#endif + +HRESULT CCodecs::Load() +{ + Formats.Clear(); + #ifdef EXTERNAL_CODECS + Codecs.Clear(); + #endif + for (UInt32 i = 0; i < g_NumArcs; i++) + { + const CArcInfo &arc = *g_Arcs[i]; + CArcInfoEx item; + item.Name = arc.Name; + item.CreateInArchive = arc.CreateInArchive; + item.CreateOutArchive = arc.CreateOutArchive; + item.AddExts(arc.Ext, arc.AddExt); + item.UpdateEnabled = (arc.CreateOutArchive != 0); + item.KeepName = arc.KeepName; + + #ifndef _SFX + SetBuffer(item.StartSignature, arc.Signature, arc.SignatureSize); + #endif + Formats.Add(item); + } + #ifdef EXTERNAL_CODECS + const CSysString baseFolder = GetBaseFolderPrefixFromRegistry(); + RINOK(LoadDll(baseFolder + kMainDll)); + RINOK(LoadDllsFromFolder(baseFolder + kCodecsFolderName TEXT(STRING_PATH_SEPARATOR))); + RINOK(LoadDllsFromFolder(baseFolder + kFormatsFolderName TEXT(STRING_PATH_SEPARATOR))); + #endif + return S_OK; +} + +int CCodecs::FindFormatForArchiveName(const UString &archivePath) const +{ + int slashPos1 = archivePath.ReverseFind(L'\\'); + int slashPos2 = archivePath.ReverseFind(L'.'); + int dotPos = archivePath.ReverseFind(L'.'); + if (dotPos < 0 || dotPos < slashPos1 || dotPos < slashPos2) + return -1; + UString ext = archivePath.Mid(dotPos + 1); + for (int i = 0; i < Formats.Size(); i++) + { + const CArcInfoEx &arc = Formats[i]; + if (!arc.UpdateEnabled) + continue; + // if (arc.FindExtension(ext) >= 0) + UString mainExt = arc.GetMainExt(); + if (!mainExt.IsEmpty() && ext.CompareNoCase(mainExt) == 0) + return i; + } + return -1; +} + +int CCodecs::FindFormatForArchiveType(const UString &arcType) const +{ + for (int i = 0; i < Formats.Size(); i++) + { + const CArcInfoEx &arc = Formats[i]; + if (!arc.UpdateEnabled) + continue; + if (arc.Name.CompareNoCase(arcType) == 0) + return i; + } + return -1; +} + +#ifdef EXTERNAL_CODECS + +#ifdef EXPORT_CODECS +extern unsigned int g_NumCodecs; +STDAPI CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject); +STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value); +// STDAPI GetNumberOfMethods(UINT32 *numCodecs); +#endif + +STDMETHODIMP CCodecs::GetNumberOfMethods(UINT32 *numMethods) +{ + *numMethods = + #ifdef EXPORT_CODECS + g_NumCodecs + + #endif + Codecs.Size(); + return S_OK; +} + +STDMETHODIMP CCodecs::GetProperty(UINT32 index, PROPID propID, PROPVARIANT *value) +{ + #ifdef EXPORT_CODECS + if (index < g_NumCodecs) + return GetMethodProperty(index, propID, value); + #endif + + const CDllCodecInfo &ci = Codecs[index + #ifdef EXPORT_CODECS + - g_NumCodecs + #endif + ]; + + if (propID == NMethodPropID::kDecoderIsAssigned) + { + NWindows::NCOM::CPropVariant propVariant; + propVariant = ci.DecoderIsAssigned; + propVariant.Detach(value); + return S_OK; + } + if (propID == NMethodPropID::kEncoderIsAssigned) + { + NWindows::NCOM::CPropVariant propVariant; + propVariant = ci.EncoderIsAssigned; + propVariant.Detach(value); + return S_OK; + } + return Libs[ci.LibIndex].GetMethodProperty(ci.CodecIndex, propID, value); +} + +STDMETHODIMP CCodecs::CreateDecoder(UINT32 index, const GUID *iid, void **coder) +{ + #ifdef EXPORT_CODECS + if (index < g_NumCodecs) + return CreateCoder2(false, index, iid, coder); + #endif + const CDllCodecInfo &ci = Codecs[index + #ifdef EXPORT_CODECS + - g_NumCodecs + #endif + ]; + if (ci.DecoderIsAssigned) + return Libs[ci.LibIndex].CreateObject(&ci.Decoder, iid, (void **)coder); + return S_OK; +} + +STDMETHODIMP CCodecs::CreateEncoder(UINT32 index, const GUID *iid, void **coder) +{ + #ifdef EXPORT_CODECS + if (index < g_NumCodecs) + return CreateCoder2(true, index, iid, coder); + #endif + const CDllCodecInfo &ci = Codecs[index + #ifdef EXPORT_CODECS + - g_NumCodecs + #endif + ]; + if (ci.EncoderIsAssigned) + return Libs[ci.LibIndex].CreateObject(&ci.Encoder, iid, (void **)coder); + return S_OK; +} + +HRESULT CCodecs::CreateCoder(const UString &name, bool encode, CMyComPtr &coder) const +{ + for (int i = 0; i < Codecs.Size(); i++) + { + const CDllCodecInfo &codec = Codecs[i]; + if (encode && !codec.EncoderIsAssigned || !encode && !codec.DecoderIsAssigned) + continue; + const CCodecLib &lib = Libs[codec.LibIndex]; + UString res; + NWindows::NCOM::CPropVariant prop; + RINOK(lib.GetMethodProperty(codec.CodecIndex, NMethodPropID::kName, &prop)); + if (prop.vt == VT_BSTR) + res = prop.bstrVal; + else if (prop.vt != VT_EMPTY) + continue; + if (name.CompareNoCase(res) == 0) + return lib.CreateObject(encode ? &codec.Encoder : &codec.Decoder, &IID_ICompressCoder, (void **)&coder); + } + return CLASS_E_CLASSNOTAVAILABLE; +} + +int CCodecs::GetCodecLibIndex(UInt32 index) +{ + #ifdef EXPORT_CODECS + if (index < g_NumCodecs) + return -1; + #endif + #ifdef EXTERNAL_CODECS + const CDllCodecInfo &ci = Codecs[index + #ifdef EXPORT_CODECS + - g_NumCodecs + #endif + ]; + return ci.LibIndex; + #else + return -1; + #endif +} + +bool CCodecs::GetCodecEncoderIsAssigned(UInt32 index) +{ + #ifdef EXPORT_CODECS + if (index < g_NumCodecs) + { + NWindows::NCOM::CPropVariant prop; + if (GetProperty(index, NMethodPropID::kEncoder, &prop) == S_OK) + if (prop.vt != VT_EMPTY) + return true; + return false; + } + #endif + #ifdef EXTERNAL_CODECS + const CDllCodecInfo &ci = Codecs[index + #ifdef EXPORT_CODECS + - g_NumCodecs + #endif + ]; + return ci.EncoderIsAssigned; + #else + return false; + #endif +} + +HRESULT CCodecs::GetCodecId(UInt32 index, UInt64 &id) +{ + UString s; + NWindows::NCOM::CPropVariant prop; + RINOK(GetProperty(index, NMethodPropID::kID, &prop)); + if (prop.vt != VT_UI8) + return E_INVALIDARG; + id = prop.uhVal.QuadPart; + return S_OK; +} + +UString CCodecs::GetCodecName(UInt32 index) +{ + UString s; + NWindows::NCOM::CPropVariant prop; + if (GetProperty(index, NMethodPropID::kName, &prop) == S_OK) + if (prop.vt == VT_BSTR) + s = prop.bstrVal; + return s; +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/LoadCodecs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/LoadCodecs.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,215 @@ +// LoadCodecs.h + +#ifndef __LOADCODECS_H +#define __LOADCODECS_H + +#include "../../../Common/Types.h" +#include "../../../Common/MyCom.h" +#include "../../../Common/MyString.h" +#include "../../../Common/Buffer.h" +#include "../../ICoder.h" + +#ifdef EXTERNAL_CODECS +#include "../../../Windows/DLL.h" +#endif + +struct CDllCodecInfo +{ + CLSID Encoder; + CLSID Decoder; + bool EncoderIsAssigned; + bool DecoderIsAssigned; + int LibIndex; + UInt32 CodecIndex; +}; + +#include "../../Archive/IArchive.h" + +typedef IInArchive * (*CreateInArchiveP)(); +typedef IOutArchive * (*CreateOutArchiveP)(); + +struct CArcExtInfo +{ + UString Ext; + UString AddExt; + CArcExtInfo() {} + CArcExtInfo(const UString &ext): Ext(ext) {} + CArcExtInfo(const UString &ext, const UString &addExt): Ext(ext), AddExt(addExt) {} +}; + + +struct CArcInfoEx +{ + #ifdef EXTERNAL_CODECS + int LibIndex; + UInt32 FormatIndex; + CLSID ClassID; + #endif + bool UpdateEnabled; + CreateInArchiveP CreateInArchive; + CreateOutArchiveP CreateOutArchive; + UString Name; + CObjectVector Exts; + #ifndef _SFX + CByteBuffer StartSignature; + // CByteBuffer FinishSignature; + #ifdef NEW_FOLDER_INTERFACE + UStringVector AssociateExts; + #endif + #endif + bool KeepName; + UString GetMainExt() const + { + if (Exts.IsEmpty()) + return UString(); + return Exts[0].Ext; + } + int FindExtension(const UString &ext) const + { + for (int i = 0; i < Exts.Size(); i++) + if (ext.CompareNoCase(Exts[i].Ext) == 0) + return i; + return -1; + } + UString GetAllExtensions() const + { + UString s; + for (int i = 0; i < Exts.Size(); i++) + { + if (i > 0) + s += ' '; + s += Exts[i].Ext; + } + return s; + } + + void AddExts(const wchar_t* ext, const wchar_t* addExt); + + CArcInfoEx(): + #ifdef EXTERNAL_CODECS + LibIndex(-1), + #endif + UpdateEnabled(false), + CreateInArchive(0), CreateOutArchive(0), + KeepName(false) + #ifndef _SFX + #endif + {} +}; + +#ifdef EXTERNAL_CODECS +typedef UInt32 (WINAPI *GetMethodPropertyFunc)(UInt32 index, PROPID propID, PROPVARIANT *value); +typedef UInt32 (WINAPI *CreateObjectFunc)(const GUID *clsID, const GUID *interfaceID, void **outObject); + + +struct CCodecLib +{ + NWindows::NDLL::CLibrary Lib; + GetMethodPropertyFunc GetMethodProperty; + CreateObjectFunc CreateObject; + #ifdef NEW_FOLDER_INTERFACE + struct CIconPair + { + UString Ext; + UInt32 IconIndex; + }; + CSysString Path; + CObjectVector IconPairs; + void LoadIcons(); + int FindIconIndex(const UString &ext) const; + #endif + CCodecLib(): GetMethodProperty(0) {} +}; +#endif + +class CCodecs: + #ifdef EXTERNAL_CODECS + public ICompressCodecsInfo, + #else + public IUnknown, + #endif + public CMyUnknownImp +{ +public: + #ifdef EXTERNAL_CODECS + CObjectVector Libs; + CObjectVector Codecs; + HRESULT LoadCodecs(); + HRESULT LoadFormats(); + HRESULT LoadDll(const CSysString &path); + HRESULT LoadDllsFromFolder(const CSysString &folderPrefix); + + HRESULT CreateArchiveHandler(const CArcInfoEx &ai, void **archive, bool outHandler) const + { + return Libs[ai.LibIndex].CreateObject(&ai.ClassID, outHandler ? &IID_IOutArchive : &IID_IInArchive, (void **)archive); + } + #endif + +public: + CObjectVector Formats; + HRESULT Load(); + int FindFormatForArchiveName(const UString &archivePath) const; + int FindFormatForArchiveType(const UString &arcType) const; + + MY_UNKNOWN_IMP + + #ifdef EXTERNAL_CODECS + STDMETHOD(GetNumberOfMethods)(UINT32 *numMethods); + STDMETHOD(GetProperty)(UINT32 index, PROPID propID, PROPVARIANT *value); + STDMETHOD(CreateDecoder)(UINT32 index, const GUID *interfaceID, void **coder); + STDMETHOD(CreateEncoder)(UINT32 index, const GUID *interfaceID, void **coder); + #endif + + int GetCodecLibIndex(UInt32 index); + bool GetCodecEncoderIsAssigned(UInt32 index); + HRESULT GetCodecId(UInt32 index, UInt64 &id); + UString GetCodecName(UInt32 index); + + HRESULT CreateInArchive(int formatIndex, CMyComPtr &archive) const + { + const CArcInfoEx &ai = Formats[formatIndex]; + #ifdef EXTERNAL_CODECS + if (ai.LibIndex < 0) + #endif + { + archive = ai.CreateInArchive(); + return S_OK; + } + #ifdef EXTERNAL_CODECS + return CreateArchiveHandler(ai, (void **)&archive, false); + #endif + } + HRESULT CreateOutArchive(int formatIndex, CMyComPtr &archive) const + { + const CArcInfoEx &ai = Formats[formatIndex]; + #ifdef EXTERNAL_CODECS + if (ai.LibIndex < 0) + #endif + { + archive = ai.CreateOutArchive(); + return S_OK; + } + #ifdef EXTERNAL_CODECS + return CreateArchiveHandler(ai, (void **)&archive, true); + #endif + } + int FindOutFormatFromName(const UString &name) const + { + for (int i = 0; i < Formats.Size(); i++) + { + const CArcInfoEx &arc = Formats[i]; + if (!arc.UpdateEnabled) + continue; + if (arc.Name.CompareNoCase(name) == 0) + return i; + } + return -1; + } + + #ifdef EXTERNAL_CODECS + HRESULT CreateCoder(const UString &name, bool encode, CMyComPtr &coder) const; + #endif + +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/OpenArchive.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/OpenArchive.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,461 @@ +// OpenArchive.cpp + +#include "StdAfx.h" + +#include "OpenArchive.h" + +#include "Common/Wildcard.h" + +#include "Windows/FileName.h" +#include "Windows/FileDir.h" +#include "Windows/Defs.h" +#include "Windows/PropVariant.h" + +#include "../../Common/FileStreams.h" +#include "../../Common/StreamUtils.h" + +#include "Common/StringConvert.h" + +#include "DefaultName.h" + +using namespace NWindows; + +HRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, UString &result) +{ + NCOM::CPropVariant prop; + RINOK(archive->GetProperty(index, kpidPath, &prop)); + if(prop.vt == VT_BSTR) + result = prop.bstrVal; + else if (prop.vt == VT_EMPTY) + result.Empty(); + else + return E_FAIL; + return S_OK; +} + +HRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, const UString &defaultName, UString &result) +{ + RINOK(GetArchiveItemPath(archive, index, result)); + if (result.IsEmpty()) + result = defaultName; + return S_OK; +} + +HRESULT GetArchiveItemFileTime(IInArchive *archive, UInt32 index, + const FILETIME &defaultFileTime, FILETIME &fileTime) +{ + NCOM::CPropVariant prop; + RINOK(archive->GetProperty(index, kpidLastWriteTime, &prop)); + if (prop.vt == VT_FILETIME) + fileTime = prop.filetime; + else if (prop.vt == VT_EMPTY) + fileTime = defaultFileTime; + else + return E_FAIL; + return S_OK; +} + +HRESULT IsArchiveItemProp(IInArchive *archive, UInt32 index, PROPID propID, bool &result) +{ + NCOM::CPropVariant prop; + RINOK(archive->GetProperty(index, propID, &prop)); + if(prop.vt == VT_BOOL) + result = VARIANT_BOOLToBool(prop.boolVal); + else if (prop.vt == VT_EMPTY) + result = false; + else + return E_FAIL; + return S_OK; +} + +HRESULT IsArchiveItemFolder(IInArchive *archive, UInt32 index, bool &result) +{ + return IsArchiveItemProp(archive, index, kpidIsFolder, result); +} + +HRESULT IsArchiveItemAnti(IInArchive *archive, UInt32 index, bool &result) +{ + return IsArchiveItemProp(archive, index, kpidIsAnti, result); +} + +// Static-SFX (for Linux) can be big. +const UInt64 kMaxCheckStartPosition = 1 << 22; + +HRESULT ReOpenArchive(IInArchive *archive, const UString &fileName, IArchiveOpenCallback *openArchiveCallback) +{ + CInFileStream *inStreamSpec = new CInFileStream; + CMyComPtr inStream(inStreamSpec); + inStreamSpec->Open(fileName); + return archive->Open(inStream, &kMaxCheckStartPosition, openArchiveCallback); +} + +#ifndef _SFX +static inline bool TestSignature(const Byte *p1, const Byte *p2, size_t size) +{ + for (size_t i = 0; i < size; i++) + if (p1[i] != p2[i]) + return false; + return true; +} +#endif + +HRESULT OpenArchive( + CCodecs *codecs, + IInStream *inStream, + const UString &fileName, + IInArchive **archiveResult, + int &formatIndex, + UString &defaultItemName, + IArchiveOpenCallback *openArchiveCallback) +{ + *archiveResult = NULL; + UString extension; + { + int dotPos = fileName.ReverseFind(L'.'); + if (dotPos >= 0) + extension = fileName.Mid(dotPos + 1); + } + CIntVector orderIndices; + int i; + int numFinded = 0; + for (i = 0; i < codecs->Formats.Size(); i++) + if (codecs->Formats[i].FindExtension(extension) >= 0) + orderIndices.Insert(numFinded++, i); + else + orderIndices.Add(i); + + #ifndef _SFX + if (numFinded != 1) + { + CIntVector orderIndices2; + CByteBuffer byteBuffer; + const UInt32 kBufferSize = (200 << 10); + byteBuffer.SetCapacity(kBufferSize); + Byte *buffer = byteBuffer; + RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); + UInt32 processedSize; + RINOK(ReadStream(inStream, buffer, kBufferSize, &processedSize)); + for (UInt32 pos = 0; pos < processedSize; pos++) + { + for (int i = 0; i < orderIndices.Size(); i++) + { + int index = orderIndices[i]; + const CArcInfoEx &ai = codecs->Formats[index]; + const CByteBuffer &sig = ai.StartSignature; + if (sig.GetCapacity() == 0) + continue; + if (pos + sig.GetCapacity() > processedSize) + continue; + if (TestSignature(buffer + pos, sig, sig.GetCapacity())) + { + orderIndices2.Add(index); + orderIndices.Delete(i--); + } + } + } + orderIndices2 += orderIndices; + orderIndices = orderIndices2; + } + else if (extension == L"000" || extension == L"001") + { + CByteBuffer byteBuffer; + const UInt32 kBufferSize = (1 << 10); + byteBuffer.SetCapacity(kBufferSize); + Byte *buffer = byteBuffer; + RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); + UInt32 processedSize; + RINOK(ReadStream(inStream, buffer, kBufferSize, &processedSize)); + if (processedSize >= 16) + { + Byte kRarHeader[] = {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}; + if (TestSignature(buffer, kRarHeader, 7) && buffer[9] == 0x73 && (buffer[10] && 1) != 0) + { + for (int i = 0; i < orderIndices.Size(); i++) + { + int index = orderIndices[i]; + const CArcInfoEx &ai = codecs->Formats[index]; + if (ai.Name.CompareNoCase(L"rar") != 0) + continue; + orderIndices.Delete(i--); + orderIndices.Insert(0, index); + break; + } + } + } + } + #endif + + HRESULT badResult = S_OK; + for(i = 0; i < orderIndices.Size(); i++) + { + inStream->Seek(0, STREAM_SEEK_SET, NULL); + + CMyComPtr archive; + + formatIndex = orderIndices[i]; + RINOK(codecs->CreateInArchive(formatIndex, archive)); + if (!archive) + continue; + + #ifdef EXTERNAL_CODECS + { + CMyComPtr setCompressCodecsInfo; + archive.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo); + if (setCompressCodecsInfo) + { + RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecs)); + } + } + #endif + + HRESULT result = archive->Open(inStream, &kMaxCheckStartPosition, openArchiveCallback); + if (result == S_FALSE) + continue; + if(result != S_OK) + { + badResult = result; + if(result == E_ABORT) + break; + continue; + } + *archiveResult = archive.Detach(); + const CArcInfoEx &format = codecs->Formats[formatIndex]; + if (format.Exts.Size() == 0) + { + defaultItemName = GetDefaultName2(fileName, L"", L""); + } + else + { + int subExtIndex = format.FindExtension(extension); + if (subExtIndex < 0) + subExtIndex = 0; + defaultItemName = GetDefaultName2(fileName, + format.Exts[subExtIndex].Ext, + format.Exts[subExtIndex].AddExt); + } + return S_OK; + } + if (badResult != S_OK) + return badResult; + return S_FALSE; +} + +HRESULT OpenArchive( + CCodecs *codecs, + const UString &filePath, + IInArchive **archiveResult, + int &formatIndex, + UString &defaultItemName, + IArchiveOpenCallback *openArchiveCallback) +{ + CInFileStream *inStreamSpec = new CInFileStream; + CMyComPtr inStream(inStreamSpec); + if (!inStreamSpec->Open(filePath)) + return GetLastError(); + return OpenArchive(codecs, inStream, ExtractFileNameFromPath(filePath), + archiveResult, formatIndex, + defaultItemName, openArchiveCallback); +} + +static void MakeDefaultName(UString &name) +{ + int dotPos = name.ReverseFind(L'.'); + if (dotPos < 0) + return; + UString ext = name.Mid(dotPos + 1); + if (ext.IsEmpty()) + return; + for (int pos = 0; pos < ext.Length(); pos++) + if (ext[pos] < L'0' || ext[pos] > L'9') + return; + name = name.Left(dotPos); +} + +HRESULT OpenArchive( + CCodecs *codecs, + const UString &fileName, + IInArchive **archive0, + IInArchive **archive1, + int &formatIndex0, + int &formatIndex1, + UString &defaultItemName0, + UString &defaultItemName1, + IArchiveOpenCallback *openArchiveCallback) +{ + HRESULT result = OpenArchive(codecs, fileName, + archive0, formatIndex0, defaultItemName0, openArchiveCallback); + RINOK(result); + CMyComPtr getStream; + result = (*archive0)->QueryInterface(IID_IInArchiveGetStream, (void **)&getStream); + if (result != S_OK || getStream == 0) + return S_OK; + + CMyComPtr subSeqStream; + result = getStream->GetStream(0, &subSeqStream); + if (result != S_OK) + return S_OK; + + CMyComPtr subStream; + if (subSeqStream.QueryInterface(IID_IInStream, &subStream) != S_OK) + return S_OK; + if (!subStream) + return S_OK; + + UInt32 numItems; + RINOK((*archive0)->GetNumberOfItems(&numItems)); + if (numItems < 1) + return S_OK; + + UString subPath; + RINOK(GetArchiveItemPath(*archive0, 0, subPath)) + if (subPath.IsEmpty()) + { + MakeDefaultName(defaultItemName0); + subPath = defaultItemName0; + const CArcInfoEx &format = codecs->Formats[formatIndex0]; + if (format.Name.CompareNoCase(L"7z") == 0) + { + if (subPath.Right(3).CompareNoCase(L".7z") != 0) + subPath += L".7z"; + } + } + else + subPath = ExtractFileNameFromPath(subPath); + + CMyComPtr setSubArchiveName; + openArchiveCallback->QueryInterface(IID_IArchiveOpenSetSubArchiveName, (void **)&setSubArchiveName); + if (setSubArchiveName) + setSubArchiveName->SetSubArchiveName(subPath); + + result = OpenArchive(codecs, subStream, subPath, + archive1, formatIndex1, defaultItemName1, openArchiveCallback); + return S_OK; +} + +static void SetCallback(const UString &archiveName, + IOpenCallbackUI *openCallbackUI, CMyComPtr &openCallback) +{ + COpenCallbackImp *openCallbackSpec = new COpenCallbackImp; + openCallback = openCallbackSpec; + openCallbackSpec->Callback = openCallbackUI; + + UString fullName; + int fileNamePartStartIndex; + NFile::NDirectory::MyGetFullPathName(archiveName, fullName, fileNamePartStartIndex); + openCallbackSpec->Init( + fullName.Left(fileNamePartStartIndex), + fullName.Mid(fileNamePartStartIndex)); +} + +HRESULT MyOpenArchive( + CCodecs *codecs, + const UString &archiveName, + IInArchive **archive, UString &defaultItemName, IOpenCallbackUI *openCallbackUI) +{ + CMyComPtr openCallback; + SetCallback(archiveName, openCallbackUI, openCallback); + int formatInfo; + return OpenArchive(codecs, archiveName, archive, formatInfo, defaultItemName, openCallback); +} + +HRESULT MyOpenArchive( + CCodecs *codecs, + const UString &archiveName, + IInArchive **archive0, + IInArchive **archive1, + UString &defaultItemName0, + UString &defaultItemName1, + UStringVector &volumePaths, + UInt64 &volumesSize, + IOpenCallbackUI *openCallbackUI) +{ + volumesSize = 0; + COpenCallbackImp *openCallbackSpec = new COpenCallbackImp; + CMyComPtr openCallback = openCallbackSpec; + openCallbackSpec->Callback = openCallbackUI; + + UString fullName; + int fileNamePartStartIndex; + NFile::NDirectory::MyGetFullPathName(archiveName, fullName, fileNamePartStartIndex); + UString prefix = fullName.Left(fileNamePartStartIndex); + UString name = fullName.Mid(fileNamePartStartIndex); + openCallbackSpec->Init(prefix, name); + + int formatIndex0, formatIndex1; + RINOK(OpenArchive(codecs, archiveName, + archive0, + archive1, + formatIndex0, + formatIndex1, + defaultItemName0, + defaultItemName1, + openCallback)); + volumePaths.Add(prefix + name); + for (int i = 0; i < openCallbackSpec->FileNames.Size(); i++) + volumePaths.Add(prefix + openCallbackSpec->FileNames[i]); + volumesSize = openCallbackSpec->TotalSize; + return S_OK; +} + +HRESULT CArchiveLink::Close() +{ + if (Archive1 != 0) + RINOK(Archive1->Close()); + if (Archive0 != 0) + RINOK(Archive0->Close()); + IsOpen = false; + return S_OK; +} + +void CArchiveLink::Release() +{ + IsOpen = false; + Archive1.Release(); + Archive0.Release(); +} + +HRESULT OpenArchive( + CCodecs *codecs, + const UString &archiveName, + CArchiveLink &archiveLink, + IArchiveOpenCallback *openCallback) +{ + HRESULT res = OpenArchive(codecs, archiveName, + &archiveLink.Archive0, &archiveLink.Archive1, + archiveLink.FormatIndex0, archiveLink.FormatIndex1, + archiveLink.DefaultItemName0, archiveLink.DefaultItemName1, + openCallback); + archiveLink.IsOpen = (res == S_OK); + return res; +} + +HRESULT MyOpenArchive(CCodecs *codecs, + const UString &archiveName, + CArchiveLink &archiveLink, + IOpenCallbackUI *openCallbackUI) +{ + HRESULT res = MyOpenArchive(codecs, archiveName, + &archiveLink.Archive0, &archiveLink.Archive1, + archiveLink.DefaultItemName0, archiveLink.DefaultItemName1, + archiveLink.VolumePaths, + archiveLink.VolumesSize, + openCallbackUI); + archiveLink.IsOpen = (res == S_OK); + return res; +} + +HRESULT ReOpenArchive(CCodecs *codecs, CArchiveLink &archiveLink, const UString &fileName) +{ + if (archiveLink.GetNumLevels() > 1) + return E_NOTIMPL; + + if (archiveLink.GetNumLevels() == 0) + return MyOpenArchive(codecs, fileName, archiveLink, 0); + + CMyComPtr openCallback; + SetCallback(fileName, NULL, openCallback); + + HRESULT res = ReOpenArchive(archiveLink.GetArchive(), fileName, openCallback); + archiveLink.IsOpen = (res == S_OK); + return res; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/OpenArchive.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/OpenArchive.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,130 @@ +// OpenArchive.h + +#ifndef __OPENARCHIVE_H +#define __OPENARCHIVE_H + +#include "Common/MyString.h" +#include "Windows/FileFind.h" + +#include "../../Archive/IArchive.h" +#include "LoadCodecs.h" +#include "ArchiveOpenCallback.h" + +HRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, UString &result); +HRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, const UString &defaultName, UString &result); +HRESULT GetArchiveItemFileTime(IInArchive *archive, UInt32 index, + const FILETIME &defaultFileTime, FILETIME &fileTime); +HRESULT IsArchiveItemProp(IInArchive *archive, UInt32 index, PROPID propID, bool &result); +HRESULT IsArchiveItemFolder(IInArchive *archive, UInt32 index, bool &result); +HRESULT IsArchiveItemAnti(IInArchive *archive, UInt32 index, bool &result); + +struct ISetSubArchiveName +{ + virtual void SetSubArchiveName(const wchar_t *name) = 0; +}; + +HRESULT OpenArchive( + CCodecs *codecs, + IInStream *inStream, + const UString &fileName, + IInArchive **archiveResult, + int &formatIndex, + UString &defaultItemName, + IArchiveOpenCallback *openArchiveCallback); + +HRESULT OpenArchive( + CCodecs *codecs, + const UString &filePath, + IInArchive **archive, + int &formatIndex, + UString &defaultItemName, + IArchiveOpenCallback *openArchiveCallback); + +HRESULT OpenArchive( + CCodecs *codecs, + const UString &filePath, + IInArchive **archive0, + IInArchive **archive1, + int &formatIndex0, + int &formatIndex1, + UString &defaultItemName0, + UString &defaultItemName1, + IArchiveOpenCallback *openArchiveCallback); + + +HRESULT ReOpenArchive(IInArchive *archive, const UString &fileName, IArchiveOpenCallback *openArchiveCallback); + +HRESULT MyOpenArchive( + CCodecs *codecs, + const UString &archiveName, + IInArchive **archive, + UString &defaultItemName, + IOpenCallbackUI *openCallbackUI); + +HRESULT MyOpenArchive( + CCodecs *codecs, + const UString &archiveName, + IInArchive **archive0, + IInArchive **archive1, + UString &defaultItemName0, + UString &defaultItemName1, + UStringVector &volumePaths, + UInt64 &volumesSize, + IOpenCallbackUI *openCallbackUI); + +struct CArchiveLink +{ + CMyComPtr Archive0; + CMyComPtr Archive1; + UString DefaultItemName0; + UString DefaultItemName1; + + int FormatIndex0; + int FormatIndex1; + + UStringVector VolumePaths; + + UInt64 VolumesSize; + + int GetNumLevels() const + { + int result = 0; + if (Archive0) + { + result++; + if (Archive1) + result++; + } + return result; + } + + bool IsOpen; + + CArchiveLink(): IsOpen(false), VolumesSize(0) {}; + + IInArchive *GetArchive() { return Archive1 != 0 ? Archive1: Archive0; } + UString GetDefaultItemName() { return Archive1 != 0 ? DefaultItemName1: DefaultItemName0; } + int GetArchiverIndex() const { return Archive1 != 0 ? FormatIndex1: FormatIndex0; } + HRESULT Close(); + void Release(); +}; + +HRESULT OpenArchive( + CCodecs *codecs, + const UString &archiveName, + CArchiveLink &archiveLink, + IArchiveOpenCallback *openCallback); + +HRESULT MyOpenArchive( + CCodecs *codecs, + const UString &archiveName, + CArchiveLink &archiveLink, + IOpenCallbackUI *openCallbackUI); + +HRESULT ReOpenArchive( + CCodecs *codecs, + CArchiveLink &archiveLink, + const UString &fileName); + +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/PropIDUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/PropIDUtils.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,89 @@ +// PropIDUtils.cpp + +#include "StdAfx.h" + +#include "PropIDUtils.h" + +#include "Common/IntToString.h" +#include "Common/StringConvert.h" + +#include "Windows/FileFind.h" +#include "Windows/PropVariantConversions.h" + +#include "../../PropID.h" + +using namespace NWindows; + +static UString ConvertUInt32ToString(UInt32 value) +{ + wchar_t buffer[32]; + ConvertUInt64ToString(value, buffer); + return buffer; +} + +static void ConvertUInt32ToHex(UInt32 value, wchar_t *s) +{ + for (int i = 0; i < 8; i++) + { + int t = value & 0xF; + value >>= 4; + s[7 - i] = (wchar_t)((t < 10) ? (L'0' + t) : (L'A' + (t - 10))); + } + s[8] = L'\0'; +} + +UString ConvertPropertyToString(const PROPVARIANT &propVariant, PROPID propID, bool full) +{ + switch(propID) + { + case kpidCreationTime: + case kpidLastWriteTime: + case kpidLastAccessTime: + { + if (propVariant.vt != VT_FILETIME) + return UString(); // It is error; + FILETIME localFileTime; + if (propVariant.filetime.dwHighDateTime == 0 && + propVariant.filetime.dwLowDateTime == 0) + return UString(); + if (!::FileTimeToLocalFileTime(&propVariant.filetime, &localFileTime)) + return UString(); // It is error; + return ConvertFileTimeToString(localFileTime, true, full); + } + case kpidCRC: + { + if(propVariant.vt != VT_UI4) + break; + wchar_t temp[12]; + ConvertUInt32ToHex(propVariant.ulVal, temp); + return temp; + } + case kpidAttributes: + { + if(propVariant.vt != VT_UI4) + break; + UString result; + UInt32 attributes = propVariant.ulVal; + if (NFile::NFind::NAttributes::IsReadOnly(attributes)) result += L'R'; + if (NFile::NFind::NAttributes::IsHidden(attributes)) result += L'H'; + if (NFile::NFind::NAttributes::IsSystem(attributes)) result += L'S'; + if (NFile::NFind::NAttributes::IsDirectory(attributes)) result += L'D'; + if (NFile::NFind::NAttributes::IsArchived(attributes)) result += L'A'; + if (NFile::NFind::NAttributes::IsCompressed(attributes)) result += L'C'; + if (NFile::NFind::NAttributes::IsEncrypted(attributes)) result += L'E'; + return result; + } + case kpidDictionarySize: + { + if(propVariant.vt != VT_UI4) + break; + UInt32 size = propVariant.ulVal; + if (size % (1 << 20) == 0) + return ConvertUInt32ToString(size >> 20) + L"MB"; + if (size % (1 << 10) == 0) + return ConvertUInt32ToString(size >> 10) + L"KB"; + return ConvertUInt32ToString(size); + } + } + return ConvertPropVariantToString(propVariant); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/PropIDUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/PropIDUtils.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// PropIDUtils.h + +#ifndef __PROPIDUTILS_H +#define __PROPIDUTILS_H + +#include "Common/MyString.h" + +UString ConvertPropertyToString(const PROPVARIANT &propVariant, PROPID propID, bool full = true); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/Property.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/Property.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,14 @@ +// Property.h + +#ifndef __PROPERTY_H +#define __PROPERTY_H + +#include "Common/MyString.h" + +struct CProperty +{ + UString Name; + UString Value; +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/SetProperties.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/SetProperties.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,65 @@ +// SetProperties.cpp + +#include "StdAfx.h" + +#include "SetProperties.h" + +#include "Windows/PropVariant.h" +#include "Common/MyString.h" +#include "Common/StringToInt.h" +#include "Common/MyCom.h" + +#include "../../Archive/IArchive.h" + +using namespace NWindows; +using namespace NCOM; + +static void ParseNumberString(const UString &s, NCOM::CPropVariant &prop) +{ + const wchar_t *endPtr; + UInt64 result = ConvertStringToUInt64(s, &endPtr); + if (endPtr - (const wchar_t *)s != s.Length()) + prop = s; + else if (result <= 0xFFFFFFFF) + prop = (UInt32)result; + else + prop = result; +} + +HRESULT SetProperties(IUnknown *unknown, const CObjectVector &properties) +{ + if (properties.IsEmpty()) + return S_OK; + CMyComPtr setProperties; + unknown->QueryInterface(IID_ISetProperties, (void **)&setProperties); + if (!setProperties) + return S_OK; + + UStringVector realNames; + CPropVariant *values = new CPropVariant[properties.Size()]; + try + { + int i; + for(i = 0; i < properties.Size(); i++) + { + const CProperty &property = properties[i]; + NCOM::CPropVariant propVariant; + if (!property.Value.IsEmpty()) + ParseNumberString(property.Value, propVariant); + realNames.Add(property.Name); + values[i] = propVariant; + } + CRecordVector names; + for(i = 0; i < realNames.Size(); i++) + names.Add((const wchar_t *)realNames[i]); + + RINOK(setProperties->SetProperties(&names.Front(), values, names.Size())); + } + catch(...) + { + delete []values; + throw; + } + delete []values; + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/SetProperties.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/SetProperties.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// SetProperties.h + +#ifndef __SETPROPERTIES_H +#define __SETPROPERTIES_H + +#include "Property.h" + +HRESULT SetProperties(IUnknown *unknown, const CObjectVector &properties); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/SortUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/SortUtils.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,22 @@ +// SortUtils.cpp + +#include "StdAfx.h" + +#include "SortUtils.h" +#include "Common/Wildcard.h" + +static int CompareStrings(const int *p1, const int *p2, void *param) +{ + const UStringVector &strings = *(const UStringVector *)param; + return CompareFileNames(strings[*p1], strings[*p2]); +} + +void SortFileNames(const UStringVector &strings, CIntVector &indices) +{ + indices.Clear(); + int numItems = strings.Size(); + indices.Reserve(numItems); + for(int i = 0; i < numItems; i++) + indices.Add(i); + indices.Sort(CompareStrings, (void *)&strings); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/SortUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/SortUtils.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// SortUtils.h + +#ifndef __SORTUTLS_H +#define __SORTUTLS_H + +#include "Common/MyString.h" + +void SortFileNames(const UStringVector &strings, CIntVector &indices); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/TempFiles.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/TempFiles.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,22 @@ +// TempFiles.cpp + +#include "StdAfx.h" + +#include "TempFiles.h" + +#include "Windows/FileDir.h" +#include "Windows/FileIO.h" + +using namespace NWindows; +using namespace NFile; + +void CTempFiles::Clear() +{ + while(!Paths.IsEmpty()) + { + NDirectory::DeleteFileAlways((LPCWSTR)Paths.Back()); + Paths.DeleteBack(); + } +} + + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/TempFiles.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/TempFiles.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,16 @@ +// TempFiles.h + +#ifndef __TEMPFILES_H +#define __TEMPFILES_H + +#include "Common/MyString.h" + +class CTempFiles +{ + void Clear(); +public: + UStringVector Paths; + ~CTempFiles() { Clear(); } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/Update.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/Update.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,852 @@ +// Update.cpp + +#include "StdAfx.h" + +#ifdef _WIN32 +#include +#endif + +#include "Update.h" + +#include "Common/IntToString.h" +#include "Common/StringConvert.h" +#include "Common/CommandLineParser.h" + +#ifdef _WIN32 +#include "Windows/DLL.h" +#endif + +#include "Windows/Defs.h" +#include "Windows/FileDir.h" +#include "Windows/FileFind.h" +#include "Windows/FileName.h" +#include "Windows/PropVariant.h" +#include "Windows/PropVariantConversions.h" +// #include "Windows/Synchronization.h" + +#include "../../Common/FileStreams.h" +#include "../../Compress/Copy/CopyCoder.h" + +#include "../Common/DirItem.h" +#include "../Common/EnumDirItems.h" +#include "../Common/UpdateProduce.h" +#include "../Common/OpenArchive.h" + +#include "TempFiles.h" +#include "UpdateCallback.h" +#include "EnumDirItems.h" +#include "SetProperties.h" + +static const char *kUpdateIsNotSupoorted = + "update operations are not supported for this archive"; + +using namespace NCommandLineParser; +using namespace NWindows; +using namespace NCOM; +using namespace NFile; +using namespace NName; + +static const wchar_t *kTempFolderPrefix = L"7zE"; + +using namespace NUpdateArchive; + +static HRESULT CopyBlock(ISequentialInStream *inStream, ISequentialOutStream *outStream) +{ + CMyComPtr copyCoder = new NCompress::CCopyCoder; + return copyCoder->Code(inStream, outStream, NULL, NULL, NULL); +} + +class COutMultiVolStream: + public IOutStream, + public CMyUnknownImp +{ + int _streamIndex; // required stream + UInt64 _offsetPos; // offset from start of _streamIndex index + UInt64 _absPos; + UInt64 _length; + + struct CSubStreamInfo + { + COutFileStream *StreamSpec; + CMyComPtr Stream; + UString Name; + UInt64 Pos; + UInt64 RealSize; + }; + CObjectVector Streams; +public: + // CMyComPtr VolumeCallback; + CRecordVector Sizes; + UString Prefix; + CTempFiles *TempFiles; + + void Init() + { + _streamIndex = 0; + _offsetPos = 0; + _absPos = 0; + _length = 0; + } + + HRESULT Close(); + + MY_UNKNOWN_IMP1(IOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(SetSize)(Int64 newSize); +}; + +// static NSynchronization::CCriticalSection g_TempPathsCS; + +HRESULT COutMultiVolStream::Close() +{ + HRESULT res = S_OK; + for (int i = 0; i < Streams.Size(); i++) + { + CSubStreamInfo &s = Streams[i]; + if (s.StreamSpec) + { + HRESULT res2 = s.StreamSpec->Close(); + if (res2 != S_OK) + res = res2; + } + } + return res; +} + +STDMETHODIMP COutMultiVolStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if(processedSize != NULL) + *processedSize = 0; + while(size > 0) + { + if (_streamIndex >= Streams.Size()) + { + CSubStreamInfo subStream; + + wchar_t temp[32]; + ConvertUInt64ToString(_streamIndex + 1, temp); + UString res = temp; + while (res.Length() < 3) + res = UString(L'0') + res; + UString name = Prefix + res; + subStream.StreamSpec = new COutFileStream; + subStream.Stream = subStream.StreamSpec; + if(!subStream.StreamSpec->Create(name, false)) + return ::GetLastError(); + { + // NSynchronization::CCriticalSectionLock lock(g_TempPathsCS); + TempFiles->Paths.Add(name); + } + + subStream.Pos = 0; + subStream.RealSize = 0; + subStream.Name = name; + Streams.Add(subStream); + continue; + } + CSubStreamInfo &subStream = Streams[_streamIndex]; + + int index = _streamIndex; + if (index >= Sizes.Size()) + index = Sizes.Size() - 1; + UInt64 volSize = Sizes[index]; + + if (_offsetPos >= volSize) + { + _offsetPos -= volSize; + _streamIndex++; + continue; + } + if (_offsetPos != subStream.Pos) + { + // CMyComPtr outStream; + // RINOK(subStream.Stream.QueryInterface(IID_IOutStream, &outStream)); + RINOK(subStream.Stream->Seek(_offsetPos, STREAM_SEEK_SET, NULL)); + subStream.Pos = _offsetPos; + } + + UInt32 curSize = (UInt32)MyMin((UInt64)size, volSize - subStream.Pos); + UInt32 realProcessed; + RINOK(subStream.Stream->Write(data, curSize, &realProcessed)); + data = (void *)((Byte *)data + realProcessed); + size -= realProcessed; + subStream.Pos += realProcessed; + _offsetPos += realProcessed; + _absPos += realProcessed; + if (_absPos > _length) + _length = _absPos; + if (_offsetPos > subStream.RealSize) + subStream.RealSize = _offsetPos; + if(processedSize != NULL) + *processedSize += realProcessed; + if (subStream.Pos == volSize) + { + _streamIndex++; + _offsetPos = 0; + } + if (realProcessed == 0 && curSize != 0) + return E_FAIL; + break; + } + return S_OK; +} + +STDMETHODIMP COutMultiVolStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + if(seekOrigin >= 3) + return STG_E_INVALIDFUNCTION; + switch(seekOrigin) + { + case STREAM_SEEK_SET: + _absPos = offset; + break; + case STREAM_SEEK_CUR: + _absPos += offset; + break; + case STREAM_SEEK_END: + _absPos = _length + offset; + break; + } + _offsetPos = _absPos; + if (newPosition != NULL) + *newPosition = _absPos; + _streamIndex = 0; + return S_OK; +} + +STDMETHODIMP COutMultiVolStream::SetSize(Int64 newSize) +{ + if (newSize < 0) + return E_INVALIDARG; + int i = 0; + while (i < Streams.Size()) + { + CSubStreamInfo &subStream = Streams[i++]; + if ((UInt64)newSize < subStream.RealSize) + { + RINOK(subStream.Stream->SetSize(newSize)); + subStream.RealSize = newSize; + break; + } + newSize -= subStream.RealSize; + } + while (i < Streams.Size()) + { + { + CSubStreamInfo &subStream = Streams.Back(); + subStream.Stream.Release(); + NDirectory::DeleteFileAlways(subStream.Name); + } + Streams.DeleteBack(); + } + _offsetPos = _absPos; + _streamIndex = 0; + _length = newSize; + return S_OK; +} + +static const wchar_t *kDefaultArchiveType = L"7z"; +static const wchar_t *kSFXExtension = + #ifdef _WIN32 + L"exe"; + #else + L""; + #endif + +bool CUpdateOptions::Init(const CCodecs *codecs, const UString &arcPath, const UString &arcType) +{ + if (!arcType.IsEmpty()) + MethodMode.FormatIndex = codecs->FindFormatForArchiveType(arcType); + else + { + MethodMode.FormatIndex = codecs->FindFormatForArchiveName(arcPath); + if (MethodMode.FormatIndex < 0) + MethodMode.FormatIndex = codecs->FindFormatForArchiveType(kDefaultArchiveType); + } + if (MethodMode.FormatIndex < 0) + return false; + const CArcInfoEx &arcInfo = codecs->Formats[MethodMode.FormatIndex]; + UString typeExt = arcInfo.GetMainExt(); + UString ext = typeExt; + if (SfxMode) + ext = kSFXExtension; + ArchivePath.BaseExtension = ext; + ArchivePath.VolExtension = typeExt; + ArchivePath.ParseFromPath(arcPath); + for (int i = 0; i < Commands.Size(); i++) + { + CUpdateArchiveCommand &uc = Commands[i]; + uc.ArchivePath.BaseExtension = ext; + uc.ArchivePath.VolExtension = typeExt; + uc.ArchivePath.ParseFromPath(uc.UserArchivePath); + } + return true; +} + + +static HRESULT Compress( + CCodecs *codecs, + const CActionSet &actionSet, + IInArchive *archive, + const CCompressionMethodMode &compressionMethod, + CArchivePath &archivePath, + const CObjectVector &archiveItems, + bool shareForWrite, + bool stdInMode, + /* const UString & stdInFileName, */ + bool stdOutMode, + const CObjectVector &dirItems, + bool sfxMode, + const UString &sfxModule, + const CRecordVector &volumesSizes, + CTempFiles &tempFiles, + CUpdateErrorInfo &errorInfo, + IUpdateCallbackUI *callback) +{ + CMyComPtr outArchive; + if(archive != NULL) + { + CMyComPtr archive2 = archive; + HRESULT result = archive2.QueryInterface(IID_IOutArchive, &outArchive); + if(result != S_OK) + throw kUpdateIsNotSupoorted; + } + else + { + RINOK(codecs->CreateOutArchive(compressionMethod.FormatIndex, outArchive)); + + #ifdef EXTERNAL_CODECS + { + CMyComPtr setCompressCodecsInfo; + outArchive.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo); + if (setCompressCodecsInfo) + { + RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecs)); + } + } + #endif + } + if (outArchive == 0) + throw kUpdateIsNotSupoorted; + + NFileTimeType::EEnum fileTimeType; + UInt32 value; + RINOK(outArchive->GetFileTimeType(&value)); + + switch(value) + { + case NFileTimeType::kWindows: + case NFileTimeType::kDOS: + case NFileTimeType::kUnix: + fileTimeType = NFileTimeType::EEnum(value); + break; + default: + return E_FAIL; + } + + CObjectVector updatePairs; + GetUpdatePairInfoList(dirItems, archiveItems, fileTimeType, updatePairs); // must be done only once!!! + + CObjectVector updatePairs2; + UpdateProduce(updatePairs, actionSet, updatePairs2); + + UInt32 numFiles = 0; + for (int i = 0; i < updatePairs2.Size(); i++) + if (updatePairs2[i].NewData) + numFiles++; + + RINOK(callback->SetNumFiles(numFiles)); + + + CArchiveUpdateCallback *updateCallbackSpec = new CArchiveUpdateCallback; + CMyComPtr updateCallback(updateCallbackSpec); + + updateCallbackSpec->ShareForWrite = shareForWrite; + updateCallbackSpec->StdInMode = stdInMode; + updateCallbackSpec->Callback = callback; + updateCallbackSpec->DirItems = &dirItems; + updateCallbackSpec->ArchiveItems = &archiveItems; + updateCallbackSpec->UpdatePairs = &updatePairs2; + + CMyComPtr outStream; + + const UString &archiveName = archivePath.GetFinalPath(); + if (!stdOutMode) + { + UString resultPath; + int pos; + if(!NFile::NDirectory::MyGetFullPathName(archiveName, resultPath, pos)) + throw 1417161; + NFile::NDirectory::CreateComplexDirectory(resultPath.Left(pos)); + } + + COutFileStream *outStreamSpec = NULL; + COutMultiVolStream *volStreamSpec = NULL; + + if (volumesSizes.Size() == 0) + { + if (stdOutMode) + outStream = new CStdOutFileStream; + else + { + outStreamSpec = new COutFileStream; + outStream = outStreamSpec; + bool isOK = false; + UString realPath; + for (int i = 0; i < (1 << 16); i++) + { + if (archivePath.Temp) + { + if (i > 0) + { + wchar_t s[32]; + ConvertUInt64ToString(i, s); + archivePath.TempPostfix = s; + } + realPath = archivePath.GetTempPath(); + } + else + realPath = archivePath.GetFinalPath(); + if (outStreamSpec->Create(realPath, false)) + { + tempFiles.Paths.Add(realPath); + isOK = true; + break; + } + if (::GetLastError() != ERROR_FILE_EXISTS) + break; + if (!archivePath.Temp) + break; + } + if (!isOK) + { + errorInfo.SystemError = ::GetLastError(); + errorInfo.FileName = realPath; + errorInfo.Message = L"Can not open file"; + return E_FAIL; + } + } + } + else + { + if (stdOutMode) + return E_FAIL; + volStreamSpec = new COutMultiVolStream; + outStream = volStreamSpec; + volStreamSpec->Sizes = volumesSizes; + volStreamSpec->Prefix = archivePath.GetFinalPath() + UString(L"."); + volStreamSpec->TempFiles = &tempFiles; + volStreamSpec->Init(); + + /* + updateCallbackSpec->VolumesSizes = volumesSizes; + updateCallbackSpec->VolName = archivePath.Prefix + archivePath.Name; + if (!archivePath.VolExtension.IsEmpty()) + updateCallbackSpec->VolExt = UString(L'.') + archivePath.VolExtension; + */ + } + + RINOK(SetProperties(outArchive, compressionMethod.Properties)); + + if (sfxMode) + { + CInFileStream *sfxStreamSpec = new CInFileStream; + CMyComPtr sfxStream(sfxStreamSpec); + if (!sfxStreamSpec->Open(sfxModule)) + { + errorInfo.SystemError = ::GetLastError(); + errorInfo.Message = L"Can't open sfx module"; + errorInfo.FileName = sfxModule; + return E_FAIL; + } + + CMyComPtr sfxOutStream; + COutFileStream *outStreamSpec = NULL; + if (volumesSizes.Size() == 0) + sfxOutStream = outStream; + else + { + outStreamSpec = new COutFileStream; + sfxOutStream = outStreamSpec; + UString realPath = archivePath.GetFinalPath(); + if (!outStreamSpec->Create(realPath, false)) + { + errorInfo.SystemError = ::GetLastError(); + errorInfo.FileName = realPath; + errorInfo.Message = L"Can not open file"; + return E_FAIL; + } + } + RINOK(CopyBlock(sfxStream, sfxOutStream)); + if (outStreamSpec) + { + RINOK(outStreamSpec->Close()); + } + } + + HRESULT result = outArchive->UpdateItems(outStream, updatePairs2.Size(), updateCallback); + callback->Finilize(); + RINOK(result); + if (outStreamSpec) + result = outStreamSpec->Close(); + else if (volStreamSpec) + result = volStreamSpec->Close(); + return result; +} + +HRESULT EnumerateInArchiveItems(const NWildcard::CCensor &censor, + IInArchive *archive, + const UString &defaultItemName, + const NWindows::NFile::NFind::CFileInfoW &archiveFileInfo, + CObjectVector &archiveItems) +{ + archiveItems.Clear(); + UInt32 numItems; + RINOK(archive->GetNumberOfItems(&numItems)); + archiveItems.Reserve(numItems); + for(UInt32 i = 0; i < numItems; i++) + { + CArchiveItem ai; + + RINOK(GetArchiveItemPath(archive, i, ai.Name)); + RINOK(IsArchiveItemFolder(archive, i, ai.IsDirectory)); + ai.Censored = censor.CheckPath(ai.Name.IsEmpty() ? defaultItemName : ai.Name, !ai.IsDirectory); + RINOK(GetArchiveItemFileTime(archive, i, + archiveFileInfo.LastWriteTime, ai.LastWriteTime)); + + CPropVariant propertySize; + RINOK(archive->GetProperty(i, kpidSize, &propertySize)); + ai.SizeIsDefined = (propertySize.vt != VT_EMPTY); + if (ai.SizeIsDefined) + ai.Size = ConvertPropVariantToUInt64(propertySize); + + ai.IndexInServer = i; + archiveItems.Add(ai); + } + return S_OK; +} + + +static HRESULT UpdateWithItemLists( + CCodecs *codecs, + CUpdateOptions &options, + IInArchive *archive, + const CObjectVector &archiveItems, + const CObjectVector &dirItems, + CTempFiles &tempFiles, + CUpdateErrorInfo &errorInfo, + IUpdateCallbackUI2 *callback) +{ + for(int i = 0; i < options.Commands.Size(); i++) + { + CUpdateArchiveCommand &command = options.Commands[i]; + if (options.StdOutMode) + { + RINOK(callback->StartArchive(0, archive != 0)); + } + else + { + RINOK(callback->StartArchive(command.ArchivePath.GetFinalPath(), + i == 0 && options.UpdateArchiveItself && archive != 0)); + } + + RINOK(Compress( + codecs, + command.ActionSet, archive, + options.MethodMode, + command.ArchivePath, + archiveItems, + options.OpenShareForWrite, + options.StdInMode, + /* options.StdInFileName, */ + options.StdOutMode, + dirItems, + options.SfxMode, options.SfxModule, + options.VolumesSizes, + tempFiles, + errorInfo, callback)); + + RINOK(callback->FinishArchive()); + } + return S_OK; +} + +#ifdef _WIN32 +class CCurrentDirRestorer +{ + UString m_CurrentDirectory; +public: + CCurrentDirRestorer() + { NFile::NDirectory::MyGetCurrentDirectory(m_CurrentDirectory); } + ~CCurrentDirRestorer() + { RestoreDirectory();} + bool RestoreDirectory() + { return BOOLToBool(NFile::NDirectory::MySetCurrentDirectory(m_CurrentDirectory)); } +}; +#endif + +struct CEnumDirItemUpdateCallback: public IEnumDirItemCallback +{ + IUpdateCallbackUI2 *Callback; + HRESULT CheckBreak() { return Callback->CheckBreak(); } +}; + +HRESULT UpdateArchive( + CCodecs *codecs, + const NWildcard::CCensor &censor, + CUpdateOptions &options, + CUpdateErrorInfo &errorInfo, + IOpenCallbackUI *openCallback, + IUpdateCallbackUI2 *callback) +{ + if (options.StdOutMode && options.EMailMode) + return E_FAIL; + + if (options.VolumesSizes.Size() > 0 && (options.EMailMode || options.SfxMode)) + return E_NOTIMPL; + + if (options.SfxMode) + { + CProperty property; + property.Name = L"rsfx"; + property.Value = L"on"; + options.MethodMode.Properties.Add(property); + if (options.SfxModule.IsEmpty()) + { + errorInfo.Message = L"sfx file is not specified"; + return E_FAIL; + } + UString name = options.SfxModule; + if (!NDirectory::MySearchPath(NULL, name, NULL, options.SfxModule)) + { + errorInfo.Message = L"can't find specified sfx module"; + return E_FAIL; + } + } + + const UString archiveName = options.ArchivePath.GetFinalPath(); + + UString defaultItemName; + NFind::CFileInfoW archiveFileInfo; + + CArchiveLink archiveLink; + IInArchive *archive = 0; + if (NFind::FindFile(archiveName, archiveFileInfo)) + { + if (archiveFileInfo.IsDirectory()) + throw "there is no such archive"; + if (options.VolumesSizes.Size() > 0) + return E_NOTIMPL; + HRESULT result = MyOpenArchive(codecs, archiveName, archiveLink, openCallback); + RINOK(callback->OpenResult(archiveName, result)); + RINOK(result); + if (archiveLink.VolumePaths.Size() > 1) + { + errorInfo.SystemError = (DWORD)E_NOTIMPL; + errorInfo.Message = L"Updating for multivolume archives is not implemented"; + return E_NOTIMPL; + } + archive = archiveLink.GetArchive(); + defaultItemName = archiveLink.GetDefaultItemName(); + } + else + { + /* + if (archiveType.IsEmpty()) + throw "type of archive is not specified"; + */ + } + + CObjectVector dirItems; + if (options.StdInMode) + { + CDirItem item; + item.FullPath = item.Name = options.StdInFileName; + item.Size = (UInt64)(Int64)-1; + item.Attributes = 0; + SYSTEMTIME st; + FILETIME ft; + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); + item.CreationTime = item.LastAccessTime = item.LastWriteTime = ft; + dirItems.Add(item); + } + else + { + bool needScanning = false; + for(int i = 0; i < options.Commands.Size(); i++) + if (options.Commands[i].ActionSet.NeedScanning()) + needScanning = true; + if (needScanning) + { + CEnumDirItemUpdateCallback enumCallback; + enumCallback.Callback = callback; + RINOK(callback->StartScanning()); + UStringVector errorPaths; + CRecordVector errorCodes; + HRESULT res = EnumerateItems(censor, dirItems, &enumCallback, errorPaths, errorCodes); + for (int i = 0; i < errorPaths.Size(); i++) + { + RINOK(callback->CanNotFindError(errorPaths[i], errorCodes[i])); + } + if(res != S_OK) + { + errorInfo.Message = L"Scanning error"; + // errorInfo.FileName = errorPath; + return res; + } + RINOK(callback->FinishScanning()); + } + } + + UString tempDirPrefix; + bool usesTempDir = false; + + #ifdef _WIN32 + NDirectory::CTempDirectoryW tempDirectory; + if (options.EMailMode && options.EMailRemoveAfter) + { + tempDirectory.Create(kTempFolderPrefix); + tempDirPrefix = tempDirectory.GetPath(); + NormalizeDirPathPrefix(tempDirPrefix); + usesTempDir = true; + } + #endif + + CTempFiles tempFiles; + + bool createTempFile = false; + if(!options.StdOutMode && options.UpdateArchiveItself) + { + CArchivePath &ap = options.Commands[0].ArchivePath; + ap = options.ArchivePath; + // if ((archive != 0 && !usesTempDir) || !options.WorkingDir.IsEmpty()) + if ((archive != 0 || !options.WorkingDir.IsEmpty()) && !usesTempDir && options.VolumesSizes.Size() == 0) + { + createTempFile = true; + ap.Temp = true; + if (!options.WorkingDir.IsEmpty()) + { + ap.TempPrefix = options.WorkingDir; + NormalizeDirPathPrefix(ap.TempPrefix); + } + } + } + + for(int i = 0; i < options.Commands.Size(); i++) + { + CArchivePath &ap = options.Commands[i].ArchivePath; + if (usesTempDir) + { + // Check it + ap.Prefix = tempDirPrefix; + // ap.Temp = true; + // ap.TempPrefix = tempDirPrefix; + } + if (i > 0 || !createTempFile) + { + const UString &path = ap.GetFinalPath(); + if (NFind::DoesFileExist(path)) + { + errorInfo.SystemError = 0; + errorInfo.Message = L"File already exists"; + errorInfo.FileName = path; + return E_FAIL; + } + } + } + + CObjectVector archiveItems; + if (archive != NULL) + { + RINOK(EnumerateInArchiveItems(censor, + archive, defaultItemName, archiveFileInfo, archiveItems)); + } + + RINOK(UpdateWithItemLists(codecs, options, archive, archiveItems, dirItems, + tempFiles, errorInfo, callback)); + + if (archive != NULL) + { + RINOK(archiveLink.Close()); + archiveLink.Release(); + } + + tempFiles.Paths.Clear(); + if(createTempFile) + { + try + { + CArchivePath &ap = options.Commands[0].ArchivePath; + const UString &tempPath = ap.GetTempPath(); + if (archive != NULL) + if (!NDirectory::DeleteFileAlways(archiveName)) + { + errorInfo.SystemError = ::GetLastError(); + errorInfo.Message = L"delete file error"; + errorInfo.FileName = archiveName; + return E_FAIL; + } + if (!NDirectory::MyMoveFile(tempPath, archiveName)) + { + errorInfo.SystemError = ::GetLastError(); + errorInfo.Message = L"move file error"; + errorInfo.FileName = tempPath; + errorInfo.FileName2 = archiveName; + return E_FAIL; + } + } + catch(...) + { + throw; + } + } + + #ifdef _WIN32 + if (options.EMailMode) + { + NDLL::CLibrary mapiLib; + if (!mapiLib.Load(TEXT("Mapi32.dll"))) + { + errorInfo.SystemError = ::GetLastError(); + errorInfo.Message = L"can not load Mapi32.dll"; + return E_FAIL; + } + LPMAPISENDDOCUMENTS fnSend = (LPMAPISENDDOCUMENTS) + mapiLib.GetProcAddress("MAPISendDocuments"); + if (fnSend == 0) + { + errorInfo.SystemError = ::GetLastError(); + errorInfo.Message = L"can not find MAPISendDocuments function"; + return E_FAIL; + } + UStringVector fullPaths; + int i; + for(i = 0; i < options.Commands.Size(); i++) + { + CArchivePath &ap = options.Commands[i].ArchivePath; + UString arcPath; + if(!NFile::NDirectory::MyGetFullPathName(ap.GetFinalPath(), arcPath)) + { + errorInfo.SystemError = ::GetLastError(); + return E_FAIL; + } + fullPaths.Add(arcPath); + } + CCurrentDirRestorer curDirRestorer; + for(i = 0; i < fullPaths.Size(); i++) + { + UString arcPath = fullPaths[i]; + UString fileName = ExtractFileNameFromPath(arcPath); + AString path = GetAnsiString(arcPath); + AString name = GetAnsiString(fileName); + // Warning!!! MAPISendDocuments function changes Current directory + fnSend(0, ";", (LPSTR)(LPCSTR)path, (LPSTR)(LPCSTR)name, 0); + } + } + #endif + return S_OK; +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/Update.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/Update.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,165 @@ +// Update.h + +#ifndef __UPDATE_H +#define __UPDATE_H + +#include "Common/Wildcard.h" +#include "Windows/FileFind.h" +#include "../../Archive/IArchive.h" + +#include "UpdateAction.h" +#include "ArchiveOpenCallback.h" +#include "UpdateCallback.h" +#include "Property.h" +#include "LoadCodecs.h" + +struct CArchivePath +{ + UString Prefix; // path(folder) prefix including slash + UString Name; // base name + UString BaseExtension; // archive type extension or "exe" extension + UString VolExtension; // archive type extension for volumes + + bool Temp; + UString TempPrefix; // path(folder) for temp location + UString TempPostfix; + + CArchivePath(): Temp(false) {}; + + void ParseFromPath(const UString &path) + { + SplitPathToParts(path, Prefix, Name); + if (Name.IsEmpty()) + return; + int dotPos = Name.ReverseFind(L'.'); + if (dotPos <= 0) + return; + if (dotPos == Name.Length() - 1) + { + Name = Name.Left(dotPos); + BaseExtension.Empty(); + return; + } + if (BaseExtension.CompareNoCase(Name.Mid(dotPos + 1)) == 0) + { + BaseExtension = Name.Mid(dotPos + 1); + Name = Name.Left(dotPos); + } + else + BaseExtension.Empty(); + } + + UString GetPathWithoutExt() const + { + return Prefix + Name; + } + + UString GetFinalPath() const + { + UString path = GetPathWithoutExt(); + if (!BaseExtension.IsEmpty()) + path += UString(L'.') + BaseExtension; + return path; + } + + + UString GetTempPath() const + { + UString path = TempPrefix + Name; + if (!BaseExtension.IsEmpty()) + path += UString(L'.') + BaseExtension; + path += L".tmp"; + path += TempPostfix; + return path; + } +}; + +struct CUpdateArchiveCommand +{ + UString UserArchivePath; + CArchivePath ArchivePath; + NUpdateArchive::CActionSet ActionSet; +}; + +struct CCompressionMethodMode +{ + int FormatIndex; + CObjectVector Properties; + CCompressionMethodMode(): FormatIndex(-1) {} +}; + +struct CUpdateOptions +{ + CCompressionMethodMode MethodMode; + + CObjectVector Commands; + bool UpdateArchiveItself; + CArchivePath ArchivePath; + + bool SfxMode; + UString SfxModule; + + bool OpenShareForWrite; + + bool StdInMode; + UString StdInFileName; + bool StdOutMode; + + bool EMailMode; + bool EMailRemoveAfter; + UString EMailAddress; + + UString WorkingDir; + + bool Init(const CCodecs *codecs, const UString &arcPath, const UString &arcType); + + CUpdateOptions(): + UpdateArchiveItself(true), + SfxMode(false), + StdInMode(false), + StdOutMode(false), + EMailMode(false), + EMailRemoveAfter(false), + OpenShareForWrite(false) + {}; + CRecordVector VolumesSizes; +}; + +struct CErrorInfo +{ + DWORD SystemError; + UString FileName; + UString FileName2; + UString Message; + // UStringVector ErrorPaths; + // CRecordVector ErrorCodes; + CErrorInfo(): SystemError(0) {}; +}; + +struct CUpdateErrorInfo: public CErrorInfo +{ +}; + +#define INTERFACE_IUpdateCallbackUI2(x) \ + INTERFACE_IUpdateCallbackUI(x) \ + virtual HRESULT OpenResult(const wchar_t *name, HRESULT result) x; \ + virtual HRESULT StartScanning() x; \ + virtual HRESULT CanNotFindError(const wchar_t *name, DWORD systemError) x; \ + virtual HRESULT FinishScanning() x; \ + virtual HRESULT StartArchive(const wchar_t *name, bool updating) x; \ + virtual HRESULT FinishArchive() x; \ + +struct IUpdateCallbackUI2: public IUpdateCallbackUI +{ + INTERFACE_IUpdateCallbackUI2(=0) +}; + +HRESULT UpdateArchive( + CCodecs *codecs, + const NWildcard::CCensor &censor, + CUpdateOptions &options, + CUpdateErrorInfo &errorInfo, + IOpenCallbackUI *openCallback, + IUpdateCallbackUI2 *callback); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateAction.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateAction.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,64 @@ +// UpdateAction.cpp + +#include "StdAfx.h" + +#include "UpdateAction.h" + +namespace NUpdateArchive { + +const CActionSet kAddActionSet = +{ + NPairAction::kCopy, + NPairAction::kCopy, + NPairAction::kCompress, + NPairAction::kCompress, + NPairAction::kCompress, + NPairAction::kCompress, + NPairAction::kCompress +}; + +const CActionSet kUpdateActionSet = +{ + NPairAction::kCopy, + NPairAction::kCopy, + NPairAction::kCompress, + NPairAction::kCopy, + NPairAction::kCompress, + NPairAction::kCopy, + NPairAction::kCompress +}; + +const CActionSet kFreshActionSet = +{ + NPairAction::kCopy, + NPairAction::kCopy, + NPairAction::kIgnore, + NPairAction::kCopy, + NPairAction::kCompress, + NPairAction::kCopy, + NPairAction::kCompress +}; + +const CActionSet kSynchronizeActionSet = +{ + NPairAction::kCopy, + NPairAction::kIgnore, + NPairAction::kCompress, + NPairAction::kCopy, + NPairAction::kCompress, + NPairAction::kCopy, + NPairAction::kCompress, +}; + +const CActionSet kDeleteActionSet = +{ + NPairAction::kCopy, + NPairAction::kIgnore, + NPairAction::kIgnore, + NPairAction::kIgnore, + NPairAction::kIgnore, + NPairAction::kIgnore, + NPairAction::kIgnore +}; + +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateAction.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateAction.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,57 @@ +// UpdateAction.h + +#ifndef __UPDATE_ACTION_H +#define __UPDATE_ACTION_H + +namespace NUpdateArchive { + + namespace NPairState + { + const int kNumValues = 7; + enum EEnum + { + kNotMasked = 0, + kOnlyInArchive, + kOnlyOnDisk, + kNewInArchive, + kOldInArchive, + kSameFiles, + kUnknowNewerFiles + }; + } + namespace NPairAction + { + enum EEnum + { + kIgnore = 0, + kCopy, + kCompress, + kCompressAsAnti + }; + } + struct CActionSet + { + NPairAction::EEnum StateActions[NPairState::kNumValues]; + bool NeedScanning() const + { + int i; + for (i = 0; i < NPairState::kNumValues; i++) + if (StateActions[i] == NPairAction::kCompress) + return true; + for (i = 1; i < NPairState::kNumValues; i++) + if (StateActions[i] != NPairAction::kIgnore) + return true; + return false; + } + }; + extern const CActionSet kAddActionSet; + extern const CActionSet kUpdateActionSet; + extern const CActionSet kFreshActionSet; + extern const CActionSet kSynchronizeActionSet; + extern const CActionSet kDeleteActionSet; +}; + + +#endif + + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateCallback.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateCallback.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,267 @@ +// UpdateCallback.cpp + +#include "StdAfx.h" + +#include "UpdateCallback.h" + +#include "Common/StringConvert.h" +#include "Common/IntToString.h" +#include "Common/Defs.h" +#include "Common/ComTry.h" + +#include "Windows/PropVariant.h" + +#include "../../Common/FileStreams.h" + +using namespace NWindows; + +CArchiveUpdateCallback::CArchiveUpdateCallback(): + Callback(0), + ShareForWrite(false), + StdInMode(false), + DirItems(0), + ArchiveItems(0), + UpdatePairs(0) + {} + + +STDMETHODIMP CArchiveUpdateCallback::SetTotal(UInt64 size) +{ + COM_TRY_BEGIN + return Callback->SetTotal(size); + COM_TRY_END +} + +STDMETHODIMP CArchiveUpdateCallback::SetCompleted(const UInt64 *completeValue) +{ + COM_TRY_BEGIN + return Callback->SetCompleted(completeValue); + COM_TRY_END +} + +STDMETHODIMP CArchiveUpdateCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) +{ + COM_TRY_BEGIN + return Callback->SetRatioInfo(inSize, outSize); + COM_TRY_END +} + + +/* +STATPROPSTG kProperties[] = +{ + { NULL, kpidPath, VT_BSTR}, + { NULL, kpidIsFolder, VT_BOOL}, + { NULL, kpidSize, VT_UI8}, + { NULL, kpidLastAccessTime, VT_FILETIME}, + { NULL, kpidCreationTime, VT_FILETIME}, + { NULL, kpidLastWriteTime, VT_FILETIME}, + { NULL, kpidAttributes, VT_UI4}, + { NULL, kpidIsAnti, VT_BOOL} +}; +*/ + +STDMETHODIMP CArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG **) +{ + return E_NOTIMPL; + /* + return CStatPropEnumerator::CreateEnumerator(kProperties, + sizeof(kProperties) / sizeof(kProperties[0]), enumerator); + */ +} + +STDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index, + Int32 *newData, Int32 *newProperties, UInt32 *indexInArchive) +{ + COM_TRY_BEGIN + RINOK(Callback->CheckBreak()); + const CUpdatePair2 &updatePair = (*UpdatePairs)[index]; + if(newData != NULL) + *newData = BoolToInt(updatePair.NewData); + if(newProperties != NULL) + *newProperties = BoolToInt(updatePair.NewProperties); + if(indexInArchive != NULL) + { + if (updatePair.ExistInArchive) + { + if (ArchiveItems == 0) + *indexInArchive = updatePair.ArchiveItemIndex; + else + *indexInArchive = (*ArchiveItems)[updatePair.ArchiveItemIndex].IndexInServer; + } + else + *indexInArchive = UInt32(-1); + } + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) +{ + COM_TRY_BEGIN + const CUpdatePair2 &updatePair = (*UpdatePairs)[index]; + NWindows::NCOM::CPropVariant propVariant; + + if (propID == kpidIsAnti) + { + propVariant = updatePair.IsAnti; + propVariant.Detach(value); + return S_OK; + } + + if (updatePair.IsAnti) + { + switch(propID) + { + case kpidIsFolder: + case kpidPath: + break; + case kpidSize: + propVariant = (UInt64)0; + propVariant.Detach(value); + return S_OK; + default: + propVariant.Detach(value); + return S_OK; + } + } + + if(updatePair.ExistOnDisk) + { + const CDirItem &dirItem = (*DirItems)[updatePair.DirItemIndex]; + switch(propID) + { + case kpidPath: + propVariant = dirItem.Name; + break; + case kpidIsFolder: + propVariant = dirItem.IsDirectory(); + break; + case kpidSize: + propVariant = dirItem.Size; + break; + case kpidAttributes: + propVariant = dirItem.Attributes; + break; + case kpidLastAccessTime: + propVariant = dirItem.LastAccessTime; + break; + case kpidCreationTime: + propVariant = dirItem.CreationTime; + break; + case kpidLastWriteTime: + propVariant = dirItem.LastWriteTime; + break; + } + } + else + { + if (propID == kpidPath) + { + if (updatePair.NewNameIsDefined) + { + propVariant = updatePair.NewName; + propVariant.Detach(value); + return S_OK; + } + } + if (updatePair.ExistInArchive && Archive) + { + UInt32 indexInArchive; + if (ArchiveItems == 0) + indexInArchive = updatePair.ArchiveItemIndex; + else + indexInArchive = (*ArchiveItems)[updatePair.ArchiveItemIndex].IndexInServer; + return Archive->GetProperty(indexInArchive, propID, value); + } + } + propVariant.Detach(value); + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream) +{ + COM_TRY_BEGIN + const CUpdatePair2 &updatePair = (*UpdatePairs)[index]; + if(!updatePair.NewData) + return E_FAIL; + + RINOK(Callback->CheckBreak()); + RINOK(Callback->Finilize()); + + if(updatePair.IsAnti) + { + return Callback->GetStream((*ArchiveItems)[updatePair.ArchiveItemIndex].Name, true); + } + const CDirItem &dirItem = (*DirItems)[updatePair.DirItemIndex]; + RINOK(Callback->GetStream(dirItem.Name, false)); + + if(dirItem.IsDirectory()) + return S_OK; + + if (StdInMode) + { + CStdInFileStream *inStreamSpec = new CStdInFileStream; + CMyComPtr inStreamLoc(inStreamSpec); + *inStream = inStreamLoc.Detach(); + } + else + { + CInFileStream *inStreamSpec = new CInFileStream; + CMyComPtr inStreamLoc(inStreamSpec); + UString path = DirPrefix + dirItem.FullPath; + if(!inStreamSpec->OpenShared(path, ShareForWrite)) + { + return Callback->OpenFileError(path, ::GetLastError()); + } + *inStream = inStreamLoc.Detach(); + } + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CArchiveUpdateCallback::SetOperationResult(Int32 operationResult) +{ + COM_TRY_BEGIN + return Callback->SetOperationResult(operationResult); + COM_TRY_END +} + +STDMETHODIMP CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size) +{ + if (VolumesSizes.Size() == 0) + return S_FALSE; + if (index >= (UInt32)VolumesSizes.Size()) + index = VolumesSizes.Size() - 1; + *size = VolumesSizes[index]; + return S_OK; +} + +STDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream) +{ + COM_TRY_BEGIN + wchar_t temp[32]; + ConvertUInt64ToString(index + 1, temp); + UString res = temp; + while (res.Length() < 2) + res = UString(L'0') + res; + UString fileName = VolName; + fileName += L'.'; + fileName += res; + fileName += VolExt; + COutFileStream *streamSpec = new COutFileStream; + CMyComPtr streamLoc(streamSpec); + if(!streamSpec->Create(fileName, false)) + return ::GetLastError(); + *volumeStream = streamLoc.Detach(); + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) +{ + COM_TRY_BEGIN + return Callback->CryptoGetTextPassword2(passwordIsDefined, password); + COM_TRY_END +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateCallback.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateCallback.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,82 @@ +// UpdateCallback.h + +#ifndef __UPDATECALLBACK_H +#define __UPDATECALLBACK_H + +#include "Common/MyCom.h" +#include "Common/MyString.h" + +#include "../../IPassword.h" +#include "../../ICoder.h" + +#include "../Common/UpdatePair.h" +#include "../Common/UpdateProduce.h" + +#define INTERFACE_IUpdateCallbackUI(x) \ + virtual HRESULT SetTotal(UInt64 size) x; \ + virtual HRESULT SetCompleted(const UInt64 *completeValue) x; \ + virtual HRESULT SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) x; \ + virtual HRESULT CheckBreak() x; \ + virtual HRESULT Finilize() x; \ + virtual HRESULT SetNumFiles(UInt64 numFiles) x; \ + virtual HRESULT GetStream(const wchar_t *name, bool isAnti) x; \ + virtual HRESULT OpenFileError(const wchar_t *name, DWORD systemError) x; \ + virtual HRESULT SetOperationResult(Int32 operationResult) x; \ + virtual HRESULT CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) x; \ + + // virtual HRESULT CloseProgress() { return S_OK; }; + +struct IUpdateCallbackUI +{ + INTERFACE_IUpdateCallbackUI(=0) +}; + +class CArchiveUpdateCallback: + public IArchiveUpdateCallback2, + public ICryptoGetTextPassword2, + public ICompressProgressInfo, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP3( + IArchiveUpdateCallback2, + ICryptoGetTextPassword2, + ICompressProgressInfo) + + // IProgress + STDMETHOD(SetTotal)(UInt64 size); + STDMETHOD(SetCompleted)(const UInt64 *completeValue); + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); + + // IUpdateCallback + STDMETHOD(EnumProperties)(IEnumSTATPROPSTG **enumerator); + STDMETHOD(GetUpdateItemInfo)(UInt32 index, + Int32 *newData, Int32 *newProperties, UInt32 *indexInArchive); + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream); + STDMETHOD(SetOperationResult)(Int32 operationResult); + + STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size); + STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream); + + STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password); + +public: + CRecordVector VolumesSizes; + UString VolName; + UString VolExt; + + IUpdateCallbackUI *Callback; + + UString DirPrefix; + bool ShareForWrite; + bool StdInMode; + const CObjectVector *DirItems; + const CObjectVector *ArchiveItems; + const CObjectVector *UpdatePairs; + CMyComPtr Archive; + + CArchiveUpdateCallback(); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdatePair.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdatePair.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,166 @@ +// UpdatePair.cpp + +#include "StdAfx.h" + +#include + +#include "Common/Defs.h" +#include "Common/Wildcard.h" +#include "Windows/Time.h" + +#include "UpdatePair.h" +#include "SortUtils.h" + +using namespace NWindows; +using namespace NTime; + +static int MyCompareTime(NFileTimeType::EEnum fileTimeType, + const FILETIME &time1, const FILETIME &time2) +{ + switch(fileTimeType) + { + case NFileTimeType::kWindows: + return ::CompareFileTime(&time1, &time2); + case NFileTimeType::kUnix: + { + UInt32 unixTime1, unixTime2; + if (!FileTimeToUnixTime(time1, unixTime1)) + { + unixTime1 = 0; + // throw 4191614; + } + if (!FileTimeToUnixTime(time2, unixTime2)) + { + unixTime2 = 0; + // throw 4191615; + } + return MyCompare(unixTime1, unixTime2); + } + case NFileTimeType::kDOS: + { + UInt32 dosTime1, dosTime2; + FileTimeToDosTime(time1, dosTime1); + FileTimeToDosTime(time2, dosTime2); + /* + if (!FileTimeToDosTime(time1, dosTime1)) + throw 4191616; + if (!FileTimeToDosTime(time2, dosTime2)) + throw 4191617; + */ + return MyCompare(dosTime1, dosTime2); + } + } + throw 4191618; +} + +static const wchar_t *kDuplicateFileNameMessage = L"Duplicate filename:"; + +/* +static const char *kNotCensoredCollisionMessaged = "Internal file name collision:\n"; +static const char *kSameTimeChangedSizeCollisionMessaged = + "Collision between files with same date/time and different sizes:\n"; +*/ + +static void TestDuplicateString(const UStringVector &strings, const CIntVector &indices) +{ + for(int i = 0; i + 1 < indices.Size(); i++) + if (CompareFileNames(strings[indices[i]], strings[indices[i + 1]]) == 0) + { + UString message = kDuplicateFileNameMessage; + message += L"\n"; + message += strings[indices[i]]; + message += L"\n"; + message += strings[indices[i + 1]]; + throw message; + } +} + +void GetUpdatePairInfoList( + const CObjectVector &dirItems, + const CObjectVector &archiveItems, + NFileTimeType::EEnum fileTimeType, + CObjectVector &updatePairs) +{ + CIntVector dirIndices, archiveIndices; + UStringVector dirNames, archiveNames; + + int numDirItems = dirItems.Size(); + int i; + for(i = 0; i < numDirItems; i++) + dirNames.Add(dirItems[i].Name); + SortFileNames(dirNames, dirIndices); + TestDuplicateString(dirNames, dirIndices); + + int numArchiveItems = archiveItems.Size(); + for(i = 0; i < numArchiveItems; i++) + archiveNames.Add(archiveItems[i].Name); + SortFileNames(archiveNames, archiveIndices); + TestDuplicateString(archiveNames, archiveIndices); + + int dirItemIndex = 0, archiveItemIndex = 0; + CUpdatePair pair; + while(dirItemIndex < numDirItems && archiveItemIndex < numArchiveItems) + { + int dirItemIndex2 = dirIndices[dirItemIndex], + archiveItemIndex2 = archiveIndices[archiveItemIndex]; + const CDirItem &dirItem = dirItems[dirItemIndex2]; + const CArchiveItem &archiveItem = archiveItems[archiveItemIndex2]; + int compareResult = CompareFileNames(dirItem.Name, archiveItem.Name); + if (compareResult < 0) + { + pair.State = NUpdateArchive::NPairState::kOnlyOnDisk; + pair.DirItemIndex = dirItemIndex2; + dirItemIndex++; + } + else if (compareResult > 0) + { + pair.State = archiveItem.Censored ? + NUpdateArchive::NPairState::kOnlyInArchive: NUpdateArchive::NPairState::kNotMasked; + pair.ArchiveItemIndex = archiveItemIndex2; + archiveItemIndex++; + } + else + { + if (!archiveItem.Censored) + throw 1082022;; // TTString(kNotCensoredCollisionMessaged + dirItem.Name); + pair.DirItemIndex = dirItemIndex2; + pair.ArchiveItemIndex = archiveItemIndex2; + switch (MyCompareTime(fileTimeType, dirItem.LastWriteTime, archiveItem.LastWriteTime)) + { + case -1: + pair.State = NUpdateArchive::NPairState::kNewInArchive; + break; + case 1: + pair.State = NUpdateArchive::NPairState::kOldInArchive; + break; + default: + if (archiveItem.SizeIsDefined) + if (dirItem.Size != archiveItem.Size) + // throw 1082034; // kSameTimeChangedSizeCollisionMessaged; + pair.State = NUpdateArchive::NPairState::kUnknowNewerFiles; + else + pair.State = NUpdateArchive::NPairState::kSameFiles; + else + pair.State = NUpdateArchive::NPairState::kUnknowNewerFiles; + } + dirItemIndex++; + archiveItemIndex++; + } + updatePairs.Add(pair); + } + for(;dirItemIndex < numDirItems; dirItemIndex++) + { + pair.State = NUpdateArchive::NPairState::kOnlyOnDisk; + pair.DirItemIndex = dirIndices[dirItemIndex]; + updatePairs.Add(pair); + } + for(;archiveItemIndex < numArchiveItems; archiveItemIndex++) + { + int archiveItemIndex2 = archiveIndices[archiveItemIndex]; + const CArchiveItem &archiveItem = archiveItems[archiveItemIndex2]; + pair.State = archiveItem.Censored ? + NUpdateArchive::NPairState::kOnlyInArchive: NUpdateArchive::NPairState::kNotMasked; + pair.ArchiveItemIndex = archiveItemIndex2; + updatePairs.Add(pair); + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdatePair.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdatePair.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// UpdatePair.h + +#ifndef __UPDATE_PAIR_H +#define __UPDATE_PAIR_H + +#include "DirItem.h" +#include "UpdateAction.h" + +#include "../../Archive/IArchive.h" + +struct CUpdatePair +{ + NUpdateArchive::NPairState::EEnum State; + int ArchiveItemIndex; + int DirItemIndex; +}; + +void GetUpdatePairInfoList( + const CObjectVector &dirItems, + const CObjectVector &archiveItems, + NFileTimeType::EEnum fileTimeType, + CObjectVector &updatePairs); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateProduce.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateProduce.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,63 @@ +// UpdateProduce.cpp + +#include "StdAfx.h" + +#include "UpdateProduce.h" + +using namespace NUpdateArchive; + +static const char *kUpdateActionSetCollision = + "Internal collision in update action set"; + +void UpdateProduce( + const CObjectVector &updatePairs, + const NUpdateArchive::CActionSet &actionSet, + CObjectVector &operationChain) +{ + for(int i = 0; i < updatePairs.Size(); i++) + { + // CUpdateArchiveRange aRange; + const CUpdatePair &pair = updatePairs[i]; + + CUpdatePair2 pair2; + pair2.IsAnti = false; + pair2.ArchiveItemIndex = pair.ArchiveItemIndex; + pair2.DirItemIndex = pair.DirItemIndex; + pair2.ExistInArchive = (pair.State != NPairState::kOnlyOnDisk); + pair2.ExistOnDisk = (pair.State != NPairState::kOnlyInArchive && pair.State != NPairState::kNotMasked); + switch(actionSet.StateActions[pair.State]) + { + case NPairAction::kIgnore: + /* + if (pair.State != NPairState::kOnlyOnDisk) + IgnoreArchiveItem(m_ArchiveItems[pair.ArchiveItemIndex]); + // cout << "deleting"; + */ + break; + case NPairAction::kCopy: + { + if (pair.State == NPairState::kOnlyOnDisk) + throw kUpdateActionSetCollision; + pair2.NewData = pair2.NewProperties = false; + operationChain.Add(pair2); + break; + } + case NPairAction::kCompress: + { + if (pair.State == NPairState::kOnlyInArchive || + pair.State == NPairState::kNotMasked) + throw kUpdateActionSetCollision; + pair2.NewData = pair2.NewProperties = true; + operationChain.Add(pair2); + break; + } + case NPairAction::kCompressAsAnti: + { + pair2.IsAnti = true; + pair2.NewData = pair2.NewProperties = true; + operationChain.Add(pair2); + break; + } + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateProduce.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/UpdateProduce.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,31 @@ +// UpdateProduce.h + +#ifndef __UPDATE_PRODUCE_H +#define __UPDATE_PRODUCE_H + +#include "UpdatePair.h" + +struct CUpdatePair2 +{ + // bool OperationIsCompress; + bool NewData; + bool NewProperties; + + bool ExistInArchive; + bool ExistOnDisk; + bool IsAnti; + int ArchiveItemIndex; + int DirItemIndex; + + bool NewNameIsDefined; + UString NewName; + + CUpdatePair2(): NewNameIsDefined(false) {} +}; + +void UpdateProduce( + const CObjectVector &updatePairs, + const NUpdateArchive::CActionSet &actionSet, + CObjectVector &operationChain); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/WorkDir.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/WorkDir.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,64 @@ +// WorkDir.cpp + +#include "StdAfx.h" + +#include "WorkDir.h" + +#include "Common/StringConvert.h" +#include "Common/Wildcard.h" + +#include "Windows/FileName.h" +#include "Windows/FileDir.h" + +static inline UINT GetCurrentCodePage() + { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } + +using namespace NWindows; +using namespace NFile; +using namespace NName; + +UString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path) +{ + NWorkDir::NMode::EEnum mode = workDirInfo.Mode; + if (workDirInfo.ForRemovableOnly) + { + mode = NWorkDir::NMode::kCurrent; + UString prefix = path.Left(3); + if (prefix[1] == L':' && prefix[2] == L'\\') + { + UINT driveType = GetDriveType(GetSystemString(prefix, GetCurrentCodePage())); + if (driveType == DRIVE_CDROM || driveType == DRIVE_REMOVABLE) + mode = workDirInfo.Mode; + } + /* + CParsedPath parsedPath; + parsedPath.ParsePath(archiveName); + UINT driveType = GetDriveType(parsedPath.Prefix); + if ((driveType != DRIVE_CDROM) && (driveType != DRIVE_REMOVABLE)) + mode = NZipSettings::NWorkDir::NMode::kCurrent; + */ + } + switch(mode) + { + case NWorkDir::NMode::kCurrent: + { + return ExtractDirPrefixFromPath(path); + } + case NWorkDir::NMode::kSpecified: + { + UString tempDir = workDirInfo.Path; + NormalizeDirPathPrefix(tempDir); + return tempDir; + } + default: + { + UString tempDir; + if(!NFile::NDirectory::MyGetTempPath(tempDir)) + throw 141717; + return tempDir; + } + } +} + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/WorkDir.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/WorkDir.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// WorkDir.h + +#ifndef __WORKDIR_H +#define __WORKDIR_H + +#include "ZipRegistry.h" + +UString GetWorkDir(const NWorkDir::CInfo &workDirInfo, const UString &path); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Common/ZipRegistry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Common/ZipRegistry.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,98 @@ +// ZipRegistry.h + +#ifndef __ZIPREGISTRY_H +#define __ZIPREGISTRY_H + +#include "Common/MyString.h" +#include "Common/Types.h" +#include "ExtractMode.h" + +namespace NExtract +{ + struct CInfo + { + NPathMode::EEnum PathMode; + NOverwriteMode::EEnum OverwriteMode; + UStringVector Paths; + bool ShowPassword; + }; +} + +namespace NCompression { + + struct CFormatOptions + { + CSysString FormatID; + UString Options; + UString Method; + UString EncryptionMethod; + UInt32 Level; + UInt32 Dictionary; + UInt32 Order; + UInt32 BlockLogSize; + UInt32 NumThreads; + void ResetForLevelChange() + { + BlockLogSize = NumThreads = Level = Dictionary = Order = UInt32(-1); + Method.Empty(); + // EncryptionMethod.Empty(); + // Options.Empty(); + } + CFormatOptions() { ResetForLevelChange(); } + }; + + struct CInfo + { + UStringVector HistoryArchives; + UInt32 Level; + UString ArchiveType; + + CObjectVector FormatOptionsVector; + + bool ShowPassword; + bool EncryptHeaders; + }; +} + +namespace NWorkDir{ + + namespace NMode + { + enum EEnum + { + kSystem, + kCurrent, + kSpecified + }; + } + struct CInfo + { + NMode::EEnum Mode; + UString Path; + bool ForRemovableOnly; + void SetForRemovableOnlyDefault() { ForRemovableOnly = true; } + void SetDefault() + { + Mode = NMode::kSystem; + Path.Empty(); + SetForRemovableOnlyDefault(); + } + }; +} + +void SaveExtractionInfo(const NExtract::CInfo &info); +void ReadExtractionInfo(NExtract::CInfo &info); + +void SaveCompressionInfo(const NCompression::CInfo &info); +void ReadCompressionInfo(NCompression::CInfo &info); + +void SaveWorkDirInfo(const NWorkDir::CInfo &info); +void ReadWorkDirInfo(NWorkDir::CInfo &info); + +void SaveCascadedMenu(bool enabled); +bool ReadCascadedMenu(); + +void SaveContextMenuStatus(UInt32 value); +bool ReadContextMenuStatus(UInt32 &value); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/ConsoleClose.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/ConsoleClose.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,63 @@ +// ConsoleClose.cpp + +#include "StdAfx.h" + +#include "ConsoleClose.h" + +static int g_BreakCounter = 0; +static const int kBreakAbortThreshold = 2; + +namespace NConsoleClose { + +static BOOL WINAPI HandlerRoutine(DWORD ctrlType) +{ + if (ctrlType == CTRL_LOGOFF_EVENT) + { + // printf("\nCTRL_LOGOFF_EVENT\n"); + return TRUE; + } + + g_BreakCounter++; + if (g_BreakCounter < kBreakAbortThreshold) + return TRUE; + return FALSE; + /* + switch(ctrlType) + { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + if (g_BreakCounter < kBreakAbortThreshold) + return TRUE; + } + return FALSE; + */ +} + +bool TestBreakSignal() +{ + /* + if (g_BreakCounter > 0) + return true; + */ + return (g_BreakCounter > 0); +} + +void CheckCtrlBreak() +{ + if (TestBreakSignal()) + throw CCtrlBreakException(); +} + +CCtrlHandlerSetter::CCtrlHandlerSetter() +{ + if(!SetConsoleCtrlHandler(HandlerRoutine, TRUE)) + throw "SetConsoleCtrlHandler fails"; +} + +CCtrlHandlerSetter::~CCtrlHandlerSetter() +{ + if(!SetConsoleCtrlHandler(HandlerRoutine, FALSE)) + throw "SetConsoleCtrlHandler fails"; +} + +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/ConsoleClose.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/ConsoleClose.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// ConsoleCloseUtils.h + +#ifndef __CONSOLECLOSEUTILS_H +#define __CONSOLECLOSEUTILS_H + +namespace NConsoleClose { + +bool TestBreakSignal(); + +class CCtrlHandlerSetter +{ +public: + CCtrlHandlerSetter(); + virtual ~CCtrlHandlerSetter(); +}; + +class CCtrlBreakException +{}; + +void CheckCtrlBreak(); + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,235 @@ +// ExtractCallbackConsole.h + +#include "StdAfx.h" + +#include "ExtractCallbackConsole.h" +#include "UserInputUtils.h" +#include "ConsoleClose.h" + +#include "Common/Wildcard.h" + +#include "Windows/FileDir.h" +#include "Windows/FileFind.h" +#include "Windows/Time.h" +#include "Windows/Defs.h" +#include "Windows/PropVariant.h" +#include "Windows/Error.h" +#include "Windows/PropVariantConversions.h" + +#include "../../Common/FilePathAutoRename.h" + +#include "../Common/ExtractingFilePath.h" + +using namespace NWindows; +using namespace NFile; +using namespace NDirectory; + +static const char *kTestingString = "Testing "; +static const char *kExtractingString = "Extracting "; +static const char *kSkippingString = "Skipping "; + +// static const char *kCantAutoRename = "can not create file with auto name\n"; +// static const char *kCantRenameFile = "can not rename existing file\n"; +// static const char *kCantDeleteOutputFile = "can not delete output file "; +static const char *kError = "ERROR: "; +static const char *kMemoryExceptionMessage = "Can't allocate required memory!"; + +static const char *kProcessing = "Processing archive: "; +static const char *kEverythingIsOk = "Everything is Ok"; +static const char *kNoFiles = "No files to process"; + +static const char *kUnsupportedMethod = "Unsupported Method"; +static const char *kCrcFailed = "CRC Failed"; +static const char *kCrcFailedEncrypted = "CRC Failed in encrypted file. Wrong password?"; +static const char *kDataError = "Data Error"; +static const char *kDataErrorEncrypted = "Data Error in encrypted file. Wrong password?"; +static const char *kUnknownError = "Unknown Error"; + +STDMETHODIMP CExtractCallbackConsole::SetTotal(UInt64) +{ + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + return S_OK; +} + +STDMETHODIMP CExtractCallbackConsole::SetCompleted(const UInt64 *) +{ + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + return S_OK; +} + +STDMETHODIMP CExtractCallbackConsole::AskOverwrite( + const wchar_t *existName, const FILETIME *, const UInt64 *, + const wchar_t *newName, const FILETIME *, const UInt64 *, + Int32 *answer) +{ + (*OutStream) << "file " << existName << + "\nalready exists. Overwrite with " << endl; + (*OutStream) << newName; + + NUserAnswerMode::EEnum overwriteAnswer = ScanUserYesNoAllQuit(OutStream); + + switch(overwriteAnswer) + { + case NUserAnswerMode::kQuit: + return E_ABORT; + case NUserAnswerMode::kNo: + *answer = NOverwriteAnswer::kNo; + break; + case NUserAnswerMode::kNoAll: + *answer = NOverwriteAnswer::kNoToAll; + break; + case NUserAnswerMode::kYesAll: + *answer = NOverwriteAnswer::kYesToAll; + break; + case NUserAnswerMode::kYes: + *answer = NOverwriteAnswer::kYes; + break; + case NUserAnswerMode::kAutoRename: + *answer = NOverwriteAnswer::kAutoRename; + break; + default: + return E_FAIL; + } + return S_OK; +} + +STDMETHODIMP CExtractCallbackConsole::PrepareOperation(const wchar_t *name, bool /* isFolder */, Int32 askExtractMode, const UInt64 *position) +{ + switch (askExtractMode) + { + case NArchive::NExtract::NAskMode::kExtract: + (*OutStream) << kExtractingString; + break; + case NArchive::NExtract::NAskMode::kTest: + (*OutStream) << kTestingString; + break; + case NArchive::NExtract::NAskMode::kSkip: + (*OutStream) << kSkippingString; + break; + }; + (*OutStream) << name; + if (position != 0) + (*OutStream) << " <" << *position << ">"; + return S_OK; +} + +STDMETHODIMP CExtractCallbackConsole::MessageError(const wchar_t *message) +{ + (*OutStream) << message << endl; + NumFileErrorsInCurrentArchive++; + NumFileErrors++; + return S_OK; +} + +STDMETHODIMP CExtractCallbackConsole::SetOperationResult(Int32 operationResult, bool encrypted) +{ + switch(operationResult) + { + case NArchive::NExtract::NOperationResult::kOK: + break; + default: + { + NumFileErrorsInCurrentArchive++; + NumFileErrors++; + (*OutStream) << " "; + switch(operationResult) + { + case NArchive::NExtract::NOperationResult::kUnSupportedMethod: + (*OutStream) << kUnsupportedMethod; + break; + case NArchive::NExtract::NOperationResult::kCRCError: + (*OutStream) << (encrypted ? kCrcFailedEncrypted: kCrcFailed); + break; + case NArchive::NExtract::NOperationResult::kDataError: + (*OutStream) << (encrypted ? kDataErrorEncrypted : kDataError); + break; + default: + (*OutStream) << kUnknownError; + } + } + } + (*OutStream) << endl; + return S_OK; +} + +STDMETHODIMP CExtractCallbackConsole::CryptoGetTextPassword(BSTR *password) +{ + if (!PasswordIsDefined) + { + Password = GetPassword(OutStream); + PasswordIsDefined = true; + } + CMyComBSTR tempName(Password); + *password = tempName.Detach(); + return S_OK; +} + +HRESULT CExtractCallbackConsole::BeforeOpen(const wchar_t *name) +{ + NumArchives++; + NumFileErrorsInCurrentArchive = 0; + (*OutStream) << endl << kProcessing << name << endl; + return S_OK; +} + +HRESULT CExtractCallbackConsole::OpenResult(const wchar_t * /* name */, HRESULT result, bool encrypted) +{ + (*OutStream) << endl; + if (result != S_OK) + { + (*OutStream) << "Error: "; + if (encrypted) + (*OutStream) << "Can not open encrypted archive. Wrong password?"; + else + (*OutStream) << "Can not open file as archive"; + (*OutStream) << endl; + NumArchiveErrors++; + } + return S_OK; +} + +HRESULT CExtractCallbackConsole::ThereAreNoFiles() +{ + (*OutStream) << endl << kNoFiles << endl; + return S_OK; +} + +HRESULT CExtractCallbackConsole::ExtractResult(HRESULT result) +{ + if (result == S_OK) + { + (*OutStream) << endl; + if (NumFileErrorsInCurrentArchive == 0) + (*OutStream) << kEverythingIsOk << endl; + else + { + NumArchiveErrors++; + (*OutStream) << "Sub items Errors: " << NumFileErrorsInCurrentArchive << endl; + } + } + if (result == S_OK) + return result; + NumArchiveErrors++; + if (result == E_ABORT || result == ERROR_DISK_FULL) + return result; + (*OutStream) << endl << kError; + if (result == E_OUTOFMEMORY) + (*OutStream) << kMemoryExceptionMessage; + else + { + UString message; + NError::MyFormatMessage(result, message); + (*OutStream) << message; + } + (*OutStream) << endl; + return S_OK; +} + +HRESULT CExtractCallbackConsole::SetPassword(const UString &password) +{ + PasswordIsDefined = true; + Password = password; + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,65 @@ +// ExtractCallbackConsole.h + +#ifndef __EXTRACTCALLBACKCONSOLE_H +#define __EXTRACTCALLBACKCONSOLE_H + +#include "Common/MyString.h" +#include "Common/StdOutStream.h" +#include "../../Common/FileStreams.h" +#include "../../IPassword.h" +#include "../../Archive/IArchive.h" +#include "../Common/ArchiveExtractCallback.h" + +class CExtractCallbackConsole: + public IExtractCallbackUI, + public ICryptoGetTextPassword, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP2(IFolderArchiveExtractCallback, ICryptoGetTextPassword) + + STDMETHOD(SetTotal)(UInt64 total); + STDMETHOD(SetCompleted)(const UInt64 *completeValue); + + // IFolderArchiveExtractCallback + STDMETHOD(AskOverwrite)( + const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize, + const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize, + Int32 *answer); + STDMETHOD (PrepareOperation)(const wchar_t *name, bool isFolder, Int32 askExtractMode, const UInt64 *position); + + STDMETHOD(MessageError)(const wchar_t *message); + STDMETHOD(SetOperationResult)(Int32 operationResult, bool encrypted); + + // ICryptoGetTextPassword + STDMETHOD(CryptoGetTextPassword)(BSTR *password); + + HRESULT BeforeOpen(const wchar_t *name); + HRESULT OpenResult(const wchar_t *name, HRESULT result, bool encrypted); + HRESULT ThereAreNoFiles(); + HRESULT ExtractResult(HRESULT result); + + HRESULT SetPassword(const UString &password); + +public: + bool PasswordIsDefined; + UString Password; + + UInt64 NumArchives; + UInt64 NumArchiveErrors; + UInt64 NumFileErrors; + UInt64 NumFileErrorsInCurrentArchive; + + CStdOutStream *OutStream; + + void Init() + { + NumArchives = 0; + NumArchiveErrors = 0; + NumFileErrors = 0; + NumFileErrorsInCurrentArchive = 0; + } + +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/List.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/List.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,579 @@ +// List.cpp + +#include "StdAfx.h" + +#include "List.h" +#include "ConsoleClose.h" + +#include "Common/StringConvert.h" +#include "Common/StdOutStream.h" +#include "Common/IntToString.h" +#include "Common/MyCom.h" + +#include "Windows/PropVariant.h" +#include "Windows/Defs.h" +#include "Windows/PropVariantConversions.h" +#include "Windows/FileDir.h" + +#include "../../Archive/IArchive.h" + +#include "../Common/PropIDUtils.h" +#include "../Common/OpenArchive.h" + +#include "OpenCallbackConsole.h" + +using namespace NWindows; + +struct CPropIdToName +{ + PROPID PropID; + const wchar_t *Name; +}; + +static CPropIdToName kPropIdToName[] = +{ + { kpidPath, L"Path" }, + { kpidName, L"Name" }, + { kpidIsFolder, L"Folder" }, + { kpidSize, L"Size" }, + { kpidPackedSize, L"Packed Size" }, + { kpidAttributes, L"Attributes" }, + { kpidCreationTime, L"Created" }, + { kpidLastAccessTime, L"Accessed" }, + { kpidLastWriteTime, L"Modified" }, + { kpidSolid, L"Solid" }, + { kpidCommented, L"Commented" }, + { kpidEncrypted, L"Encrypted" }, + { kpidSplitBefore, L"Split Before" }, + { kpidSplitAfter, L"Split After" }, + { kpidDictionarySize, L"Dictionary Size" }, + { kpidCRC, L"CRC" }, + { kpidType, L"Type" }, + { kpidIsAnti, L"Anti" }, + { kpidMethod, L"Method" }, + { kpidHostOS, L"Host OS" }, + { kpidFileSystem, L"File System" }, + { kpidUser, L"User" }, + { kpidGroup, L"Group" }, + { kpidBlock, L"Block" }, + { kpidComment, L"Comment" }, + { kpidPosition, L"Position" }, + { kpidPrefix, L"Prefix" }, + { kpidNumSubFolders, L"Folders" }, + { kpidNumSubFiles, L"Files" }, + { kpidUnpackVer, L"Version" }, + { kpidVolume, L"Volume" }, + { kpidIsVolume, L"Multivolume" }, + { kpidOffset, L"Offset" }, + { kpidLinks, L"Links" }, + { kpidNumBlocks, L"Blocks" }, + { kpidNumVolumes, L"Volumes" } +}; + +static const char kEmptyAttributeChar = '.'; +static const char kDirectoryAttributeChar = 'D'; +static const char kReadonlyAttributeChar = 'R'; +static const char kHiddenAttributeChar = 'H'; +static const char kSystemAttributeChar = 'S'; +static const char kArchiveAttributeChar = 'A'; + +static const char *kListing = "Listing archive: "; +static const wchar_t *kFilesMessage = L"files"; +static const wchar_t *kDirsMessage = L"folders"; + +static void GetAttributesString(DWORD wa, bool directory, char *s) +{ + s[0] = ((wa & FILE_ATTRIBUTE_DIRECTORY) != 0 || directory) ? + kDirectoryAttributeChar: kEmptyAttributeChar; + s[1] = ((wa & FILE_ATTRIBUTE_READONLY) != 0)? + kReadonlyAttributeChar: kEmptyAttributeChar; + s[2] = ((wa & FILE_ATTRIBUTE_HIDDEN) != 0) ? + kHiddenAttributeChar: kEmptyAttributeChar; + s[3] = ((wa & FILE_ATTRIBUTE_SYSTEM) != 0) ? + kSystemAttributeChar: kEmptyAttributeChar; + s[4] = ((wa & FILE_ATTRIBUTE_ARCHIVE) != 0) ? + kArchiveAttributeChar: kEmptyAttributeChar; + s[5] = '\0'; +} + +enum EAdjustment +{ + kLeft, + kCenter, + kRight +}; + +struct CFieldInfo +{ + PROPID PropID; + UString Name; + EAdjustment TitleAdjustment; + EAdjustment TextAdjustment; + int PrefixSpacesWidth; + int Width; +}; + +struct CFieldInfoInit +{ + PROPID PropID; + const wchar_t *Name; + EAdjustment TitleAdjustment; + EAdjustment TextAdjustment; + int PrefixSpacesWidth; + int Width; +}; + +CFieldInfoInit kStandardFieldTable[] = +{ + { kpidLastWriteTime, L" Date Time", kLeft, kLeft, 0, 19 }, + { kpidAttributes, L"Attr", kRight, kCenter, 1, 5 }, + { kpidSize, L"Size", kRight, kRight, 1, 12 }, + { kpidPackedSize, L"Compressed", kRight, kRight, 1, 12 }, + { kpidPath, L"Name", kLeft, kLeft, 2, 24 } +}; + +void PrintSpaces(int numSpaces) +{ + for (int i = 0; i < numSpaces; i++) + g_StdOut << ' '; +} + +void PrintString(EAdjustment adjustment, int width, const UString &textString) +{ + const int numSpaces = width - textString.Length(); + int numLeftSpaces = 0; + switch (adjustment) + { + case kLeft: + numLeftSpaces = 0; + break; + case kCenter: + numLeftSpaces = numSpaces / 2; + break; + case kRight: + numLeftSpaces = numSpaces; + break; + } + PrintSpaces(numLeftSpaces); + g_StdOut << textString; + PrintSpaces(numSpaces - numLeftSpaces); +} + +class CFieldPrinter +{ + CObjectVector _fields; +public: + void Clear() { _fields.Clear(); } + void Init(const CFieldInfoInit *standardFieldTable, int numItems); + HRESULT Init(IInArchive *archive); + void PrintTitle(); + void PrintTitleLines(); + HRESULT PrintItemInfo(IInArchive *archive, + const UString &defaultItemName, + const NWindows::NFile::NFind::CFileInfoW &archiveFileInfo, + UInt32 index, + bool techMode); + HRESULT PrintSummaryInfo(UInt64 numFiles, UInt64 numDirs, + const UInt64 *size, const UInt64 *compressedSize); +}; + +void CFieldPrinter::Init(const CFieldInfoInit *standardFieldTable, int numItems) +{ + Clear(); + for (int i = 0; i < numItems; i++) + { + CFieldInfo fieldInfo; + const CFieldInfoInit &fieldInfoInit = standardFieldTable[i]; + fieldInfo.PropID = fieldInfoInit.PropID; + fieldInfo.Name = fieldInfoInit.Name; + fieldInfo.TitleAdjustment = fieldInfoInit.TitleAdjustment; + fieldInfo.TextAdjustment = fieldInfoInit.TextAdjustment; + fieldInfo.PrefixSpacesWidth = fieldInfoInit.PrefixSpacesWidth; + fieldInfo.Width = fieldInfoInit.Width; + _fields.Add(fieldInfo); + } +} + +static UString GetPropName(PROPID propID, BSTR name) +{ + for (int i = 0; i < sizeof(kPropIdToName) / sizeof(kPropIdToName[0]); i++) + { + const CPropIdToName &propIdToName = kPropIdToName[i]; + if (propIdToName.PropID == propID) + return propIdToName.Name; + } + if (name) + return name; + return L"?"; +} + +HRESULT CFieldPrinter::Init(IInArchive *archive) +{ + Clear(); + UInt32 numProps; + RINOK(archive->GetNumberOfProperties(&numProps)); + for (UInt32 i = 0; i < numProps; i++) + { + CMyComBSTR name; + PROPID propID; + VARTYPE vt; + RINOK(archive->GetPropertyInfo(i, &name, &propID, &vt)); + CFieldInfo fieldInfo; + fieldInfo.PropID = propID; + fieldInfo.Name = GetPropName(propID, name); + _fields.Add(fieldInfo); + } + return S_OK; +} + +void CFieldPrinter::PrintTitle() +{ + for (int i = 0; i < _fields.Size(); i++) + { + const CFieldInfo &fieldInfo = _fields[i]; + PrintSpaces(fieldInfo.PrefixSpacesWidth); + PrintString(fieldInfo.TitleAdjustment, + ((fieldInfo.PropID == kpidPath) ? 0: fieldInfo.Width), fieldInfo.Name); + } +} + +void CFieldPrinter::PrintTitleLines() +{ + for (int i = 0; i < _fields.Size(); i++) + { + const CFieldInfo &fieldInfo = _fields[i]; + PrintSpaces(fieldInfo.PrefixSpacesWidth); + for (int i = 0; i < fieldInfo.Width; i++) + g_StdOut << '-'; + } +} + + +BOOL IsFileTimeZero(CONST FILETIME *lpFileTime) +{ + return (lpFileTime->dwLowDateTime == 0) && (lpFileTime->dwHighDateTime == 0); +} + +static const char *kEmptyTimeString = " "; +void PrintTime(const NCOM::CPropVariant &propVariant) +{ + if (propVariant.vt != VT_FILETIME) + throw "incorrect item"; + if (IsFileTimeZero(&propVariant.filetime)) + g_StdOut << kEmptyTimeString; + else + { + FILETIME localFileTime; + if (!FileTimeToLocalFileTime(&propVariant.filetime, &localFileTime)) + throw "FileTimeToLocalFileTime error"; + char s[32]; + if (ConvertFileTimeToString(localFileTime, s, true, true)) + g_StdOut << s; + else + g_StdOut << kEmptyTimeString; + } +} + +HRESULT CFieldPrinter::PrintItemInfo(IInArchive *archive, + const UString &defaultItemName, + const NWindows::NFile::NFind::CFileInfoW &archiveFileInfo, + UInt32 index, + bool techMode) +{ + /* + if (techMode) + { + g_StdOut << "Index = "; + g_StdOut << (UInt64)index; + g_StdOut << endl; + } + */ + for (int i = 0; i < _fields.Size(); i++) + { + const CFieldInfo &fieldInfo = _fields[i]; + if (!techMode) + PrintSpaces(fieldInfo.PrefixSpacesWidth); + + NCOM::CPropVariant propVariant; + RINOK(archive->GetProperty(index, fieldInfo.PropID, &propVariant)); + if (techMode) + { + g_StdOut << fieldInfo.Name << " = "; + } + int width = (fieldInfo.PropID == kpidPath) ? 0: fieldInfo.Width; + if (propVariant.vt == VT_EMPTY) + { + switch(fieldInfo.PropID) + { + case kpidPath: + propVariant = defaultItemName; + break; + case kpidLastWriteTime: + propVariant = archiveFileInfo.LastWriteTime; + break; + default: + if (techMode) + g_StdOut << endl; + else + PrintSpaces(width); + continue; + } + } + if (fieldInfo.PropID == kpidLastWriteTime) + { + PrintTime(propVariant); + } + else if (fieldInfo.PropID == kpidAttributes) + { + if (propVariant.vt != VT_UI4) + throw "incorrect item"; + UInt32 attributes = propVariant.ulVal; + bool isFolder; + RINOK(IsArchiveItemFolder(archive, index, isFolder)); + char s[8]; + GetAttributesString(attributes, isFolder, s); + g_StdOut << s; + } + else if (propVariant.vt == VT_BSTR) + { + if (techMode) + g_StdOut << propVariant.bstrVal; + else + PrintString(fieldInfo.TextAdjustment, width, propVariant.bstrVal); + } + else + { + UString s = ConvertPropertyToString(propVariant, fieldInfo.PropID); + s.Replace(wchar_t(0xA), L' '); + s.Replace(wchar_t(0xD), L' '); + + if (techMode) + g_StdOut << s; + else + PrintString(fieldInfo.TextAdjustment, width, s); + } + if (techMode) + g_StdOut << endl; + } + return S_OK; +} + +void PrintNumberString(EAdjustment adjustment, int width, const UInt64 *value) +{ + wchar_t textString[32] = { 0 }; + if (value != NULL) + ConvertUInt64ToString(*value, textString); + PrintString(adjustment, width, textString); +} + + +HRESULT CFieldPrinter::PrintSummaryInfo(UInt64 numFiles, UInt64 numDirs, + const UInt64 *size, const UInt64 *compressedSize) +{ + for (int i = 0; i < _fields.Size(); i++) + { + const CFieldInfo &fieldInfo = _fields[i]; + PrintSpaces(fieldInfo.PrefixSpacesWidth); + NCOM::CPropVariant propVariant; + if (fieldInfo.PropID == kpidSize) + PrintNumberString(fieldInfo.TextAdjustment, fieldInfo.Width, size); + else if (fieldInfo.PropID == kpidPackedSize) + PrintNumberString(fieldInfo.TextAdjustment, fieldInfo.Width, compressedSize); + else if (fieldInfo.PropID == kpidPath) + { + wchar_t textString[32]; + ConvertUInt64ToString(numFiles, textString); + UString temp = textString; + temp += L" "; + temp += kFilesMessage; + temp += L", "; + ConvertUInt64ToString(numDirs, textString); + temp += textString; + temp += L" "; + temp += kDirsMessage; + PrintString(fieldInfo.TextAdjustment, 0, temp); + } + else + PrintString(fieldInfo.TextAdjustment, fieldInfo.Width, L""); + } + return S_OK; +} + +bool GetUInt64Value(IInArchive *archive, UInt32 index, PROPID propID, UInt64 &value) +{ + NCOM::CPropVariant propVariant; + if (archive->GetProperty(index, propID, &propVariant) != S_OK) + throw "GetPropertyValue error"; + if (propVariant.vt == VT_EMPTY) + return false; + value = ConvertPropVariantToUInt64(propVariant); + return true; +} + +HRESULT ListArchives( + CCodecs *codecs, + UStringVector &archivePaths, UStringVector &archivePathsFull, + const NWildcard::CCensorNode &wildcardCensor, + bool enableHeaders, bool techMode, bool &passwordEnabled, UString &password, UInt64 &numErrors) +{ + numErrors = 0; + CFieldPrinter fieldPrinter; + if (!techMode) + fieldPrinter.Init(kStandardFieldTable, sizeof(kStandardFieldTable) / sizeof(kStandardFieldTable[0])); + + UInt64 numFiles2 = 0, numDirs2 = 0, totalPackSize2 = 0, totalUnPackSize2 = 0; + UInt64 *totalPackSizePointer2 = 0, *totalUnPackSizePointer2 = 0; + for (int i = 0; i < archivePaths.Size(); i++) + { + const UString &archiveName = archivePaths[i]; + NFile::NFind::CFileInfoW archiveFileInfo; + if (!NFile::NFind::FindFile(archiveName, archiveFileInfo) || archiveFileInfo.IsDirectory()) + { + g_StdOut << endl << "Error: " << archiveName << " is not archive" << endl; + numErrors++; + continue; + } + if (archiveFileInfo.IsDirectory()) + { + g_StdOut << endl << "Error: " << archiveName << " is not file" << endl; + numErrors++; + continue; + } + + CArchiveLink archiveLink; + + COpenCallbackConsole openCallback; + openCallback.OutStream = &g_StdOut; + openCallback.PasswordIsDefined = passwordEnabled; + openCallback.Password = password; + + HRESULT result = MyOpenArchive(codecs, archiveName, archiveLink, &openCallback); + if (result != S_OK) + { + g_StdOut << endl << "Error: " << archiveName << " is not supported archive" << endl; + numErrors++; + continue; + } + + for (int v = 0; v < archiveLink.VolumePaths.Size(); v++) + { + int index = archivePathsFull.FindInSorted(archiveLink.VolumePaths[v]); + if (index >= 0 && index > i) + { + archivePaths.Delete(index); + archivePathsFull.Delete(index); + } + } + + IInArchive *archive = archiveLink.GetArchive(); + const UString defaultItemName = archiveLink.GetDefaultItemName(); + + if (enableHeaders) + { + g_StdOut << endl << kListing << archiveName << endl << endl; + + UInt32 numProps; + if (archive->GetNumberOfArchiveProperties(&numProps) == S_OK) + { + for (UInt32 i = 0; i < numProps; i++) + { + CMyComBSTR name; + PROPID propID; + VARTYPE vt; + if (archive->GetArchivePropertyInfo(i, &name, &propID, &vt) != S_OK) + continue; + NCOM::CPropVariant prop; + if (archive->GetArchiveProperty(propID, &prop) != S_OK) + continue; + UString s = ConvertPropertyToString(prop, propID); + if (!s.IsEmpty()) + g_StdOut << GetPropName(propID, name) << " = " << s << endl; + } + } + if (techMode) + g_StdOut << "----------\n"; + if (numProps > 0) + g_StdOut << endl; + } + + if (enableHeaders && !techMode) + { + fieldPrinter.PrintTitle(); + g_StdOut << endl; + fieldPrinter.PrintTitleLines(); + g_StdOut << endl; + } + + if (techMode) + { + RINOK(fieldPrinter.Init(archive)); + } + UInt64 numFiles = 0, numDirs = 0, totalPackSize = 0, totalUnPackSize = 0; + UInt64 *totalPackSizePointer = 0, *totalUnPackSizePointer = 0; + UInt32 numItems; + RINOK(archive->GetNumberOfItems(&numItems)); + for(UInt32 i = 0; i < numItems; i++) + { + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + + UString filePath; + RINOK(GetArchiveItemPath(archive, i, defaultItemName, filePath)); + + bool isFolder; + RINOK(IsArchiveItemFolder(archive, i, isFolder)); + if (!wildcardCensor.CheckPath(filePath, !isFolder)) + continue; + + fieldPrinter.PrintItemInfo(archive, defaultItemName, archiveFileInfo, i, techMode); + + UInt64 packSize, unpackSize; + if (!GetUInt64Value(archive, i, kpidSize, unpackSize)) + unpackSize = 0; + else + totalUnPackSizePointer = &totalUnPackSize; + if (!GetUInt64Value(archive, i, kpidPackedSize, packSize)) + packSize = 0; + else + totalPackSizePointer = &totalPackSize; + + g_StdOut << endl; + + if (isFolder) + numDirs++; + else + numFiles++; + totalPackSize += packSize; + totalUnPackSize += unpackSize; + } + if (enableHeaders && !techMode) + { + fieldPrinter.PrintTitleLines(); + g_StdOut << endl; + fieldPrinter.PrintSummaryInfo(numFiles, numDirs, totalUnPackSizePointer, totalPackSizePointer); + g_StdOut << endl; + } + if (totalPackSizePointer != 0) + { + totalPackSizePointer2 = &totalPackSize2; + totalPackSize2 += totalPackSize; + } + if (totalUnPackSizePointer != 0) + { + totalUnPackSizePointer2 = &totalUnPackSize2; + totalUnPackSize2 += totalUnPackSize; + } + numFiles2 += numFiles; + numDirs2 += numDirs; + } + if (enableHeaders && !techMode && archivePaths.Size() > 1) + { + g_StdOut << endl; + fieldPrinter.PrintTitleLines(); + g_StdOut << endl; + fieldPrinter.PrintSummaryInfo(numFiles2, numDirs2, totalUnPackSizePointer2, totalPackSizePointer2); + g_StdOut << endl; + g_StdOut << "Archives: " << archivePaths.Size() << endl; + } + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/List.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/List.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,16 @@ +// List.h + +#ifndef __LIST_H +#define __LIST_H + +#include "Common/Wildcard.h" +#include "../Common/LoadCodecs.h" + +HRESULT ListArchives( + CCodecs *codecs, + UStringVector &archivePaths, UStringVector &archivePathsFull, + const NWildcard::CCensorNode &wildcardCensor, + bool enableHeaders, bool techMode, bool &passwordEnabled, UString &password, UInt64 &errors); + +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/Main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/Main.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,563 @@ +// Main.cpp + +#include "StdAfx.h" + +#include "Common/MyInitGuid.h" + +#include "Common/CommandLineParser.h" +#include "Common/MyException.h" +#include "Common/IntToString.h" +#include "Common/StdOutStream.h" +#include "Common/StringConvert.h" +#include "Common/StringToInt.h" + +#include "Windows/FileDir.h" +#include "Windows/FileName.h" +#include "Windows/Defs.h" +#include "Windows/Error.h" +#ifdef _WIN32 +#include "Windows/MemoryLock.h" +#endif + +#include "../../IPassword.h" +#include "../../ICoder.h" +#include "../Common/UpdateAction.h" +#include "../Common/Update.h" +#include "../Common/Extract.h" +#include "../Common/ArchiveCommandLine.h" +#include "../Common/ExitCode.h" +#ifdef EXTERNAL_CODECS +#include "../Common/LoadCodecs.h" +#endif + +#include "../../Compress/LZMA_Alone/LzmaBenchCon.h" + +#include "List.h" +#include "OpenCallbackConsole.h" +#include "ExtractCallbackConsole.h" +#include "UpdateCallbackConsole.h" + +#include "../../MyVersion.h" + +#if defined( _WIN32) && defined( _7ZIP_LARGE_PAGES) +extern "C" +{ +#include "../../../../C/Alloc.h" +} +#endif + +using namespace NWindows; +using namespace NFile; +using namespace NCommandLineParser; + +HINSTANCE g_hInstance = 0; +extern CStdOutStream *g_StdStream; + +static const char *kCopyrightString = "\n7-Zip" +#ifndef EXTERNAL_CODECS +" (A)" +#endif + +#ifdef _WIN64 +" [64]" +#endif + +" " MY_VERSION_COPYRIGHT_DATE "\n"; + +static const char *kHelpString = + "\nUsage: 7z" +#ifdef _NO_CRYPTO + "r" +#else +#ifndef EXTERNAL_CODECS + "a" +#endif +#endif + " [...] [...]\n" + " [<@listfiles...>]\n" + "\n" + "\n" + " a: Add files to archive\n" + " b: Benchmark\n" + " d: Delete files from archive\n" + " e: Extract files from archive (without using directory names)\n" + " l: List contents of archive\n" +// " l[a|t][f]: List contents of archive\n" +// " a - with Additional fields\n" +// " t - with all fields\n" +// " f - with Full pathnames\n" + " t: Test integrity of archive\n" + " u: Update files to archive\n" + " x: eXtract files with full paths\n" + "\n" + " -ai[r[-|0]]{@listfile|!wildcard}: Include archives\n" + " -ax[r[-|0]]{@listfile|!wildcard}: eXclude archives\n" + " -bd: Disable percentage indicator\n" + " -i[r[-|0]]{@listfile|!wildcard}: Include filenames\n" + " -m{Parameters}: set compression Method\n" + " -o{Directory}: set Output directory\n" + " -p{Password}: set Password\n" + " -r[-|0]: Recurse subdirectories\n" + " -scs{UTF-8 | WIN | DOS}: set charset for list files\n" + " -sfx[{name}]: Create SFX archive\n" + " -si[{name}]: read data from stdin\n" + " -slt: show technical information for l (List) command\n" + " -so: write data to stdout\n" + " -ssc[-]: set sensitive case mode\n" + " -ssw: compress shared files\n" + " -t{Type}: Set type of archive\n" + " -v{Size}[b|k|m|g]: Create volumes\n" + " -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: Update options\n" + " -w[{path}]: assign Work directory. Empty path means a temporary directory\n" + " -x[r[-|0]]]{@listfile|!wildcard}: eXclude filenames\n" + " -y: assume Yes on all queries\n"; + +// --------------------------- +// exception messages + +static const char *kEverythingIsOk = "Everything is Ok"; +static const char *kUserErrorMessage = "Incorrect command line"; // NExitCode::kUserError + +static const wchar_t *kDefaultSfxModule = L"7zCon.sfx"; + +static void ShowMessageAndThrowException(CStdOutStream &s, LPCSTR message, NExitCode::EEnum code) +{ + s << message << endl; + throw code; +} + +static void PrintHelpAndExit(CStdOutStream &s) // yyy +{ + s << kHelpString; + ShowMessageAndThrowException(s, kUserErrorMessage, NExitCode::kUserError); +} + +#ifndef _WIN32 +static void GetArguments(int numArguments, const char *arguments[], UStringVector &parts) +{ + parts.Clear(); + for(int i = 0; i < numArguments; i++) + { + UString s = MultiByteToUnicodeString(arguments[i]); + parts.Add(s); + } +} +#endif + +static void ShowCopyrightAndHelp(CStdOutStream &s, bool needHelp) +{ + s << kCopyrightString; + // s << "# CPUs: " << (UInt64)NWindows::NSystem::GetNumberOfProcessors() << "\n"; + if (needHelp) + s << kHelpString; +} + +#ifdef EXTERNAL_CODECS +static void PrintString(CStdOutStream &stdStream, const AString &s, int size) +{ + int len = s.Length(); + stdStream << s; + for (int i = len; i < size; i++) + stdStream << ' '; +} +#endif + +static void PrintString(CStdOutStream &stdStream, const UString &s, int size) +{ + int len = s.Length(); + stdStream << s; + for (int i = len; i < size; i++) + stdStream << ' '; +} + +static inline char GetHex(Byte value) +{ + return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10))); +} + +int Main2( + #ifndef _WIN32 + int numArguments, const char *arguments[] + #endif +) +{ + #ifdef _WIN32 + SetFileApisToOEM(); + #endif + + UStringVector commandStrings; + #ifdef _WIN32 + NCommandLineParser::SplitCommandLine(GetCommandLineW(), commandStrings); + #else + GetArguments(numArguments, arguments, commandStrings); + #endif + + if(commandStrings.Size() == 1) + { + ShowCopyrightAndHelp(g_StdOut, true); + return 0; + } + commandStrings.Delete(0); + + CArchiveCommandLineOptions options; + + CArchiveCommandLineParser parser; + + parser.Parse1(commandStrings, options); + + if(options.HelpMode) + { + ShowCopyrightAndHelp(g_StdOut, true); + return 0; + } + + #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) + if (options.LargePages) + { + SetLargePageSize(); + NSecurity::EnableLockMemoryPrivilege(); + } + #endif + + CStdOutStream &stdStream = options.StdOutMode ? g_StdErr : g_StdOut; + g_StdStream = &stdStream; + + if (options.EnableHeaders) + ShowCopyrightAndHelp(stdStream, false); + + parser.Parse2(options); + + CCodecs *codecs = new CCodecs; + CMyComPtr< + #ifdef EXTERNAL_CODECS + ICompressCodecsInfo + #else + IUnknown + #endif + > compressCodecsInfo = codecs; + HRESULT result = codecs->Load(); + if (result != S_OK) + throw CSystemException(result); + + bool isExtractGroupCommand = options.Command.IsFromExtractGroup(); + if (options.Command.CommandType == NCommandType::kInfo) + { + stdStream << endl << "Formats:" << endl; + int i; + for (i = 0; i < codecs->Formats.Size(); i++) + { + const CArcInfoEx &arc = codecs->Formats[i]; + #ifdef EXTERNAL_CODECS + if (arc.LibIndex >= 0) + { + char s[32]; + ConvertUInt64ToString(arc.LibIndex, s); + PrintString(stdStream, s, 2); + } + else + #endif + stdStream << " "; + stdStream << ' '; + stdStream << (char)(arc.UpdateEnabled ? 'C' : ' '); + stdStream << (char)(arc.KeepName ? 'K' : ' '); + stdStream << " "; + PrintString(stdStream, arc.Name, 6); + stdStream << " "; + UString s; + for (int t = 0; t < arc.Exts.Size(); t++) + { + const CArcExtInfo &ext = arc.Exts[t]; + s += ext.Ext; + if (!ext.AddExt.IsEmpty()) + { + s += L" ("; + s += ext.AddExt; + s += L')'; + } + s += L' '; + } + PrintString(stdStream, s, 14); + stdStream << " "; + const CByteBuffer &sig = arc.StartSignature; + for (size_t j = 0; j < sig.GetCapacity(); j++) + { + Byte b = sig[j]; + if (b > 0x20 && b < 0x80) + { + stdStream << (char)b; + } + else + { + stdStream << GetHex((Byte)((b >> 4) & 0xF)); + stdStream << GetHex((Byte)(b & 0xF)); + } + stdStream << ' '; + } + stdStream << endl; + } + stdStream << endl << "Codecs:" << endl; + + #ifdef EXTERNAL_CODECS + UINT32 numMethods; + if (codecs->GetNumberOfMethods(&numMethods) == S_OK) + for (UInt32 j = 0; j < numMethods; j++) + { + int libIndex = codecs->GetCodecLibIndex(j); + if (libIndex >= 0) + { + char s[32]; + ConvertUInt64ToString(libIndex, s); + PrintString(stdStream, s, 2); + } + else + stdStream << " "; + stdStream << ' '; + stdStream << (char)(codecs->GetCodecEncoderIsAssigned(j) ? 'C' : ' '); + UInt64 id; + stdStream << " "; + HRESULT res = codecs->GetCodecId(j, id); + if (res != S_OK) + id = (UInt64)(Int64)-1; + char s[32]; + ConvertUInt64ToString(id, s, 16); + PrintString(stdStream, s, 8); + stdStream << " "; + PrintString(stdStream, codecs->GetCodecName(j), 11); + stdStream << endl; + /* + if (res != S_OK) + throw "incorrect Codec ID"; + */ + } + #endif + return S_OK; + } + else if (options.Command.CommandType == NCommandType::kBenchmark) + { + if (options.Method.CompareNoCase(L"CRC") == 0) + { + HRESULT res = CrcBenchCon((FILE *)stdStream, options.NumIterations, options.NumThreads, options.DictionarySize); + if (res != S_OK) + { + if (res == S_FALSE) + { + stdStream << "\nCRC Error\n"; + return NExitCode::kFatalError; + } + throw CSystemException(res); + } + } + else + { + HRESULT res = LzmaBenchCon( + #ifdef EXTERNAL_LZMA + codecs, + #endif + (FILE *)stdStream, options.NumIterations, options.NumThreads, options.DictionarySize); + if (res != S_OK) + { + if (res == S_FALSE) + { + stdStream << "\nDecoding Error\n"; + return NExitCode::kFatalError; + } + throw CSystemException(res); + } + } + } + else if (isExtractGroupCommand || options.Command.CommandType == NCommandType::kList) + { + if(isExtractGroupCommand) + { + CExtractCallbackConsole *ecs = new CExtractCallbackConsole; + CMyComPtr extractCallback = ecs; + + ecs->OutStream = &stdStream; + ecs->PasswordIsDefined = options.PasswordEnabled; + ecs->Password = options.Password; + ecs->Init(); + + COpenCallbackConsole openCallback; + openCallback.OutStream = &stdStream; + openCallback.PasswordIsDefined = options.PasswordEnabled; + openCallback.Password = options.Password; + + CExtractOptions eo; + eo.StdOutMode = options.StdOutMode; + eo.PathMode = options.Command.GetPathMode(); + eo.TestMode = options.Command.IsTestMode(); + eo.OverwriteMode = options.OverwriteMode; + eo.OutputDir = options.OutputDir; + eo.YesToAll = options.YesToAll; + #ifdef COMPRESS_MT + eo.Properties = options.ExtractProperties; + #endif + UString errorMessage; + CDecompressStat stat; + HRESULT result = DecompressArchives( + codecs, + options.ArchivePathsSorted, + options.ArchivePathsFullSorted, + options.WildcardCensor.Pairs.Front().Head, + eo, &openCallback, ecs, errorMessage, stat); + if (!errorMessage.IsEmpty()) + { + stdStream << endl << "Error: " << errorMessage; + if (result == S_OK) + result = E_FAIL; + } + + stdStream << endl; + if (ecs->NumArchives > 1) + stdStream << "Archives: " << ecs->NumArchives << endl; + if (ecs->NumArchiveErrors != 0 || ecs->NumFileErrors != 0) + { + if (ecs->NumArchives > 1) + { + stdStream << endl; + if (ecs->NumArchiveErrors != 0) + stdStream << "Archive Errors: " << ecs->NumArchiveErrors << endl; + if (ecs->NumFileErrors != 0) + stdStream << "Sub items Errors: " << ecs->NumFileErrors << endl; + } + if (result != S_OK) + throw CSystemException(result); + return NExitCode::kFatalError; + } + if (result != S_OK) + throw CSystemException(result); + if (stat.NumFolders != 0) + stdStream << "Folders: " << stat.NumFolders << endl; + if (stat.NumFiles != 1 || stat.NumFolders != 0) + stdStream << "Files: " << stat.NumFiles << endl; + stdStream + << "Size: " << stat.UnpackSize << endl + << "Compressed: " << stat.PackSize << endl; + } + else + { + UInt64 numErrors = 0; + HRESULT result = ListArchives( + codecs, + options.ArchivePathsSorted, + options.ArchivePathsFullSorted, + options.WildcardCensor.Pairs.Front().Head, + options.EnableHeaders, + options.TechMode, + options.PasswordEnabled, + options.Password, numErrors); + if (numErrors > 0) + { + g_StdOut << endl << "Errors: " << numErrors; + return NExitCode::kFatalError; + } + if (result != S_OK) + throw CSystemException(result); + } + } + else if(options.Command.IsFromUpdateGroup()) + { + UString workingDir; + + CUpdateOptions &uo = options.UpdateOptions; + if (uo.SfxMode && uo.SfxModule.IsEmpty()) + uo.SfxModule = kDefaultSfxModule; + + bool passwordIsDefined = + options.PasswordEnabled && !options.Password.IsEmpty(); + + COpenCallbackConsole openCallback; + openCallback.OutStream = &stdStream; + openCallback.PasswordIsDefined = passwordIsDefined; + openCallback.Password = options.Password; + + CUpdateCallbackConsole callback; + callback.EnablePercents = options.EnablePercents; + callback.PasswordIsDefined = passwordIsDefined; + callback.AskPassword = options.PasswordEnabled && options.Password.IsEmpty(); + callback.Password = options.Password; + callback.StdOutMode = uo.StdOutMode; + callback.Init(&stdStream); + + CUpdateErrorInfo errorInfo; + + if (!uo.Init(codecs, options.ArchiveName, options.ArcType)) + throw "Unsupported archive type"; + HRESULT result = UpdateArchive(codecs, + options.WildcardCensor, uo, + errorInfo, &openCallback, &callback); + + int exitCode = NExitCode::kSuccess; + if (callback.CantFindFiles.Size() > 0) + { + stdStream << endl; + stdStream << "WARNINGS for files:" << endl << endl; + int numErrors = callback.CantFindFiles.Size(); + for (int i = 0; i < numErrors; i++) + { + stdStream << callback.CantFindFiles[i] << " : "; + stdStream << NError::MyFormatMessageW(callback.CantFindCodes[i]) << endl; + } + stdStream << "----------------" << endl; + stdStream << "WARNING: Cannot find " << numErrors << " file"; + if (numErrors > 1) + stdStream << "s"; + stdStream << endl; + exitCode = NExitCode::kWarning; + } + + if (result != S_OK) + { + UString message; + if (!errorInfo.Message.IsEmpty()) + { + message += errorInfo.Message; + message += L"\n"; + } + if (!errorInfo.FileName.IsEmpty()) + { + message += errorInfo.FileName; + message += L"\n"; + } + if (!errorInfo.FileName2.IsEmpty()) + { + message += errorInfo.FileName2; + message += L"\n"; + } + if (errorInfo.SystemError != 0) + { + message += NError::MyFormatMessageW(errorInfo.SystemError); + message += L"\n"; + } + if (!message.IsEmpty()) + stdStream << L"\nError:\n" << message; + throw CSystemException(result); + } + int numErrors = callback.FailedFiles.Size(); + if (numErrors == 0) + { + if (callback.CantFindFiles.Size() == 0) + stdStream << kEverythingIsOk << endl; + } + else + { + stdStream << endl; + stdStream << "WARNINGS for files:" << endl << endl; + for (int i = 0; i < numErrors; i++) + { + stdStream << callback.FailedFiles[i] << " : "; + stdStream << NError::MyFormatMessageW(callback.FailedCodes[i]) << endl; + } + stdStream << "----------------" << endl; + stdStream << "WARNING: Cannot open " << numErrors << " file"; + if (numErrors > 1) + stdStream << "s"; + stdStream << endl; + exitCode = NExitCode::kWarning; + } + return exitCode; + } + else + PrintHelpAndExit(stdStream); + return 0; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/MainAr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/MainAr.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,161 @@ +// MainAr.cpp + +#include "StdAfx.h" + +// #include + +#include "Windows/Error.h" + +#include "Common/StdOutStream.h" +#include "Common/NewHandler.h" +#include "Common/MyException.h" +#include "Common/StringConvert.h" + +#include "../Common/ExitCode.h" +#include "../Common/ArchiveCommandLine.h" +#include "ConsoleClose.h" + +using namespace NWindows; + +CStdOutStream *g_StdStream = 0; + +#ifdef _WIN32 +#ifndef _UNICODE +bool g_IsNT = false; +#endif +#if !defined(_UNICODE) || !defined(_WIN64) +static inline bool IsItWindowsNT() +{ + OSVERSIONINFO versionInfo; + versionInfo.dwOSVersionInfoSize = sizeof(versionInfo); + if (!::GetVersionEx(&versionInfo)) + return false; + return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT); +} +#endif +#endif + +extern int Main2( + #ifndef _WIN32 + int numArguments, const char *arguments[] + #endif +); + +static const char *kExceptionErrorMessage = "\n\nError:\n"; +static const char *kUserBreak = "\nBreak signaled\n"; + +static const char *kMemoryExceptionMessage = "\n\nERROR: Can't allocate required memory!\n"; +static const char *kUnknownExceptionMessage = "\n\nUnknown Error\n"; +static const char *kInternalExceptionMessage = "\n\nInternal Error #"; + +int +#ifdef _MSC_VER +__cdecl +#endif +main +( +#ifndef _WIN32 +int numArguments, const char *arguments[] +#endif +) +{ + g_StdStream = &g_StdOut; + #ifdef _WIN32 + + #ifdef _UNICODE + #ifndef _WIN64 + if (!IsItWindowsNT()) + { + (*g_StdStream) << "This program requires Windows NT/2000/XP/2003/Vista"; + return NExitCode::kFatalError; + } + #endif + #else + g_IsNT = IsItWindowsNT(); + #endif + + #endif + + // setlocale(LC_COLLATE, ".OCP"); + NConsoleClose::CCtrlHandlerSetter ctrlHandlerSetter; + int res = 0; + try + { + res = Main2( +#ifndef _WIN32 + numArguments, arguments +#endif + ); + } + catch(const CNewException &) + { + (*g_StdStream) << kMemoryExceptionMessage; + return (NExitCode::kMemoryError); + } + catch(const NConsoleClose::CCtrlBreakException &) + { + (*g_StdStream) << endl << kUserBreak; + return (NExitCode::kUserBreak); + } + catch(const CArchiveCommandLineException &e) + { + (*g_StdStream) << kExceptionErrorMessage << e << endl; + return (NExitCode::kUserError); + } + catch(const CSystemException &systemError) + { + if (systemError.ErrorCode == E_OUTOFMEMORY) + { + (*g_StdStream) << kMemoryExceptionMessage; + return (NExitCode::kMemoryError); + } + if (systemError.ErrorCode == E_ABORT) + { + (*g_StdStream) << endl << kUserBreak; + return (NExitCode::kUserBreak); + } + UString message; + NError::MyFormatMessage(systemError.ErrorCode, message); + (*g_StdStream) << endl << endl << "System error:" << endl << + message << endl; + return (NExitCode::kFatalError); + } + catch(NExitCode::EEnum &exitCode) + { + (*g_StdStream) << kInternalExceptionMessage << exitCode << endl; + return (exitCode); + } + /* + catch(const NExitCode::CMultipleErrors &multipleErrors) + { + (*g_StdStream) << endl << multipleErrors.NumErrors << " errors" << endl; + return (NExitCode::kFatalError); + } + */ + catch(const UString &s) + { + (*g_StdStream) << kExceptionErrorMessage << s << endl; + return (NExitCode::kFatalError); + } + catch(const AString &s) + { + (*g_StdStream) << kExceptionErrorMessage << s << endl; + return (NExitCode::kFatalError); + } + catch(const char *s) + { + (*g_StdStream) << kExceptionErrorMessage << s << endl; + return (NExitCode::kFatalError); + } + catch(int t) + { + (*g_StdStream) << kInternalExceptionMessage << t << endl; + return (NExitCode::kFatalError); + } + catch(...) + { + (*g_StdStream) << kUnknownExceptionMessage; + return (NExitCode::kFatalError); + } + return res; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/OpenCallbackConsole.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/OpenCallbackConsole.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,58 @@ +// OpenCallbackConsole.cpp + +#include "StdAfx.h" + +#include "OpenCallbackConsole.h" + +#include "ConsoleClose.h" +#include "UserInputUtils.h" + +HRESULT COpenCallbackConsole::CheckBreak() +{ + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + return S_OK; +} + +HRESULT COpenCallbackConsole::SetTotal(const UInt64 *, const UInt64 *) +{ + return CheckBreak(); +} + +HRESULT COpenCallbackConsole::SetCompleted(const UInt64 *, const UInt64 *) +{ + return CheckBreak(); +} + +HRESULT COpenCallbackConsole::CryptoGetTextPassword(BSTR *password) +{ + PasswordWasAsked = true; + RINOK(CheckBreak()); + if (!PasswordIsDefined) + { + Password = GetPassword(OutStream); + PasswordIsDefined = true; + } + CMyComBSTR temp(Password); + *password = temp.Detach(); + return S_OK; +} + +HRESULT COpenCallbackConsole::GetPasswordIfAny(UString &password) +{ + if (PasswordIsDefined) + password = Password; + return S_OK; +} + +bool COpenCallbackConsole::WasPasswordAsked() +{ + return PasswordWasAsked; +} + +void COpenCallbackConsole::ClearPasswordWasAskedFlag() +{ + PasswordWasAsked = false; +} + + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/OpenCallbackConsole.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/OpenCallbackConsole.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,27 @@ +// OpenCallbackConsole.h + +#ifndef __OPENCALLBACKCONSOLE_H +#define __OPENCALLBACKCONSOLE_H + +#include "Common/StdOutStream.h" +#include "../Common/ArchiveOpenCallback.h" + +class COpenCallbackConsole: public IOpenCallbackUI +{ +public: + HRESULT CheckBreak(); + HRESULT SetTotal(const UInt64 *files, const UInt64 *bytes); + HRESULT SetCompleted(const UInt64 *files, const UInt64 *bytes); + HRESULT CryptoGetTextPassword(BSTR *password); + HRESULT GetPasswordIfAny(UString &password); + bool WasPasswordAsked(); + void ClearPasswordWasAskedFlag(); + + CStdOutStream *OutStream; + bool PasswordIsDefined; + UString Password; + bool PasswordWasAsked; + COpenCallbackConsole(): PasswordIsDefined(false), PasswordWasAsked(false) {} +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/PercentPrinter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/PercentPrinter.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,90 @@ +// PercentPrinter.cpp + +#include "StdAfx.h" + +#include "Common/IntToString.h" +#include "Common/MyString.h" + +#include "PercentPrinter.h" + +const int kPaddingSize = 2; +const int kPercentsSize = 4; +const int kMaxExtraSize = kPaddingSize + 32 + kPercentsSize; + +static void ClearPrev(char *p, int num) +{ + int i; + for (i = 0; i < num; i++) *p++ = '\b'; + for (i = 0; i < num; i++) *p++ = ' '; + for (i = 0; i < num; i++) *p++ = '\b'; + *p = '\0'; +} + +void CPercentPrinter::ClosePrint() +{ + if (m_NumExtraChars == 0) + return; + char s[kMaxExtraSize * 3 + 1]; + ClearPrev(s, m_NumExtraChars); + (*OutStream) << s; + m_NumExtraChars = 0; +} + +void CPercentPrinter::PrintString(const char *s) +{ + ClosePrint(); + (*OutStream) << s; +} + +void CPercentPrinter::PrintString(const wchar_t *s) +{ + ClosePrint(); + (*OutStream) << s; +} + +void CPercentPrinter::PrintNewLine() +{ + ClosePrint(); + (*OutStream) << "\n"; +} + +void CPercentPrinter::RePrintRatio() +{ + char s[32]; + ConvertUInt64ToString(((m_Total == 0) ? 0 : (m_CurValue * 100 / m_Total)), s); + int size = (int)strlen(s); + s[size++] = '%'; + s[size] = '\0'; + + int extraSize = kPaddingSize + MyMax(size, kPercentsSize); + if (extraSize < m_NumExtraChars) + extraSize = m_NumExtraChars; + + char fullString[kMaxExtraSize * 3]; + char *p = fullString; + int i; + if (m_NumExtraChars == 0) + { + for (i = 0; i < extraSize; i++) + *p++ = ' '; + m_NumExtraChars = extraSize; + } + + for (i = 0; i < m_NumExtraChars; i++) + *p++ = '\b'; + m_NumExtraChars = extraSize; + for (; size < m_NumExtraChars; size++) + *p++ = ' '; + MyStringCopy(p, s); + (*OutStream) << fullString; + OutStream->Flush(); + m_PrevValue = m_CurValue; +} + +void CPercentPrinter::PrintRatio() +{ + if (m_CurValue < m_PrevValue + m_MinStepSize && + m_CurValue + m_MinStepSize > m_PrevValue && m_NumExtraChars != 0) + return; + RePrintRatio(); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/PercentPrinter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/PercentPrinter.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,31 @@ +// PercentPrinter.h + +#ifndef __PERCENTPRINTER_H +#define __PERCENTPRINTER_H + +#include "Common/Types.h" +#include "Common/StdOutStream.h" + +class CPercentPrinter +{ + UInt64 m_MinStepSize; + UInt64 m_PrevValue; + UInt64 m_CurValue; + UInt64 m_Total; + int m_NumExtraChars; +public: + CStdOutStream *OutStream; + + CPercentPrinter(UInt64 minStepSize = 1): m_MinStepSize(minStepSize), + m_PrevValue(0), m_CurValue(0), m_Total(1), m_NumExtraChars(0) {} + void SetTotal(UInt64 total) { m_Total = total; m_PrevValue = 0; } + void SetRatio(UInt64 doneValue) { m_CurValue = doneValue; } + void PrintString(const char *s); + void PrintString(const wchar_t *s); + void PrintNewLine(); + void ClosePrint(); + void RePrintRatio(); + void PrintRatio(); +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/StdAfx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/StdAfx.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +// StdAfx.cpp + +#include "StdAfx.h" diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/MyWindows.h" +#include "../../../Common/NewHandler.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,208 @@ +// UpdateCallbackConsole.cpp + +#include "StdAfx.h" + +#include "UpdateCallbackConsole.h" + +#include "Windows/Error.h" +#ifdef COMPRESS_MT +#include "Windows/Synchronization.h" +#endif + +#include "ConsoleClose.h" +#include "UserInputUtils.h" + +using namespace NWindows; + +#ifdef COMPRESS_MT +static NSynchronization::CCriticalSection g_CriticalSection; +#define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection); +#else +#define MT_LOCK +#endif + +static const wchar_t *kEmptyFileAlias = L"[Content]"; + +static const char *kCreatingArchiveMessage = "Creating archive "; +static const char *kUpdatingArchiveMessage = "Updating archive "; +static const char *kScanningMessage = "Scanning"; + + +HRESULT CUpdateCallbackConsole::OpenResult(const wchar_t *name, HRESULT result) +{ + (*OutStream) << endl; + if (result != S_OK) + (*OutStream) << "Error: " << name << " is not supported archive" << endl; + return S_OK; +} + +HRESULT CUpdateCallbackConsole::StartScanning() +{ + (*OutStream) << kScanningMessage; + return S_OK; +} + +HRESULT CUpdateCallbackConsole::CanNotFindError(const wchar_t *name, DWORD systemError) +{ + CantFindFiles.Add(name); + CantFindCodes.Add(systemError); + // m_PercentPrinter.ClosePrint(); + if (!m_WarningsMode) + { + (*OutStream) << endl << endl; + m_PercentPrinter.PrintNewLine(); + m_WarningsMode = true; + } + m_PercentPrinter.PrintString(name); + m_PercentPrinter.PrintString(": WARNING: "); + m_PercentPrinter.PrintString(NError::MyFormatMessageW(systemError)); + m_PercentPrinter.PrintNewLine(); + return S_OK; +} + +HRESULT CUpdateCallbackConsole::FinishScanning() +{ + (*OutStream) << endl << endl; + return S_OK; +} + +HRESULT CUpdateCallbackConsole::StartArchive(const wchar_t *name, bool updating) +{ + if(updating) + (*OutStream) << kUpdatingArchiveMessage; + else + (*OutStream) << kCreatingArchiveMessage; + if (name != 0) + (*OutStream) << name; + else + (*OutStream) << "StdOut"; + (*OutStream) << endl << endl; + return S_OK; +} + +HRESULT CUpdateCallbackConsole::FinishArchive() +{ + (*OutStream) << endl; + return S_OK; +} + +HRESULT CUpdateCallbackConsole::CheckBreak() +{ + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + return S_OK; +} + +HRESULT CUpdateCallbackConsole::Finilize() +{ + MT_LOCK + if (m_NeedBeClosed) + { + if (EnablePercents) + { + m_PercentPrinter.ClosePrint(); + } + if (!StdOutMode && m_NeedNewLine) + { + m_PercentPrinter.PrintNewLine(); + m_NeedNewLine = false; + } + m_NeedBeClosed = false; + } + return S_OK; +} + +HRESULT CUpdateCallbackConsole::SetNumFiles(UInt64 /* numFiles */) +{ + return S_OK; +} + +HRESULT CUpdateCallbackConsole::SetTotal(UInt64 size) +{ + MT_LOCK + if (EnablePercents) + m_PercentPrinter.SetTotal(size); + return S_OK; +} + +HRESULT CUpdateCallbackConsole::SetCompleted(const UInt64 *completeValue) +{ + MT_LOCK + if (completeValue != NULL) + { + if (EnablePercents) + { + m_PercentPrinter.SetRatio(*completeValue); + m_PercentPrinter.PrintRatio(); + m_NeedBeClosed = true; + } + } + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + return S_OK; +} + +HRESULT CUpdateCallbackConsole::SetRatioInfo(const UInt64 * /* inSize */, const UInt64 * /* outSize */) +{ + /* + if (NConsoleClose::TestBreakSignal()) + return E_ABORT; + */ + return S_OK; +} + +HRESULT CUpdateCallbackConsole::GetStream(const wchar_t *name, bool isAnti) +{ + MT_LOCK + if (StdOutMode) + return S_OK; + if(isAnti) + m_PercentPrinter.PrintString("Anti item "); + else + m_PercentPrinter.PrintString("Compressing "); + if (name[0] == 0) + name = kEmptyFileAlias; + m_PercentPrinter.PrintString(name); + if (EnablePercents) + m_PercentPrinter.RePrintRatio(); + return S_OK; +} + +HRESULT CUpdateCallbackConsole::OpenFileError(const wchar_t *name, DWORD systemError) +{ + MT_LOCK + FailedCodes.Add(systemError); + FailedFiles.Add(name); + // if (systemError == ERROR_SHARING_VIOLATION) + { + m_PercentPrinter.ClosePrint(); + m_PercentPrinter.PrintNewLine(); + m_PercentPrinter.PrintString("WARNING: "); + m_PercentPrinter.PrintString(NError::MyFormatMessageW(systemError)); + return S_FALSE; + } + // return systemError; +} + +HRESULT CUpdateCallbackConsole::SetOperationResult(Int32 ) +{ + m_NeedBeClosed = true; + m_NeedNewLine = true; + return S_OK; +} + +HRESULT CUpdateCallbackConsole::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) +{ + if (!PasswordIsDefined) + { + if (AskPassword) + { + Password = GetPassword(OutStream); + PasswordIsDefined = true; + } + } + *passwordIsDefined = BoolToInt(PasswordIsDefined); + CMyComBSTR tempName(Password); + *password = tempName.Detach(); + return S_OK; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,58 @@ +// UpdateCallbackConsole.h + +#ifndef __UPDATECALLBACKCONSOLE_H +#define __UPDATECALLBACKCONSOLE_H + +#include "Common/MyString.h" +#include "Common/StdOutStream.h" +#include "PercentPrinter.h" +#include "../Common/Update.h" + +class CUpdateCallbackConsole: public IUpdateCallbackUI2 +{ + CPercentPrinter m_PercentPrinter; + bool m_NeedBeClosed; + bool m_NeedNewLine; + + bool m_WarningsMode; + + CStdOutStream *OutStream; +public: + bool EnablePercents; + bool StdOutMode; + + bool PasswordIsDefined; + UString Password; + bool AskPassword; + + + CUpdateCallbackConsole(): + m_PercentPrinter(1 << 16), + PasswordIsDefined(false), + AskPassword(false), + StdOutMode(false), + EnablePercents(true), + m_WarningsMode(false) + {} + + ~CUpdateCallbackConsole() { Finilize(); } + void Init(CStdOutStream *outStream) + { + m_NeedBeClosed = false; + m_NeedNewLine = false; + FailedFiles.Clear(); + FailedCodes.Clear(); + OutStream = outStream; + m_PercentPrinter.OutStream = outStream; + } + + INTERFACE_IUpdateCallbackUI2(;) + + UStringVector FailedFiles; + CRecordVector FailedCodes; + + UStringVector CantFindFiles; + CRecordVector CantFindCodes; +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/UserInputUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/UserInputUtils.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,58 @@ +// UserInputUtils.cpp + +#include "StdAfx.h" + +#include "Common/StdInStream.h" +#include "Common/StringConvert.h" + +#include "UserInputUtils.h" + +static const char kYes = 'Y'; +static const char kNo = 'N'; +static const char kYesAll = 'A'; +static const char kNoAll = 'S'; +static const char kAutoRename = 'U'; +static const char kQuit = 'Q'; + +static const char *kFirstQuestionMessage = "?\n"; +static const char *kHelpQuestionMessage = + "(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename / (Q)uit? "; + +// return true if pressed Quite; +// in: anAll +// out: anAll, anYes; + +NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream) +{ + (*outStream) << kFirstQuestionMessage; + for(;;) + { + (*outStream) << kHelpQuestionMessage; + AString scannedString = g_StdIn.ScanStringUntilNewLine(); + scannedString.Trim(); + if(!scannedString.IsEmpty()) + switch(::MyCharUpper(scannedString[0])) + { + case kYes: + return NUserAnswerMode::kYes; + case kNo: + return NUserAnswerMode::kNo; + case kYesAll: + return NUserAnswerMode::kYesAll; + case kNoAll: + return NUserAnswerMode::kNoAll; + case kAutoRename: + return NUserAnswerMode::kAutoRename; + case kQuit: + return NUserAnswerMode::kQuit; + } + } +} + +UString GetPassword(CStdOutStream *outStream) +{ + (*outStream) << "\nEnter password:"; + outStream->Flush(); + AString oemPassword = g_StdIn.ScanStringUntilNewLine(); + return MultiByteToUnicodeString(oemPassword, CP_OEMCP); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/UserInputUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/UserInputUtils.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// UserInputUtils.h + +#ifndef __USERINPUTUTILS_H +#define __USERINPUTUTILS_H + +#include "Common/StdOutStream.h" + +namespace NUserAnswerMode { + +enum EEnum +{ + kYes, + kNo, + kYesAll, + kNoAll, + kAutoRename, + kQuit +}; +} + +NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream); +UString GetPassword(CStdOutStream *outStream); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/7zip/UI/Console/afxres.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/7zip/UI/Console/afxres.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +#include diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Build.mak --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Build.mak Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,68 @@ +!IFDEF CPU +LIBS = $(LIBS) bufferoverflowU.lib +CFLAGS = $(CFLAGS) -GS- -Zc:forScope +!ENDIF + +!IFNDEF O +!IFDEF CPU +O=$(CPU) +!ELSE +O=O +!ENDIF +!ENDIF + +!IF "$(CPU)" != "IA64" +!IF "$(CPU)" != "AMD64" +MY_ML = ml +!ELSE +MY_ML = ml64 +!ENDIF +!ENDIF + +COMPL_ASM = $(MY_ML) -c -Fo$O/ $** + +CFLAGS = $(CFLAGS) -nologo -c -Fo$O/ -EHsc -Gz -WX -Gy + +!IFDEF MY_STATIC_LINK +!IFNDEF MY_SINGLE_THREAD +CFLAGS = $(CFLAGS) -MT +!ENDIF +!ELSE +CFLAGS = $(CFLAGS) -MD +!ENDIF + +!IFDEF NEW_COMPILER +CFLAGS_O1 = $(CFLAGS) -O1 -W4 -Wp64 +CFLAGS_O2 = $(CFLAGS) -O2 -W4 -Wp64 +!ELSE +CFLAGS_O1 = $(CFLAGS) -O1 -W3 +CFLAGS_O2 = $(CFLAGS) -O2 -W3 +!ENDIF + +LFLAGS = $(LFLAGS) -nologo -OPT:NOWIN98 -OPT:REF + +!IFDEF DEF_FILE +LFLAGS = $(LFLAGS) -DLL -DEF:$(DEF_FILE) +!ENDIF + +PROGPATH = $O\$(PROG) + +COMPL_O1 = $(CPP) $(CFLAGS_O1) $** +COMPL_O2 = $(CPP) $(CFLAGS_O2) $** +COMPL_PCH = $(CPP) $(CFLAGS_O1) -Yc"StdAfx.h" -Fp$O/a.pch $** +COMPL = $(CPP) $(CFLAGS_O1) -Yu"StdAfx.h" -Fp$O/a.pch $** + +all: $(PROGPATH) + +clean: + -del /Q $(PROGPATH) $O\*.exe $O\*.dll $O\*.obj $O\*.lib $O\*.exp $O\*.res $O\*.pch + +$O: + if not exist "$O" mkdir "$O" + +$(PROGPATH): $O $(OBJS) $(DEF_FILE) + link $(LFLAGS) -out:$(PROGPATH) $(OBJS) $(LIBS) +$O\resource.res: $(*B).rc + rc -fo$@ $** +$O\StdAfx.obj: $(*B).cpp + $(COMPL_PCH) diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/AutoPtr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/AutoPtr.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,35 @@ +// Common/AutoPtr.h + +#ifndef __COMMON_AUTOPTR_H +#define __COMMON_AUTOPTR_H + +template class CMyAutoPtr +{ + T *_p; +public: + CMyAutoPtr(T *p = 0) : _p(p) {} + CMyAutoPtr(CMyAutoPtr& p): _p(p.release()) {} + CMyAutoPtr& operator=(CMyAutoPtr& p) + { + reset(p.release()); + return (*this); + } + ~CMyAutoPtr() { delete _p; } + T& operator*() const { return *_p; } + // T* operator->() const { return (&**this); } + T* get() const { return _p; } + T* release() + { + T *tmp = _p; + _p = 0; + return tmp; + } + void reset(T* p = 0) + { + if (p != _p) + delete _p; + _p = p; + } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/Buffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/Buffer.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,77 @@ +// Common/Buffer.h + +#ifndef __COMMON_BUFFER_H +#define __COMMON_BUFFER_H + +#include "Defs.h" + +template class CBuffer +{ +protected: + size_t _capacity; + T *_items; +public: + void Free() + { + delete []_items; + _items = 0; + _capacity = 0; + } + CBuffer(): _capacity(0), _items(0) {}; + CBuffer(const CBuffer &buffer): _capacity(0), _items(0) { *this = buffer; } + CBuffer(size_t size): _items(0), _capacity(0) { SetCapacity(size); } + virtual ~CBuffer() { delete []_items; } + operator T *() { return _items; }; + operator const T *() const { return _items; }; + size_t GetCapacity() const { return _capacity; } + void SetCapacity(size_t newCapacity) + { + if (newCapacity == _capacity) + return; + T *newBuffer; + if (newCapacity > 0) + { + newBuffer = new T[newCapacity]; + if(_capacity > 0) + memmove(newBuffer, _items, MyMin(_capacity, newCapacity) * sizeof(T)); + } + else + newBuffer = 0; + delete []_items; + _items = newBuffer; + _capacity = newCapacity; + } + CBuffer& operator=(const CBuffer &buffer) + { + Free(); + if(buffer._capacity > 0) + { + SetCapacity(buffer._capacity); + memmove(_items, buffer._items, buffer._capacity * sizeof(T)); + } + return *this; + } +}; + +template +bool operator==(const CBuffer& b1, const CBuffer& b2) +{ + if (b1.GetCapacity() != b2.GetCapacity()) + return false; + for (size_t i = 0; i < b1.GetCapacity(); i++) + if (b1[i] != b2[i]) + return false; + return true; +} + +template +bool operator!=(const CBuffer& b1, const CBuffer& b2) +{ + return !(b1 == b2); +} + +typedef CBuffer CCharBuffer; +typedef CBuffer CWCharBuffer; +typedef CBuffer CByteBuffer; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/CRC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/CRC.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,14 @@ +// Common/CRC.cpp + +#include "StdAfx.h" + +extern "C" +{ +#include "../../C/7zCrc.h" +} + +class CCRCTableInit +{ +public: + CCRCTableInit() { CrcGenerateTable(); } +} g_CRCTableInit; diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/C_FileIO.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/C_FileIO.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,88 @@ +// Common/C_FileIO.h + +#include "C_FileIO.h" + +#include +#include + +namespace NC { +namespace NFile { +namespace NIO { + +bool CFileBase::OpenBinary(const char *name, int flags) +{ + #ifdef O_BINARY + flags |= O_BINARY; + #endif + Close(); + _handle = ::open(name, flags, 0666); + return _handle != -1; +} + +bool CFileBase::Close() +{ + if(_handle == -1) + return true; + if (close(_handle) != 0) + return false; + _handle = -1; + return true; +} + +bool CFileBase::GetLength(UInt64 &length) const +{ + off_t curPos = Seek(0, SEEK_CUR); + off_t lengthTemp = Seek(0, SEEK_END); + Seek(curPos, SEEK_SET); + length = (UInt64)lengthTemp; + return true; +} + +off_t CFileBase::Seek(off_t distanceToMove, int moveMethod) const +{ + return ::lseek(_handle, distanceToMove, moveMethod); +} + +///////////////////////// +// CInFile + +bool CInFile::Open(const char *name) +{ + return CFileBase::OpenBinary(name, O_RDONLY); +} + +bool CInFile::OpenShared(const char *name, bool) +{ + return Open(name); +} + +ssize_t CInFile::Read(void *data, size_t size) +{ + return read(_handle, data, size); +} + +///////////////////////// +// COutFile + +bool COutFile::Create(const char *name, bool createAlways) +{ + if (createAlways) + { + Close(); + _handle = ::creat(name, 0666); + return _handle != -1; + } + return OpenBinary(name, O_CREAT | O_EXCL | O_WRONLY); +} + +bool COutFile::Open(const char *name, DWORD creationDisposition) +{ + return Create(name, false); +} + +ssize_t COutFile::Write(const void *data, size_t size) +{ + return write(_handle, data, size); +} + +}}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/C_FileIO.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/C_FileIO.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,47 @@ +// Common/C_FileIO.h + +#ifndef __COMMON_C_FILEIO_H +#define __COMMON_C_FILEIO_H + +#include +#include + +#include "Types.h" +#include "MyWindows.h" + +namespace NC { +namespace NFile { +namespace NIO { + +class CFileBase +{ +protected: + int _handle; + bool OpenBinary(const char *name, int flags); +public: + CFileBase(): _handle(-1) {}; + ~CFileBase() { Close(); } + bool Close(); + bool GetLength(UInt64 &length) const; + off_t Seek(off_t distanceToMove, int moveMethod) const; +}; + +class CInFile: public CFileBase +{ +public: + bool Open(const char *name); + bool OpenShared(const char *name, bool shareForWrite); + ssize_t Read(void *data, size_t size); +}; + +class COutFile: public CFileBase +{ +public: + bool Create(const char *name, bool createAlways); + bool Open(const char *name, DWORD creationDisposition); + ssize_t Write(const void *data, size_t size); +}; + +}}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/ComTry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/ComTry.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,17 @@ +// ComTry.h + +#ifndef __COM_TRY_H +#define __COM_TRY_H + +#include "MyWindows.h" +// #include "Exception.h" +// #include "NewHandler.h" + +#define COM_TRY_BEGIN try { +#define COM_TRY_END } catch(...) { return E_OUTOFMEMORY; } + + // catch(const CNewException &) { return E_OUTOFMEMORY; }\ + // catch(const CSystemException &e) { return e.ErrorCode; }\ + // catch(...) { return E_FAIL; } + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/CommandLineParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/CommandLineParser.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,232 @@ +// CommandLineParser.cpp + +#include "StdAfx.h" + +#include "CommandLineParser.h" + +namespace NCommandLineParser { + +void SplitCommandLine(const UString &src, UString &dest1, UString &dest2) +{ + dest1.Empty(); + dest2.Empty(); + bool quoteMode = false; + int i; + for (i = 0; i < src.Length(); i++) + { + wchar_t c = src[i]; + if (c == L'\"') + quoteMode = !quoteMode; + else if (c == L' ' && !quoteMode) + { + i++; + break; + } + else + dest1 += c; + } + dest2 = src.Mid(i); +} + +void SplitCommandLine(const UString &s, UStringVector &parts) +{ + UString sTemp = s; + sTemp.Trim(); + parts.Clear(); + for (;;) + { + UString s1, s2; + SplitCommandLine(sTemp, s1, s2); + // s1.Trim(); + // s2.Trim(); + if (!s1.IsEmpty()) + parts.Add(s1); + if (s2.IsEmpty()) + break; + sTemp = s2; + } +} + + +static const wchar_t kSwitchID1 = '-'; +// static const wchar_t kSwitchID2 = '/'; + +static const wchar_t kSwitchMinus = '-'; +static const wchar_t *kStopSwitchParsing = L"--"; + +static bool IsItSwitchChar(wchar_t c) +{ + return (c == kSwitchID1 /*|| c == kSwitchID2 */); +} + +CParser::CParser(int numSwitches): + _numSwitches(numSwitches) +{ + _switches = new CSwitchResult[_numSwitches]; +} + +CParser::~CParser() +{ + delete []_switches; +} + +void CParser::ParseStrings(const CSwitchForm *switchForms, + const UStringVector &commandStrings) +{ + int numCommandStrings = commandStrings.Size(); + bool stopSwitch = false; + for (int i = 0; i < numCommandStrings; i++) + { + const UString &s = commandStrings[i]; + if (stopSwitch) + NonSwitchStrings.Add(s); + else + if (s == kStopSwitchParsing) + stopSwitch = true; + else + if (!ParseString(s, switchForms)) + NonSwitchStrings.Add(s); + } +} + +// if string contains switch then function updates switch structures +// out: (string is a switch) +bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms) +{ + int len = s.Length(); + if (len == 0) + return false; + int pos = 0; + if (!IsItSwitchChar(s[pos])) + return false; + while(pos < len) + { + if (IsItSwitchChar(s[pos])) + pos++; + const int kNoLen = -1; + int matchedSwitchIndex = 0; // GCC Warning + int maxLen = kNoLen; + for(int switchIndex = 0; switchIndex < _numSwitches; switchIndex++) + { + int switchLen = MyStringLen(switchForms[switchIndex].IDString); + if (switchLen <= maxLen || pos + switchLen > len) + continue; + + UString temp = s + pos; + temp = temp.Left(switchLen); + if(temp.CompareNoCase(switchForms[switchIndex].IDString) == 0) + // if(_strnicmp(switchForms[switchIndex].IDString, LPCSTR(s) + pos, switchLen) == 0) + { + matchedSwitchIndex = switchIndex; + maxLen = switchLen; + } + } + if (maxLen == kNoLen) + throw "maxLen == kNoLen"; + CSwitchResult &matchedSwitch = _switches[matchedSwitchIndex]; + const CSwitchForm &switchForm = switchForms[matchedSwitchIndex]; + if ((!switchForm.Multi) && matchedSwitch.ThereIs) + throw "switch must be single"; + matchedSwitch.ThereIs = true; + pos += maxLen; + int tailSize = len - pos; + NSwitchType::EEnum type = switchForm.Type; + switch(type) + { + case NSwitchType::kPostMinus: + { + if (tailSize == 0) + matchedSwitch.WithMinus = false; + else + { + matchedSwitch.WithMinus = (s[pos] == kSwitchMinus); + if (matchedSwitch.WithMinus) + pos++; + } + break; + } + case NSwitchType::kPostChar: + { + if (tailSize < switchForm.MinLen) + throw "switch is not full"; + UString set = switchForm.PostCharSet; + const int kEmptyCharValue = -1; + if (tailSize == 0) + matchedSwitch.PostCharIndex = kEmptyCharValue; + else + { + int index = set.Find(s[pos]); + if (index < 0) + matchedSwitch.PostCharIndex = kEmptyCharValue; + else + { + matchedSwitch.PostCharIndex = index; + pos++; + } + } + break; + } + case NSwitchType::kLimitedPostString: + case NSwitchType::kUnLimitedPostString: + { + int minLen = switchForm.MinLen; + if (tailSize < minLen) + throw "switch is not full"; + if (type == NSwitchType::kUnLimitedPostString) + { + matchedSwitch.PostStrings.Add(s.Mid(pos)); + return true; + } + int maxLen = switchForm.MaxLen; + UString stringSwitch = s.Mid(pos, minLen); + pos += minLen; + for(int i = minLen; i < maxLen && pos < len; i++, pos++) + { + wchar_t c = s[pos]; + if (IsItSwitchChar(c)) + break; + stringSwitch += c; + } + matchedSwitch.PostStrings.Add(stringSwitch); + break; + } + case NSwitchType::kSimple: + break; + } + } + return true; +} + +const CSwitchResult& CParser::operator[](size_t index) const +{ + return _switches[index]; +} + +///////////////////////////////// +// Command parsing procedures + +int ParseCommand(int numCommandForms, const CCommandForm *commandForms, + const UString &commandString, UString &postString) +{ + for(int i = 0; i < numCommandForms; i++) + { + const UString id = commandForms[i].IDString; + if (commandForms[i].PostStringMode) + { + if(commandString.Find(id) == 0) + { + postString = commandString.Mid(id.Length()); + return i; + } + } + else + if (commandString == id) + { + postString.Empty(); + return i; + } + } + return -1; +} + +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/CommandLineParser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/CommandLineParser.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,72 @@ +// Common/CommandLineParser.h + +#ifndef __COMMON_COMMANDLINEPARSER_H +#define __COMMON_COMMANDLINEPARSER_H + +#include "MyString.h" + +namespace NCommandLineParser { + +void SplitCommandLine(const UString &src, UString &dest1, UString &dest2); +void SplitCommandLine(const UString &s, UStringVector &parts); + +namespace NSwitchType { + enum EEnum + { + kSimple, + kPostMinus, + kLimitedPostString, + kUnLimitedPostString, + kPostChar + }; +} + +struct CSwitchForm +{ + const wchar_t *IDString; + NSwitchType::EEnum Type; + bool Multi; + int MinLen; + int MaxLen; + const wchar_t *PostCharSet; +}; + +struct CSwitchResult +{ + bool ThereIs; + bool WithMinus; + UStringVector PostStrings; + int PostCharIndex; + CSwitchResult(): ThereIs(false) {}; +}; + +class CParser +{ + int _numSwitches; + CSwitchResult *_switches; + bool ParseString(const UString &s, const CSwitchForm *switchForms); +public: + UStringVector NonSwitchStrings; + CParser(int numSwitches); + ~CParser(); + void ParseStrings(const CSwitchForm *switchForms, + const UStringVector &commandStrings); + const CSwitchResult& operator[](size_t index) const; +}; + +///////////////////////////////// +// Command parsing procedures + +struct CCommandForm +{ + wchar_t *IDString; + bool PostStringMode; +}; + +// Returns: Index of form and postString; -1, if there is no match +int ParseCommand(int numCommandForms, const CCommandForm *commandForms, + const UString &commandString, UString &postString); + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/Defs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/Defs.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,20 @@ +// Common/Defs.h + +#ifndef __COMMON_DEFS_H +#define __COMMON_DEFS_H + +template inline T MyMin(T a, T b) + { return a < b ? a : b; } +template inline T MyMax(T a, T b) + { return a > b ? a : b; } + +template inline int MyCompare(T a, T b) + { return a < b ? -1 : (a == b ? 0 : 1); } + +inline int BoolToInt(bool value) + { return (value ? 1: 0); } + +inline bool IntToBool(int value) + { return (value != 0); } + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/DynamicBuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/DynamicBuffer.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,47 @@ +// Common/DynamicBuffer.h + +#ifndef __COMMON_DYNAMICBUFFER_H +#define __COMMON_DYNAMICBUFFER_H + +#include "Buffer.h" + +template class CDynamicBuffer: public CBuffer +{ + void GrowLength(size_t size) + { + size_t delta; + if (this->_capacity > 64) + delta = this->_capacity / 4; + else if (this->_capacity > 8) + delta = 16; + else + delta = 4; + delta = MyMax(delta, size); + SetCapacity(this->_capacity + delta); + } +public: + CDynamicBuffer(): CBuffer() {}; + CDynamicBuffer(const CDynamicBuffer &buffer): CBuffer(buffer) {}; + CDynamicBuffer(size_t size): CBuffer(size) {}; + CDynamicBuffer& operator=(const CDynamicBuffer &buffer) + { + this->Free(); + if(buffer._capacity > 0) + { + SetCapacity(buffer._capacity); + memmove(this->_items, buffer._items, buffer._capacity * sizeof(T)); + } + return *this; + } + void EnsureCapacity(size_t capacity) + { + if (this->_capacity < capacity) + GrowLength(capacity - this->_capacity); + } +}; + +typedef CDynamicBuffer CCharDynamicBuffer; +typedef CDynamicBuffer CWCharDynamicBuffer; +typedef CDynamicBuffer CByteDynamicBuffer; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/IntToString.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/IntToString.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,63 @@ +// Common/IntToString.cpp + +#include "StdAfx.h" + +#include "IntToString.h" + +void ConvertUInt64ToString(UInt64 value, char *s, UInt32 base) +{ + if (base < 2 || base > 36) + { + *s = '\0'; + return; + } + char temp[72]; + int pos = 0; + do + { + int delta = (int)(value % base); + temp[pos++] = (char)((delta < 10) ? ('0' + delta) : ('a' + (delta - 10))); + value /= base; + } + while (value != 0); + do + *s++ = temp[--pos]; + while(pos > 0); + *s = '\0'; +} + +void ConvertUInt64ToString(UInt64 value, wchar_t *s) +{ + wchar_t temp[32]; + int pos = 0; + do + { + temp[pos++] = (wchar_t)(L'0' + (int)(value % 10)); + value /= 10; + } + while (value != 0); + do + *s++ = temp[--pos]; + while(pos > 0); + *s = L'\0'; +} + +void ConvertInt64ToString(Int64 value, char *s) +{ + if (value < 0) + { + *s++ = '-'; + value = -value; + } + ConvertUInt64ToString(value, s); +} + +void ConvertInt64ToString(Int64 value, wchar_t *s) +{ + if (value < 0) + { + *s++ = L'-'; + value = -value; + } + ConvertUInt64ToString(value, s); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/IntToString.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/IntToString.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,15 @@ +// Common/IntToString.h + +#ifndef __COMMON_INTTOSTRING_H +#define __COMMON_INTTOSTRING_H + +#include +#include "Types.h" + +void ConvertUInt64ToString(UInt64 value, char *s, UInt32 base = 10); +void ConvertUInt64ToString(UInt64 value, wchar_t *s); + +void ConvertInt64ToString(Int64 value, char *s); +void ConvertInt64ToString(Int64 value, wchar_t *s); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/ListFileUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/ListFileUtils.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,74 @@ +// Common/ListFileUtils.cpp + +#include "StdAfx.h" + +#include "../Windows/FileIO.h" + +#include "ListFileUtils.h" +#include "StringConvert.h" +#include "UTFConvert.h" + +static const char kQuoteChar = '\"'; +static void RemoveQuote(UString &s) +{ + if (s.Length() >= 2) + if (s[0] == kQuoteChar && s[s.Length() - 1] == kQuoteChar) + s = s.Mid(1, s.Length() - 2); +} + +bool ReadNamesFromListFile(LPCWSTR fileName, UStringVector &resultStrings, UINT codePage) +{ + NWindows::NFile::NIO::CInFile file; + if (!file.Open(fileName)) + return false; + UInt64 length; + if (!file.GetLength(length)) + return false; + if (length > ((UInt32)1 << 31)) + return false; + AString s; + char *p = s.GetBuffer((int)length + 1); + UInt32 processed; + if (!file.Read(p, (UInt32)length, processed)) + return false; + p[(UInt32)length] = 0; + s.ReleaseBuffer(); + file.Close(); + + UString u; + #ifdef CP_UTF8 + if (codePage == CP_UTF8) + { + if (!ConvertUTF8ToUnicode(s, u)) + return false; + } + else + #endif + u = MultiByteToUnicodeString(s, codePage); + if (!u.IsEmpty()) + { + if (u[0] == 0xFEFF) + u.Delete(0); + } + + UString t; + for(int i = 0; i < u.Length(); i++) + { + wchar_t c = u[i]; + if (c == L'\n' || c == 0xD) + { + t.Trim(); + RemoveQuote(t); + if (!t.IsEmpty()) + resultStrings.Add(t); + t.Empty(); + } + else + t += c; + } + t.Trim(); + RemoveQuote(t); + if (!t.IsEmpty()) + resultStrings.Add(t); + return true; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/ListFileUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/ListFileUtils.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,11 @@ +// Common/ListFileUtils.h + +#ifndef __COMMON_LISTFILEUTILS_H +#define __COMMON_LISTFILEUTILS_H + +#include "MyString.h" +#include "Types.h" + +bool ReadNamesFromListFile(LPCWSTR fileName, UStringVector &strings, UINT codePage = CP_OEMCP); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyCom.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyCom.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,218 @@ +// MyCom.h + +#ifndef __MYCOM_H +#define __MYCOM_H + +#include "MyWindows.h" + +#ifndef RINOK +#define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; } +#endif + +template +class CMyComPtr +{ + T* _p; +public: + // typedef T _PtrClass; + CMyComPtr() { _p = NULL;} + CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); } + CMyComPtr(const CMyComPtr& lp) + { + if ((_p = lp._p) != NULL) + _p->AddRef(); + } + ~CMyComPtr() { if (_p) _p->Release(); } + void Release() { if (_p) { _p->Release(); _p = NULL; } } + operator T*() const { return (T*)_p; } + // T& operator*() const { return *_p; } + T** operator&() { return &_p; } + T* operator->() const { return _p; } + T* operator=(T* p) + { + if (p != 0) + p->AddRef(); + if (_p) + _p->Release(); + _p = p; + return p; + } + T* operator=(const CMyComPtr& lp) { return (*this = lp._p); } + bool operator!() const { return (_p == NULL); } + // bool operator==(T* pT) const { return _p == pT; } + // Compare two objects for equivalence + void Attach(T* p2) + { + Release(); + _p = p2; + } + T* Detach() + { + T* pt = _p; + _p = NULL; + return pt; + } + #ifdef _WIN32 + HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p); + } + #endif + /* + HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + CLSID clsid; + HRESULT hr = CLSIDFromProgID(szProgID, &clsid); + ATLASSERT(_p == NULL); + if (SUCCEEDED(hr)) + hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p); + return hr; + } + */ + template + HRESULT QueryInterface(REFGUID iid, Q** pp) const + { + return _p->QueryInterface(iid, (void**)pp); + } +}; + +////////////////////////////////////////////////////////// + +class CMyComBSTR +{ +public: + BSTR m_str; + CMyComBSTR() { m_str = NULL; } + CMyComBSTR(LPCOLESTR pSrc) { m_str = ::SysAllocString(pSrc); } + // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); } + // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); } + CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); } + /* + CMyComBSTR(REFGUID src) + { + LPOLESTR szGuid; + StringFromCLSID(src, &szGuid); + m_str = ::SysAllocString(szGuid); + CoTaskMemFree(szGuid); + } + */ + ~CMyComBSTR() { ::SysFreeString(m_str); } + CMyComBSTR& operator=(const CMyComBSTR& src) + { + if (m_str != src.m_str) + { + if (m_str) + ::SysFreeString(m_str); + m_str = src.MyCopy(); + } + return *this; + } + CMyComBSTR& operator=(LPCOLESTR pSrc) + { + ::SysFreeString(m_str); + m_str = ::SysAllocString(pSrc); + return *this; + } + unsigned int Length() const { return ::SysStringLen(m_str); } + operator BSTR() const { return m_str; } + BSTR* operator&() { return &m_str; } + BSTR MyCopy() const + { + int byteLen = ::SysStringByteLen(m_str); + BSTR res = ::SysAllocStringByteLen(NULL, byteLen); + memmove(res, m_str, byteLen); + return res; + } + void Attach(BSTR src) { m_str = src; } + BSTR Detach() + { + BSTR s = m_str; + m_str = NULL; + return s; + } + void Empty() + { + ::SysFreeString(m_str); + m_str = NULL; + } + bool operator!() const { return (m_str == NULL); } +}; + + +////////////////////////////////////////////////////////// + +class CMyUnknownImp +{ +public: + ULONG __m_RefCount; + CMyUnknownImp(): __m_RefCount(0) {} +}; + +#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \ + (REFGUID iid, void **outObject) { + +#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \ + { *outObject = (void *)(i *)this; AddRef(); return S_OK; } + +#define MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) if (iid == IID_IUnknown) \ + { *outObject = (void *)(IUnknown *)(i *)this; AddRef(); return S_OK; } + +#define MY_QUERYINTERFACE_BEGIN2(i) MY_QUERYINTERFACE_BEGIN \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \ + MY_QUERYINTERFACE_ENTRY(i) + +#define MY_QUERYINTERFACE_END return E_NOINTERFACE; } + +#define MY_ADDREF_RELEASE \ +STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \ +STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \ + return __m_RefCount; delete this; return 0; } + +#define MY_UNKNOWN_IMP_SPEC(i) \ + MY_QUERYINTERFACE_BEGIN \ + i \ + MY_QUERYINTERFACE_END \ + MY_ADDREF_RELEASE + + +#define MY_UNKNOWN_IMP MY_QUERYINTERFACE_BEGIN \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(IUnknown) \ + MY_QUERYINTERFACE_END \ + MY_ADDREF_RELEASE + +#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \ + MY_QUERYINTERFACE_ENTRY(i) \ + ) + +#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + ) + +#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + ) + +#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + MY_QUERYINTERFACE_ENTRY(i4) \ + ) + +#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + MY_QUERYINTERFACE_ENTRY(i4) \ + MY_QUERYINTERFACE_ENTRY(i5) \ + ) + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyException.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyException.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,14 @@ +// Common/Exception.h + +#ifndef __COMMON_EXCEPTION_H +#define __COMMON_EXCEPTION_H + +#include "MyWindows.h" + +struct CSystemException +{ + HRESULT ErrorCode; + CSystemException(HRESULT errorCode): ErrorCode(errorCode) {} +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyGuidDef.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyGuidDef.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,54 @@ +// Common/MyGuidDef.h + +#ifndef GUID_DEFINED +#define GUID_DEFINED + +#include "Types.h" + +typedef struct { + UInt32 Data1; + UInt16 Data2; + UInt16 Data3; + unsigned char Data4[8]; +} GUID; + +#ifdef __cplusplus +#define REFGUID const GUID & +#else +#define REFGUID const GUID * +#endif + +#define REFCLSID REFGUID +#define REFIID REFGUID + +#ifdef __cplusplus +inline int operator==(REFGUID g1, REFGUID g2) +{ + for (int i = 0; i < (int)sizeof(g1); i++) + if (((unsigned char *)&g1)[i] != ((unsigned char *)&g2)[i]) + return 0; + return 1; +} +inline int operator!=(REFGUID g1, REFGUID g2) { return !(g1 == g2); } +#endif + +#ifdef __cplusplus + #define MY_EXTERN_C extern "C" +#else + #define MY_EXTERN_C extern +#endif + +#endif // GUID_DEFINED + + +#ifdef DEFINE_GUID +#undef DEFINE_GUID +#endif + +#ifdef INITGUID + #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } +#else + #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + MY_EXTERN_C const GUID name +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyInitGuid.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyInitGuid.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,15 @@ +// Common/MyInitGuid.h + +#ifndef __COMMON_MYINITGUID_H +#define __COMMON_MYINITGUID_H + +#ifdef _WIN32 +#include +#else +#define INITGUID +#include "MyGuidDef.h" +DEFINE_GUID(IID_IUnknown, +0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyString.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyString.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,198 @@ +// Common/MyString.cpp + +#include "StdAfx.h" + +#ifdef _WIN32 +#include "StringConvert.h" +#else +#include +#endif + +#include "MyString.h" + + +#ifdef _WIN32 + +#ifndef _UNICODE + +wchar_t MyCharUpper(wchar_t c) +{ + if (c == 0) + return 0; + wchar_t *res = CharUpperW((LPWSTR)(UINT_PTR)(unsigned int)c); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return (wchar_t)(unsigned int)(UINT_PTR)res; + const int kBufferSize = 4; + char s[kBufferSize + 1]; + int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufferSize, 0, 0); + if (numChars == 0 || numChars > kBufferSize) + return c; + s[numChars] = 0; + ::CharUpperA(s); + ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1); + return c; +} + +wchar_t MyCharLower(wchar_t c) +{ + if (c == 0) + return 0; + wchar_t *res = CharLowerW((LPWSTR)(UINT_PTR)(unsigned int)c); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return (wchar_t)(unsigned int)(UINT_PTR)res; + const int kBufferSize = 4; + char s[kBufferSize + 1]; + int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufferSize, 0, 0); + if (numChars == 0 || numChars > kBufferSize) + return c; + s[numChars] = 0; + ::CharLowerA(s); + ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1); + return c; +} + +wchar_t * MyStringUpper(wchar_t *s) +{ + if (s == 0) + return 0; + wchar_t *res = CharUpperW(s); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return res; + AString a = UnicodeStringToMultiByte(s); + a.MakeUpper(); + return MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a)); +} + +wchar_t * MyStringLower(wchar_t *s) +{ + if (s == 0) + return 0; + wchar_t *res = CharLowerW(s); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return res; + AString a = UnicodeStringToMultiByte(s); + a.MakeLower(); + return MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a)); +} + +#endif + +/* +inline int ConvertCompareResult(int r) { return r - 2; } + +int MyStringCollate(const wchar_t *s1, const wchar_t *s2) +{ + int res = CompareStringW( + LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1); + #ifdef _UNICODE + return ConvertCompareResult(res); + #else + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return ConvertCompareResult(res); + return MyStringCollate(UnicodeStringToMultiByte(s1), + UnicodeStringToMultiByte(s2)); + #endif +} + +#ifndef _WIN32_WCE +int MyStringCollate(const char *s1, const char *s2) +{ + return ConvertCompareResult(CompareStringA( + LOCALE_USER_DEFAULT, SORT_STRINGSORT, s1, -1, s2, -1)); +} + +int MyStringCollateNoCase(const char *s1, const char *s2) +{ + return ConvertCompareResult(CompareStringA( + LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1)); +} +#endif + +int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2) +{ + int res = CompareStringW( + LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, s1, -1, s2, -1); + #ifdef _UNICODE + return ConvertCompareResult(res); + #else + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return ConvertCompareResult(res); + return MyStringCollateNoCase(UnicodeStringToMultiByte(s1), + UnicodeStringToMultiByte(s2)); + #endif +} +*/ + +#else + +wchar_t MyCharUpper(wchar_t c) +{ + return toupper(c); +} + +/* +int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2) +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + wchar_t u1 = MyCharUpper(c1); + wchar_t u2 = MyCharUpper(c2); + + if (u1 < u2) return -1; + if (u1 > u2) return 1; + if (u1 == 0) return 0; + } +} +*/ + +#endif + +int MyStringCompare(const char *s1, const char *s2) +{ + for (;;) + { + unsigned char c1 = (unsigned char)*s1++; + unsigned char c2 = (unsigned char)*s2++; + if (c1 < c2) return -1; + if (c1 > c2) return 1; + if (c1 == 0) return 0; + } +} + +int MyStringCompare(const wchar_t *s1, const wchar_t *s2) +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 < c2) return -1; + if (c1 > c2) return 1; + if (c1 == 0) return 0; + } +} + +int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 != c2) + { + wchar_t u1 = MyCharUpper(c1); + wchar_t u2 = MyCharUpper(c2); + if (u1 < u2) return -1; + if (u1 > u2) return 1; + } + if (c1 == 0) return 0; + } +} + +#ifdef _WIN32 +int MyStringCompareNoCase(const char *s1, const char *s2) +{ + return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2)); +} +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyString.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyString.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,636 @@ +// Common/String.h + +#ifndef __COMMON_STRING_H +#define __COMMON_STRING_H + +#include +// #include + +#include "MyVector.h" + +#ifdef _WIN32 +#include "MyWindows.h" +#endif + +template +inline int MyStringLen(const T *s) +{ + int i; + for (i = 0; s[i] != '\0'; i++); + return i; +} + +template +inline T * MyStringCopy(T *dest, const T *src) +{ + T *destStart = dest; + while((*dest++ = *src++) != 0); + return destStart; +} + +inline wchar_t* MyStringGetNextCharPointer(wchar_t *p) + { return (p + 1); } +inline const wchar_t* MyStringGetNextCharPointer(const wchar_t *p) + { return (p + 1); } +inline wchar_t* MyStringGetPrevCharPointer(const wchar_t *, wchar_t *p) + { return (p - 1); } +inline const wchar_t* MyStringGetPrevCharPointer(const wchar_t *, const wchar_t *p) + { return (p - 1); } + +#ifdef _WIN32 + +inline char* MyStringGetNextCharPointer(char *p) + { return CharNextA(p); } +inline const char* MyStringGetNextCharPointer(const char *p) + { return CharNextA(p); } + +inline char* MyStringGetPrevCharPointer(char *base, char *p) + { return CharPrevA(base, p); } +inline const char* MyStringGetPrevCharPointer(const char *base, const char *p) + { return CharPrevA(base, p); } + +inline char MyCharUpper(char c) + { return (char)(unsigned int)(UINT_PTR)CharUpperA((LPSTR)(UINT_PTR)(unsigned int)(unsigned char)c); } +#ifdef _UNICODE +inline wchar_t MyCharUpper(wchar_t c) + { return (wchar_t)(unsigned int)(UINT_PTR)CharUpperW((LPWSTR)(UINT_PTR)(unsigned int)c); } +#else +wchar_t MyCharUpper(wchar_t c); +#endif + +inline char MyCharLower(char c) + { return (char)(unsigned int)(UINT_PTR)CharLowerA((LPSTR)(UINT_PTR)(unsigned int)(unsigned char)c); } +#ifdef _UNICODE +inline wchar_t MyCharLower(wchar_t c) + { return (wchar_t)(unsigned int)(UINT_PTR)CharLowerW((LPWSTR)(UINT_PTR)(unsigned int)c); } +#else +wchar_t MyCharLower(wchar_t c); +#endif + +inline char * MyStringUpper(char *s) { return CharUpperA(s); } +#ifdef _UNICODE +inline wchar_t * MyStringUpper(wchar_t *s) { return CharUpperW(s); } +#else +wchar_t * MyStringUpper(wchar_t *s); +#endif + +inline char * MyStringLower(char *s) { return CharLowerA(s); } +#ifdef _UNICODE +inline wchar_t * MyStringLower(wchar_t *s) { return CharLowerW(s); } +#else +wchar_t * MyStringLower(wchar_t *s); +#endif + +#else // Standard-C +wchar_t MyCharUpper(wchar_t c); +#endif + +////////////////////////////////////// +// Compare + +/* +#ifndef _WIN32_WCE +int MyStringCollate(const char *s1, const char *s2); +int MyStringCollateNoCase(const char *s1, const char *s2); +#endif +int MyStringCollate(const wchar_t *s1, const wchar_t *s2); +int MyStringCollateNoCase(const wchar_t *s1, const wchar_t *s2); +*/ + +int MyStringCompare(const char *s1, const char *s2); +int MyStringCompare(const wchar_t *s1, const wchar_t *s2); + +#ifdef _WIN32 +int MyStringCompareNoCase(const char *s1, const char *s2); +#endif + +int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2); + +template +class CStringBase +{ + void TrimLeftWithCharSet(const CStringBase &charSet) + { + const T *p = _chars; + while (charSet.Find(*p) >= 0 && (*p != 0)) + p = GetNextCharPointer(p); + Delete(0, (int)(p - _chars)); + } + void TrimRightWithCharSet(const CStringBase &charSet) + { + const T *p = _chars; + const T *pLast = NULL; + while (*p != 0) + { + if (charSet.Find(*p) >= 0) + { + if (pLast == NULL) + pLast = p; + } + else + pLast = NULL; + p = GetNextCharPointer(p); + } + if(pLast != NULL) + { + int i = (int)(pLast - _chars); + Delete(i, _length - i); + } + + } + void MoveItems(int destIndex, int srcIndex) + { + memmove(_chars + destIndex, _chars + srcIndex, + sizeof(T) * (_length - srcIndex + 1)); + } + + void InsertSpace(int &index, int size) + { + CorrectIndex(index); + GrowLength(size); + MoveItems(index + size, index); + } + + static T *GetNextCharPointer(T *p) + { return MyStringGetNextCharPointer(p); } + static const T *GetNextCharPointer(const T *p) + { return MyStringGetNextCharPointer(p); } + static T *GetPrevCharPointer(T *base, T *p) + { return MyStringGetPrevCharPointer(base, p); } + static const T *GetPrevCharPointer(const T *base, const T *p) + { return MyStringGetPrevCharPointer(base, p); } +protected: + T *_chars; + int _length; + int _capacity; + + void SetCapacity(int newCapacity) + { + int realCapacity = newCapacity + 1; + if(realCapacity == _capacity) + return; + /* + const int kMaxStringSize = 0x20000000; + #ifndef _WIN32_WCE + if(newCapacity > kMaxStringSize || newCapacity < _length) + throw 1052337; + #endif + */ + T *newBuffer = new T[realCapacity]; + if(_capacity > 0) + { + for (int i = 0; i < (_length + 1); i++) + newBuffer[i] = _chars[i]; + delete []_chars; + _chars = newBuffer; + } + else + { + _chars = newBuffer; + _chars[0] = 0; + } + _capacity = realCapacity; + } + + void GrowLength(int n) + { + int freeSize = _capacity - _length - 1; + if (n <= freeSize) + return; + int delta; + if (_capacity > 64) + delta = _capacity / 2; + else if (_capacity > 8) + delta = 16; + else + delta = 4; + if (freeSize + delta < n) + delta = n - freeSize; + SetCapacity(_capacity + delta); + } + + void CorrectIndex(int &index) const + { + if (index > _length) + index = _length; + } + +public: + CStringBase(): _chars(0), _length(0), _capacity(0) + { SetCapacity(16 - 1); } + CStringBase(T c): _chars(0), _length(0), _capacity(0) + { + SetCapacity(1); + _chars[0] = c; + _chars[1] = 0; + _length = 1; + } + CStringBase(const T *chars): _chars(0), _length(0), _capacity(0) + { + int length = MyStringLen(chars); + SetCapacity(length); + MyStringCopy(_chars, chars); // can be optimized by memove() + _length = length; + } + CStringBase(const CStringBase &s): _chars(0), _length(0), _capacity(0) + { + SetCapacity(s._length); + MyStringCopy(_chars, s._chars); + _length = s._length; + } + ~CStringBase() { delete []_chars; } + + operator const T*() const { return _chars;} + + // The minimum size of the character buffer in characters. + // This value does not include space for a null terminator. + T* GetBuffer(int minBufLength) + { + if(minBufLength >= _capacity) + SetCapacity(minBufLength + 1); + return _chars; + } + void ReleaseBuffer() { ReleaseBuffer(MyStringLen(_chars)); } + void ReleaseBuffer(int newLength) + { + /* + #ifndef _WIN32_WCE + if(newLength >= _capacity) + throw 282217; + #endif + */ + _chars[newLength] = 0; + _length = newLength; + } + + CStringBase& operator=(T c) + { + Empty(); + SetCapacity(1); + _chars[0] = c; + _chars[1] = 0; + _length = 1; + return *this; + } + CStringBase& operator=(const T *chars) + { + Empty(); + int length = MyStringLen(chars); + SetCapacity(length); + MyStringCopy(_chars, chars); + _length = length; + return *this; + } + CStringBase& operator=(const CStringBase& s) + { + if(&s == this) + return *this; + Empty(); + SetCapacity(s._length); + MyStringCopy(_chars, s._chars); + _length = s._length; + return *this; + } + + CStringBase& operator+=(T c) + { + GrowLength(1); + _chars[_length] = c; + _chars[++_length] = 0; + return *this; + } + CStringBase& operator+=(const T *s) + { + int len = MyStringLen(s); + GrowLength(len); + MyStringCopy(_chars + _length, s); + _length += len; + return *this; + } + CStringBase& operator+=(const CStringBase &s) + { + GrowLength(s._length); + MyStringCopy(_chars + _length, s._chars); + _length += s._length; + return *this; + } + void Empty() + { + _length = 0; + _chars[0] = 0; + } + int Length() const { return _length; } + bool IsEmpty() const { return (_length == 0); } + + CStringBase Mid(int startIndex) const + { return Mid(startIndex, _length - startIndex); } + CStringBase Mid(int startIndex, int count ) const + { + if (startIndex + count > _length) + count = _length - startIndex; + + if (startIndex == 0 && startIndex + count == _length) + return *this; + + CStringBase result; + result.SetCapacity(count); + // MyStringNCopy(result._chars, _chars + startIndex, count); + for (int i = 0; i < count; i++) + result._chars[i] = _chars[startIndex + i]; + result._chars[count] = 0; + result._length = count; + return result; + } + CStringBase Left(int count) const + { return Mid(0, count); } + CStringBase Right(int count) const + { + if (count > _length) + count = _length; + return Mid(_length - count, count); + } + + void MakeUpper() + { MyStringUpper(_chars); } + void MakeLower() + { MyStringLower(_chars); } + + int Compare(const CStringBase& s) const + { return MyStringCompare(_chars, s._chars); } + + int Compare(const T *s) const + { return MyStringCompare(_chars, s); } + + int CompareNoCase(const CStringBase& s) const + { return MyStringCompareNoCase(_chars, s._chars); } + + int CompareNoCase(const T *s) const + { return MyStringCompareNoCase(_chars, s); } + + /* + int Collate(const CStringBase& s) const + { return MyStringCollate(_chars, s._chars); } + int CollateNoCase(const CStringBase& s) const + { return MyStringCollateNoCase(_chars, s._chars); } + */ + + int Find(T c) const { return Find(c, 0); } + int Find(T c, int startIndex) const + { + T *p = _chars + startIndex; + for (;;) + { + if (*p == c) + return (int)(p - _chars); + if (*p == 0) + return -1; + p = GetNextCharPointer(p); + } + } + int Find(const CStringBase &s) const { return Find(s, 0); } + int Find(const CStringBase &s, int startIndex) const + { + if (s.IsEmpty()) + return startIndex; + for (; startIndex < _length; startIndex++) + { + int j; + for (j = 0; j < s._length && startIndex + j < _length; j++) + if (_chars[startIndex+j] != s._chars[j]) + break; + if (j == s._length) + return startIndex; + } + return -1; + } + int ReverseFind(T c) const + { + if (_length == 0) + return -1; + T *p = _chars + _length - 1; + for (;;) + { + if (*p == c) + return (int)(p - _chars); + if (p == _chars) + return -1; + p = GetPrevCharPointer(_chars, p); + } + } + int FindOneOf(const CStringBase &s) const + { + for(int i = 0; i < _length; i++) + if (s.Find(_chars[i]) >= 0) + return i; + return -1; + } + + void TrimLeft(T c) + { + const T *p = _chars; + while (c == *p) + p = GetNextCharPointer(p); + Delete(0, p - _chars); + } + private: + CStringBase GetTrimDefaultCharSet() + { + CStringBase charSet; + charSet += (T)' '; + charSet += (T)'\n'; + charSet += (T)'\t'; + return charSet; + } + public: + + void TrimLeft() + { + TrimLeftWithCharSet(GetTrimDefaultCharSet()); + } + void TrimRight() + { + TrimRightWithCharSet(GetTrimDefaultCharSet()); + } + void TrimRight(T c) + { + const T *p = _chars; + const T *pLast = NULL; + while (*p != 0) + { + if (*p == c) + { + if (pLast == NULL) + pLast = p; + } + else + pLast = NULL; + p = GetNextCharPointer(p); + } + if(pLast != NULL) + { + int i = pLast - _chars; + Delete(i, _length - i); + } + } + void Trim() + { + TrimRight(); + TrimLeft(); + } + + int Insert(int index, T c) + { + InsertSpace(index, 1); + _chars[index] = c; + _length++; + return _length; + } + int Insert(int index, const CStringBase &s) + { + CorrectIndex(index); + if (s.IsEmpty()) + return _length; + int numInsertChars = s.Length(); + InsertSpace(index, numInsertChars); + for(int i = 0; i < numInsertChars; i++) + _chars[index + i] = s[i]; + _length += numInsertChars; + return _length; + } + + // !!!!!!!!!!!!!!! test it if newChar = '\0' + int Replace(T oldChar, T newChar) + { + if (oldChar == newChar) + return 0; + int number = 0; + int pos = 0; + while (pos < Length()) + { + pos = Find(oldChar, pos); + if (pos < 0) + break; + _chars[pos] = newChar; + pos++; + number++; + } + return number; + } + int Replace(const CStringBase &oldString, const CStringBase &newString) + { + if (oldString.IsEmpty()) + return 0; + if (oldString == newString) + return 0; + int oldStringLength = oldString.Length(); + int newStringLength = newString.Length(); + int number = 0; + int pos = 0; + while (pos < _length) + { + pos = Find(oldString, pos); + if (pos < 0) + break; + Delete(pos, oldStringLength); + Insert(pos, newString); + pos += newStringLength; + number++; + } + return number; + } + int Delete(int index, int count = 1 ) + { + if (index + count > _length) + count = _length - index; + if (count > 0) + { + MoveItems(index, index + count); + _length -= count; + } + return _length; + } +}; + +template +CStringBase operator+(const CStringBase& s1, const CStringBase& s2) +{ + CStringBase result(s1); + result += s2; + return result; +} + +template +CStringBase operator+(const CStringBase& s, T c) +{ + CStringBase result(s); + result += c; + return result; +} + +template +CStringBase operator+(T c, const CStringBase& s) +{ + CStringBase result(c); + result += s; + return result; +} + +template +CStringBase operator+(const CStringBase& s, const T * chars) +{ + CStringBase result(s); + result += chars; + return result; +} + +template +CStringBase operator+(const T * chars, const CStringBase& s) +{ + CStringBase result(chars); + result += s; + return result; +} + +template +bool operator==(const CStringBase& s1, const CStringBase& s2) + { return (s1.Compare(s2) == 0); } + +template +bool operator<(const CStringBase& s1, const CStringBase& s2) + { return (s1.Compare(s2) < 0); } + +template +bool operator==(const T *s1, const CStringBase& s2) + { return (s2.Compare(s1) == 0); } + +template +bool operator==(const CStringBase& s1, const T *s2) + { return (s1.Compare(s2) == 0); } + +template +bool operator!=(const CStringBase& s1, const CStringBase& s2) + { return (s1.Compare(s2) != 0); } + +template +bool operator!=(const T *s1, const CStringBase& s2) + { return (s2.Compare(s1) != 0); } + +template +bool operator!=(const CStringBase& s1, const T *s2) + { return (s1.Compare(s2) != 0); } + +typedef CStringBase AString; +typedef CStringBase UString; + +typedef CObjectVector AStringVector; +typedef CObjectVector UStringVector; + +#ifdef _UNICODE + typedef UString CSysString; +#else + typedef AString CSysString; +#endif + +typedef CObjectVector CSysStringVector; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyUnknown.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyUnknown.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// MyUnknown.h + +#ifndef __MYUNKNOWN_H +#define __MYUNKNOWN_H + +#ifdef _WIN32 + +#ifdef _WIN32_WCE +#if (_WIN32_WCE > 300) +#include +#else +#define MIDL_INTERFACE(x) struct +#endif +#else +#include +#endif + +#include + +#else +#include "MyWindows.h" +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyVector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyVector.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,78 @@ +// Common/MyVector.cpp + +#include "StdAfx.h" + +#include + +#include "MyVector.h" + +CBaseRecordVector::~CBaseRecordVector() { Free(); } + +void CBaseRecordVector::Free() +{ + delete []((unsigned char *)_items); + _capacity = 0; + _size = 0; + _items = 0; +} + +void CBaseRecordVector::Clear() { DeleteFrom(0); } +void CBaseRecordVector::DeleteBack() { Delete(_size - 1); } +void CBaseRecordVector::DeleteFrom(int index) { Delete(index, _size - index); } + +void CBaseRecordVector::ReserveOnePosition() +{ + if (_size != _capacity) + return; + int delta; + if (_capacity > 64) + delta = _capacity / 2; + else if (_capacity > 8) + delta = 8; + else + delta = 4; + Reserve(_capacity + delta); +} + +void CBaseRecordVector::Reserve(int newCapacity) +{ + if (newCapacity <= _capacity) + return; + if ((unsigned)newCapacity >= ((unsigned)1 << (sizeof(unsigned) * 8 - 1))) + throw 1052353; + size_t newSize = (size_t)(unsigned)newCapacity * _itemSize; + if (newSize / _itemSize != (size_t)(unsigned)newCapacity) + throw 1052354; + unsigned char *p = new unsigned char[newSize]; + if (p == 0) + throw 1052355; + int numRecordsToMove = _capacity; + memmove(p, _items, _itemSize * numRecordsToMove); + delete [](unsigned char *)_items; + _items = p; + _capacity = newCapacity; +} + +void CBaseRecordVector::MoveItems(int destIndex, int srcIndex) +{ + memmove(((unsigned char *)_items) + destIndex * _itemSize, + ((unsigned char *)_items) + srcIndex * _itemSize, + _itemSize * (_size - srcIndex)); +} + +void CBaseRecordVector::InsertOneItem(int index) +{ + ReserveOnePosition(); + MoveItems(index + 1, index); + _size++; +} + +void CBaseRecordVector::Delete(int index, int num) +{ + TestIndexAndCorrectNum(index, num); + if (num > 0) + { + MoveItems(index, index + num); + _size -= num; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyVector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyVector.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,254 @@ +// Common/Vector.h + +#ifndef __COMMON_VECTOR_H +#define __COMMON_VECTOR_H + +#include "Defs.h" + +class CBaseRecordVector +{ + void MoveItems(int destIndex, int srcIndex); +protected: + int _capacity; + int _size; + void *_items; + size_t _itemSize; + + void ReserveOnePosition(); + void InsertOneItem(int index); + void TestIndexAndCorrectNum(int index, int &num) const + { if (index + num > _size) num = _size - index; } +public: + CBaseRecordVector(size_t itemSize): + _capacity(0), _size(0), _items(0), _itemSize(itemSize) {} + virtual ~CBaseRecordVector(); + void Free(); + int Size() const { return _size; } + bool IsEmpty() const { return (_size == 0); } + void Reserve(int newCapacity); + virtual void Delete(int index, int num = 1); + void Clear(); + void DeleteFrom(int index); + void DeleteBack(); +}; + +template +class CRecordVector: public CBaseRecordVector +{ +public: + CRecordVector():CBaseRecordVector(sizeof(T)){}; + CRecordVector(const CRecordVector &v): + CBaseRecordVector(sizeof(T)) { *this = v;} + CRecordVector& operator=(const CRecordVector &v) + { + Clear(); + return (*this += v); + } + CRecordVector& operator+=(const CRecordVector &v) + { + int size = v.Size(); + Reserve(Size() + size); + for(int i = 0; i < size; i++) + Add(v[i]); + return *this; + } + int Add(T item) + { + ReserveOnePosition(); + ((T *)_items)[_size] = item; + return _size++; + } + void Insert(int index, T item) + { + InsertOneItem(index); + ((T *)_items)[index] = item; + } + // T* GetPointer() const { return (T*)_items; } + // operator const T *() const { return _items; }; + const T& operator[](int index) const { return ((T *)_items)[index]; } + T& operator[](int index) { return ((T *)_items)[index]; } + const T& Front() const { return operator[](0); } + T& Front() { return operator[](0); } + const T& Back() const { return operator[](_size - 1); } + T& Back() { return operator[](_size - 1); } + + void Swap(int i, int j) + { + T temp = operator[](i); + operator[](i) = operator[](j); + operator[](j) = temp; + } + + int FindInSorted(const T& item) const + { + int left = 0, right = Size(); + while (left != right) + { + int mid = (left + right) / 2; + const T& midValue = (*this)[mid]; + if (item == midValue) + return mid; + if (item < midValue) + right = mid; + else + left = mid + 1; + } + return -1; + } + + int AddToUniqueSorted(const T& item) + { + int left = 0, right = Size(); + while (left != right) + { + int mid = (left + right) / 2; + const T& midValue = (*this)[mid]; + if (item == midValue) + return mid; + if (item < midValue) + right = mid; + else + left = mid + 1; + } + Insert(right, item); + return right; + } + + static void SortRefDown(T* p, int k, int size, int (*compare)(const T*, const T*, void *), void *param) + { + T temp = p[k]; + for (;;) + { + int s = (k << 1); + if (s > size) + break; + if (s < size && compare(p + s + 1, p + s, param) > 0) + s++; + if (compare(&temp, p + s, param) >= 0) + break; + p[k] = p[s]; + k = s; + } + p[k] = temp; + } + + void Sort(int (*compare)(const T*, const T*, void *), void *param) + { + int size = _size; + if (size <= 1) + return; + T* p = (&Front()) - 1; + { + int i = size / 2; + do + SortRefDown(p, i, size, compare, param); + while(--i != 0); + } + do + { + T temp = p[size]; + p[size--] = p[1]; + p[1] = temp; + SortRefDown(p, 1, size, compare, param); + } + while (size > 1); + } +}; + +typedef CRecordVector CIntVector; +typedef CRecordVector CUIntVector; +typedef CRecordVector CBoolVector; +typedef CRecordVector CByteVector; +typedef CRecordVector CPointerVector; + +template +class CObjectVector: public CPointerVector +{ +public: + CObjectVector(){}; + ~CObjectVector() { Clear(); } + CObjectVector(const CObjectVector &objectVector) + { *this = objectVector; } + CObjectVector& operator=(const CObjectVector &objectVector) + { + Clear(); + return (*this += objectVector); + } + CObjectVector& operator+=(const CObjectVector &objectVector) + { + int size = objectVector.Size(); + Reserve(Size() + size); + for(int i = 0; i < size; i++) + Add(objectVector[i]); + return *this; + } + const T& operator[](int index) const { return *((T *)CPointerVector::operator[](index)); } + T& operator[](int index) { return *((T *)CPointerVector::operator[](index)); } + T& Front() { return operator[](0); } + const T& Front() const { return operator[](0); } + T& Back() { return operator[](_size - 1); } + const T& Back() const { return operator[](_size - 1); } + int Add(const T& item) + { return CPointerVector::Add(new T(item)); } + void Insert(int index, const T& item) + { CPointerVector::Insert(index, new T(item)); } + virtual void Delete(int index, int num = 1) + { + TestIndexAndCorrectNum(index, num); + for(int i = 0; i < num; i++) + delete (T *)(((void **)_items)[index + i]); + CPointerVector::Delete(index, num); + } + int Find(const T& item) const + { + for(int i = 0; i < Size(); i++) + if (item == (*this)[i]) + return i; + return -1; + } + int FindInSorted(const T& item) const + { + int left = 0, right = Size(); + while (left != right) + { + int mid = (left + right) / 2; + const T& midValue = (*this)[mid]; + if (item == midValue) + return mid; + if (item < midValue) + right = mid; + else + left = mid + 1; + } + return -1; + } + int AddToSorted(const T& item) + { + int left = 0, right = Size(); + while (left != right) + { + int mid = (left + right) / 2; + const T& midValue = (*this)[mid]; + if (item == midValue) + { + right = mid + 1; + break; + } + if (item < midValue) + right = mid; + else + left = mid + 1; + } + Insert(right, item); + return right; + } + + void Sort(int (*compare)(void *const *, void *const *, void *), void *param) + { CPointerVector::Sort(compare, param); } + + static int CompareObjectItems(void *const *a1, void *const *a2, void * /* param */) + { return MyCompare(*(*((const T **)a1)), *(*((const T **)a2))); } + void Sort() { CPointerVector::Sort(CompareObjectItems, 0); } +}; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/MyWindows.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/MyWindows.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,214 @@ +// MyWindows.h + +#ifndef __MYWINDOWS_H +#define __MYWINDOWS_H + +#ifdef _WIN32 + +#include + +#define CHAR_PATH_SEPARATOR '\\' +#define WCHAR_PATH_SEPARATOR L'\\' +#define STRING_PATH_SEPARATOR "\\" +#define WSTRING_PATH_SEPARATOR L"\\" + +#else + +#define CHAR_PATH_SEPARATOR '/' +#define WCHAR_PATH_SEPARATOR L'/' +#define STRING_PATH_SEPARATOR "/" +#define WSTRING_PATH_SEPARATOR L"/" + +#include // for wchar_t +#include + +#include "MyGuidDef.h" + +typedef char CHAR; +typedef unsigned char UCHAR; + +#undef BYTE +typedef unsigned char BYTE; + +typedef short SHORT; +typedef unsigned short USHORT; + +#undef WORD +typedef unsigned short WORD; +typedef short VARIANT_BOOL; + +typedef int INT; +typedef Int32 INT32; +typedef unsigned int UINT; +typedef UInt32 UINT32; +typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit +typedef UINT32 ULONG; + +#undef DWORD +typedef UINT32 DWORD; + +typedef Int64 LONGLONG; +typedef UInt64 ULONGLONG; + +typedef struct LARGE_INTEGER { LONGLONG QuadPart; }LARGE_INTEGER; +typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart;} ULARGE_INTEGER; + +typedef const CHAR *LPCSTR; +typedef CHAR TCHAR; +typedef const TCHAR *LPCTSTR; +typedef wchar_t WCHAR; +typedef WCHAR OLECHAR; +typedef const WCHAR *LPCWSTR; +typedef OLECHAR *BSTR; +typedef const OLECHAR *LPCOLESTR; +typedef OLECHAR *LPOLESTR; + +typedef struct _FILETIME +{ + DWORD dwLowDateTime; + DWORD dwHighDateTime; +}FILETIME; + +#define HRESULT LONG +#define FAILED(Status) ((HRESULT)(Status)<0) +typedef ULONG PROPID; +typedef LONG SCODE; + +#define S_OK ((HRESULT)0x00000000L) +#define S_FALSE ((HRESULT)0x00000001L) +#define E_NOTIMPL ((HRESULT)0x80004001L) +#define E_NOINTERFACE ((HRESULT)0x80004002L) +#define E_ABORT ((HRESULT)0x80004004L) +#define E_FAIL ((HRESULT)0x80004005L) +#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L) +#define E_OUTOFMEMORY ((HRESULT)0x8007000EL) +#define E_INVALIDARG ((HRESULT)0x80070057L) + +#ifdef _MSC_VER +#define STDMETHODCALLTYPE __stdcall +#else +#define STDMETHODCALLTYPE +#endif + +#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f +#define STDMETHOD(f) STDMETHOD_(HRESULT, f) +#define STDMETHODIMP_(type) type STDMETHODCALLTYPE +#define STDMETHODIMP STDMETHODIMP_(HRESULT) + +#define PURE = 0 + +#define MIDL_INTERFACE(x) struct + +#ifdef __cplusplus + +DEFINE_GUID(IID_IUnknown, +0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); +struct IUnknown +{ + STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE; + STDMETHOD_(ULONG, AddRef)() PURE; + STDMETHOD_(ULONG, Release)() PURE; + #ifndef _WIN32 + virtual ~IUnknown() {} + #endif +}; + +typedef IUnknown *LPUNKNOWN; + +#endif + +#define VARIANT_TRUE ((VARIANT_BOOL)-1) +#define VARIANT_FALSE ((VARIANT_BOOL)0) + +enum VARENUM +{ + VT_EMPTY = 0, + VT_NULL = 1, + VT_I2 = 2, + VT_I4 = 3, + VT_R4 = 4, + VT_R8 = 5, + VT_CY = 6, + VT_DATE = 7, + VT_BSTR = 8, + VT_DISPATCH = 9, + VT_ERROR = 10, + VT_BOOL = 11, + VT_VARIANT = 12, + VT_UNKNOWN = 13, + VT_DECIMAL = 14, + VT_I1 = 16, + VT_UI1 = 17, + VT_UI2 = 18, + VT_UI4 = 19, + VT_I8 = 20, + VT_UI8 = 21, + VT_INT = 22, + VT_UINT = 23, + VT_VOID = 24, + VT_HRESULT = 25, + VT_FILETIME = 64 +}; + +typedef unsigned short VARTYPE; +typedef WORD PROPVAR_PAD1; +typedef WORD PROPVAR_PAD2; +typedef WORD PROPVAR_PAD3; + +#ifdef __cplusplus + +typedef struct tagPROPVARIANT +{ + VARTYPE vt; + PROPVAR_PAD1 wReserved1; + PROPVAR_PAD2 wReserved2; + PROPVAR_PAD3 wReserved3; + union + { + CHAR cVal; + UCHAR bVal; + SHORT iVal; + USHORT uiVal; + LONG lVal; + ULONG ulVal; + INT intVal; + UINT uintVal; + LARGE_INTEGER hVal; + ULARGE_INTEGER uhVal; + VARIANT_BOOL boolVal; + SCODE scode; + FILETIME filetime; + BSTR bstrVal; + }; +} PROPVARIANT; + +typedef PROPVARIANT tagVARIANT; +typedef tagVARIANT VARIANT; +typedef VARIANT VARIANTARG; + +MY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop); +MY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src); + +#endif + +MY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len); +MY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz); +MY_EXTERN_C void SysFreeString(BSTR bstr); +MY_EXTERN_C UINT SysStringByteLen(BSTR bstr); +MY_EXTERN_C UINT SysStringLen(BSTR bstr); + +MY_EXTERN_C DWORD GetLastError(); +MY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2); + +#define CP_ACP 0 +#define CP_OEMCP 1 + +typedef enum tagSTREAM_SEEK +{ + STREAM_SEEK_SET = 0, + STREAM_SEEK_CUR = 1, + STREAM_SEEK_END = 2 +} STREAM_SEEK; + +#endif +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/NewHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/NewHandler.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,116 @@ +// NewHandler.cpp + +#include "StdAfx.h" + +#include + +#include "NewHandler.h" + +// #define DEBUG_MEMORY_LEAK + +#ifndef DEBUG_MEMORY_LEAK + +#ifdef _WIN32 +void * +#ifdef _MSC_VER +__cdecl +#endif +operator new(size_t size) +{ + // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); + void *p = ::malloc(size); + if (p == 0) + throw CNewException(); + return p; +} + +void +#ifdef _MSC_VER +__cdecl +#endif +operator delete(void *p) throw() +{ + /* + if (p == 0) + return; + ::HeapFree(::GetProcessHeap(), 0, p); + */ + ::free(p); +} +#endif + +#else + +#pragma init_seg(lib) +const int kDebugSize = 1000000; +static void *a[kDebugSize]; +static int index = 0; + +static int numAllocs = 0; +void * __cdecl operator new(size_t size) +{ + numAllocs++; + void *p = HeapAlloc(GetProcessHeap(), 0, size); + if (index == 40) + { + int t = 1; + } + if (index < kDebugSize) + { + a[index] = p; + index++; + } + if (p == 0) + throw CNewException(); + printf("Alloc %6d, size = %8d\n", numAllocs, size); + return p; +} + +class CC +{ +public: + CC() + { + for (int i = 0; i < kDebugSize; i++) + a[i] = 0; + } + ~CC() + { + for (int i = 0; i < kDebugSize; i++) + if (a[i] != 0) + return; + } +} g_CC; + + +void __cdecl operator delete(void *p) +{ + if (p == 0) + return; + /* + for (int i = 0; i < index; i++) + if (a[i] == p) + a[i] = 0; + */ + HeapFree(GetProcessHeap(), 0, p); + numAllocs--; + printf("Free %d\n", numAllocs); +} + +#endif + +/* +int MemErrorVC(size_t) +{ + throw CNewException(); + // return 1; +} +CNewHandlerSetter::CNewHandlerSetter() +{ + // MemErrorOldVCFunction = _set_new_handler(MemErrorVC); +} +CNewHandlerSetter::~CNewHandlerSetter() +{ + // _set_new_handler(MemErrorOldVCFunction); +} +*/ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/NewHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/NewHandler.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,16 @@ +// Common/NewHandler.h + +#ifndef __COMMON_NEWHANDLER_H +#define __COMMON_NEWHANDLER_H + +class CNewException {}; + +#ifdef _WIN32 +void +#ifdef _MSC_VER +__cdecl +#endif +operator delete(void *p) throw(); +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +// #include "MyWindows.h" +#include "NewHandler.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StdInStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StdInStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,84 @@ +// Common/StdInStream.cpp + +#include "StdAfx.h" + +#include +#include "StdInStream.h" + +#ifdef _MSC_VER +// "was declared deprecated" disabling +#pragma warning(disable : 4996 ) +#endif + +static const char kIllegalChar = '\0'; +static const char kNewLineChar = '\n'; + +static const char *kEOFMessage = "Unexpected end of input stream"; +static const char *kReadErrorMessage ="Error reading input stream"; +static const char *kIllegalCharMessage = "Illegal character in input stream"; + +static LPCTSTR kFileOpenMode = TEXT("r"); + +CStdInStream g_StdIn(stdin); + +bool CStdInStream::Open(LPCTSTR fileName) +{ + Close(); + _stream = _tfopen(fileName, kFileOpenMode); + _streamIsOpen = (_stream != 0); + return _streamIsOpen; +} + +bool CStdInStream::Close() +{ + if(!_streamIsOpen) + return true; + _streamIsOpen = (fclose(_stream) != 0); + return !_streamIsOpen; +} + +CStdInStream::~CStdInStream() +{ + Close(); +} + +AString CStdInStream::ScanStringUntilNewLine() +{ + AString s; + for (;;) + { + int intChar = GetChar(); + if(intChar == EOF) + throw kEOFMessage; + char c = char(intChar); + if (c == kIllegalChar) + throw kIllegalCharMessage; + if(c == kNewLineChar) + break; + s += c; + } + return s; +} + +void CStdInStream::ReadToString(AString &resultString) +{ + resultString.Empty(); + int c; + while((c = GetChar()) != EOF) + resultString += char(c); +} + +bool CStdInStream::Eof() +{ + return (feof(_stream) != 0); +} + +int CStdInStream::GetChar() +{ + int c = fgetc(_stream); // getc() doesn't work in BeOS? + if(c == EOF && !Eof()) + throw kReadErrorMessage; + return c; +} + + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StdInStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StdInStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,31 @@ +// Common/StdInStream.h + +#ifndef __COMMON_STDINSTREAM_H +#define __COMMON_STDINSTREAM_H + +#include + +#include "MyString.h" +#include "Types.h" + +class CStdInStream +{ + bool _streamIsOpen; + FILE *_stream; +public: + CStdInStream(): _streamIsOpen(false) {}; + CStdInStream(FILE *stream): _streamIsOpen(false), _stream(stream) {}; + ~CStdInStream(); + bool Open(LPCTSTR fileName); + bool Close(); + + AString ScanStringUntilNewLine(); + void ReadToString(AString &resultString); + + bool Eof(); + int GetChar(); +}; + +extern CStdInStream g_StdIn; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StdOutStream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StdOutStream.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,93 @@ +// Common/StdOutStream.cpp + +#include "StdAfx.h" + +#include + +#include "StdOutStream.h" +#include "IntToString.h" +#include "StringConvert.h" + +#ifdef _MSC_VER +// "was declared deprecated" disabling +#pragma warning(disable : 4996 ) +#endif + +static const char kNewLineChar = '\n'; + +static const char *kFileOpenMode = "wt"; + +CStdOutStream g_StdOut(stdout); +CStdOutStream g_StdErr(stderr); + +bool CStdOutStream::Open(const char *fileName) +{ + Close(); + _stream = fopen(fileName, kFileOpenMode); + _streamIsOpen = (_stream != 0); + return _streamIsOpen; +} + +bool CStdOutStream::Close() +{ + if(!_streamIsOpen) + return true; + if (fclose(_stream) != 0) + return false; + _stream = 0; + _streamIsOpen = false; + return true; +} + +bool CStdOutStream::Flush() +{ + return (fflush(_stream) == 0); +} + +CStdOutStream::~CStdOutStream () +{ + Close(); +} + +CStdOutStream & CStdOutStream::operator<<(CStdOutStream & (*aFunction)(CStdOutStream &)) +{ + (*aFunction)(*this); + return *this; +} + +CStdOutStream & endl(CStdOutStream & outStream) +{ + return outStream << kNewLineChar; +} + +CStdOutStream & CStdOutStream::operator<<(const char *string) +{ + fputs(string, _stream); + return *this; +} + +CStdOutStream & CStdOutStream::operator<<(const wchar_t *string) +{ + *this << (const char *)UnicodeStringToMultiByte(string, CP_OEMCP); + return *this; +} + +CStdOutStream & CStdOutStream::operator<<(char c) +{ + fputc(c, _stream); + return *this; +} + +CStdOutStream & CStdOutStream::operator<<(int number) +{ + char textString[32]; + ConvertInt64ToString(number, textString); + return operator<<(textString); +} + +CStdOutStream & CStdOutStream::operator<<(UInt64 number) +{ + char textString[32]; + ConvertUInt64ToString(number, textString); + return operator<<(textString); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StdOutStream.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StdOutStream.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,35 @@ +// Common/StdOutStream.h + +#ifndef __COMMON_STDOUTSTREAM_H +#define __COMMON_STDOUTSTREAM_H + +#include + +#include "Types.h" + +class CStdOutStream +{ + bool _streamIsOpen; + FILE *_stream; +public: + CStdOutStream (): _streamIsOpen(false), _stream(0) {}; + CStdOutStream (FILE *stream): _streamIsOpen(false), _stream(stream) {}; + ~CStdOutStream (); + operator FILE *() { return _stream; } + bool Open(const char *fileName); + bool Close(); + bool Flush(); + CStdOutStream & operator<<(CStdOutStream & (* aFunction)(CStdOutStream &)); + CStdOutStream & operator<<(const char *string); + CStdOutStream & operator<<(const wchar_t *string); + CStdOutStream & operator<<(char c); + CStdOutStream & operator<<(int number); + CStdOutStream & operator<<(UInt64 number); +}; + +CStdOutStream & endl(CStdOutStream & outStream); + +extern CStdOutStream g_StdOut; +extern CStdOutStream g_StdErr; + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StringConvert.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StringConvert.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,94 @@ +// Common/StringConvert.cpp + +#include "StdAfx.h" + +#include "StringConvert.h" + +#ifndef _WIN32 +#include +#endif + +#ifdef _WIN32 +UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) +{ + UString resultString; + if(!srcString.IsEmpty()) + { + int numChars = MultiByteToWideChar(codePage, 0, srcString, + srcString.Length(), resultString.GetBuffer(srcString.Length()), + srcString.Length() + 1); + #ifndef _WIN32_WCE + if(numChars == 0) + throw 282228; + #endif + resultString.ReleaseBuffer(numChars); + } + return resultString; +} + +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) +{ + AString resultString; + if(!srcString.IsEmpty()) + { + int numRequiredBytes = srcString.Length() * 2; + char defaultChar = '_'; + int numChars = WideCharToMultiByte(codePage, 0, srcString, + srcString.Length(), resultString.GetBuffer(numRequiredBytes), + numRequiredBytes + 1, &defaultChar, NULL); + #ifndef _WIN32_WCE + if(numChars == 0) + throw 282229; + #endif + resultString.ReleaseBuffer(numChars); + } + return resultString; +} + +#ifndef _WIN32_WCE +AString SystemStringToOemString(const CSysString &srcString) +{ + AString result; + CharToOem(srcString, result.GetBuffer(srcString.Length() * 2)); + result.ReleaseBuffer(); + return result; +} +#endif + +#else + +UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) +{ + UString resultString; + for (int i = 0; i < srcString.Length(); i++) + resultString += wchar_t(srcString[i]); + /* + if(!srcString.IsEmpty()) + { + int numChars = mbstowcs(resultString.GetBuffer(srcString.Length()), srcString, srcString.Length() + 1); + if (numChars < 0) throw "Your environment does not support UNICODE"; + resultString.ReleaseBuffer(numChars); + } + */ + return resultString; +} + +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage) +{ + AString resultString; + for (int i = 0; i < srcString.Length(); i++) + resultString += char(srcString[i]); + /* + if(!srcString.IsEmpty()) + { + int numRequiredBytes = srcString.Length() * 6 + 1; + int numChars = wcstombs(resultString.GetBuffer(numRequiredBytes), srcString, numRequiredBytes); + if (numChars < 0) throw "Your environment does not support UNICODE"; + resultString.ReleaseBuffer(numChars); + } + */ + return resultString; +} + +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StringConvert.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StringConvert.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,71 @@ +// Common/StringConvert.h + +#ifndef __COMMON_STRINGCONVERT_H +#define __COMMON_STRINGCONVERT_H + +#include "MyWindows.h" +#include "MyString.h" +#include "Types.h" + +UString MultiByteToUnicodeString(const AString &srcString, UINT codePage = CP_ACP); +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage = CP_ACP); + +inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString) + { return unicodeString; } +inline const UString& GetUnicodeString(const UString &unicodeString) + { return unicodeString; } +inline UString GetUnicodeString(const AString &ansiString) + { return MultiByteToUnicodeString(ansiString); } +inline UString GetUnicodeString(const AString &multiByteString, UINT codePage) + { return MultiByteToUnicodeString(multiByteString, codePage); } +inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString, UINT) + { return unicodeString; } +inline const UString& GetUnicodeString(const UString &unicodeString, UINT) + { return unicodeString; } + +inline const char* GetAnsiString(const char* ansiString) + { return ansiString; } +inline const AString& GetAnsiString(const AString &ansiString) + { return ansiString; } +inline AString GetAnsiString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString); } + +inline const char* GetOemString(const char* oemString) + { return oemString; } +inline const AString& GetOemString(const AString &oemString) + { return oemString; } +inline AString GetOemString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString, CP_OEMCP); } + + +#ifdef _UNICODE + inline const wchar_t* GetSystemString(const wchar_t* unicodeString) + { return unicodeString;} + inline const UString& GetSystemString(const UString &unicodeString) + { return unicodeString;} + inline const wchar_t* GetSystemString(const wchar_t* unicodeString, UINT /* codePage */) + { return unicodeString;} + inline const UString& GetSystemString(const UString &unicodeString, UINT /* codePage */) + { return unicodeString;} + inline UString GetSystemString(const AString &multiByteString, UINT codePage) + { return MultiByteToUnicodeString(multiByteString, codePage);} + inline UString GetSystemString(const AString &multiByteString) + { return MultiByteToUnicodeString(multiByteString);} +#else + inline const char* GetSystemString(const char *ansiString) + { return ansiString; } + inline const AString& GetSystemString(const AString &multiByteString, UINT) + { return multiByteString; } + inline const char * GetSystemString(const char *multiByteString, UINT) + { return multiByteString; } + inline AString GetSystemString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString); } + inline AString GetSystemString(const UString &unicodeString, UINT codePage) + { return UnicodeStringToMultiByte(unicodeString, codePage); } +#endif + +#ifndef _WIN32_WCE +AString SystemStringToOemString(const CSysString &srcString); +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StringToInt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StringToInt.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,68 @@ +// Common/StringToInt.cpp + +#include "StdAfx.h" + +#include "StringToInt.h" + +UInt64 ConvertStringToUInt64(const char *s, const char **end) +{ + UInt64 result = 0; + for (;;) + { + char c = *s; + if (c < '0' || c > '9') + { + if (end != NULL) + *end = s; + return result; + } + result *= 10; + result += (c - '0'); + s++; + } +} + +UInt64 ConvertOctStringToUInt64(const char *s, const char **end) +{ + UInt64 result = 0; + for (;;) + { + char c = *s; + if (c < '0' || c > '7') + { + if (end != NULL) + *end = s; + return result; + } + result <<= 3; + result += (c - '0'); + s++; + } +} + + +UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end) +{ + UInt64 result = 0; + for (;;) + { + wchar_t c = *s; + if (c < '0' || c > '9') + { + if (end != NULL) + *end = s; + return result; + } + result *= 10; + result += (c - '0'); + s++; + } +} + + +Int64 ConvertStringToInt64(const char *s, const char **end) +{ + if (*s == '-') + return -(Int64)ConvertStringToUInt64(s + 1, end); + return ConvertStringToUInt64(s, end); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/StringToInt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/StringToInt.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,17 @@ +// Common/StringToInt.h + +#ifndef __COMMON_STRINGTOINT_H +#define __COMMON_STRINGTOINT_H + +#include +#include "Types.h" + +UInt64 ConvertStringToUInt64(const char *s, const char **end); +UInt64 ConvertOctStringToUInt64(const char *s, const char **end); +UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end); + +Int64 ConvertStringToInt64(const char *s, const char **end); + +#endif + + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/Types.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/Types.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,57 @@ +// Common/Types.h + +#ifndef __COMMON_TYPES_H +#define __COMMON_TYPES_H + +#ifndef _7ZIP_BYTE_DEFINED +#define _7ZIP_BYTE_DEFINED +typedef unsigned char Byte; +#endif + +#ifndef _7ZIP_INT16_DEFINED +#define _7ZIP_INT16_DEFINED +typedef short Int16; +#endif + +#ifndef _7ZIP_UINT16_DEFINED +#define _7ZIP_UINT16_DEFINED +typedef unsigned short UInt16; +#endif + +#ifndef _7ZIP_INT32_DEFINED +#define _7ZIP_INT32_DEFINED +typedef int Int32; +#endif + +#ifndef _7ZIP_UINT32_DEFINED +#define _7ZIP_UINT32_DEFINED +typedef unsigned int UInt32; +#endif + +#ifdef _MSC_VER + +#ifndef _7ZIP_INT64_DEFINED +#define _7ZIP_INT64_DEFINED +typedef __int64 Int64; +#endif + +#ifndef _7ZIP_UINT64_DEFINED +#define _7ZIP_UINT64_DEFINED +typedef unsigned __int64 UInt64; +#endif + +#else + +#ifndef _7ZIP_INT64_DEFINED +#define _7ZIP_INT64_DEFINED +typedef long long int Int64; +#endif + +#ifndef _7ZIP_UINT64_DEFINED +#define _7ZIP_UINT64_DEFINED +typedef unsigned long long int UInt64; +#endif + +#endif + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/UTFConvert.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/UTFConvert.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,91 @@ +// UTFConvert.cpp + +#include "StdAfx.h" + +#include "UTFConvert.h" +#include "Types.h" + +static Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +// These functions are for UTF8 <-> UTF16 conversion. + +bool ConvertUTF8ToUnicode(const AString &src, UString &dest) +{ + dest.Empty(); + for(int i = 0; i < src.Length();) + { + Byte c = (Byte)src[i++]; + if (c < 0x80) + { + dest += (wchar_t)c; + continue; + } + if(c < 0xC0) + return false; + int numAdds; + for (numAdds = 1; numAdds < 5; numAdds++) + if (c < kUtf8Limits[numAdds]) + break; + UInt32 value = (c - kUtf8Limits[numAdds - 1]); + do + { + if (i >= src.Length()) + return false; + Byte c2 = (Byte)src[i++]; + if (c2 < 0x80 || c2 >= 0xC0) + return false; + value <<= 6; + value |= (c2 - 0x80); + numAdds--; + } + while(numAdds > 0); + if (value < 0x10000) + dest += (wchar_t)(value); + else + { + value -= 0x10000; + if (value >= 0x100000) + return false; + dest += (wchar_t)(0xD800 + (value >> 10)); + dest += (wchar_t)(0xDC00 + (value & 0x3FF)); + } + } + return true; +} + +bool ConvertUnicodeToUTF8(const UString &src, AString &dest) +{ + dest.Empty(); + for(int i = 0; i < src.Length();) + { + UInt32 value = (UInt32)src[i++]; + if (value < 0x80) + { + dest += (char)value; + continue; + } + if (value >= 0xD800 && value < 0xE000) + { + if (value >= 0xDC00) + return false; + if (i >= src.Length()) + return false; + UInt32 c2 = (UInt32)src[i++]; + if (c2 < 0xDC00 || c2 >= 0xE000) + return false; + value = ((value - 0xD800) << 10) | (c2 - 0xDC00); + } + int numAdds; + for (numAdds = 1; numAdds < 5; numAdds++) + if (value < (((UInt32)1) << (numAdds * 5 + 6))) + break; + dest += (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds))); + do + { + numAdds--; + dest += (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F)); + } + while(numAdds > 0); + } + return true; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/UTFConvert.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/UTFConvert.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,11 @@ +// Common/UTFConvert.h + +#ifndef __COMMON_UTFCONVERT_H +#define __COMMON_UTFCONVERT_H + +#include "MyString.h" + +bool ConvertUTF8ToUnicode(const AString &utfString, UString &resultString); +bool ConvertUnicodeToUTF8(const UString &unicodeString, AString &resultString); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/Wildcard.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/Wildcard.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,458 @@ +// Common/Wildcard.cpp + +#include "StdAfx.h" + +#include "Wildcard.h" + +bool g_CaseSensitive = + #ifdef _WIN32 + false; + #else + true; + #endif + +static const wchar_t kAnyCharsChar = L'*'; +static const wchar_t kAnyCharChar = L'?'; + +#ifdef _WIN32 +static const wchar_t kDirDelimiter1 = L'\\'; +#endif +static const wchar_t kDirDelimiter2 = L'/'; + +static const UString kWildCardCharSet = L"?*"; + +static const UString kIllegalWildCardFileNameChars= + L"\x1\x2\x3\x4\x5\x6\x7\x8\x9\xA\xB\xC\xD\xE\xF" + L"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F" + L"\"/:<>\\|"; + + +static inline bool IsCharDirLimiter(wchar_t c) +{ + return ( + #ifdef _WIN32 + c == kDirDelimiter1 || + #endif + c == kDirDelimiter2); +} + +int CompareFileNames(const UString &s1, const UString &s2) +{ + if (g_CaseSensitive) + return s1.Compare(s2); + return s1.CompareNoCase(s2); +} + +// ----------------------------------------- +// this function compares name with mask +// ? - any char +// * - any char or empty + +static bool EnhancedMaskTest(const wchar_t *mask, const wchar_t *name) +{ + for (;;) + { + wchar_t m = *mask; + wchar_t c = *name; + if (m == 0) + return (c == 0); + if (m == kAnyCharsChar) + { + if (EnhancedMaskTest(mask + 1, name)) + return true; + if (c == 0) + return false; + } + else + { + if (m == kAnyCharChar) + { + if (c == 0) + return false; + } + else if (m != c) + if (g_CaseSensitive || MyCharUpper(m) != MyCharUpper(c)) + return false; + mask++; + } + name++; + } +} + +// -------------------------------------------------- +// Splits path to strings + +void SplitPathToParts(const UString &path, UStringVector &pathParts) +{ + pathParts.Clear(); + UString name; + int len = path.Length(); + if (len == 0) + return; + for (int i = 0; i < len; i++) + { + wchar_t c = path[i]; + if (IsCharDirLimiter(c)) + { + pathParts.Add(name); + name.Empty(); + } + else + name += c; + } + pathParts.Add(name); +} + +void SplitPathToParts(const UString &path, UString &dirPrefix, UString &name) +{ + int i; + for(i = path.Length() - 1; i >= 0; i--) + if(IsCharDirLimiter(path[i])) + break; + dirPrefix = path.Left(i + 1); + name = path.Mid(i + 1); +} + +UString ExtractDirPrefixFromPath(const UString &path) +{ + int i; + for(i = path.Length() - 1; i >= 0; i--) + if(IsCharDirLimiter(path[i])) + break; + return path.Left(i + 1); +} + +UString ExtractFileNameFromPath(const UString &path) +{ + int i; + for(i = path.Length() - 1; i >= 0; i--) + if(IsCharDirLimiter(path[i])) + break; + return path.Mid(i + 1); +} + + +bool CompareWildCardWithName(const UString &mask, const UString &name) +{ + return EnhancedMaskTest(mask, name); +} + +bool DoesNameContainWildCard(const UString &path) +{ + return (path.FindOneOf(kWildCardCharSet) >= 0); +} + + +// ----------------------------------------------------------' +// NWildcard + +namespace NWildcard { + + +/* +M = MaskParts.Size(); +N = TestNameParts.Size(); + + File Dir +ForFile req M<=N [N-M, N) - + nonreq M=N [0, M) - + +ForDir req M 1) + return true; + } + return false; +} + +bool CCensorNode::AreThereIncludeItems() const +{ + if (IncludeItems.Size() > 0) + return true; + for (int i = 0; i < SubNodes.Size(); i++) + if (SubNodes[i].AreThereIncludeItems()) + return true; + return false; +} + +bool CCensorNode::CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const +{ + const CObjectVector &items = include ? IncludeItems : ExcludeItems; + for (int i = 0; i < items.Size(); i++) + if (items[i].CheckPath(pathParts, isFile)) + return true; + return false; +} + +bool CCensorNode::CheckPath(UStringVector &pathParts, bool isFile, bool &include) const +{ + if (CheckPathCurrent(false, pathParts, isFile)) + { + include = false; + return true; + } + include = true; + bool finded = CheckPathCurrent(true, pathParts, isFile); + if (pathParts.Size() == 1) + return finded; + int index = FindSubNode(pathParts.Front()); + if (index >= 0) + { + UStringVector pathParts2 = pathParts; + pathParts2.Delete(0); + if (SubNodes[index].CheckPath(pathParts2, isFile, include)) + return true; + } + return finded; +} + +bool CCensorNode::CheckPath(const UString &path, bool isFile, bool &include) const +{ + UStringVector pathParts; + SplitPathToParts(path, pathParts); + return CheckPath(pathParts, isFile, include); +} + +bool CCensorNode::CheckPath(const UString &path, bool isFile) const +{ + bool include; + if(CheckPath(path, isFile, include)) + return include; + return false; +} + +bool CCensorNode::CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const +{ + if (CheckPathCurrent(include, pathParts, isFile)) + return true; + if (Parent == 0) + return false; + pathParts.Insert(0, Name); + return Parent->CheckPathToRoot(include, pathParts, isFile); +} + +/* +bool CCensorNode::CheckPathToRoot(bool include, const UString &path, bool isFile) const +{ + UStringVector pathParts; + SplitPathToParts(path, pathParts); + return CheckPathToRoot(include, pathParts, isFile); +} +*/ + +void CCensorNode::AddItem2(bool include, const UString &path, bool recursive) +{ + if (path.IsEmpty()) + return; + bool forFile = true; + bool forFolder = true; + UString path2 = path; + if (IsCharDirLimiter(path[path.Length() - 1])) + { + path2.Delete(path.Length() - 1); + forFile = false; + } + AddItem(include, path2, recursive, forFile, forFolder); +} + +void CCensorNode::ExtendExclude(const CCensorNode &fromNodes) +{ + ExcludeItems += fromNodes.ExcludeItems; + for (int i = 0; i < fromNodes.SubNodes.Size(); i++) + { + const CCensorNode &node = fromNodes.SubNodes[i]; + int subNodeIndex = FindSubNode(node.Name); + if (subNodeIndex < 0) + subNodeIndex = SubNodes.Add(CCensorNode(node.Name, this)); + SubNodes[subNodeIndex].ExtendExclude(node); + } +} + +int CCensor::FindPrefix(const UString &prefix) const +{ + for (int i = 0; i < Pairs.Size(); i++) + if (CompareFileNames(Pairs[i].Prefix, prefix) == 0) + return i; + return -1; +} + +void CCensor::AddItem(bool include, const UString &path, bool recursive) +{ + UStringVector pathParts; + SplitPathToParts(path, pathParts); + bool forFile = true; + if (pathParts.Back().IsEmpty()) + { + forFile = false; + pathParts.DeleteBack(); + } + const UString &front = pathParts.Front(); + bool isAbs = false; + if (front.IsEmpty()) + isAbs = true; + else if (front.Length() == 2 && front[1] == L':') + isAbs = true; + else + { + for (int i = 0; i < pathParts.Size(); i++) + { + const UString &part = pathParts[i]; + if (part == L".." || part == L".") + { + isAbs = true; + break; + } + } + } + int numAbsParts = 0; + if (isAbs) + if (pathParts.Size() > 1) + numAbsParts = pathParts.Size() - 1; + else + numAbsParts = 1; + UString prefix; + for (int i = 0; i < numAbsParts; i++) + { + const UString &front = pathParts.Front(); + if (DoesNameContainWildCard(front)) + break; + prefix += front; + prefix += WCHAR_PATH_SEPARATOR; + pathParts.Delete(0); + } + int index = FindPrefix(prefix); + if (index < 0) + index = Pairs.Add(CPair(prefix)); + + CItem item; + item.PathParts = pathParts; + item.ForDir = true; + item.ForFile = forFile; + item.Recursive = recursive; + Pairs[index].Head.AddItem(include, item); +} + +bool CCensor::CheckPath(const UString &path, bool isFile) const +{ + bool finded = false; + for (int i = 0; i < Pairs.Size(); i++) + { + bool include; + if (Pairs[i].Head.CheckPath(path, isFile, include)) + { + if (!include) + return false; + finded = true; + } + } + return finded; +} + +void CCensor::ExtendExclude() +{ + int i; + for (i = 0; i < Pairs.Size(); i++) + if (Pairs[i].Prefix.IsEmpty()) + break; + if (i == Pairs.Size()) + return; + int index = i; + for (i = 0; i < Pairs.Size(); i++) + if (index != i) + Pairs[i].Head.ExtendExclude(Pairs[index].Head); +} + +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Common/Wildcard.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Common/Wildcard.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,80 @@ +// Common/Wildcard.h + +#ifndef __COMMON_WILDCARD_H +#define __COMMON_WILDCARD_H + +#include "MyString.h" + +int CompareFileNames(const UString &s1, const UString &s2); + +void SplitPathToParts(const UString &path, UStringVector &pathParts); +void SplitPathToParts(const UString &path, UString &dirPrefix, UString &name); +UString ExtractDirPrefixFromPath(const UString &path); +UString ExtractFileNameFromPath(const UString &path); +bool DoesNameContainWildCard(const UString &path); +bool CompareWildCardWithName(const UString &mask, const UString &name); + +namespace NWildcard { + +struct CItem +{ + UStringVector PathParts; + bool Recursive; + bool ForFile; + bool ForDir; + bool CheckPath(const UStringVector &pathParts, bool isFile) const; +}; + +class CCensorNode +{ + CCensorNode *Parent; + bool CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const; + void AddItemSimple(bool include, CItem &item); + bool CheckPath(UStringVector &pathParts, bool isFile, bool &include) const; +public: + CCensorNode(): Parent(0) { }; + CCensorNode(const UString &name, CCensorNode *parent): Name(name), Parent(parent) { }; + UString Name; + CObjectVector SubNodes; + CObjectVector IncludeItems; + CObjectVector ExcludeItems; + + int FindSubNode(const UString &path) const; + + void AddItem(bool include, CItem &item); + void AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir); + void AddItem2(bool include, const UString &path, bool recursive); + + bool NeedCheckSubDirs() const; + bool AreThereIncludeItems() const; + + bool CheckPath(const UString &path, bool isFile, bool &include) const; + bool CheckPath(const UString &path, bool isFile) const; + + bool CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const; + // bool CheckPathToRoot(const UString &path, bool isFile, bool include) const; + void ExtendExclude(const CCensorNode &fromNodes); +}; + +struct CPair +{ + UString Prefix; + CCensorNode Head; + CPair(const UString &prefix): Prefix(prefix) { }; +}; + +class CCensor +{ + int FindPrefix(const UString &prefix) const; +public: + CObjectVector Pairs; + bool AllAreRelative() const + { return (Pairs.Size() == 1 && Pairs.Front().Prefix.IsEmpty()); } + void AddItem(bool include, const UString &path, bool recursive); + bool CheckPath(const UString &path, bool isFile) const; + void ExtendExclude(); +}; + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/DLL.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/DLL.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,115 @@ +// Windows/DLL.cpp + +#include "StdAfx.h" + +#include "DLL.h" +#include "Defs.h" +#ifndef _UNICODE +#include "../Common/StringConvert.h" +#endif + +#ifndef _UNICODE +extern bool g_IsNT; +#endif + +namespace NWindows { +namespace NDLL { + +CLibrary::~CLibrary() +{ + Free(); +} + +bool CLibrary::Free() +{ + if (_module == 0) + return true; + // MessageBox(0, TEXT(""), TEXT("Free"), 0); + // Sleep(5000); + if (!::FreeLibrary(_module)) + return false; + _module = 0; + return true; +} + +bool CLibrary::LoadOperations(HMODULE newModule) +{ + if (newModule == NULL) + return false; + if(!Free()) + return false; + _module = newModule; + return true; +} + +bool CLibrary::LoadEx(LPCTSTR fileName, DWORD flags) +{ + // MessageBox(0, fileName, TEXT("LoadEx"), 0); + return LoadOperations(::LoadLibraryEx(fileName, NULL, flags)); +} + +bool CLibrary::Load(LPCTSTR fileName) +{ + // MessageBox(0, fileName, TEXT("Load"), 0); + // Sleep(5000); + // OutputDebugString(fileName); + // OutputDebugString(TEXT("\n")); + return LoadOperations(::LoadLibrary(fileName)); +} + +#ifndef _UNICODE +static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } +CSysString GetSysPath(LPCWSTR sysPath) + { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); } + +bool CLibrary::LoadEx(LPCWSTR fileName, DWORD flags) +{ + if (g_IsNT) + return LoadOperations(::LoadLibraryExW(fileName, NULL, flags)); + return LoadEx(GetSysPath(fileName), flags); +} +bool CLibrary::Load(LPCWSTR fileName) +{ + if (g_IsNT) + return LoadOperations(::LoadLibraryW(fileName)); + return Load(GetSysPath(fileName)); +} +#endif + +bool MyGetModuleFileName(HMODULE hModule, CSysString &result) +{ + result.Empty(); + TCHAR fullPath[MAX_PATH + 2]; + DWORD size = ::GetModuleFileName(hModule, fullPath, MAX_PATH + 1); + if (size <= MAX_PATH && size != 0) + { + result = fullPath; + return true; + } + return false; +} + +#ifndef _UNICODE +bool MyGetModuleFileName(HMODULE hModule, UString &result) +{ + result.Empty(); + if (g_IsNT) + { + wchar_t fullPath[MAX_PATH + 2]; + DWORD size = ::GetModuleFileNameW(hModule, fullPath, MAX_PATH + 1); + if (size <= MAX_PATH && size != 0) + { + result = fullPath; + return true; + } + return false; + } + CSysString resultSys; + if (!MyGetModuleFileName(hModule, resultSys)) + return false; + result = MultiByteToUnicodeString(resultSys, GetCurrentCodePage()); + return true; +} +#endif + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/DLL.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/DLL.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,54 @@ +// Windows/DLL.h + +#ifndef __WINDOWS_DLL_H +#define __WINDOWS_DLL_H + +#include "../Common/MyString.h" + +namespace NWindows { +namespace NDLL { + +class CLibrary +{ + bool LoadOperations(HMODULE newModule); +protected: + HMODULE _module; +public: + operator HMODULE() const { return _module; } + HMODULE* operator&() { return &_module; } + + CLibrary():_module(NULL) {}; + ~CLibrary(); + void Attach(HMODULE m) + { + Free(); + _module = m; + } + HMODULE Detach() + { + HMODULE m = _module; + _module = NULL; + return m; + } + + // operator HMODULE() const { return _module; }; + bool IsLoaded() const { return (_module != NULL); }; + bool Free(); + bool LoadEx(LPCTSTR fileName, DWORD flags = LOAD_LIBRARY_AS_DATAFILE); + bool Load(LPCTSTR fileName); + #ifndef _UNICODE + bool LoadEx(LPCWSTR fileName, DWORD flags = LOAD_LIBRARY_AS_DATAFILE); + bool Load(LPCWSTR fileName); + #endif + FARPROC GetProcAddress(LPCSTR procName) const + { return ::GetProcAddress(_module, procName); } +}; + +bool MyGetModuleFileName(HMODULE hModule, CSysString &result); +#ifndef _UNICODE +bool MyGetModuleFileName(HMODULE hModule, UString &result); +#endif + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/Defs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/Defs.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,23 @@ +// Windows/Defs.h + +#ifndef __WINDOWS_DEFS_H +#define __WINDOWS_DEFS_H + +inline bool BOOLToBool(BOOL value) + { return (value != FALSE); } + +#ifdef _WIN32 +inline bool LRESULTToBool(LRESULT value) + { return (value != FALSE); } +#endif + +inline BOOL BoolToBOOL(bool value) + { return (value ? TRUE: FALSE); } + +inline VARIANT_BOOL BoolToVARIANT_BOOL(bool value) + { return (value ? VARIANT_TRUE: VARIANT_FALSE); } + +inline bool VARIANT_BOOLToBool(VARIANT_BOOL value) + { return (value != VARIANT_FALSE); } + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/Error.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/Error.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,50 @@ +// Windows/Error.h + +#include "StdAfx.h" + +#include "Windows/Error.h" +#ifndef _UNICODE +#include "Common/StringConvert.h" +#endif + +#ifndef _UNICODE +extern bool g_IsNT; +#endif + +namespace NWindows { +namespace NError { + +bool MyFormatMessage(DWORD messageID, CSysString &message) +{ + LPVOID msgBuf; + if(::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL,messageID, 0, (LPTSTR) &msgBuf,0, NULL) == 0) + return false; + message = (LPCTSTR)msgBuf; + ::LocalFree(msgBuf); + return true; +} + +#ifndef _UNICODE +bool MyFormatMessage(DWORD messageID, UString &message) +{ + if (g_IsNT) + { + LPVOID msgBuf; + if(::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, messageID, 0, (LPWSTR) &msgBuf, 0, NULL) == 0) + return false; + message = (LPCWSTR)msgBuf; + ::LocalFree(msgBuf); + return true; + } + CSysString messageSys; + bool result = MyFormatMessage(messageID, messageSys); + message = GetUnicodeString(messageSys); + return result; +} +#endif + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/Error.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/Error.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,33 @@ +// Windows/Error.h + +#ifndef __WINDOWS_ERROR_H +#define __WINDOWS_ERROR_H + +#include "Common/MyString.h" + +namespace NWindows { +namespace NError { + +bool MyFormatMessage(DWORD messageID, CSysString &message); +inline CSysString MyFormatMessage(DWORD messageID) +{ + CSysString message; + MyFormatMessage(messageID, message); + return message; +} +#ifdef _UNICODE +inline UString MyFormatMessageW(DWORD messageID) + { return MyFormatMessage(messageID); } +#else +bool MyFormatMessage(DWORD messageID, UString &message); +inline UString MyFormatMessageW(DWORD messageID) +{ + UString message; + MyFormatMessage(messageID, message); + return message; +} +#endif + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileDir.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileDir.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,841 @@ +// Windows/FileDir.cpp + +#include "StdAfx.h" + +#include "FileDir.h" +#include "FileName.h" +#include "FileFind.h" +#include "Defs.h" +#ifndef _UNICODE +#include "../Common/StringConvert.h" +#endif + +#ifndef _UNICODE +extern bool g_IsNT; +#endif + +namespace NWindows { +namespace NFile { + +#if defined(WIN_LONG_PATH) && defined(_UNICODE) +#define WIN_LONG_PATH2 +#endif + +// SetCurrentDirectory doesn't support \\?\ prefix + +#ifdef WIN_LONG_PATH +bool GetLongPathBase(LPCWSTR fileName, UString &res); +bool GetLongPath(LPCWSTR fileName, UString &res); +#endif + +namespace NDirectory { + +#ifndef _UNICODE +static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } +static UString GetUnicodePath(const CSysString &sysPath) + { return MultiByteToUnicodeString(sysPath, GetCurrentCodePage()); } +static CSysString GetSysPath(LPCWSTR sysPath) + { return UnicodeStringToMultiByte(sysPath, GetCurrentCodePage()); } +#endif + +bool MyGetWindowsDirectory(CSysString &path) +{ + UINT needLength = ::GetWindowsDirectory(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); + path.ReleaseBuffer(); + return (needLength > 0 && needLength <= MAX_PATH); +} + +bool MyGetSystemDirectory(CSysString &path) +{ + UINT needLength = ::GetSystemDirectory(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); + path.ReleaseBuffer(); + return (needLength > 0 && needLength <= MAX_PATH); +} + +#ifndef _UNICODE +bool MyGetWindowsDirectory(UString &path) +{ + if (g_IsNT) + { + UINT needLength = ::GetWindowsDirectoryW(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); + path.ReleaseBuffer(); + return (needLength > 0 && needLength <= MAX_PATH); + } + CSysString sysPath; + if (!MyGetWindowsDirectory(sysPath)) + return false; + path = GetUnicodePath(sysPath); + return true; +} + +bool MyGetSystemDirectory(UString &path) +{ + if (g_IsNT) + { + UINT needLength = ::GetSystemDirectoryW(path.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); + path.ReleaseBuffer(); + return (needLength > 0 && needLength <= MAX_PATH); + } + CSysString sysPath; + if (!MyGetSystemDirectory(sysPath)) + return false; + path = GetUnicodePath(sysPath); + return true; +} +#endif + +bool SetDirTime(LPCWSTR fileName, const FILETIME *creationTime, const FILETIME *lastAccessTime, const FILETIME *lastWriteTime) +{ + #ifndef _UNICODE + if (!g_IsNT) + { + ::SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return false; + } + #endif + HANDLE hDir = ::CreateFileW(fileName, GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); + #ifdef WIN_LONG_PATH + if (hDir == INVALID_HANDLE_VALUE) + { + UString longPath; + if (GetLongPath(fileName, longPath)) + hDir = ::CreateFileW(longPath, GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); + } + #endif + + bool res = false; + if (hDir != INVALID_HANDLE_VALUE) + { + res = BOOLToBool(::SetFileTime(hDir, creationTime, lastAccessTime, lastWriteTime)); + ::CloseHandle(hDir); + } + return res; +} + +bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes) +{ + if (::SetFileAttributes(fileName, fileAttributes)) + return true; + #ifdef WIN_LONG_PATH2 + UString longPath; + if (GetLongPath(fileName, longPath)) + return BOOLToBool(::SetFileAttributesW(longPath, fileAttributes)); + #endif + return false; +} + +bool MyRemoveDirectory(LPCTSTR pathName) +{ + if (::RemoveDirectory(pathName)) + return true; + #ifdef WIN_LONG_PATH2 + UString longPath; + if (GetLongPath(pathName, longPath)) + return BOOLToBool(::RemoveDirectoryW(longPath)); + #endif + return false; +} + +#ifdef WIN_LONG_PATH +bool GetLongPaths(LPCWSTR s1, LPCWSTR s2, UString &d1, UString &d2) +{ + if (!GetLongPathBase(s1, d1) || !GetLongPathBase(s2, d2)) + return false; + if (d1.IsEmpty() && d2.IsEmpty()) return false; + if (d1.IsEmpty()) d1 = s1; + if (d2.IsEmpty()) d2 = s2; + return true; +} +#endif + +bool MyMoveFile(LPCTSTR existFileName, LPCTSTR newFileName) +{ + if (::MoveFile(existFileName, newFileName)) + return true; + #ifdef WIN_LONG_PATH2 + UString d1, d2; + if (GetLongPaths(existFileName, newFileName, d1, d2)) + return BOOLToBool(::MoveFileW(d1, d2)); + #endif + return false; +} + +#ifndef _UNICODE +bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes) +{ + if (!g_IsNT) + return MySetFileAttributes(GetSysPath(fileName), fileAttributes); + if (::SetFileAttributesW(fileName, fileAttributes)) + return true; + #ifdef WIN_LONG_PATH + UString longPath; + if (GetLongPath(fileName, longPath)) + return BOOLToBool(::SetFileAttributesW(longPath, fileAttributes)); + #endif + return false; +} + + +bool MyRemoveDirectory(LPCWSTR pathName) +{ + if (!g_IsNT) + return MyRemoveDirectory(GetSysPath(pathName)); + if (::RemoveDirectoryW(pathName)) + return true; + #ifdef WIN_LONG_PATH + UString longPath; + if (GetLongPath(pathName, longPath)) + return BOOLToBool(::RemoveDirectoryW(longPath)); + #endif + return false; +} + +bool MyMoveFile(LPCWSTR existFileName, LPCWSTR newFileName) +{ + if (!g_IsNT) + return MyMoveFile(GetSysPath(existFileName), GetSysPath(newFileName)); + if (::MoveFileW(existFileName, newFileName)) + return true; + #ifdef WIN_LONG_PATH + UString d1, d2; + if (GetLongPaths(existFileName, newFileName, d1, d2)) + return BOOLToBool(::MoveFileW(d1, d2)); + #endif + return false; +} +#endif + +bool MyCreateDirectory(LPCTSTR pathName) +{ + if (::CreateDirectory(pathName, NULL)) + return true; + #ifdef WIN_LONG_PATH2 + if (::GetLastError() != ERROR_ALREADY_EXISTS) + { + UString longPath; + if (GetLongPath(pathName, longPath)) + return BOOLToBool(::CreateDirectoryW(longPath, NULL)); + } + #endif + return false; +} + +#ifndef _UNICODE +bool MyCreateDirectory(LPCWSTR pathName) +{ + if (!g_IsNT) + return MyCreateDirectory(GetSysPath(pathName)); + if (::CreateDirectoryW(pathName, NULL)) + return true; + #ifdef WIN_LONG_PATH + if (::GetLastError() != ERROR_ALREADY_EXISTS) + { + UString longPath; + if (GetLongPath(pathName, longPath)) + return BOOLToBool(::CreateDirectoryW(longPath, NULL)); + } + #endif + return false; +} +#endif + +/* +bool CreateComplexDirectory(LPCTSTR pathName) +{ + NName::CParsedPath path; + path.ParsePath(pathName); + CSysString fullPath = path.Prefix; + DWORD errorCode = ERROR_SUCCESS; + for(int i = 0; i < path.PathParts.Size(); i++) + { + const CSysString &string = path.PathParts[i]; + if(string.IsEmpty()) + { + if(i != path.PathParts.Size() - 1) + return false; + return true; + } + fullPath += path.PathParts[i]; + if (!MyCreateDirectory(fullPath)) + { + DWORD errorCode = GetLastError(); + if(errorCode != ERROR_ALREADY_EXISTS) + return false; + } + fullPath += NName::kDirDelimiter; + } + return true; +} +*/ + +bool CreateComplexDirectory(LPCTSTR _aPathName) +{ + CSysString pathName = _aPathName; + int pos = pathName.ReverseFind(TEXT(CHAR_PATH_SEPARATOR)); + if (pos > 0 && pos == pathName.Length() - 1) + { + if (pathName.Length() == 3 && pathName[1] == ':') + return true; // Disk folder; + pathName.Delete(pos); + } + CSysString pathName2 = pathName; + pos = pathName.Length(); + for (;;) + { + if(MyCreateDirectory(pathName)) + break; + if (::GetLastError() == ERROR_ALREADY_EXISTS) + { + NFind::CFileInfo fileInfo; + if (!NFind::FindFile(pathName, fileInfo)) // For network folders + return true; + if (!fileInfo.IsDirectory()) + return false; + break; + } + pos = pathName.ReverseFind(TEXT(CHAR_PATH_SEPARATOR)); + if (pos < 0 || pos == 0) + return false; + if (pathName[pos - 1] == ':') + return false; + pathName = pathName.Left(pos); + } + pathName = pathName2; + while(pos < pathName.Length()) + { + pos = pathName.Find(TEXT(CHAR_PATH_SEPARATOR), pos + 1); + if (pos < 0) + pos = pathName.Length(); + if (!MyCreateDirectory(pathName.Left(pos))) + return false; + } + return true; +} + +#ifndef _UNICODE + +bool CreateComplexDirectory(LPCWSTR _aPathName) +{ + UString pathName = _aPathName; + int pos = pathName.ReverseFind(WCHAR_PATH_SEPARATOR); + if (pos > 0 && pos == pathName.Length() - 1) + { + if (pathName.Length() == 3 && pathName[1] == L':') + return true; // Disk folder; + pathName.Delete(pos); + } + UString pathName2 = pathName; + pos = pathName.Length(); + for (;;) + { + if(MyCreateDirectory(pathName)) + break; + if (::GetLastError() == ERROR_ALREADY_EXISTS) + { + NFind::CFileInfoW fileInfo; + if (!NFind::FindFile(pathName, fileInfo)) // For network folders + return true; + if (!fileInfo.IsDirectory()) + return false; + break; + } + pos = pathName.ReverseFind(WCHAR_PATH_SEPARATOR); + if (pos < 0 || pos == 0) + return false; + if (pathName[pos - 1] == L':') + return false; + pathName = pathName.Left(pos); + } + pathName = pathName2; + while(pos < pathName.Length()) + { + pos = pathName.Find(WCHAR_PATH_SEPARATOR, pos + 1); + if (pos < 0) + pos = pathName.Length(); + if (!MyCreateDirectory(pathName.Left(pos))) + return false; + } + return true; +} + +#endif + +bool DeleteFileAlways(LPCTSTR name) +{ + if (!MySetFileAttributes(name, 0)) + return false; + if (::DeleteFile(name)) + return true; + #ifdef WIN_LONG_PATH2 + UString longPath; + if (GetLongPath(name, longPath)) + return BOOLToBool(::DeleteFileW(longPath)); + #endif + return false; +} + +#ifndef _UNICODE +bool DeleteFileAlways(LPCWSTR name) +{ + if (!g_IsNT) + return DeleteFileAlways(GetSysPath(name)); + if (!MySetFileAttributes(name, 0)) + return false; + if (::DeleteFileW(name)) + return true; + #ifdef WIN_LONG_PATH + UString longPath; + if (GetLongPath(name, longPath)) + return BOOLToBool(::DeleteFileW(longPath)); + #endif + return false; +} +#endif + +static bool RemoveDirectorySubItems2(const CSysString pathPrefix, const NFind::CFileInfo &fileInfo) +{ + if(fileInfo.IsDirectory()) + return RemoveDirectoryWithSubItems(pathPrefix + fileInfo.Name); + return DeleteFileAlways(pathPrefix + fileInfo.Name); +} + +bool RemoveDirectoryWithSubItems(const CSysString &path) +{ + NFind::CFileInfo fileInfo; + CSysString pathPrefix = path + NName::kDirDelimiter; + { + NFind::CEnumerator enumerator(pathPrefix + TCHAR(NName::kAnyStringWildcard)); + while(enumerator.Next(fileInfo)) + if (!RemoveDirectorySubItems2(pathPrefix, fileInfo)) + return false; + } + if (!MySetFileAttributes(path, 0)) + return false; + return MyRemoveDirectory(path); +} + +#ifndef _UNICODE +static bool RemoveDirectorySubItems2(const UString pathPrefix, const NFind::CFileInfoW &fileInfo) +{ + if(fileInfo.IsDirectory()) + return RemoveDirectoryWithSubItems(pathPrefix + fileInfo.Name); + return DeleteFileAlways(pathPrefix + fileInfo.Name); +} +bool RemoveDirectoryWithSubItems(const UString &path) +{ + NFind::CFileInfoW fileInfo; + UString pathPrefix = path + UString(NName::kDirDelimiter); + { + NFind::CEnumeratorW enumerator(pathPrefix + UString(NName::kAnyStringWildcard)); + while(enumerator.Next(fileInfo)) + if (!RemoveDirectorySubItems2(pathPrefix, fileInfo)) + return false; + } + if (!MySetFileAttributes(path, 0)) + return false; + return MyRemoveDirectory(path); +} +#endif + +#ifndef _WIN32_WCE + +bool MyGetShortPathName(LPCTSTR longPath, CSysString &shortPath) +{ + DWORD needLength = ::GetShortPathName(longPath, shortPath.GetBuffer(MAX_PATH + 1), MAX_PATH + 1); + shortPath.ReleaseBuffer(); + return (needLength > 0 && needLength < MAX_PATH); +} + +bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, int &fileNamePartStartIndex) +{ + resultPath.Empty(); + LPTSTR fileNamePointer = 0; + LPTSTR buffer = resultPath.GetBuffer(MAX_PATH); + DWORD needLength = ::GetFullPathName(fileName, MAX_PATH + 1, buffer, &fileNamePointer); + resultPath.ReleaseBuffer(); + if (needLength == 0) + return false; + if (needLength >= MAX_PATH) + { + #ifdef WIN_LONG_PATH2 + needLength++; + buffer = resultPath.GetBuffer(needLength + 1); + DWORD needLength2 = ::GetFullPathNameW(fileName, needLength, buffer, &fileNamePointer); + resultPath.ReleaseBuffer(); + if (needLength2 == 0 || needLength2 > needLength) + #endif + return false; + } + if (fileNamePointer == 0) + fileNamePartStartIndex = lstrlen(fileName); + else + fileNamePartStartIndex = (int)(fileNamePointer - buffer); + return true; +} + +#ifndef _UNICODE +bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, int &fileNamePartStartIndex) +{ + resultPath.Empty(); + if (g_IsNT) + { + LPWSTR fileNamePointer = 0; + LPWSTR buffer = resultPath.GetBuffer(MAX_PATH); + DWORD needLength = ::GetFullPathNameW(fileName, MAX_PATH + 1, buffer, &fileNamePointer); + resultPath.ReleaseBuffer(); + if (needLength == 0) + return false; + if (needLength >= MAX_PATH) + { + #ifdef WIN_LONG_PATH + needLength++; + buffer = resultPath.GetBuffer(needLength + 1); + DWORD needLength2 = ::GetFullPathNameW(fileName, needLength, buffer, &fileNamePointer); + resultPath.ReleaseBuffer(); + if (needLength2 == 0 || needLength2 > needLength) + #endif + return false; + } + if (fileNamePointer == 0) + fileNamePartStartIndex = MyStringLen(fileName); + else + fileNamePartStartIndex = (int)(fileNamePointer - buffer); + } + else + { + CSysString sysPath; + if (!MyGetFullPathName(GetSysPath(fileName), sysPath, fileNamePartStartIndex)) + return false; + UString resultPath1 = GetUnicodePath(sysPath.Left(fileNamePartStartIndex)); + UString resultPath2 = GetUnicodePath(sysPath.Mid(fileNamePartStartIndex)); + fileNamePartStartIndex = resultPath1.Length(); + resultPath = resultPath1 + resultPath2; + } + return true; +} +#endif + + +bool MyGetFullPathName(LPCTSTR fileName, CSysString &path) +{ + int index; + return MyGetFullPathName(fileName, path, index); +} + +#ifndef _UNICODE +bool MyGetFullPathName(LPCWSTR fileName, UString &path) +{ + int index; + return MyGetFullPathName(fileName, path, index); +} +#endif + +bool GetOnlyName(LPCTSTR fileName, CSysString &resultName) +{ + int index; + if (!MyGetFullPathName(fileName, resultName, index)) + return false; + resultName = resultName.Mid(index); + return true; +} + +#ifndef _UNICODE +bool GetOnlyName(LPCWSTR fileName, UString &resultName) +{ + int index; + if (!MyGetFullPathName(fileName, resultName, index)) + return false; + resultName = resultName.Mid(index); + return true; +} +#endif + +bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName) +{ + int index; + if (!MyGetFullPathName(fileName, resultName, index)) + return false; + resultName = resultName.Left(index); + return true; +} + +#ifndef _UNICODE +bool GetOnlyDirPrefix(LPCWSTR fileName, UString &resultName) +{ + int index; + if (!MyGetFullPathName(fileName, resultName, index)) + return false; + resultName = resultName.Left(index); + return true; +} +#endif + +bool MyGetCurrentDirectory(CSysString &path) +{ + DWORD needLength = ::GetCurrentDirectory(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1)); + path.ReleaseBuffer(); + return (needLength > 0 && needLength <= MAX_PATH); +} + +#ifndef _UNICODE +bool MySetCurrentDirectory(LPCWSTR path) +{ + if (g_IsNT) + return BOOLToBool(::SetCurrentDirectoryW(path)); + return MySetCurrentDirectory(GetSysPath(path)); +} +bool MyGetCurrentDirectory(UString &path) +{ + if (g_IsNT) + { + DWORD needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1)); + path.ReleaseBuffer(); + return (needLength > 0 && needLength <= MAX_PATH); + } + CSysString sysPath; + if (!MyGetCurrentDirectory(sysPath)) + return false; + path = GetUnicodePath(sysPath); + return true; +} +#endif +#endif + +bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, + CSysString &resultPath, UINT32 &filePart) +{ + LPTSTR filePartPointer; + DWORD value = ::SearchPath(path, fileName, extension, + MAX_PATH, resultPath.GetBuffer(MAX_PATH + 1), &filePartPointer); + filePart = (UINT32)(filePartPointer - (LPCTSTR)resultPath); + resultPath.ReleaseBuffer(); + return (value > 0 && value <= MAX_PATH); +} + +#ifndef _UNICODE +bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, + UString &resultPath, UINT32 &filePart) +{ + if (g_IsNT) + { + LPWSTR filePartPointer = 0; + DWORD value = ::SearchPathW(path, fileName, extension, + MAX_PATH, resultPath.GetBuffer(MAX_PATH + 1), &filePartPointer); + filePart = (UINT32)(filePartPointer - (LPCWSTR)resultPath); + resultPath.ReleaseBuffer(); + return (value > 0 && value <= MAX_PATH); + } + + CSysString sysPath; + if (!MySearchPath( + path != 0 ? (LPCTSTR)GetSysPath(path): 0, + fileName != 0 ? (LPCTSTR)GetSysPath(fileName): 0, + extension != 0 ? (LPCTSTR)GetSysPath(extension): 0, + sysPath, filePart)) + return false; + UString resultPath1 = GetUnicodePath(sysPath.Left(filePart)); + UString resultPath2 = GetUnicodePath(sysPath.Mid(filePart)); + filePart = resultPath1.Length(); + resultPath = resultPath1 + resultPath2; + return true; +} +#endif + +bool MyGetTempPath(CSysString &path) +{ + DWORD needLength = ::GetTempPath(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1)); + path.ReleaseBuffer(); + return (needLength > 0 && needLength <= MAX_PATH); +} + +#ifndef _UNICODE +bool MyGetTempPath(UString &path) +{ + path.Empty(); + if (g_IsNT) + { + DWORD needLength = ::GetTempPathW(MAX_PATH + 1, path.GetBuffer(MAX_PATH + 1)); + path.ReleaseBuffer(); + return (needLength > 0 && needLength <= MAX_PATH); + } + CSysString sysPath; + if (!MyGetTempPath(sysPath)) + return false; + path = GetUnicodePath(sysPath); + return true; +} +#endif + +UINT MyGetTempFileName(LPCTSTR dirPath, LPCTSTR prefix, CSysString &path) +{ + UINT number = ::GetTempFileName(dirPath, prefix, 0, path.GetBuffer(MAX_PATH + 1)); + path.ReleaseBuffer(); + return number; +} + +#ifndef _UNICODE +UINT MyGetTempFileName(LPCWSTR dirPath, LPCWSTR prefix, UString &path) +{ + if (g_IsNT) + { + UINT number = ::GetTempFileNameW(dirPath, prefix, 0, path.GetBuffer(MAX_PATH)); + path.ReleaseBuffer(); + return number; + } + CSysString sysPath; + UINT number = MyGetTempFileName( + dirPath ? (LPCTSTR)GetSysPath(dirPath): 0, + prefix ? (LPCTSTR)GetSysPath(prefix): 0, + sysPath); + path = GetUnicodePath(sysPath); + return number; +} +#endif + +UINT CTempFile::Create(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath) +{ + Remove(); + UINT number = MyGetTempFileName(dirPath, prefix, resultPath); + if(number != 0) + { + _fileName = resultPath; + _mustBeDeleted = true; + } + return number; +} + +bool CTempFile::Create(LPCTSTR prefix, CSysString &resultPath) +{ + CSysString tempPath; + if (!MyGetTempPath(tempPath)) + return false; + if (Create(tempPath, prefix, resultPath) != 0) + return true; + if (!MyGetWindowsDirectory(tempPath)) + return false; + return (Create(tempPath, prefix, resultPath) != 0); +} + +bool CTempFile::Remove() +{ + if (!_mustBeDeleted) + return true; + _mustBeDeleted = !DeleteFileAlways(_fileName); + return !_mustBeDeleted; +} + +#ifndef _UNICODE + +UINT CTempFileW::Create(LPCWSTR dirPath, LPCWSTR prefix, UString &resultPath) +{ + Remove(); + UINT number = MyGetTempFileName(dirPath, prefix, resultPath); + if(number != 0) + { + _fileName = resultPath; + _mustBeDeleted = true; + } + return number; +} + +bool CTempFileW::Create(LPCWSTR prefix, UString &resultPath) +{ + UString tempPath; + if (!MyGetTempPath(tempPath)) + return false; + if (Create(tempPath, prefix, resultPath) != 0) + return true; + if (!MyGetWindowsDirectory(tempPath)) + return false; + return (Create(tempPath, prefix, resultPath) != 0); +} + +bool CTempFileW::Remove() +{ + if (!_mustBeDeleted) + return true; + _mustBeDeleted = !DeleteFileAlways(_fileName); + return !_mustBeDeleted; +} + +#endif + +bool CreateTempDirectory(LPCTSTR prefix, CSysString &dirName) +{ + /* + CSysString prefix = tempPath + prefixChars; + CRandom random; + random.Init(); + */ + for (;;) + { + CTempFile tempFile; + if (!tempFile.Create(prefix, dirName)) + return false; + if (!::DeleteFile(dirName)) + return false; + /* + UINT32 randomNumber = random.Generate(); + TCHAR randomNumberString[32]; + _stprintf(randomNumberString, _T("%04X"), randomNumber); + dirName = prefix + randomNumberString; + */ + if(NFind::DoesFileExist(dirName)) + continue; + if (MyCreateDirectory(dirName)) + return true; + if (::GetLastError() != ERROR_ALREADY_EXISTS) + return false; + } +} + +bool CTempDirectory::Create(LPCTSTR prefix) +{ + Remove(); + return (_mustBeDeleted = CreateTempDirectory(prefix, _tempDir)); +} + +#ifndef _UNICODE + +bool CreateTempDirectory(LPCWSTR prefix, UString &dirName) +{ + /* + CSysString prefix = tempPath + prefixChars; + CRandom random; + random.Init(); + */ + for (;;) + { + CTempFileW tempFile; + if (!tempFile.Create(prefix, dirName)) + return false; + if (!DeleteFileAlways(dirName)) + return false; + /* + UINT32 randomNumber = random.Generate(); + TCHAR randomNumberString[32]; + _stprintf(randomNumberString, _T("%04X"), randomNumber); + dirName = prefix + randomNumberString; + */ + if(NFind::DoesFileExist(dirName)) + continue; + if (MyCreateDirectory(dirName)) + return true; + if (::GetLastError() != ERROR_ALREADY_EXISTS) + return false; + } +} + +bool CTempDirectoryW::Create(LPCWSTR prefix) +{ + Remove(); + return (_mustBeDeleted = CreateTempDirectory(prefix, _tempDir)); +} + +#endif + +}}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileDir.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileDir.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,178 @@ +// Windows/FileDir.h + +#ifndef __WINDOWS_FILEDIR_H +#define __WINDOWS_FILEDIR_H + +#include "../Common/MyString.h" +#include "Defs.h" + +namespace NWindows { +namespace NFile { +namespace NDirectory { + +#ifdef WIN_LONG_PATH +bool GetLongPaths(LPCWSTR s1, LPCWSTR s2, UString &d1, UString &d2); +#endif + +bool MyGetWindowsDirectory(CSysString &path); +bool MyGetSystemDirectory(CSysString &path); +#ifndef _UNICODE +bool MyGetWindowsDirectory(UString &path); +bool MyGetSystemDirectory(UString &path); +#endif + +bool SetDirTime(LPCWSTR fileName, const FILETIME *creationTime, const FILETIME *lastAccessTime, const FILETIME *lastWriteTime); + +bool MySetFileAttributes(LPCTSTR fileName, DWORD fileAttributes); +bool MyMoveFile(LPCTSTR existFileName, LPCTSTR newFileName); +bool MyRemoveDirectory(LPCTSTR pathName); +bool MyCreateDirectory(LPCTSTR pathName); +bool CreateComplexDirectory(LPCTSTR pathName); +bool DeleteFileAlways(LPCTSTR name); +bool RemoveDirectoryWithSubItems(const CSysString &path); + +#ifndef _UNICODE +bool MySetFileAttributes(LPCWSTR fileName, DWORD fileAttributes); +bool MyMoveFile(LPCWSTR existFileName, LPCWSTR newFileName); +bool MyRemoveDirectory(LPCWSTR pathName); +bool MyCreateDirectory(LPCWSTR pathName); +bool CreateComplexDirectory(LPCWSTR pathName); +bool DeleteFileAlways(LPCWSTR name); +bool RemoveDirectoryWithSubItems(const UString &path); +#endif + +#ifndef _WIN32_WCE +bool MyGetShortPathName(LPCTSTR longPath, CSysString &shortPath); + +bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath, + int &fileNamePartStartIndex); +bool MyGetFullPathName(LPCTSTR fileName, CSysString &resultPath); +bool GetOnlyName(LPCTSTR fileName, CSysString &resultName); +bool GetOnlyDirPrefix(LPCTSTR fileName, CSysString &resultName); +#ifndef _UNICODE +bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath, + int &fileNamePartStartIndex); +bool MyGetFullPathName(LPCWSTR fileName, UString &resultPath); +bool GetOnlyName(LPCWSTR fileName, UString &resultName); +bool GetOnlyDirPrefix(LPCWSTR fileName, UString &resultName); +#endif + +inline bool MySetCurrentDirectory(LPCTSTR path) + { return BOOLToBool(::SetCurrentDirectory(path)); } +bool MyGetCurrentDirectory(CSysString &resultPath); +#ifndef _UNICODE +bool MySetCurrentDirectory(LPCWSTR path); +bool MyGetCurrentDirectory(UString &resultPath); +#endif +#endif + +bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, + CSysString &resultPath, UINT32 &filePart); +#ifndef _UNICODE +bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, + UString &resultPath, UINT32 &filePart); +#endif + +inline bool MySearchPath(LPCTSTR path, LPCTSTR fileName, LPCTSTR extension, + CSysString &resultPath) +{ + UINT32 value; + return MySearchPath(path, fileName, extension, resultPath, value); +} + +#ifndef _UNICODE +inline bool MySearchPath(LPCWSTR path, LPCWSTR fileName, LPCWSTR extension, + UString &resultPath) +{ + UINT32 value; + return MySearchPath(path, fileName, extension, resultPath, value); +} +#endif + +bool MyGetTempPath(CSysString &resultPath); +#ifndef _UNICODE +bool MyGetTempPath(UString &resultPath); +#endif + +UINT MyGetTempFileName(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath); +#ifndef _UNICODE +UINT MyGetTempFileName(LPCWSTR dirPath, LPCWSTR prefix, UString &resultPath); +#endif + +class CTempFile +{ + bool _mustBeDeleted; + CSysString _fileName; +public: + CTempFile(): _mustBeDeleted(false) {} + ~CTempFile() { Remove(); } + void DisableDeleting() { _mustBeDeleted = false; } + UINT Create(LPCTSTR dirPath, LPCTSTR prefix, CSysString &resultPath); + bool Create(LPCTSTR prefix, CSysString &resultPath); + bool Remove(); +}; + +#ifdef _UNICODE +typedef CTempFile CTempFileW; +#else +class CTempFileW +{ + bool _mustBeDeleted; + UString _fileName; +public: + CTempFileW(): _mustBeDeleted(false) {} + ~CTempFileW() { Remove(); } + void DisableDeleting() { _mustBeDeleted = false; } + UINT Create(LPCWSTR dirPath, LPCWSTR prefix, UString &resultPath); + bool Create(LPCWSTR prefix, UString &resultPath); + bool Remove(); +}; +#endif + +bool CreateTempDirectory(LPCTSTR prefixChars, CSysString &dirName); + +class CTempDirectory +{ + bool _mustBeDeleted; + CSysString _tempDir; +public: + const CSysString &GetPath() const { return _tempDir; } + CTempDirectory(): _mustBeDeleted(false) {} + ~CTempDirectory() { Remove(); } + bool Create(LPCTSTR prefix) ; + bool Remove() + { + if (!_mustBeDeleted) + return true; + _mustBeDeleted = !RemoveDirectoryWithSubItems(_tempDir); + return (!_mustBeDeleted); + } + void DisableDeleting() { _mustBeDeleted = false; } +}; + +#ifdef _UNICODE +typedef CTempDirectory CTempDirectoryW; +#else +class CTempDirectoryW +{ + bool _mustBeDeleted; + UString _tempDir; +public: + const UString &GetPath() const { return _tempDir; } + CTempDirectoryW(): _mustBeDeleted(false) {} + ~CTempDirectoryW() { Remove(); } + bool Create(LPCWSTR prefix) ; + bool Remove() + { + if (!_mustBeDeleted) + return true; + _mustBeDeleted = !RemoveDirectoryWithSubItems(_tempDir); + return (!_mustBeDeleted); + } + void DisableDeleting() { _mustBeDeleted = false; } +}; +#endif + +}}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileFind.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileFind.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,408 @@ +// Windows/FileFind.cpp + +#include "StdAfx.h" + +#include "FileFind.h" +#ifndef _UNICODE +#include "../Common/StringConvert.h" +#endif + +#ifndef _UNICODE +extern bool g_IsNT; +#endif + +namespace NWindows { +namespace NFile { + +#if defined(WIN_LONG_PATH) && defined(_UNICODE) +#define WIN_LONG_PATH2 +#endif + +bool GetLongPath(LPCWSTR fileName, UString &res); + +namespace NFind { + +static const TCHAR kDot = TEXT('.'); + +bool CFileInfo::IsDots() const +{ + if (!IsDirectory() || Name.IsEmpty()) + return false; + if (Name[0] != kDot) + return false; + return Name.Length() == 1 || (Name[1] == kDot && Name.Length() == 2); +} + +#ifndef _UNICODE +bool CFileInfoW::IsDots() const +{ + if (!IsDirectory() || Name.IsEmpty()) + return false; + if (Name[0] != kDot) + return false; + return Name.Length() == 1 || (Name[1] == kDot && Name.Length() == 2); +} +#endif + +static void ConvertWIN32_FIND_DATA_To_FileInfo( + const WIN32_FIND_DATA &findData, + CFileInfo &fileInfo) +{ + fileInfo.Attributes = findData.dwFileAttributes; + fileInfo.CreationTime = findData.ftCreationTime; + fileInfo.LastAccessTime = findData.ftLastAccessTime; + fileInfo.LastWriteTime = findData.ftLastWriteTime; + fileInfo.Size = (((UInt64)findData.nFileSizeHigh) << 32) + findData.nFileSizeLow; + fileInfo.Name = findData.cFileName; + #ifndef _WIN32_WCE + fileInfo.ReparseTag = findData.dwReserved0; + #else + fileInfo.ObjectID = findData.dwOID; + #endif +} + +#ifndef _UNICODE + +static inline UINT GetCurrentCodePage() { return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; } + +static void ConvertWIN32_FIND_DATA_To_FileInfo( + const WIN32_FIND_DATAW &findData, + CFileInfoW &fileInfo) +{ + fileInfo.Attributes = findData.dwFileAttributes; + fileInfo.CreationTime = findData.ftCreationTime; + fileInfo.LastAccessTime = findData.ftLastAccessTime; + fileInfo.LastWriteTime = findData.ftLastWriteTime; + fileInfo.Size = (((UInt64)findData.nFileSizeHigh) << 32) + findData.nFileSizeLow; + fileInfo.Name = findData.cFileName; + #ifndef _WIN32_WCE + fileInfo.ReparseTag = findData.dwReserved0; + #else + fileInfo.ObjectID = findData.dwOID; + #endif +} + +static void ConvertWIN32_FIND_DATA_To_FileInfo( + const WIN32_FIND_DATA &findData, + CFileInfoW &fileInfo) +{ + fileInfo.Attributes = findData.dwFileAttributes; + fileInfo.CreationTime = findData.ftCreationTime; + fileInfo.LastAccessTime = findData.ftLastAccessTime; + fileInfo.LastWriteTime = findData.ftLastWriteTime; + fileInfo.Size = (((UInt64)findData.nFileSizeHigh) << 32) + findData.nFileSizeLow; + fileInfo.Name = GetUnicodeString(findData.cFileName, GetCurrentCodePage()); + #ifndef _WIN32_WCE + fileInfo.ReparseTag = findData.dwReserved0; + #else + fileInfo.ObjectID = findData.dwOID; + #endif +} +#endif + +//////////////////////////////// +// CFindFile + +bool CFindFile::Close() +{ + if (_handle == INVALID_HANDLE_VALUE) + return true; + if (!::FindClose(_handle)) + return false; + _handle = INVALID_HANDLE_VALUE; + return true; +} + + +bool CFindFile::FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo) +{ + if (!Close()) + return false; + WIN32_FIND_DATA findData; + _handle = ::FindFirstFile(wildcard, &findData); + #ifdef WIN_LONG_PATH2 + if (_handle == INVALID_HANDLE_VALUE) + { + UString longPath; + if (GetLongPath(wildcard, longPath)) + _handle = ::FindFirstFileW(longPath, &findData); + } + #endif + if (_handle == INVALID_HANDLE_VALUE) + return false; + ConvertWIN32_FIND_DATA_To_FileInfo(findData, fileInfo); + return true; +} + +#ifndef _UNICODE +bool CFindFile::FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo) +{ + if (!Close()) + return false; + if (g_IsNT) + { + WIN32_FIND_DATAW findData; + _handle = ::FindFirstFileW(wildcard, &findData); + #ifdef WIN_LONG_PATH + if (_handle == INVALID_HANDLE_VALUE) + { + UString longPath; + if (GetLongPath(wildcard, longPath)) + _handle = ::FindFirstFileW(longPath, &findData); + } + #endif + if (_handle != INVALID_HANDLE_VALUE) + ConvertWIN32_FIND_DATA_To_FileInfo(findData, fileInfo); + } + else + { + WIN32_FIND_DATAA findData; + _handle = ::FindFirstFileA(UnicodeStringToMultiByte(wildcard, + GetCurrentCodePage()), &findData); + if (_handle != INVALID_HANDLE_VALUE) + ConvertWIN32_FIND_DATA_To_FileInfo(findData, fileInfo); + } + return (_handle != INVALID_HANDLE_VALUE); +} +#endif + +bool CFindFile::FindNext(CFileInfo &fileInfo) +{ + WIN32_FIND_DATA findData; + bool result = BOOLToBool(::FindNextFile(_handle, &findData)); + if (result) + ConvertWIN32_FIND_DATA_To_FileInfo(findData, fileInfo); + return result; +} + +#ifndef _UNICODE +bool CFindFile::FindNext(CFileInfoW &fileInfo) +{ + if (g_IsNT) + { + WIN32_FIND_DATAW findData; + if (!::FindNextFileW(_handle, &findData)) + return false; + ConvertWIN32_FIND_DATA_To_FileInfo(findData, fileInfo); + } + else + { + WIN32_FIND_DATAA findData; + if (!::FindNextFileA(_handle, &findData)) + return false; + ConvertWIN32_FIND_DATA_To_FileInfo(findData, fileInfo); + } + return true; +} +#endif + +bool FindFile(LPCTSTR wildcard, CFileInfo &fileInfo) +{ + CFindFile finder; + return finder.FindFirst(wildcard, fileInfo); +} + +#ifndef _UNICODE +bool FindFile(LPCWSTR wildcard, CFileInfoW &fileInfo) +{ + CFindFile finder; + return finder.FindFirst(wildcard, fileInfo); +} +#endif + +bool DoesFileExist(LPCTSTR name) +{ + CFileInfo fileInfo; + return FindFile(name, fileInfo); +} + +#ifndef _UNICODE +bool DoesFileExist(LPCWSTR name) +{ + CFileInfoW fileInfo; + return FindFile(name, fileInfo); +} +#endif + +///////////////////////////////////// +// CEnumerator + +bool CEnumerator::NextAny(CFileInfo &fileInfo) +{ + if (_findFile.IsHandleAllocated()) + return _findFile.FindNext(fileInfo); + else + return _findFile.FindFirst(_wildcard, fileInfo); +} + +bool CEnumerator::Next(CFileInfo &fileInfo) +{ + for (;;) + { + if (!NextAny(fileInfo)) + return false; + if (!fileInfo.IsDots()) + return true; + } +} + +bool CEnumerator::Next(CFileInfo &fileInfo, bool &found) +{ + if (Next(fileInfo)) + { + found = true; + return true; + } + found = false; + return (::GetLastError() == ERROR_NO_MORE_FILES); +} + +#ifndef _UNICODE +bool CEnumeratorW::NextAny(CFileInfoW &fileInfo) +{ + if (_findFile.IsHandleAllocated()) + return _findFile.FindNext(fileInfo); + else + return _findFile.FindFirst(_wildcard, fileInfo); +} + +bool CEnumeratorW::Next(CFileInfoW &fileInfo) +{ + for (;;) + { + if (!NextAny(fileInfo)) + return false; + if (!fileInfo.IsDots()) + return true; + } +} + +bool CEnumeratorW::Next(CFileInfoW &fileInfo, bool &found) +{ + if (Next(fileInfo)) + { + found = true; + return true; + } + found = false; + return (::GetLastError() == ERROR_NO_MORE_FILES); +} + +#endif + +//////////////////////////////// +// CFindChangeNotification +// FindFirstChangeNotification can return 0. MSDN doesn't tell about it. + +bool CFindChangeNotification::Close() +{ + if (!IsHandleAllocated()) + return true; + if (!::FindCloseChangeNotification(_handle)) + return false; + _handle = INVALID_HANDLE_VALUE; + return true; +} + +HANDLE CFindChangeNotification::FindFirst(LPCTSTR pathName, bool watchSubtree, DWORD notifyFilter) +{ + _handle = ::FindFirstChangeNotification(pathName, BoolToBOOL(watchSubtree), notifyFilter); + #ifdef WIN_LONG_PATH2 + if (!IsHandleAllocated()) + { + UString longPath; + if (GetLongPath(pathName, longPath)) + _handle = ::FindFirstChangeNotificationW(longPath, BoolToBOOL(watchSubtree), notifyFilter); + } + #endif + return _handle; +} + +#ifndef _UNICODE +HANDLE CFindChangeNotification::FindFirst(LPCWSTR pathName, bool watchSubtree, DWORD notifyFilter) +{ + if (!g_IsNT) + return FindFirst(UnicodeStringToMultiByte(pathName, GetCurrentCodePage()), watchSubtree, notifyFilter); + _handle = ::FindFirstChangeNotificationW(pathName, BoolToBOOL(watchSubtree), notifyFilter); + #ifdef WIN_LONG_PATH + if (!IsHandleAllocated()) + { + UString longPath; + if (GetLongPath(pathName, longPath)) + _handle = ::FindFirstChangeNotificationW(longPath, BoolToBOOL(watchSubtree), notifyFilter); + } + #endif + return _handle; +} +#endif + +#ifndef _WIN32_WCE +bool MyGetLogicalDriveStrings(CSysStringVector &driveStrings) +{ + driveStrings.Clear(); + UINT32 size = GetLogicalDriveStrings(0, NULL); + if (size == 0) + return false; + CSysString buffer; + UINT32 newSize = GetLogicalDriveStrings(size, buffer.GetBuffer(size)); + if (newSize == 0) + return false; + if (newSize > size) + return false; + CSysString string; + for(UINT32 i = 0; i < newSize; i++) + { + TCHAR c = buffer[i]; + if (c == TEXT('\0')) + { + driveStrings.Add(string); + string.Empty(); + } + else + string += c; + } + if (!string.IsEmpty()) + return false; + return true; +} + +#ifndef _UNICODE +bool MyGetLogicalDriveStrings(UStringVector &driveStrings) +{ + driveStrings.Clear(); + if (g_IsNT) + { + UINT32 size = GetLogicalDriveStringsW(0, NULL); + if (size == 0) + return false; + UString buffer; + UINT32 newSize = GetLogicalDriveStringsW(size, buffer.GetBuffer(size)); + if (newSize == 0) + return false; + if (newSize > size) + return false; + UString string; + for(UINT32 i = 0; i < newSize; i++) + { + WCHAR c = buffer[i]; + if (c == L'\0') + { + driveStrings.Add(string); + string.Empty(); + } + else + string += c; + } + return string.IsEmpty(); + } + CSysStringVector driveStringsA; + bool res = MyGetLogicalDriveStrings(driveStringsA); + for (int i = 0; i < driveStringsA.Size(); i++) + driveStrings.Add(GetUnicodeString(driveStringsA[i])); + return res; +} +#endif + +#endif + +}}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileFind.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileFind.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,153 @@ +// Windows/FileFind.h + +#ifndef __WINDOWS_FILEFIND_H +#define __WINDOWS_FILEFIND_H + +#include "../Common/MyString.h" +#include "../Common/Types.h" +#include "FileName.h" +#include "Defs.h" + +namespace NWindows { +namespace NFile { +namespace NFind { + +namespace NAttributes +{ + inline bool IsReadOnly(DWORD attributes) { return (attributes & FILE_ATTRIBUTE_READONLY) != 0; } + inline bool IsHidden(DWORD attributes) { return (attributes & FILE_ATTRIBUTE_HIDDEN) != 0; } + inline bool IsSystem(DWORD attributes) { return (attributes & FILE_ATTRIBUTE_SYSTEM) != 0; } + inline bool IsDirectory(DWORD attributes) { return (attributes & FILE_ATTRIBUTE_DIRECTORY) != 0; } + inline bool IsArchived(DWORD attributes) { return (attributes & FILE_ATTRIBUTE_ARCHIVE) != 0; } + inline bool IsCompressed(DWORD attributes) { return (attributes & FILE_ATTRIBUTE_COMPRESSED) != 0; } + inline bool IsEncrypted(DWORD attributes) { return (attributes & FILE_ATTRIBUTE_ENCRYPTED) != 0; } +} + +class CFileInfoBase +{ + bool MatchesMask(UINT32 mask) const { return ((Attributes & mask) != 0); } +public: + DWORD Attributes; + FILETIME CreationTime; + FILETIME LastAccessTime; + FILETIME LastWriteTime; + UInt64 Size; + + #ifndef _WIN32_WCE + UINT32 ReparseTag; + #else + DWORD ObjectID; + #endif + + bool IsArchived() const { return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); } + bool IsCompressed() const { return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); } + bool IsDirectory() const { return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); } + bool IsEncrypted() const { return MatchesMask(FILE_ATTRIBUTE_ENCRYPTED); } + bool IsHidden() const { return MatchesMask(FILE_ATTRIBUTE_HIDDEN); } + bool IsNormal() const { return MatchesMask(FILE_ATTRIBUTE_NORMAL); } + bool IsOffline() const { return MatchesMask(FILE_ATTRIBUTE_OFFLINE); } + bool IsReadOnly() const { return MatchesMask(FILE_ATTRIBUTE_READONLY); } + bool HasReparsePoint() const { return MatchesMask(FILE_ATTRIBUTE_REPARSE_POINT); } + bool IsSparse() const { return MatchesMask(FILE_ATTRIBUTE_SPARSE_FILE); } + bool IsSystem() const { return MatchesMask(FILE_ATTRIBUTE_SYSTEM); } + bool IsTemporary() const { return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); } +}; + +class CFileInfo: public CFileInfoBase +{ +public: + CSysString Name; + bool IsDots() const; +}; + +#ifdef _UNICODE +typedef CFileInfo CFileInfoW; +#else +class CFileInfoW: public CFileInfoBase +{ +public: + UString Name; + bool IsDots() const; +}; +#endif + +class CFindFile +{ + friend class CEnumerator; + HANDLE _handle; +public: + bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE; } + CFindFile(): _handle(INVALID_HANDLE_VALUE) {} + ~CFindFile() { Close(); } + bool FindFirst(LPCTSTR wildcard, CFileInfo &fileInfo); + bool FindNext(CFileInfo &fileInfo); + #ifndef _UNICODE + bool FindFirst(LPCWSTR wildcard, CFileInfoW &fileInfo); + bool FindNext(CFileInfoW &fileInfo); + #endif + bool Close(); +}; + +bool FindFile(LPCTSTR wildcard, CFileInfo &fileInfo); + +bool DoesFileExist(LPCTSTR name); +#ifndef _UNICODE +bool FindFile(LPCWSTR wildcard, CFileInfoW &fileInfo); +bool DoesFileExist(LPCWSTR name); +#endif + +class CEnumerator +{ + CFindFile _findFile; + CSysString _wildcard; + bool NextAny(CFileInfo &fileInfo); +public: + CEnumerator(): _wildcard(NName::kAnyStringWildcard) {} + CEnumerator(const CSysString &wildcard): _wildcard(wildcard) {} + bool Next(CFileInfo &fileInfo); + bool Next(CFileInfo &fileInfo, bool &found); +}; + +#ifdef _UNICODE +typedef CEnumerator CEnumeratorW; +#else +class CEnumeratorW +{ + CFindFile _findFile; + UString _wildcard; + bool NextAny(CFileInfoW &fileInfo); +public: + CEnumeratorW(): _wildcard(NName::kAnyStringWildcard) {} + CEnumeratorW(const UString &wildcard): _wildcard(wildcard) {} + bool Next(CFileInfoW &fileInfo); + bool Next(CFileInfoW &fileInfo, bool &found); +}; +#endif + +class CFindChangeNotification +{ + HANDLE _handle; +public: + operator HANDLE () { return _handle; } + bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE && _handle != 0; } + CFindChangeNotification(): _handle(INVALID_HANDLE_VALUE) {} + ~CFindChangeNotification() { Close(); } + bool Close(); + HANDLE FindFirst(LPCTSTR pathName, bool watchSubtree, DWORD notifyFilter); + #ifndef _UNICODE + HANDLE FindFirst(LPCWSTR pathName, bool watchSubtree, DWORD notifyFilter); + #endif + bool FindNext() { return BOOLToBool(::FindNextChangeNotification(_handle)); } +}; + +#ifndef _WIN32_WCE +bool MyGetLogicalDriveStrings(CSysStringVector &driveStrings); +#ifndef _UNICODE +bool MyGetLogicalDriveStrings(UStringVector &driveStrings); +#endif +#endif + +}}} + +#endif + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileIO.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileIO.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,318 @@ +// Windows/FileIO.cpp + +#include "StdAfx.h" + +#include "FileIO.h" +#include "Defs.h" +#ifdef WIN_LONG_PATH +#include "../Common/MyString.h" +#endif +#ifndef _UNICODE +#include "../Common/StringConvert.h" +#endif + +#ifndef _UNICODE +extern bool g_IsNT; +#endif + +namespace NWindows { +namespace NFile { + +#if defined(WIN_LONG_PATH) && defined(_UNICODE) +#define WIN_LONG_PATH2 +#endif + +#ifdef WIN_LONG_PATH +bool GetLongPathBase(LPCWSTR s, UString &res) +{ + res.Empty(); + int len = MyStringLen(s); + wchar_t c = s[0]; + if (len < 1 || c == L'\\' || c == L'.' && (len == 1 || len == 2 && s[1] == L'.')) + return true; + UString curDir; + bool isAbs = false; + if (len > 3) + isAbs = (s[1] == L':' && s[2] == L'\\' && (c >= L'a' && c <= L'z' || c >= L'A' && c <= L'Z')); + + if (!isAbs) + { + DWORD needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, curDir.GetBuffer(MAX_PATH + 1)); + curDir.ReleaseBuffer(); + if (needLength == 0 || needLength > MAX_PATH) + return false; + if (curDir[curDir.Length() - 1] != L'\\') + curDir += L'\\'; + } + res = UString(L"\\\\?\\") + curDir + s; + return true; +} + +bool GetLongPath(LPCWSTR path, UString &longPath) +{ + if (GetLongPathBase(path, longPath)) + return !longPath.IsEmpty(); + return false; +} +#endif + +namespace NIO { + +CFileBase::~CFileBase() { Close(); } + +bool CFileBase::Create(LPCTSTR fileName, DWORD desiredAccess, + DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) +{ + if (!Close()) + return false; + _handle = ::CreateFile(fileName, desiredAccess, shareMode, + (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, + flagsAndAttributes, (HANDLE)NULL); + #ifdef WIN_LONG_PATH2 + if (_handle == INVALID_HANDLE_VALUE) + { + UString longPath; + if (GetLongPath(fileName, longPath)) + _handle = ::CreateFileW(longPath, desiredAccess, shareMode, + (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, + flagsAndAttributes, (HANDLE)NULL); + } + #endif + return (_handle != INVALID_HANDLE_VALUE); +} + +#ifndef _UNICODE +bool CFileBase::Create(LPCWSTR fileName, DWORD desiredAccess, + DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) +{ + if (!g_IsNT) + return Create(UnicodeStringToMultiByte(fileName, ::AreFileApisANSI() ? CP_ACP : CP_OEMCP), + desiredAccess, shareMode, creationDisposition, flagsAndAttributes); + if (!Close()) + return false; + _handle = ::CreateFileW(fileName, desiredAccess, shareMode, + (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, + flagsAndAttributes, (HANDLE)NULL); + #ifdef WIN_LONG_PATH + if (_handle == INVALID_HANDLE_VALUE) + { + UString longPath; + if (GetLongPath(fileName, longPath)) + _handle = ::CreateFileW(longPath, desiredAccess, shareMode, + (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, + flagsAndAttributes, (HANDLE)NULL); + } + #endif + return (_handle != INVALID_HANDLE_VALUE); +} +#endif + +bool CFileBase::Close() +{ + if (_handle == INVALID_HANDLE_VALUE) + return true; + if (!::CloseHandle(_handle)) + return false; + _handle = INVALID_HANDLE_VALUE; + return true; +} + +bool CFileBase::GetPosition(UInt64 &position) const +{ + return Seek(0, FILE_CURRENT, position); +} + +bool CFileBase::GetLength(UInt64 &length) const +{ + DWORD sizeHigh; + DWORD sizeLow = ::GetFileSize(_handle, &sizeHigh); + if(sizeLow == 0xFFFFFFFF) + if(::GetLastError() != NO_ERROR) + return false; + length = (((UInt64)sizeHigh) << 32) + sizeLow; + return true; +} + +bool CFileBase::Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const +{ + LARGE_INTEGER value; + value.QuadPart = distanceToMove; + value.LowPart = ::SetFilePointer(_handle, value.LowPart, &value.HighPart, moveMethod); + if (value.LowPart == 0xFFFFFFFF) + if(::GetLastError() != NO_ERROR) + return false; + newPosition = value.QuadPart; + return true; +} + +bool CFileBase::Seek(UInt64 position, UInt64 &newPosition) +{ + return Seek(position, FILE_BEGIN, newPosition); +} + +bool CFileBase::SeekToBegin() +{ + UInt64 newPosition; + return Seek(0, newPosition); +} + +bool CFileBase::SeekToEnd(UInt64 &newPosition) +{ + return Seek(0, FILE_END, newPosition); +} + +bool CFileBase::GetFileInformation(CByHandleFileInfo &fileInfo) const +{ + BY_HANDLE_FILE_INFORMATION winFileInfo; + if(!::GetFileInformationByHandle(_handle, &winFileInfo)) + return false; + fileInfo.Attributes = winFileInfo.dwFileAttributes; + fileInfo.CreationTime = winFileInfo.ftCreationTime; + fileInfo.LastAccessTime = winFileInfo.ftLastAccessTime; + fileInfo.LastWriteTime = winFileInfo.ftLastWriteTime; + fileInfo.VolumeSerialNumber = winFileInfo.dwFileAttributes; + fileInfo.Size = (((UInt64)winFileInfo.nFileSizeHigh) << 32) + winFileInfo.nFileSizeLow; + fileInfo.NumberOfLinks = winFileInfo.nNumberOfLinks; + fileInfo.FileIndex = (((UInt64)winFileInfo.nFileIndexHigh) << 32) + winFileInfo.nFileIndexLow; + return true; +} + +///////////////////////// +// CInFile + +bool CInFile::Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) + { return Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); } + +bool CInFile::OpenShared(LPCTSTR fileName, bool shareForWrite) +{ return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } + +bool CInFile::Open(LPCTSTR fileName) + { return OpenShared(fileName, false); } + +#ifndef _UNICODE +bool CInFile::Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) + { return Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); } + +bool CInFile::OpenShared(LPCWSTR fileName, bool shareForWrite) +{ return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } + +bool CInFile::Open(LPCWSTR fileName) + { return OpenShared(fileName, false); } +#endif + +// ReadFile and WriteFile functions in Windows have BUG: +// If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) +// from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES +// (Insufficient system resources exist to complete the requested service). + +// Probably in some version of Windows there are problems with other sizes: +// for 32 MB (maybe also for 16 MB). +// And message can be "Network connection was lost" + +static UInt32 kChunkSizeMax = (1 << 22); + +bool CInFile::ReadPart(void *data, UInt32 size, UInt32 &processedSize) +{ + if (size > kChunkSizeMax) + size = kChunkSizeMax; + DWORD processedLoc = 0; + bool res = BOOLToBool(::ReadFile(_handle, data, size, &processedLoc, NULL)); + processedSize = (UInt32)processedLoc; + return res; +} + +bool CInFile::Read(void *data, UInt32 size, UInt32 &processedSize) +{ + processedSize = 0; + do + { + UInt32 processedLoc = 0; + bool res = ReadPart(data, size, processedLoc); + processedSize += processedLoc; + if (!res) + return false; + if (processedLoc == 0) + return true; + data = (void *)((unsigned char *)data + processedLoc); + size -= processedLoc; + } + while (size > 0); + return true; +} + +///////////////////////// +// COutFile + +bool COutFile::Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) + { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); } + +static inline DWORD GetCreationDisposition(bool createAlways) + { return createAlways? CREATE_ALWAYS: CREATE_NEW; } + +bool COutFile::Open(LPCTSTR fileName, DWORD creationDisposition) + { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); } + +bool COutFile::Create(LPCTSTR fileName, bool createAlways) + { return Open(fileName, GetCreationDisposition(createAlways)); } + +#ifndef _UNICODE + +bool COutFile::Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) + { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); } + +bool COutFile::Open(LPCWSTR fileName, DWORD creationDisposition) + { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); } + +bool COutFile::Create(LPCWSTR fileName, bool createAlways) + { return Open(fileName, GetCreationDisposition(createAlways)); } + +#endif + +bool COutFile::SetTime(const FILETIME *creationTime, const FILETIME *lastAccessTime, const FILETIME *lastWriteTime) + { return BOOLToBool(::SetFileTime(_handle, creationTime, lastAccessTime, lastWriteTime)); } + +bool COutFile::SetLastWriteTime(const FILETIME *lastWriteTime) + { return SetTime(NULL, NULL, lastWriteTime); } + +bool COutFile::WritePart(const void *data, UInt32 size, UInt32 &processedSize) +{ + if (size > kChunkSizeMax) + size = kChunkSizeMax; + DWORD processedLoc = 0; + bool res = BOOLToBool(::WriteFile(_handle, data, size, &processedLoc, NULL)); + processedSize = (UInt32)processedLoc; + return res; +} + +bool COutFile::Write(const void *data, UInt32 size, UInt32 &processedSize) +{ + processedSize = 0; + do + { + UInt32 processedLoc = 0; + bool res = WritePart(data, size, processedLoc); + processedSize += processedLoc; + if (!res) + return false; + if (processedLoc == 0) + return true; + data = (const void *)((const unsigned char *)data + processedLoc); + size -= processedLoc; + } + while (size > 0); + return true; +} + +bool COutFile::SetEndOfFile() { return BOOLToBool(::SetEndOfFile(_handle)); } + +bool COutFile::SetLength(UInt64 length) +{ + UInt64 newPosition; + if(!Seek(length, newPosition)) + return false; + if(newPosition != length) + return false; + return SetEndOfFile(); +} + +}}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileIO.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileIO.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,99 @@ +// Windows/FileIO.h + +#ifndef __WINDOWS_FILEIO_H +#define __WINDOWS_FILEIO_H + +#include "../Common/Types.h" + +namespace NWindows { +namespace NFile { +namespace NIO { + +struct CByHandleFileInfo +{ + DWORD Attributes; + FILETIME CreationTime; + FILETIME LastAccessTime; + FILETIME LastWriteTime; + DWORD VolumeSerialNumber; + UInt64 Size; + DWORD NumberOfLinks; + UInt64 FileIndex; +}; + +class CFileBase +{ +protected: + HANDLE _handle; + bool Create(LPCTSTR fileName, DWORD desiredAccess, + DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); + #ifndef _UNICODE + bool Create(LPCWSTR fileName, DWORD desiredAccess, + DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); + #endif + +public: + CFileBase(): _handle(INVALID_HANDLE_VALUE){}; + ~CFileBase(); + + bool Close(); + + bool GetPosition(UInt64 &position) const; + bool GetLength(UInt64 &length) const; + + bool Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const; + bool Seek(UInt64 position, UInt64 &newPosition); + bool SeekToBegin(); + bool SeekToEnd(UInt64 &newPosition); + + bool GetFileInformation(CByHandleFileInfo &fileInfo) const; +}; + +class CInFile: public CFileBase +{ +public: + bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); + bool OpenShared(LPCTSTR fileName, bool shareForWrite); + bool Open(LPCTSTR fileName); + #ifndef _UNICODE + bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); + bool OpenShared(LPCWSTR fileName, bool shareForWrite); + bool Open(LPCWSTR fileName); + #endif + bool ReadPart(void *data, UInt32 size, UInt32 &processedSize); + bool Read(void *data, UInt32 size, UInt32 &processedSize); +}; + +class COutFile: public CFileBase +{ + // DWORD m_CreationDisposition; +public: + // COutFile(): m_CreationDisposition(CREATE_NEW){}; + bool Open(LPCTSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); + bool Open(LPCTSTR fileName, DWORD creationDisposition); + bool Create(LPCTSTR fileName, bool createAlways); + + #ifndef _UNICODE + bool Open(LPCWSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes); + bool Open(LPCWSTR fileName, DWORD creationDisposition); + bool Create(LPCWSTR fileName, bool createAlways); + #endif + + /* + void SetOpenCreationDisposition(DWORD creationDisposition) + { m_CreationDisposition = creationDisposition; } + void SetOpenCreationDispositionCreateAlways() + { m_CreationDisposition = CREATE_ALWAYS; } + */ + + bool SetTime(const FILETIME *creationTime, const FILETIME *lastAccessTime, const FILETIME *lastWriteTime); + bool SetLastWriteTime(const FILETIME *lastWriteTime); + bool WritePart(const void *data, UInt32 size, UInt32 &processedSize); + bool Write(const void *data, UInt32 size, UInt32 &processedSize); + bool SetEndOfFile(); + bool SetLength(UInt64 length); +}; + +}}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileMapping.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileMapping.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,14 @@ +// Windows/FileMapping.cpp + +#include "StdAfx.h" + +#include "Windows/FileMapping.h" + +namespace NWindows { +namespace NFile { +namespace NMapping { + + + + +}}} \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileMapping.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileMapping.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,50 @@ +// Windows/FileMapping.h + +#ifndef __WINDOWS_FILEMAPPING_H +#define __WINDOWS_FILEMAPPING_H + +#include "Windows/Handle.h" +#include "Windows/Defs.h" + +namespace NWindows { +// namespace NFile { +// namespace NMapping { + +class CFileMapping: public CHandle +{ +public: + bool Create(HANDLE file, LPSECURITY_ATTRIBUTES attributes, + DWORD protect, UINT64 maximumSize, LPCTSTR name) + { + _handle = ::CreateFileMapping(file, attributes, + protect, DWORD(maximumSize >> 32), DWORD(maximumSize), name); + return (_handle != NULL); + } + + bool Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) + { + _handle = ::OpenFileMapping(desiredAccess, BoolToBOOL(inheritHandle), name); + return (_handle != NULL); + } + + LPVOID MapViewOfFile(DWORD desiredAccess, UINT64 fileOffset, + SIZE_T numberOfBytesToMap) + { + return ::MapViewOfFile(_handle, desiredAccess, + DWORD(fileOffset >> 32), DWORD(fileOffset), numberOfBytesToMap); + } + + LPVOID MapViewOfFileEx(DWORD desiredAccess, UINT64 fileOffset, + SIZE_T numberOfBytesToMap, LPVOID baseAddress) + { + return ::MapViewOfFileEx(_handle, desiredAccess, + DWORD(fileOffset >> 32), DWORD(fileOffset), + numberOfBytesToMap, baseAddress); + } + + +}; + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileName.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileName.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,54 @@ +// Windows/FileName.cpp + +#include "StdAfx.h" + +#include "Windows/FileName.h" +#include "Common/Wildcard.h" + +namespace NWindows { +namespace NFile { +namespace NName { + +void NormalizeDirPathPrefix(CSysString &dirPath) +{ + if (dirPath.IsEmpty()) + return; + if (dirPath.ReverseFind(kDirDelimiter) != dirPath.Length() - 1) + dirPath += kDirDelimiter; +} + +#ifndef _UNICODE +void NormalizeDirPathPrefix(UString &dirPath) +{ + if (dirPath.IsEmpty()) + return; + if (dirPath.ReverseFind(wchar_t(kDirDelimiter)) != dirPath.Length() - 1) + dirPath += wchar_t(kDirDelimiter); +} +#endif + +#ifdef _WIN32 + +const wchar_t kExtensionDelimiter = L'.'; + +void SplitNameToPureNameAndExtension(const UString &fullName, + UString &pureName, UString &extensionDelimiter, UString &extension) +{ + int index = fullName.ReverseFind(kExtensionDelimiter); + if (index < 0) + { + pureName = fullName; + extensionDelimiter.Empty(); + extension.Empty(); + } + else + { + pureName = fullName.Left(index); + extensionDelimiter = kExtensionDelimiter; + extension = fullName.Mid(index + 1); + } +} + +#endif + +}}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/FileName.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/FileName.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,27 @@ +// Windows/FileName.h + +#ifndef __WINDOWS_FILENAME_H +#define __WINDOWS_FILENAME_H + +#include "../Common/MyString.h" + +namespace NWindows { +namespace NFile { +namespace NName { + +const TCHAR kDirDelimiter = CHAR_PATH_SEPARATOR; +const TCHAR kAnyStringWildcard = '*'; + +void NormalizeDirPathPrefix(CSysString &dirPath); // ensures that it ended with '\\' +#ifndef _UNICODE +void NormalizeDirPathPrefix(UString &dirPath); // ensures that it ended with '\\' +#endif + +#ifdef _WIN32 +void SplitNameToPureNameAndExtension(const UString &fullName, + UString &pureName, UString &extensionDelimiter, UString &extension); +#endif + +}}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/Handle.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/Handle.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,37 @@ +// Windows/Handle.h + +#ifndef __WINDOWS_HANDLE_H +#define __WINDOWS_HANDLE_H + +namespace NWindows { + +class CHandle +{ +protected: + HANDLE _handle; +public: + operator HANDLE() { return _handle; } + CHandle(): _handle(NULL) {} + ~CHandle() { Close(); } + bool Close() + { + if (_handle == NULL) + return true; + if (!::CloseHandle(_handle)) + return false; + _handle = NULL; + return true; + } + void Attach(HANDLE handle) + { _handle = handle; } + HANDLE Detach() + { + HANDLE handle = _handle; + _handle = NULL; + return handle; + } +}; + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/MemoryLock.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/MemoryLock.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,78 @@ +// Common/MemoryLock.cpp + +#include "StdAfx.h" + +namespace NWindows { +namespace NSecurity { + +#ifndef _UNICODE +typedef BOOL (WINAPI * OpenProcessTokenP)(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle); +typedef BOOL (WINAPI * LookupPrivilegeValueP)(LPCTSTR lpSystemName, LPCTSTR lpName, PLUID lpLuid); +typedef BOOL (WINAPI * AdjustTokenPrivilegesP)(HANDLE TokenHandle, BOOL DisableAllPrivileges, + PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState,PDWORD ReturnLength); +#endif + +#ifdef _UNICODE +bool EnableLockMemoryPrivilege( +#else +static bool EnableLockMemoryPrivilege2(HMODULE hModule, +#endif +bool enable) +{ + #ifndef _UNICODE + if (hModule == NULL) + return false; + OpenProcessTokenP openProcessToken = (OpenProcessTokenP)GetProcAddress(hModule, "OpenProcessToken"); + LookupPrivilegeValueP lookupPrivilegeValue = (LookupPrivilegeValueP)GetProcAddress(hModule, "LookupPrivilegeValueA" ); + AdjustTokenPrivilegesP adjustTokenPrivileges = (AdjustTokenPrivilegesP)GetProcAddress(hModule, "AdjustTokenPrivileges"); + if (openProcessToken == NULL || adjustTokenPrivileges == NULL || lookupPrivilegeValue == NULL) + return false; + #endif + + HANDLE token; + if (! + #ifdef _UNICODE + ::OpenProcessToken + #else + openProcessToken + #endif + (::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) + return false; + TOKEN_PRIVILEGES tp; + bool res = false; + if ( + #ifdef _UNICODE + ::LookupPrivilegeValue + #else + lookupPrivilegeValue + #endif + (NULL, SE_LOCK_MEMORY_NAME, &(tp.Privileges[0].Luid))) + { + tp.PrivilegeCount = 1; + tp.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED: 0; + if ( + #ifdef _UNICODE + ::AdjustTokenPrivileges + #else + adjustTokenPrivileges + #endif + (token, FALSE, &tp, 0, NULL, NULL)) + res = (GetLastError() == ERROR_SUCCESS); + } + ::CloseHandle(token); + return res; +} + +#ifndef _UNICODE +bool EnableLockMemoryPrivilege(bool enable) +{ + HMODULE hModule = LoadLibrary(TEXT("Advapi32.dll")); + if(hModule == NULL) + return false; + bool res = EnableLockMemoryPrivilege2(hModule, enable); + ::FreeLibrary(hModule); + return res; +} +#endif + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/MemoryLock.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/MemoryLock.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,13 @@ +// Windows/MemoryLock.h + +#ifndef __WINDOWS_MEMORYLOCK_H +#define __WINDOWS_MEMORYLOCK_H + +namespace NWindows { +namespace NSecurity { + +bool EnableLockMemoryPrivilege(bool enable = true); + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/PropVariant.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/PropVariant.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,312 @@ +// Windows/PropVariant.cpp + +#include "StdAfx.h" + +#include "PropVariant.h" + +#include "../Common/Defs.h" + +namespace NWindows { +namespace NCOM { + +CPropVariant::CPropVariant(const PROPVARIANT& varSrc) +{ + vt = VT_EMPTY; + InternalCopy(&varSrc); +} + +CPropVariant::CPropVariant(const CPropVariant& varSrc) +{ + vt = VT_EMPTY; + InternalCopy(&varSrc); +} + +CPropVariant::CPropVariant(BSTR bstrSrc) +{ + vt = VT_EMPTY; + *this = bstrSrc; +} + +CPropVariant::CPropVariant(LPCOLESTR lpszSrc) +{ + vt = VT_EMPTY; + *this = lpszSrc; +} + +CPropVariant& CPropVariant::operator=(const CPropVariant& varSrc) +{ + InternalCopy(&varSrc); + return *this; +} +CPropVariant& CPropVariant::operator=(const PROPVARIANT& varSrc) +{ + InternalCopy(&varSrc); + return *this; +} + +CPropVariant& CPropVariant::operator=(BSTR bstrSrc) +{ + *this = (LPCOLESTR)bstrSrc; + return *this; +} + +CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc) +{ + InternalClear(); + vt = VT_BSTR; + wReserved1 = 0; + bstrVal = ::SysAllocString(lpszSrc); + if (bstrVal == NULL && lpszSrc != NULL) + { + vt = VT_ERROR; + scode = E_OUTOFMEMORY; + } + return *this; +} + + +CPropVariant& CPropVariant::operator=(bool bSrc) +{ + if (vt != VT_BOOL) + { + InternalClear(); + vt = VT_BOOL; + } + boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE; + return *this; +} + +CPropVariant& CPropVariant::operator=(UInt32 value) +{ + if (vt != VT_UI4) + { + InternalClear(); + vt = VT_UI4; + } + ulVal = value; + return *this; +} + +CPropVariant& CPropVariant::operator=(UInt64 value) +{ + if (vt != VT_UI8) + { + InternalClear(); + vt = VT_UI8; + } + uhVal.QuadPart = value; + return *this; +} + +CPropVariant& CPropVariant::operator=(const FILETIME &value) +{ + if (vt != VT_FILETIME) + { + InternalClear(); + vt = VT_FILETIME; + } + filetime = value; + return *this; +} + +CPropVariant& CPropVariant::operator=(Int32 value) +{ + if (vt != VT_I4) + { + InternalClear(); + vt = VT_I4; + } + lVal = value; + + return *this; +} + +CPropVariant& CPropVariant::operator=(Byte value) +{ + if (vt != VT_UI1) + { + InternalClear(); + vt = VT_UI1; + } + bVal = value; + return *this; +} + +CPropVariant& CPropVariant::operator=(Int16 value) +{ + if (vt != VT_I2) + { + InternalClear(); + vt = VT_I2; + } + iVal = value; + return *this; +} + +/* +CPropVariant& CPropVariant::operator=(LONG value) +{ + if (vt != VT_I4) + { + InternalClear(); + vt = VT_I4; + } + lVal = value; + return *this; +} +*/ + +static HRESULT MyPropVariantClear(PROPVARIANT *propVariant) +{ + switch(propVariant->vt) + { + case VT_UI1: + case VT_I1: + case VT_I2: + case VT_UI2: + case VT_BOOL: + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_INT: + case VT_UINT: + case VT_ERROR: + case VT_FILETIME: + case VT_UI8: + case VT_R8: + case VT_CY: + case VT_DATE: + propVariant->vt = VT_EMPTY; + propVariant->wReserved1 = 0; + return S_OK; + } + return ::VariantClear((VARIANTARG *)propVariant); +} + +HRESULT CPropVariant::Clear() +{ + return MyPropVariantClear(this); +} + +HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc) +{ + ::VariantClear((tagVARIANT *)this); + switch(pSrc->vt) + { + case VT_UI1: + case VT_I1: + case VT_I2: + case VT_UI2: + case VT_BOOL: + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_INT: + case VT_UINT: + case VT_ERROR: + case VT_FILETIME: + case VT_UI8: + case VT_R8: + case VT_CY: + case VT_DATE: + memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT)); + return S_OK; + } + return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)(pSrc)); +} + + +HRESULT CPropVariant::Attach(PROPVARIANT* pSrc) +{ + HRESULT hr = Clear(); + if (FAILED(hr)) + return hr; + memcpy(this, pSrc, sizeof(PROPVARIANT)); + pSrc->vt = VT_EMPTY; + return S_OK; +} + +HRESULT CPropVariant::Detach(PROPVARIANT* pDest) +{ + HRESULT hr = MyPropVariantClear(pDest); + if (FAILED(hr)) + return hr; + memcpy(pDest, this, sizeof(PROPVARIANT)); + vt = VT_EMPTY; + return S_OK; +} + +HRESULT CPropVariant::InternalClear() +{ + HRESULT hr = Clear(); + if (FAILED(hr)) + { + vt = VT_ERROR; + scode = hr; + } + return hr; +} + +void CPropVariant::InternalCopy(const PROPVARIANT* pSrc) +{ + HRESULT hr = Copy(pSrc); + if (FAILED(hr)) + { + vt = VT_ERROR; + scode = hr; + } +} + +int CPropVariant::Compare(const CPropVariant &a) +{ + if(vt != a.vt) + return 0; // it's mean some bug + switch (vt) + { + case VT_EMPTY: + return 0; + + /* + case VT_I1: + return MyCompare(cVal, a.cVal); + */ + case VT_UI1: + return MyCompare(bVal, a.bVal); + + case VT_I2: + return MyCompare(iVal, a.iVal); + case VT_UI2: + return MyCompare(uiVal, a.uiVal); + + case VT_I4: + return MyCompare(lVal, a.lVal); + /* + case VT_INT: + return MyCompare(intVal, a.intVal); + */ + case VT_UI4: + return MyCompare(ulVal, a.ulVal); + /* + case VT_UINT: + return MyCompare(uintVal, a.uintVal); + */ + case VT_I8: + return MyCompare(hVal.QuadPart, a.hVal.QuadPart); + case VT_UI8: + return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart); + + case VT_BOOL: + return -MyCompare(boolVal, a.boolVal); + + case VT_FILETIME: + return ::CompareFileTime(&filetime, &a.filetime); + case VT_BSTR: + return 0; // Not implemented + // return MyCompare(aPropVarint.cVal); + + default: + return 0; + } +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/PropVariant.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/PropVariant.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,57 @@ +// Windows/PropVariant.h + +#ifndef __WINDOWS_PROPVARIANT_H +#define __WINDOWS_PROPVARIANT_H + +#include "../Common/MyWindows.h" +#include "../Common/Types.h" + +namespace NWindows { +namespace NCOM { + +class CPropVariant : public tagPROPVARIANT +{ +public: + CPropVariant() { vt = VT_EMPTY; wReserved1 = 0; } + ~CPropVariant() { Clear(); } + CPropVariant(const PROPVARIANT& varSrc); + CPropVariant(const CPropVariant& varSrc); + CPropVariant(BSTR bstrSrc); + CPropVariant(LPCOLESTR lpszSrc); + CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); }; + CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; } + CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal = *(ULARGE_INTEGER*)&value; } + CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; } + CPropVariant(Int32 value) { vt = VT_I4; wReserved1 = 0; lVal = value; } + CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; } + CPropVariant(Int16 value) { vt = VT_I2; wReserved1 = 0; iVal = value; } + // CPropVariant(LONG value, VARTYPE vtSrc = VT_I4) { vt = vtSrc; lVal = value; } + + CPropVariant& operator=(const CPropVariant& varSrc); + CPropVariant& operator=(const PROPVARIANT& varSrc); + CPropVariant& operator=(BSTR bstrSrc); + CPropVariant& operator=(LPCOLESTR lpszSrc); + CPropVariant& operator=(bool bSrc); + CPropVariant& operator=(UInt32 value); + CPropVariant& operator=(UInt64 value); + CPropVariant& operator=(const FILETIME &value); + + CPropVariant& operator=(Int32 value); + CPropVariant& operator=(Byte value); + CPropVariant& operator=(Int16 value); + // CPropVariant& operator=(LONG value); + + HRESULT Clear(); + HRESULT Copy(const PROPVARIANT* pSrc); + HRESULT Attach(PROPVARIANT* pSrc); + HRESULT Detach(PROPVARIANT* pDest); + + HRESULT InternalClear(); + void InternalCopy(const PROPVARIANT* pSrc); + + int Compare(const CPropVariant &a1); +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/PropVariantConversions.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/PropVariantConversions.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,150 @@ +// PropVariantConversions.cpp + +#include "StdAfx.h" + +// #include + +#include "PropVariantConversions.h" + +#include "Windows/Defs.h" + +#include "Common/StringConvert.h" +#include "Common/IntToString.h" + +static UString ConvertUInt64ToString(UInt64 value) +{ + wchar_t buffer[32]; + ConvertUInt64ToString(value, buffer); + return buffer; +} + +static UString ConvertInt64ToString(Int64 value) +{ + wchar_t buffer[32]; + ConvertInt64ToString(value, buffer); + return buffer; +} + +static char *UIntToStringSpec(UInt32 value, char *s, int numPos) +{ + char temp[16]; + int pos = 0; + do + { + temp[pos++] = (char)('0' + value % 10); + value /= 10; + } + while (value != 0); + int i; + for (i = 0; i < numPos - pos; i++) + *s++ = '0'; + do + *s++ = temp[--pos]; + while (pos > 0); + *s = '\0'; + return s; +} + +bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool includeSeconds) +{ + s[0] = '\0'; + SYSTEMTIME st; + if(!BOOLToBool(FileTimeToSystemTime(&ft, &st))) + return false; + s = UIntToStringSpec(st.wYear, s, 4); + *s++ = '-'; + s = UIntToStringSpec(st.wMonth, s, 2); + *s++ = '-'; + s = UIntToStringSpec(st.wDay, s, 2); + if (includeTime) + { + *s++ = ' '; + s = UIntToStringSpec(st.wHour, s, 2); + *s++ = ':'; + s = UIntToStringSpec(st.wMinute, s, 2); + if (includeSeconds) + { + *s++ = ':'; + UIntToStringSpec(st.wSecond, s, 2); + } + } + /* + sprintf(s, "%04d-%02d-%02d", st.wYear, st.wMonth, st.wDay); + if (includeTime) + { + sprintf(s + strlen(s), " %02d:%02d", st.wHour, st.wMinute); + if (includeSeconds) + sprintf(s + strlen(s), ":%02d", st.wSecond); + } + */ + return true; +} + +UString ConvertFileTimeToString(const FILETIME &fileTime, bool includeTime, bool includeSeconds) +{ + char s[32]; + ConvertFileTimeToString(fileTime, s, includeTime, includeSeconds); + return GetUnicodeString(s); +} + + +UString ConvertPropVariantToString(const PROPVARIANT &propVariant) +{ + switch (propVariant.vt) + { + case VT_EMPTY: + return UString(); + case VT_BSTR: + return propVariant.bstrVal; + case VT_UI1: + return ConvertUInt64ToString(propVariant.bVal); + case VT_UI2: + return ConvertUInt64ToString(propVariant.uiVal); + case VT_UI4: + return ConvertUInt64ToString(propVariant.ulVal); + case VT_UI8: + return ConvertUInt64ToString(propVariant.uhVal.QuadPart); + case VT_FILETIME: + return ConvertFileTimeToString(propVariant.filetime, true, true); + /* + case VT_I1: + return ConvertInt64ToString(propVariant.cVal); + */ + case VT_I2: + return ConvertInt64ToString(propVariant.iVal); + case VT_I4: + return ConvertInt64ToString(propVariant.lVal); + case VT_I8: + return ConvertInt64ToString(propVariant.hVal.QuadPart); + + case VT_BOOL: + return VARIANT_BOOLToBool(propVariant.boolVal) ? L"+" : L"-"; + default: + #ifndef _WIN32_WCE + throw 150245; + #else + return UString(); + #endif + } +} + +UInt64 ConvertPropVariantToUInt64(const PROPVARIANT &propVariant) +{ + switch (propVariant.vt) + { + case VT_UI1: + return propVariant.bVal; + case VT_UI2: + return propVariant.uiVal; + case VT_UI4: + return propVariant.ulVal; + case VT_UI8: + return (UInt64)propVariant.uhVal.QuadPart; + default: + #ifndef _WIN32_WCE + throw 151199; + #else + return 0; + #endif + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/PropVariantConversions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/PropVariantConversions.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,14 @@ +// Windows/PropVariantConversions.h + +#ifndef __PROPVARIANTCONVERSIONS_H +#define __PROPVARIANTCONVERSIONS_H + +#include "Common/Types.h" +#include "Common/MyString.h" + +bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime = true, bool includeSeconds = true); +UString ConvertFileTimeToString(const FILETIME &ft, bool includeTime = true, bool includeSeconds = true); +UString ConvertPropVariantToString(const PROPVARIANT &propVariant); +UInt64 ConvertPropVariantToUInt64(const PROPVARIANT &propVariant); + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/StdAfx.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/StdAfx.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../Common/MyWindows.h" +#include "../Common/NewHandler.h" + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/Synchronization.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/Synchronization.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,10 @@ +// Windows/Synchronization.cpp + +#include "StdAfx.h" + +#include "Synchronization.h" + +namespace NWindows { +namespace NSynchronization { + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/Synchronization.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/Synchronization.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,168 @@ +// Windows/Synchronization.h + +#ifndef __WINDOWS_SYNCHRONIZATION_H +#define __WINDOWS_SYNCHRONIZATION_H + +#include "Defs.h" + +extern "C" +{ +#include "../../C/Threads.h" +} + +#ifdef _WIN32 +#include "Handle.h" +#endif + +namespace NWindows { +namespace NSynchronization { + +class CBaseEvent +{ +protected: + ::CEvent _object; +public: + bool IsCreated() { return Event_IsCreated(&_object) != 0; } + operator HANDLE() { return _object.handle; } + CBaseEvent() { Event_Construct(&_object); } + ~CBaseEvent() { Close(); } + HRes Close() { return Event_Close(&_object); } + #ifdef _WIN32 + HRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, + LPSECURITY_ATTRIBUTES securityAttributes = NULL) + { + _object.handle = ::CreateEvent(securityAttributes, BoolToBOOL(manualReset), + BoolToBOOL(initiallyOwn), name); + if (_object.handle != 0) + return 0; + return ::GetLastError(); + } + HRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) + { + _object.handle = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); + if (_object.handle != 0) + return 0; + return ::GetLastError(); + } + #endif + + HRes Set() { return Event_Set(&_object); } + // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); } + HRes Reset() { return Event_Reset(&_object); } + HRes Lock() { return Event_Wait(&_object); } +}; + +class CManualResetEvent: public CBaseEvent +{ +public: + HRes Create(bool initiallyOwn = false) + { + return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0); + } + HRes CreateIfNotCreated() + { + if (IsCreated()) + return 0; + return ManualResetEvent_CreateNotSignaled(&_object); + } + #ifdef _WIN32 + HRes CreateWithName(bool initiallyOwn, LPCTSTR name) + { + return CBaseEvent::Create(true, initiallyOwn, name); + } + #endif +}; + +class CAutoResetEvent: public CBaseEvent +{ +public: + HRes Create() + { + return AutoResetEvent_CreateNotSignaled(&_object); + } + HRes CreateIfNotCreated() + { + if (IsCreated()) + return 0; + return AutoResetEvent_CreateNotSignaled(&_object); + } +}; + +#ifdef _WIN32 +class CObject: public CHandle +{ +public: + HRes Lock(DWORD timeoutInterval = INFINITE) + { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); } +}; +class CMutex: public CObject +{ +public: + HRes Create(bool initiallyOwn, LPCTSTR name = NULL, + LPSECURITY_ATTRIBUTES securityAttributes = NULL) + { + _handle = ::CreateMutex(securityAttributes, BoolToBOOL(initiallyOwn), name); + if (_handle != 0) + return 0; + return ::GetLastError(); + } + HRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) + { + _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name); + if (_handle != 0) + return 0; + return ::GetLastError(); + } + HRes Release() + { + return ::ReleaseMutex(_handle) ? 0 : ::GetLastError(); + } +}; +class CMutexLock +{ + CMutex *_object; +public: + CMutexLock(CMutex &object): _object(&object) { _object->Lock(); } + ~CMutexLock() { _object->Release(); } +}; +#endif + +class CSemaphore +{ + ::CSemaphore _object; +public: + CSemaphore() { Semaphore_Construct(&_object); } + ~CSemaphore() { Close(); } + HRes Close() { return Semaphore_Close(&_object); } + operator HANDLE() { return _object.handle; } + HRes Create(UInt32 initiallyCount, UInt32 maxCount) + { + return Semaphore_Create(&_object, initiallyCount, maxCount); + } + HRes Release() { return Semaphore_Release1(&_object); } + HRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); } + HRes Lock() { return Semaphore_Wait(&_object); } +}; + +class CCriticalSection +{ + ::CCriticalSection _object; +public: + CCriticalSection() { CriticalSection_Init(&_object); } + ~CCriticalSection() { CriticalSection_Delete(&_object); } + void Enter() { CriticalSection_Enter(&_object); } + void Leave() { CriticalSection_Leave(&_object); } +}; + +class CCriticalSectionLock +{ + CCriticalSection *_object; + void Unlock() { _object->Leave(); } +public: + CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); } + ~CCriticalSectionLock() { Unlock(); } +}; + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/System.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/System.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,64 @@ +// Windows/System.cpp + +#include "StdAfx.h" + +#include "System.h" + +namespace NWindows { +namespace NSystem { + +UInt32 GetNumberOfProcessors() +{ + SYSTEM_INFO systemInfo; + GetSystemInfo(&systemInfo); + return (UInt32)systemInfo.dwNumberOfProcessors; +} + +#if !defined(_WIN64) && defined(__GNUC__) + +typedef struct _MY_MEMORYSTATUSEX { + DWORD dwLength; + DWORD dwMemoryLoad; + DWORDLONG ullTotalPhys; + DWORDLONG ullAvailPhys; + DWORDLONG ullTotalPageFile; + DWORDLONG ullAvailPageFile; + DWORDLONG ullTotalVirtual; + DWORDLONG ullAvailVirtual; + DWORDLONG ullAvailExtendedVirtual; +} MY_MEMORYSTATUSEX, *MY_LPMEMORYSTATUSEX; + +#else + +#define MY_MEMORYSTATUSEX MEMORYSTATUSEX +#define MY_LPMEMORYSTATUSEX LPMEMORYSTATUSEX + +#endif + +typedef BOOL (WINAPI *GlobalMemoryStatusExP)(MY_LPMEMORYSTATUSEX lpBuffer); + +UInt64 GetRamSize() +{ + MY_MEMORYSTATUSEX stat; + stat.dwLength = sizeof(stat); + #ifdef _WIN64 + if (!::GlobalMemoryStatusEx(&stat)) + return 0; + return stat.ullTotalPhys; + #else + GlobalMemoryStatusExP globalMemoryStatusEx = (GlobalMemoryStatusExP) + ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), + "GlobalMemoryStatusEx"); + if (globalMemoryStatusEx != 0) + if (globalMemoryStatusEx(&stat)) + return stat.ullTotalPhys; + { + MEMORYSTATUS stat; + stat.dwLength = sizeof(stat); + GlobalMemoryStatus(&stat); + return stat.dwTotalPhys; + } + #endif +} + +}} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/System.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/System.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,16 @@ +// Windows/System.h + +#ifndef __WINDOWS_SYSTEM_H +#define __WINDOWS_SYSTEM_H + +#include "../Common/Types.h" + +namespace NWindows { +namespace NSystem { + +UInt32 GetNumberOfProcessors(); +UInt64 GetRamSize(); + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/Thread.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/Thread.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,38 @@ +// Windows/Thread.h + +#ifndef __WINDOWS_THREAD_H +#define __WINDOWS_THREAD_H + +#include "Defs.h" + +extern "C" +{ +#include "../../C/Threads.h" +} + +namespace NWindows { + +class CThread +{ + ::CThread thread; +public: + CThread() { Thread_Construct(&thread); } + ~CThread() { Close(); } + bool IsCreated() { return Thread_WasCreated(&thread) != 0; } + HRes Close() { return Thread_Close(&thread); } + HRes Create(THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter) + { return Thread_Create(&thread, startAddress, parameter); } + HRes Wait() { return Thread_Wait(&thread); } + + #ifdef _WIN32 + DWORD Resume() { return ::ResumeThread(thread.handle); } + DWORD Suspend() { return ::SuspendThread(thread.handle); } + bool Terminate(DWORD exitCode) { return BOOLToBool(::TerminateThread(thread.handle, exitCode)); } + int GetPriority() { return ::GetThreadPriority(thread.handle); } + bool SetPriority(int priority) { return BOOLToBool(::SetThreadPriority(thread.handle, priority)); } + #endif +}; + +} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CPP/Windows/Time.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CPP/Windows/Time.h Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,66 @@ +// Windows/Time.h + +#ifndef __WINDOWS_TIME_H +#define __WINDOWS_TIME_H + +#include "Common/Types.h" +#include "Windows/Defs.h" + +namespace NWindows { +namespace NTime { + +inline bool DosTimeToFileTime(UInt32 dosTime, FILETIME &fileTime) +{ + return BOOLToBool(::DosDateTimeToFileTime(UInt16(dosTime >> 16), + UInt16(dosTime & 0xFFFF), &fileTime)); +} + +const UInt32 kHighDosTime = 0xFF9FBF7D; +const UInt32 kLowDosTime = 0x210000; + +inline bool FileTimeToDosTime(const FILETIME &fileTime, UInt32 &dosTime) +{ + WORD datePart, timePart; + if (!::FileTimeToDosDateTime(&fileTime, &datePart, &timePart)) + { + if (fileTime.dwHighDateTime >= 0x01C00000) // 2000 + dosTime = kHighDosTime; + else + dosTime = kLowDosTime; + return false; + } + dosTime = (((UInt32)datePart) << 16) + timePart; + return true; +} + +const UInt32 kNumTimeQuantumsInSecond = 10000000; +const UInt64 kUnixTimeStartValue = ((UInt64)kNumTimeQuantumsInSecond) * 60 * 60 * 24 * 134774; + +inline void UnixTimeToFileTime(UInt32 unixTime, FILETIME &fileTime) +{ + UInt64 v = kUnixTimeStartValue + ((UInt64)unixTime) * kNumTimeQuantumsInSecond; + fileTime.dwLowDateTime = (DWORD)v; + fileTime.dwHighDateTime = (DWORD)(v >> 32); +} + +inline bool FileTimeToUnixTime(const FILETIME &fileTime, UInt32 &unixTime) +{ + UInt64 winTime = (((UInt64)fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime; + if (winTime < kUnixTimeStartValue) + { + unixTime = 0; + return false; + } + winTime = (winTime - kUnixTimeStartValue) / kNumTimeQuantumsInSecond; + if (winTime > 0xFFFFFFFF) + { + unixTime = 0xFFFFFFFF; + return false; + } + unixTime = (UInt32)winTime; + return true; +} + +}} + +#endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Common/CRC.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Common/CRC.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,55 @@ +// Common/CRC.cs + +namespace SevenZip +{ + class CRC + { + public static readonly uint[] Table; + + static CRC() + { + Table = new uint[256]; + const uint kPoly = 0xEDB88320; + for (uint i = 0; i < 256; i++) + { + uint r = i; + for (int j = 0; j < 8; j++) + if ((r & 1) != 0) + r = (r >> 1) ^ kPoly; + else + r >>= 1; + Table[i] = r; + } + } + + uint _value = 0xFFFFFFFF; + + public void Init() { _value = 0xFFFFFFFF; } + + public void UpdateByte(byte b) + { + _value = Table[(((byte)(_value)) ^ b)] ^ (_value >> 8); + } + + public void Update(byte[] data, uint offset, uint size) + { + for (uint i = 0; i < size; i++) + _value = Table[(((byte)(_value)) ^ data[offset + i])] ^ (_value >> 8); + } + + public uint GetDigest() { return _value ^ 0xFFFFFFFF; } + + static uint CalculateDigest(byte[] data, uint offset, uint size) + { + CRC crc = new CRC(); + // crc.Init(); + crc.Update(data, offset, size); + return crc.GetDigest(); + } + + static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) + { + return (CalculateDigest(data, offset, size) == digest); + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Common/CommandLineParser.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Common/CommandLineParser.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,274 @@ +// CommandLineParser.cs + +using System; +using System.Collections; + +namespace SevenZip.CommandLineParser +{ + public enum SwitchType + { + Simple, + PostMinus, + LimitedPostString, + UnLimitedPostString, + PostChar + } + + public class SwitchForm + { + public string IDString; + public SwitchType Type; + public bool Multi; + public int MinLen; + public int MaxLen; + public string PostCharSet; + + public SwitchForm(string idString, SwitchType type, bool multi, + int minLen, int maxLen, string postCharSet) + { + IDString = idString; + Type = type; + Multi = multi; + MinLen = minLen; + MaxLen = maxLen; + PostCharSet = postCharSet; + } + public SwitchForm(string idString, SwitchType type, bool multi, int minLen): + this(idString, type, multi, minLen, 0, "") + { + } + public SwitchForm(string idString, SwitchType type, bool multi): + this(idString, type, multi, 0) + { + } + } + + public class SwitchResult + { + public bool ThereIs; + public bool WithMinus; + public ArrayList PostStrings = new ArrayList(); + public int PostCharIndex; + public SwitchResult() + { + ThereIs = false; + } + } + + public class Parser + { + public ArrayList NonSwitchStrings = new ArrayList(); + SwitchResult[] _switches; + + public Parser(int numSwitches) + { + _switches = new SwitchResult[numSwitches]; + for (int i = 0; i < numSwitches; i++) + _switches[i] = new SwitchResult(); + } + + bool ParseString(string srcString, SwitchForm[] switchForms) + { + int len = srcString.Length; + if (len == 0) + return false; + int pos = 0; + if (!IsItSwitchChar(srcString[pos])) + return false; + while (pos < len) + { + if (IsItSwitchChar(srcString[pos])) + pos++; + const int kNoLen = -1; + int matchedSwitchIndex = 0; + int maxLen = kNoLen; + for (int switchIndex = 0; switchIndex < _switches.Length; switchIndex++) + { + int switchLen = switchForms[switchIndex].IDString.Length; + if (switchLen <= maxLen || pos + switchLen > len) + continue; + if (String.Compare(switchForms[switchIndex].IDString, 0, + srcString, pos, switchLen, true) == 0) + { + matchedSwitchIndex = switchIndex; + maxLen = switchLen; + } + } + if (maxLen == kNoLen) + throw new Exception("maxLen == kNoLen"); + SwitchResult matchedSwitch = _switches[matchedSwitchIndex]; + SwitchForm switchForm = switchForms[matchedSwitchIndex]; + if ((!switchForm.Multi) && matchedSwitch.ThereIs) + throw new Exception("switch must be single"); + matchedSwitch.ThereIs = true; + pos += maxLen; + int tailSize = len - pos; + SwitchType type = switchForm.Type; + switch (type) + { + case SwitchType.PostMinus: + { + if (tailSize == 0) + matchedSwitch.WithMinus = false; + else + { + matchedSwitch.WithMinus = (srcString[pos] == kSwitchMinus); + if (matchedSwitch.WithMinus) + pos++; + } + break; + } + case SwitchType.PostChar: + { + if (tailSize < switchForm.MinLen) + throw new Exception("switch is not full"); + string charSet = switchForm.PostCharSet; + const int kEmptyCharValue = -1; + if (tailSize == 0) + matchedSwitch.PostCharIndex = kEmptyCharValue; + else + { + int index = charSet.IndexOf(srcString[pos]); + if (index < 0) + matchedSwitch.PostCharIndex = kEmptyCharValue; + else + { + matchedSwitch.PostCharIndex = index; + pos++; + } + } + break; + } + case SwitchType.LimitedPostString: + case SwitchType.UnLimitedPostString: + { + int minLen = switchForm.MinLen; + if (tailSize < minLen) + throw new Exception("switch is not full"); + if (type == SwitchType.UnLimitedPostString) + { + matchedSwitch.PostStrings.Add(srcString.Substring(pos)); + return true; + } + String stringSwitch = srcString.Substring(pos, minLen); + pos += minLen; + for (int i = minLen; i < switchForm.MaxLen && pos < len; i++, pos++) + { + char c = srcString[pos]; + if (IsItSwitchChar(c)) + break; + stringSwitch += c; + } + matchedSwitch.PostStrings.Add(stringSwitch); + break; + } + } + } + return true; + + } + + public void ParseStrings(SwitchForm[] switchForms, string[] commandStrings) + { + int numCommandStrings = commandStrings.Length; + bool stopSwitch = false; + for (int i = 0; i < numCommandStrings; i++) + { + string s = commandStrings[i]; + if (stopSwitch) + NonSwitchStrings.Add(s); + else + if (s == kStopSwitchParsing) + stopSwitch = true; + else + if (!ParseString(s, switchForms)) + NonSwitchStrings.Add(s); + } + } + + public SwitchResult this[int index] { get { return _switches[index]; } } + + public static int ParseCommand(CommandForm[] commandForms, string commandString, + out string postString) + { + for (int i = 0; i < commandForms.Length; i++) + { + string id = commandForms[i].IDString; + if (commandForms[i].PostStringMode) + { + if (commandString.IndexOf(id) == 0) + { + postString = commandString.Substring(id.Length); + return i; + } + } + else + if (commandString == id) + { + postString = ""; + return i; + } + } + postString = ""; + return -1; + } + + static bool ParseSubCharsCommand(int numForms, CommandSubCharsSet[] forms, + string commandString, ArrayList indices) + { + indices.Clear(); + int numUsedChars = 0; + for (int i = 0; i < numForms; i++) + { + CommandSubCharsSet charsSet = forms[i]; + int currentIndex = -1; + int len = charsSet.Chars.Length; + for (int j = 0; j < len; j++) + { + char c = charsSet.Chars[j]; + int newIndex = commandString.IndexOf(c); + if (newIndex >= 0) + { + if (currentIndex >= 0) + return false; + if (commandString.IndexOf(c, newIndex + 1) >= 0) + return false; + currentIndex = j; + numUsedChars++; + } + } + if (currentIndex == -1 && !charsSet.EmptyAllowed) + return false; + indices.Add(currentIndex); + } + return (numUsedChars == commandString.Length); + } + const char kSwitchID1 = '-'; + const char kSwitchID2 = '/'; + + const char kSwitchMinus = '-'; + const string kStopSwitchParsing = "--"; + + static bool IsItSwitchChar(char c) + { + return (c == kSwitchID1 || c == kSwitchID2); + } + } + + public class CommandForm + { + public string IDString = ""; + public bool PostStringMode = false; + public CommandForm(string idString, bool postStringMode) + { + IDString = idString; + PostStringMode = postStringMode; + } + } + + class CommandSubCharsSet + { + public string Chars = ""; + public bool EmptyAllowed = false; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Common/InBuffer.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Common/InBuffer.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,72 @@ +// InBuffer.cs + +namespace SevenZip.Buffer +{ + public class InBuffer + { + byte[] m_Buffer; + uint m_Pos; + uint m_Limit; + uint m_BufferSize; + System.IO.Stream m_Stream; + bool m_StreamWasExhausted; + ulong m_ProcessedSize; + + public InBuffer(uint bufferSize) + { + m_Buffer = new byte[bufferSize]; + m_BufferSize = bufferSize; + } + + public void Init(System.IO.Stream stream) + { + m_Stream = stream; + m_ProcessedSize = 0; + m_Limit = 0; + m_Pos = 0; + m_StreamWasExhausted = false; + } + + public bool ReadBlock() + { + if (m_StreamWasExhausted) + return false; + m_ProcessedSize += m_Pos; + int aNumProcessedBytes = m_Stream.Read(m_Buffer, 0, (int)m_BufferSize); + m_Pos = 0; + m_Limit = (uint)aNumProcessedBytes; + m_StreamWasExhausted = (aNumProcessedBytes == 0); + return (!m_StreamWasExhausted); + } + + + public void ReleaseStream() + { + // m_Stream.Close(); + m_Stream = null; + } + + public bool ReadByte(byte b) // check it + { + if (m_Pos >= m_Limit) + if (!ReadBlock()) + return false; + b = m_Buffer[m_Pos++]; + return true; + } + + public byte ReadByte() + { + // return (byte)m_Stream.ReadByte(); + if (m_Pos >= m_Limit) + if (!ReadBlock()) + return 0xFF; + return m_Buffer[m_Pos++]; + } + + public ulong GetProcessedSize() + { + return m_ProcessedSize + m_Pos; + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Common/OutBuffer.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Common/OutBuffer.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,47 @@ +// OutBuffer.cs + +namespace SevenZip.Buffer +{ + public class OutBuffer + { + byte[] m_Buffer; + uint m_Pos; + uint m_BufferSize; + System.IO.Stream m_Stream; + ulong m_ProcessedSize; + + public OutBuffer(uint bufferSize) + { + m_Buffer = new byte[bufferSize]; + m_BufferSize = bufferSize; + } + + public void SetStream(System.IO.Stream stream) { m_Stream = stream; } + public void FlushStream() { m_Stream.Flush(); } + public void CloseStream() { m_Stream.Close(); } + public void ReleaseStream() { m_Stream = null; } + + public void Init() + { + m_ProcessedSize = 0; + m_Pos = 0; + } + + public void WriteByte(byte b) + { + m_Buffer[m_Pos++] = b; + if (m_Pos >= m_BufferSize) + FlushData(); + } + + public void FlushData() + { + if (m_Pos == 0) + return; + m_Stream.Write(m_Buffer, 0, (int)m_Pos); + m_Pos = 0; + } + + public ulong GetProcessedSize() { return m_ProcessedSize + m_Pos; } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LZ/IMatchFinder.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LZ/IMatchFinder.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +// IMatchFinder.cs + +using System; + +namespace SevenZip.Compression.LZ +{ + interface IInWindowStream + { + void SetStream(System.IO.Stream inStream); + void Init(); + void ReleaseStream(); + Byte GetIndexByte(Int32 index); + UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit); + UInt32 GetNumAvailableBytes(); + } + + interface IMatchFinder : IInWindowStream + { + void Create(UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter); + UInt32 GetMatches(UInt32[] distances); + void Skip(UInt32 num); + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LZ/LzBinTree.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LZ/LzBinTree.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,367 @@ +// LzBinTree.cs + +using System; + +namespace SevenZip.Compression.LZ +{ + public class BinTree : InWindow, IMatchFinder + { + UInt32 _cyclicBufferPos; + UInt32 _cyclicBufferSize = 0; + UInt32 _matchMaxLen; + + UInt32[] _son; + UInt32[] _hash; + + UInt32 _cutValue = 0xFF; + UInt32 _hashMask; + UInt32 _hashSizeSum = 0; + + bool HASH_ARRAY = true; + + const UInt32 kHash2Size = 1 << 10; + const UInt32 kHash3Size = 1 << 16; + const UInt32 kBT2HashSize = 1 << 16; + const UInt32 kStartMaxLen = 1; + const UInt32 kHash3Offset = kHash2Size; + const UInt32 kEmptyHashValue = 0; + const UInt32 kMaxValForNormalize = ((UInt32)1 << 31) - 1; + + UInt32 kNumHashDirectBytes = 0; + UInt32 kMinMatchCheck = 4; + UInt32 kFixHashSize = kHash2Size + kHash3Size; + + public void SetType(int numHashBytes) + { + HASH_ARRAY = (numHashBytes > 2); + if (HASH_ARRAY) + { + kNumHashDirectBytes = 0; + kMinMatchCheck = 4; + kFixHashSize = kHash2Size + kHash3Size; + } + else + { + kNumHashDirectBytes = 2; + kMinMatchCheck = 2 + 1; + kFixHashSize = 0; + } + } + + public new void SetStream(System.IO.Stream stream) { base.SetStream(stream); } + public new void ReleaseStream() { base.ReleaseStream(); } + + public new void Init() + { + base.Init(); + for (UInt32 i = 0; i < _hashSizeSum; i++) + _hash[i] = kEmptyHashValue; + _cyclicBufferPos = 0; + ReduceOffsets(-1); + } + + public new void MovePos() + { + if (++_cyclicBufferPos >= _cyclicBufferSize) + _cyclicBufferPos = 0; + base.MovePos(); + if (_pos == kMaxValForNormalize) + Normalize(); + } + + public new Byte GetIndexByte(Int32 index) { return base.GetIndexByte(index); } + + public new UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) + { return base.GetMatchLen(index, distance, limit); } + + public new UInt32 GetNumAvailableBytes() { return base.GetNumAvailableBytes(); } + + public void Create(UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter) + { + if (historySize > kMaxValForNormalize - 256) + throw new Exception(); + _cutValue = 16 + (matchMaxLen >> 1); + + UInt32 windowReservSize = (historySize + keepAddBufferBefore + + matchMaxLen + keepAddBufferAfter) / 2 + 256; + + base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); + + _matchMaxLen = matchMaxLen; + + UInt32 cyclicBufferSize = historySize + 1; + if (_cyclicBufferSize != cyclicBufferSize) + _son = new UInt32[(_cyclicBufferSize = cyclicBufferSize) * 2]; + + UInt32 hs = kBT2HashSize; + + if (HASH_ARRAY) + { + hs = historySize - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + hs |= 0xFFFF; + if (hs > (1 << 24)) + hs >>= 1; + _hashMask = hs; + hs++; + hs += kFixHashSize; + } + if (hs != _hashSizeSum) + _hash = new UInt32[_hashSizeSum = hs]; + } + + public UInt32 GetMatches(UInt32[] distances) + { + UInt32 lenLimit; + if (_pos + _matchMaxLen <= _streamPos) + lenLimit = _matchMaxLen; + else + { + lenLimit = _streamPos - _pos; + if (lenLimit < kMinMatchCheck) + { + MovePos(); + return 0; + } + } + + UInt32 offset = 0; + UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; + UInt32 cur = _bufferOffset + _pos; + UInt32 maxLen = kStartMaxLen; // to avoid items for len < hashSize; + UInt32 hashValue, hash2Value = 0, hash3Value = 0; + + if (HASH_ARRAY) + { + UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; + hash2Value = temp & (kHash2Size - 1); + temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8); + hash3Value = temp & (kHash3Size - 1); + hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; + } + else + hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8); + + UInt32 curMatch = _hash[kFixHashSize + hashValue]; + if (HASH_ARRAY) + { + UInt32 curMatch2 = _hash[hash2Value]; + UInt32 curMatch3 = _hash[kHash3Offset + hash3Value]; + _hash[hash2Value] = _pos; + _hash[kHash3Offset + hash3Value] = _pos; + if (curMatch2 > matchMinPos) + if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur]) + { + distances[offset++] = maxLen = 2; + distances[offset++] = _pos - curMatch2 - 1; + } + if (curMatch3 > matchMinPos) + if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur]) + { + if (curMatch3 == curMatch2) + offset -= 2; + distances[offset++] = maxLen = 3; + distances[offset++] = _pos - curMatch3 - 1; + curMatch2 = curMatch3; + } + if (offset != 0 && curMatch2 == curMatch) + { + offset -= 2; + maxLen = kStartMaxLen; + } + } + + _hash[kFixHashSize + hashValue] = _pos; + + UInt32 ptr0 = (_cyclicBufferPos << 1) + 1; + UInt32 ptr1 = (_cyclicBufferPos << 1); + + UInt32 len0, len1; + len0 = len1 = kNumHashDirectBytes; + + if (kNumHashDirectBytes != 0) + { + if (curMatch > matchMinPos) + { + if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != + _bufferBase[cur + kNumHashDirectBytes]) + { + distances[offset++] = maxLen = kNumHashDirectBytes; + distances[offset++] = _pos - curMatch - 1; + } + } + } + + UInt32 count = _cutValue; + + while(true) + { + if(curMatch <= matchMinPos || count-- == 0) + { + _son[ptr0] = _son[ptr1] = kEmptyHashValue; + break; + } + UInt32 delta = _pos - curMatch; + UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ? + (_cyclicBufferPos - delta) : + (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; + + UInt32 pby1 = _bufferOffset + curMatch; + UInt32 len = Math.Min(len0, len1); + if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) + { + while(++len != lenLimit) + if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) + break; + if (maxLen < len) + { + distances[offset++] = maxLen = len; + distances[offset++] = delta - 1; + if (len == lenLimit) + { + _son[ptr1] = _son[cyclicPos]; + _son[ptr0] = _son[cyclicPos + 1]; + break; + } + } + } + if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) + { + _son[ptr1] = curMatch; + ptr1 = cyclicPos + 1; + curMatch = _son[ptr1]; + len1 = len; + } + else + { + _son[ptr0] = curMatch; + ptr0 = cyclicPos; + curMatch = _son[ptr0]; + len0 = len; + } + } + MovePos(); + return offset; + } + + public void Skip(UInt32 num) + { + do + { + UInt32 lenLimit; + if (_pos + _matchMaxLen <= _streamPos) + lenLimit = _matchMaxLen; + else + { + lenLimit = _streamPos - _pos; + if (lenLimit < kMinMatchCheck) + { + MovePos(); + continue; + } + } + + UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; + UInt32 cur = _bufferOffset + _pos; + + UInt32 hashValue; + + if (HASH_ARRAY) + { + UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; + UInt32 hash2Value = temp & (kHash2Size - 1); + _hash[hash2Value] = _pos; + temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8); + UInt32 hash3Value = temp & (kHash3Size - 1); + _hash[kHash3Offset + hash3Value] = _pos; + hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; + } + else + hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8); + + UInt32 curMatch = _hash[kFixHashSize + hashValue]; + _hash[kFixHashSize + hashValue] = _pos; + + UInt32 ptr0 = (_cyclicBufferPos << 1) + 1; + UInt32 ptr1 = (_cyclicBufferPos << 1); + + UInt32 len0, len1; + len0 = len1 = kNumHashDirectBytes; + + UInt32 count = _cutValue; + while (true) + { + if (curMatch <= matchMinPos || count-- == 0) + { + _son[ptr0] = _son[ptr1] = kEmptyHashValue; + break; + } + + UInt32 delta = _pos - curMatch; + UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ? + (_cyclicBufferPos - delta) : + (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; + + UInt32 pby1 = _bufferOffset + curMatch; + UInt32 len = Math.Min(len0, len1); + if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) + { + while (++len != lenLimit) + if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) + break; + if (len == lenLimit) + { + _son[ptr1] = _son[cyclicPos]; + _son[ptr0] = _son[cyclicPos + 1]; + break; + } + } + if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) + { + _son[ptr1] = curMatch; + ptr1 = cyclicPos + 1; + curMatch = _son[ptr1]; + len1 = len; + } + else + { + _son[ptr0] = curMatch; + ptr0 = cyclicPos; + curMatch = _son[ptr0]; + len0 = len; + } + } + MovePos(); + } + while (--num != 0); + } + + void NormalizeLinks(UInt32[] items, UInt32 numItems, UInt32 subValue) + { + for (UInt32 i = 0; i < numItems; i++) + { + UInt32 value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; + } + } + + void Normalize() + { + UInt32 subValue = _pos - _cyclicBufferSize; + NormalizeLinks(_son, _cyclicBufferSize * 2, subValue); + NormalizeLinks(_hash, _hashSizeSum, subValue); + ReduceOffsets((Int32)subValue); + } + + public void SetCutValue(UInt32 cutValue) { _cutValue = cutValue; } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LZ/LzInWindow.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LZ/LzInWindow.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,132 @@ +// LzInWindow.cs + +using System; + +namespace SevenZip.Compression.LZ +{ + public class InWindow + { + public Byte[] _bufferBase = null; // pointer to buffer with data + System.IO.Stream _stream; + UInt32 _posLimit; // offset (from _buffer) of first byte when new block reading must be done + bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream + + UInt32 _pointerToLastSafePosition; + + public UInt32 _bufferOffset; + + public UInt32 _blockSize; // Size of Allocated memory block + public UInt32 _pos; // offset (from _buffer) of curent byte + UInt32 _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos + UInt32 _keepSizeAfter; // how many BYTEs must be kept buffer after _pos + public UInt32 _streamPos; // offset (from _buffer) of first not read byte from Stream + + public void MoveBlock() + { + UInt32 offset = (UInt32)(_bufferOffset) + _pos - _keepSizeBefore; + // we need one additional byte, since MovePos moves on 1 byte. + if (offset > 0) + offset--; + + UInt32 numBytes = (UInt32)(_bufferOffset) + _streamPos - offset; + + // check negative offset ???? + for (UInt32 i = 0; i < numBytes; i++) + _bufferBase[i] = _bufferBase[offset + i]; + _bufferOffset -= offset; + } + + public virtual void ReadBlock() + { + if (_streamEndWasReached) + return; + while (true) + { + int size = (int)((0 - _bufferOffset) + _blockSize - _streamPos); + if (size == 0) + return; + int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size); + if (numReadBytes == 0) + { + _posLimit = _streamPos; + UInt32 pointerToPostion = _bufferOffset + _posLimit; + if (pointerToPostion > _pointerToLastSafePosition) + _posLimit = (UInt32)(_pointerToLastSafePosition - _bufferOffset); + + _streamEndWasReached = true; + return; + } + _streamPos += (UInt32)numReadBytes; + if (_streamPos >= _pos + _keepSizeAfter) + _posLimit = _streamPos - _keepSizeAfter; + } + } + + void Free() { _bufferBase = null; } + + public void Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv) + { + _keepSizeBefore = keepSizeBefore; + _keepSizeAfter = keepSizeAfter; + UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; + if (_bufferBase == null || _blockSize != blockSize) + { + Free(); + _blockSize = blockSize; + _bufferBase = new Byte[_blockSize]; + } + _pointerToLastSafePosition = _blockSize - keepSizeAfter; + } + + public void SetStream(System.IO.Stream stream) { _stream = stream; } + public void ReleaseStream() { _stream = null; } + + public void Init() + { + _bufferOffset = 0; + _pos = 0; + _streamPos = 0; + _streamEndWasReached = false; + ReadBlock(); + } + + public void MovePos() + { + _pos++; + if (_pos > _posLimit) + { + UInt32 pointerToPostion = _bufferOffset + _pos; + if (pointerToPostion > _pointerToLastSafePosition) + MoveBlock(); + ReadBlock(); + } + } + + public Byte GetIndexByte(Int32 index) { return _bufferBase[_bufferOffset + _pos + index]; } + + // index + limit have not to exceed _keepSizeAfter; + public UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) + { + if (_streamEndWasReached) + if ((_pos + index) + limit > _streamPos) + limit = _streamPos - (UInt32)(_pos + index); + distance++; + // Byte *pby = _buffer + (size_t)_pos + index; + UInt32 pby = _bufferOffset + _pos + (UInt32)index; + + UInt32 i; + for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++); + return i; + } + + public UInt32 GetNumAvailableBytes() { return _streamPos - _pos; } + + public void ReduceOffsets(Int32 subValue) + { + _bufferOffset += (UInt32)subValue; + _posLimit -= (UInt32)subValue; + _pos -= (UInt32)subValue; + _streamPos -= (UInt32)subValue; + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LZ/LzOutWindow.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LZ/LzOutWindow.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,110 @@ +// LzOutWindow.cs + +namespace SevenZip.Compression.LZ +{ + public class OutWindow + { + byte[] _buffer = null; + uint _pos; + uint _windowSize = 0; + uint _streamPos; + System.IO.Stream _stream; + + public uint TrainSize = 0; + + public void Create(uint windowSize) + { + if (_windowSize != windowSize) + { + // System.GC.Collect(); + _buffer = new byte[windowSize]; + } + _windowSize = windowSize; + _pos = 0; + _streamPos = 0; + } + + public void Init(System.IO.Stream stream, bool solid) + { + ReleaseStream(); + _stream = stream; + if (!solid) + { + _streamPos = 0; + _pos = 0; + TrainSize = 0; + } + } + + public bool Train(System.IO.Stream stream) + { + long len = stream.Length; + uint size = (len < _windowSize) ? (uint)len : _windowSize; + TrainSize = size; + stream.Position = len - size; + _streamPos = _pos = 0; + while (size > 0) + { + uint curSize = _windowSize - _pos; + if (size < curSize) + curSize = size; + int numReadBytes = stream.Read(_buffer, (int)_pos, (int)curSize); + if (numReadBytes == 0) + return false; + size -= (uint)numReadBytes; + _pos += (uint)numReadBytes; + _streamPos += (uint)numReadBytes; + if (_pos == _windowSize) + _streamPos = _pos = 0; + } + return true; + } + + public void ReleaseStream() + { + Flush(); + _stream = null; + } + + public void Flush() + { + uint size = _pos - _streamPos; + if (size == 0) + return; + _stream.Write(_buffer, (int)_streamPos, (int)size); + if (_pos >= _windowSize) + _pos = 0; + _streamPos = _pos; + } + + public void CopyBlock(uint distance, uint len) + { + uint pos = _pos - distance - 1; + if (pos >= _windowSize) + pos += _windowSize; + for (; len > 0; len--) + { + if (pos >= _windowSize) + pos = 0; + _buffer[_pos++] = _buffer[pos++]; + if (_pos >= _windowSize) + Flush(); + } + } + + public void PutByte(byte b) + { + _buffer[_pos++] = b; + if (_pos >= _windowSize) + Flush(); + } + + public byte GetByte(uint distance) + { + uint pos = _pos - distance - 1; + if (pos >= _windowSize) + pos += _windowSize; + return _buffer[pos]; + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LZMA/LzmaBase.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LZMA/LzmaBase.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,76 @@ +// LzmaBase.cs + +namespace SevenZip.Compression.LZMA +{ + internal abstract class Base + { + public const uint kNumRepDistances = 4; + public const uint kNumStates = 12; + + // static byte []kLiteralNextStates = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; + // static byte []kMatchNextStates = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; + // static byte []kRepNextStates = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; + // static byte []kShortRepNextStates = {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + + public struct State + { + public uint Index; + public void Init() { Index = 0; } + public void UpdateChar() + { + if (Index < 4) Index = 0; + else if (Index < 10) Index -= 3; + else Index -= 6; + } + public void UpdateMatch() { Index = (uint)(Index < 7 ? 7 : 10); } + public void UpdateRep() { Index = (uint)(Index < 7 ? 8 : 11); } + public void UpdateShortRep() { Index = (uint)(Index < 7 ? 9 : 11); } + public bool IsCharState() { return Index < 7; } + } + + public const int kNumPosSlotBits = 6; + public const int kDicLogSizeMin = 0; + // public const int kDicLogSizeMax = 30; + // public const uint kDistTableSizeMax = kDicLogSizeMax * 2; + + public const int kNumLenToPosStatesBits = 2; // it's for speed optimization + public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits; + + public const uint kMatchMinLen = 2; + + public static uint GetLenToPosState(uint len) + { + len -= kMatchMinLen; + if (len < kNumLenToPosStates) + return len; + return (uint)(kNumLenToPosStates - 1); + } + + public const int kNumAlignBits = 4; + public const uint kAlignTableSize = 1 << kNumAlignBits; + public const uint kAlignMask = (kAlignTableSize - 1); + + public const uint kStartPosModelIndex = 4; + public const uint kEndPosModelIndex = 14; + public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; + + public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2); + + public const uint kNumLitPosStatesBitsEncodingMax = 4; + public const uint kNumLitContextBitsMax = 8; + + public const int kNumPosStatesBitsMax = 4; + public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax); + public const int kNumPosStatesBitsEncodingMax = 4; + public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); + + public const int kNumLowLenBits = 3; + public const int kNumMidLenBits = 3; + public const int kNumHighLenBits = 8; + public const uint kNumLowLenSymbols = 1 << kNumLowLenBits; + public const uint kNumMidLenSymbols = 1 << kNumMidLenBits; + public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + + (1 << kNumHighLenBits); + public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LZMA/LzmaDecoder.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LZMA/LzmaDecoder.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,398 @@ +// LzmaDecoder.cs + +using System; + +namespace SevenZip.Compression.LZMA +{ + using RangeCoder; + + public class Decoder : ICoder, ISetDecoderProperties // ,System.IO.Stream + { + class LenDecoder + { + BitDecoder m_Choice = new BitDecoder(); + BitDecoder m_Choice2 = new BitDecoder(); + BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; + BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; + BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits); + uint m_NumPosStates = 0; + + public void Create(uint numPosStates) + { + for (uint posState = m_NumPosStates; posState < numPosStates; posState++) + { + m_LowCoder[posState] = new BitTreeDecoder(Base.kNumLowLenBits); + m_MidCoder[posState] = new BitTreeDecoder(Base.kNumMidLenBits); + } + m_NumPosStates = numPosStates; + } + + public void Init() + { + m_Choice.Init(); + for (uint posState = 0; posState < m_NumPosStates; posState++) + { + m_LowCoder[posState].Init(); + m_MidCoder[posState].Init(); + } + m_Choice2.Init(); + m_HighCoder.Init(); + } + + public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState) + { + if (m_Choice.Decode(rangeDecoder) == 0) + return m_LowCoder[posState].Decode(rangeDecoder); + else + { + uint symbol = Base.kNumLowLenSymbols; + if (m_Choice2.Decode(rangeDecoder) == 0) + symbol += m_MidCoder[posState].Decode(rangeDecoder); + else + { + symbol += Base.kNumMidLenSymbols; + symbol += m_HighCoder.Decode(rangeDecoder); + } + return symbol; + } + } + } + + class LiteralDecoder + { + struct Decoder2 + { + BitDecoder[] m_Decoders; + public void Create() { m_Decoders = new BitDecoder[0x300]; } + public void Init() { for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); } + + public byte DecodeNormal(RangeCoder.Decoder rangeDecoder) + { + uint symbol = 1; + do + symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); + while (symbol < 0x100); + return (byte)symbol; + } + + public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte) + { + uint symbol = 1; + do + { + uint matchBit = (uint)(matchByte >> 7) & 1; + matchByte <<= 1; + uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder); + symbol = (symbol << 1) | bit; + if (matchBit != bit) + { + while (symbol < 0x100) + symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); + break; + } + } + while (symbol < 0x100); + return (byte)symbol; + } + } + + Decoder2[] m_Coders; + int m_NumPrevBits; + int m_NumPosBits; + uint m_PosMask; + + public void Create(int numPosBits, int numPrevBits) + { + if (m_Coders != null && m_NumPrevBits == numPrevBits && + m_NumPosBits == numPosBits) + return; + m_NumPosBits = numPosBits; + m_PosMask = ((uint)1 << numPosBits) - 1; + m_NumPrevBits = numPrevBits; + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new Decoder2[numStates]; + for (uint i = 0; i < numStates; i++) + m_Coders[i].Create(); + } + + public void Init() + { + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + for (uint i = 0; i < numStates; i++) + m_Coders[i].Init(); + } + + uint GetState(uint pos, byte prevByte) + { return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits)); } + + public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte) + { return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); } + + public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte) + { return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); } + }; + + LZ.OutWindow m_OutWindow = new LZ.OutWindow(); + RangeCoder.Decoder m_RangeDecoder = new RangeCoder.Decoder(); + + BitDecoder[] m_IsMatchDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + BitDecoder[] m_IsRepDecoders = new BitDecoder[Base.kNumStates]; + BitDecoder[] m_IsRepG0Decoders = new BitDecoder[Base.kNumStates]; + BitDecoder[] m_IsRepG1Decoders = new BitDecoder[Base.kNumStates]; + BitDecoder[] m_IsRepG2Decoders = new BitDecoder[Base.kNumStates]; + BitDecoder[] m_IsRep0LongDecoders = new BitDecoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + + BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates]; + BitDecoder[] m_PosDecoders = new BitDecoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; + + BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits); + + LenDecoder m_LenDecoder = new LenDecoder(); + LenDecoder m_RepLenDecoder = new LenDecoder(); + + LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); + + uint m_DictionarySize; + uint m_DictionarySizeCheck; + + uint m_PosStateMask; + + public Decoder() + { + m_DictionarySize = 0xFFFFFFFF; + for (int i = 0; i < Base.kNumLenToPosStates; i++) + m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits); + } + + void SetDictionarySize(uint dictionarySize) + { + if (m_DictionarySize != dictionarySize) + { + m_DictionarySize = dictionarySize; + m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1); + uint blockSize = Math.Max(m_DictionarySizeCheck, (1 << 12)); + m_OutWindow.Create(blockSize); + } + } + + void SetLiteralProperties(int lp, int lc) + { + if (lp > 8) + throw new InvalidParamException(); + if (lc > 8) + throw new InvalidParamException(); + m_LiteralDecoder.Create(lp, lc); + } + + void SetPosBitsProperties(int pb) + { + if (pb > Base.kNumPosStatesBitsMax) + throw new InvalidParamException(); + uint numPosStates = (uint)1 << pb; + m_LenDecoder.Create(numPosStates); + m_RepLenDecoder.Create(numPosStates); + m_PosStateMask = numPosStates - 1; + } + + bool _solid = false; + void Init(System.IO.Stream inStream, System.IO.Stream outStream) + { + m_RangeDecoder.Init(inStream); + m_OutWindow.Init(outStream, _solid); + + uint i; + for (i = 0; i < Base.kNumStates; i++) + { + for (uint j = 0; j <= m_PosStateMask; j++) + { + uint index = (i << Base.kNumPosStatesBitsMax) + j; + m_IsMatchDecoders[index].Init(); + m_IsRep0LongDecoders[index].Init(); + } + m_IsRepDecoders[i].Init(); + m_IsRepG0Decoders[i].Init(); + m_IsRepG1Decoders[i].Init(); + m_IsRepG2Decoders[i].Init(); + } + + m_LiteralDecoder.Init(); + for (i = 0; i < Base.kNumLenToPosStates; i++) + m_PosSlotDecoder[i].Init(); + // m_PosSpecDecoder.Init(); + for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) + m_PosDecoders[i].Init(); + + m_LenDecoder.Init(); + m_RepLenDecoder.Init(); + m_PosAlignDecoder.Init(); + } + + public void Code(System.IO.Stream inStream, System.IO.Stream outStream, + Int64 inSize, Int64 outSize, ICodeProgress progress) + { + Init(inStream, outStream); + + Base.State state = new Base.State(); + state.Init(); + uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; + + UInt64 nowPos64 = 0; + UInt64 outSize64 = (UInt64)outSize; + if (nowPos64 < outSize64) + { + if (m_IsMatchDecoders[state.Index << Base.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0) + throw new DataErrorException(); + state.UpdateChar(); + byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0); + m_OutWindow.PutByte(b); + nowPos64++; + } + while (nowPos64 < outSize64) + { + // UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64); + // while(nowPos64 < next) + { + uint posState = (uint)nowPos64 & m_PosStateMask; + if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) + { + byte b; + byte prevByte = m_OutWindow.GetByte(0); + if (!state.IsCharState()) + b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, + (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0)); + else + b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte); + m_OutWindow.PutByte(b); + state.UpdateChar(); + nowPos64++; + } + else + { + uint len; + if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) + { + if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) + { + if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) + { + state.UpdateShortRep(); + m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); + nowPos64++; + continue; + } + } + else + { + UInt32 distance; + if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) + { + distance = rep1; + } + else + { + if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) + distance = rep2; + else + { + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; + state.UpdateRep(); + } + else + { + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); + state.UpdateMatch(); + uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); + if (posSlot >= Base.kStartPosModelIndex) + { + int numDirectBits = (int)((posSlot >> 1) - 1); + rep0 = ((2 | (posSlot & 1)) << numDirectBits); + if (posSlot < Base.kEndPosModelIndex) + rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, + rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); + else + { + rep0 += (m_RangeDecoder.DecodeDirectBits( + numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits); + rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); + } + } + else + rep0 = posSlot; + } + if (rep0 >= m_OutWindow.TrainSize + nowPos64 || rep0 >= m_DictionarySizeCheck) + { + if (rep0 == 0xFFFFFFFF) + break; + throw new DataErrorException(); + } + m_OutWindow.CopyBlock(rep0, len); + nowPos64 += len; + } + } + } + m_OutWindow.Flush(); + m_OutWindow.ReleaseStream(); + m_RangeDecoder.ReleaseStream(); + } + + public void SetDecoderProperties(byte[] properties) + { + if (properties.Length < 5) + throw new InvalidParamException(); + int lc = properties[0] % 9; + int remainder = properties[0] / 9; + int lp = remainder % 5; + int pb = remainder / 5; + if (pb > Base.kNumPosStatesBitsMax) + throw new InvalidParamException(); + UInt32 dictionarySize = 0; + for (int i = 0; i < 4; i++) + dictionarySize += ((UInt32)(properties[1 + i])) << (i * 8); + SetDictionarySize(dictionarySize); + SetLiteralProperties(lp, lc); + SetPosBitsProperties(pb); + } + + public bool Train(System.IO.Stream stream) + { + _solid = true; + return m_OutWindow.Train(stream); + } + + /* + public override bool CanRead { get { return true; }} + public override bool CanWrite { get { return true; }} + public override bool CanSeek { get { return true; }} + public override long Length { get { return 0; }} + public override long Position + { + get { return 0; } + set { } + } + public override void Flush() { } + public override int Read(byte[] buffer, int offset, int count) + { + return 0; + } + public override void Write(byte[] buffer, int offset, int count) + { + } + public override long Seek(long offset, System.IO.SeekOrigin origin) + { + return 0; + } + public override void SetLength(long value) {} + */ + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LZMA/LzmaEncoder.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LZMA/LzmaEncoder.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1480 @@ +// LzmaEncoder.cs + +using System; + +namespace SevenZip.Compression.LZMA +{ + using RangeCoder; + + public class Encoder : ICoder, ISetCoderProperties, IWriteCoderProperties + { + enum EMatchFinderType + { + BT2, + BT4, + }; + + const UInt32 kIfinityPrice = 0xFFFFFFF; + + static Byte[] g_FastPos = new Byte[1 << 11]; + + static Encoder() + { + const Byte kFastSlots = 22; + int c = 2; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++) + { + UInt32 k = ((UInt32)1 << ((slotFast >> 1) - 1)); + for (UInt32 j = 0; j < k; j++, c++) + g_FastPos[c] = slotFast; + } + } + + static UInt32 GetPosSlot(UInt32 pos) + { + if (pos < (1 << 11)) + return g_FastPos[pos]; + if (pos < (1 << 21)) + return (UInt32)(g_FastPos[pos >> 10] + 20); + return (UInt32)(g_FastPos[pos >> 20] + 40); + } + + static UInt32 GetPosSlot2(UInt32 pos) + { + if (pos < (1 << 17)) + return (UInt32)(g_FastPos[pos >> 6] + 12); + if (pos < (1 << 27)) + return (UInt32)(g_FastPos[pos >> 16] + 32); + return (UInt32)(g_FastPos[pos >> 26] + 52); + } + + Base.State _state = new Base.State(); + Byte _previousByte; + UInt32[] _repDistances = new UInt32[Base.kNumRepDistances]; + + void BaseInit() + { + _state.Init(); + _previousByte = 0; + for (UInt32 i = 0; i < Base.kNumRepDistances; i++) + _repDistances[i] = 0; + } + + const int kDefaultDictionaryLogSize = 22; + const UInt32 kNumFastBytesDefault = 0x20; + + class LiteralEncoder + { + public struct Encoder2 + { + BitEncoder[] m_Encoders; + + public void Create() { m_Encoders = new BitEncoder[0x300]; } + + public void Init() { for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); } + + public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol) + { + uint context = 1; + for (int i = 7; i >= 0; i--) + { + uint bit = (uint)((symbol >> i) & 1); + m_Encoders[context].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + } + } + + public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) + { + uint context = 1; + bool same = true; + for (int i = 7; i >= 0; i--) + { + uint bit = (uint)((symbol >> i) & 1); + uint state = context; + if (same) + { + uint matchBit = (uint)((matchByte >> i) & 1); + state += ((1 + matchBit) << 8); + same = (matchBit == bit); + } + m_Encoders[state].Encode(rangeEncoder, bit); + context = (context << 1) | bit; + } + } + + public uint GetPrice(bool matchMode, byte matchByte, byte symbol) + { + uint price = 0; + uint context = 1; + int i = 7; + if (matchMode) + { + for (; i >= 0; i--) + { + uint matchBit = (uint)(matchByte >> i) & 1; + uint bit = (uint)(symbol >> i) & 1; + price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit); + context = (context << 1) | bit; + if (matchBit != bit) + { + i--; + break; + } + } + } + for (; i >= 0; i--) + { + uint bit = (uint)(symbol >> i) & 1; + price += m_Encoders[context].GetPrice(bit); + context = (context << 1) | bit; + } + return price; + } + } + + Encoder2[] m_Coders; + int m_NumPrevBits; + int m_NumPosBits; + uint m_PosMask; + + public void Create(int numPosBits, int numPrevBits) + { + if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) + return; + m_NumPosBits = numPosBits; + m_PosMask = ((uint)1 << numPosBits) - 1; + m_NumPrevBits = numPrevBits; + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new Encoder2[numStates]; + for (uint i = 0; i < numStates; i++) + m_Coders[i].Create(); + } + + public void Init() + { + uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); + for (uint i = 0; i < numStates; i++) + m_Coders[i].Init(); + } + + public Encoder2 GetSubCoder(UInt32 pos, Byte prevByte) + { return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits))]; } + } + + class LenEncoder + { + RangeCoder.BitEncoder _choice = new RangeCoder.BitEncoder(); + RangeCoder.BitEncoder _choice2 = new RangeCoder.BitEncoder(); + RangeCoder.BitTreeEncoder[] _lowCoder = new RangeCoder.BitTreeEncoder[Base.kNumPosStatesEncodingMax]; + RangeCoder.BitTreeEncoder[] _midCoder = new RangeCoder.BitTreeEncoder[Base.kNumPosStatesEncodingMax]; + RangeCoder.BitTreeEncoder _highCoder = new RangeCoder.BitTreeEncoder(Base.kNumHighLenBits); + + public LenEncoder() + { + for (UInt32 posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++) + { + _lowCoder[posState] = new RangeCoder.BitTreeEncoder(Base.kNumLowLenBits); + _midCoder[posState] = new RangeCoder.BitTreeEncoder(Base.kNumMidLenBits); + } + } + + public void Init(UInt32 numPosStates) + { + _choice.Init(); + _choice2.Init(); + for (UInt32 posState = 0; posState < numPosStates; posState++) + { + _lowCoder[posState].Init(); + _midCoder[posState].Init(); + } + _highCoder.Init(); + } + + public void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState) + { + if (symbol < Base.kNumLowLenSymbols) + { + _choice.Encode(rangeEncoder, 0); + _lowCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + symbol -= Base.kNumLowLenSymbols; + _choice.Encode(rangeEncoder, 1); + if (symbol < Base.kNumMidLenSymbols) + { + _choice2.Encode(rangeEncoder, 0); + _midCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + _choice2.Encode(rangeEncoder, 1); + _highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols); + } + } + } + + public void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32[] prices, UInt32 st) + { + UInt32 a0 = _choice.GetPrice0(); + UInt32 a1 = _choice.GetPrice1(); + UInt32 b0 = a1 + _choice2.GetPrice0(); + UInt32 b1 = a1 + _choice2.GetPrice1(); + UInt32 i = 0; + for (i = 0; i < Base.kNumLowLenSymbols; i++) + { + if (i >= numSymbols) + return; + prices[st + i] = a0 + _lowCoder[posState].GetPrice(i); + } + for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++) + { + if (i >= numSymbols) + return; + prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols); + } + for (; i < numSymbols; i++) + prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols); + } + }; + + const UInt32 kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; + + class LenPriceTableEncoder : LenEncoder + { + UInt32[] _prices = new UInt32[Base.kNumLenSymbols << Base.kNumPosStatesBitsEncodingMax]; + UInt32 _tableSize; + UInt32[] _counters = new UInt32[Base.kNumPosStatesEncodingMax]; + + public void SetTableSize(UInt32 tableSize) { _tableSize = tableSize; } + + public UInt32 GetPrice(UInt32 symbol, UInt32 posState) + { + return _prices[posState * Base.kNumLenSymbols + symbol]; + } + + void UpdateTable(UInt32 posState) + { + SetPrices(posState, _tableSize, _prices, posState * Base.kNumLenSymbols); + _counters[posState] = _tableSize; + } + + public void UpdateTables(UInt32 numPosStates) + { + for (UInt32 posState = 0; posState < numPosStates; posState++) + UpdateTable(posState); + } + + public new void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState) + { + base.Encode(rangeEncoder, symbol, posState); + if (--_counters[posState] == 0) + UpdateTable(posState); + } + } + + const UInt32 kNumOpts = 1 << 12; + class Optimal + { + public Base.State State; + + public bool Prev1IsChar; + public bool Prev2; + + public UInt32 PosPrev2; + public UInt32 BackPrev2; + + public UInt32 Price; + public UInt32 PosPrev; + public UInt32 BackPrev; + + public UInt32 Backs0; + public UInt32 Backs1; + public UInt32 Backs2; + public UInt32 Backs3; + + public void MakeAsChar() { BackPrev = 0xFFFFFFFF; Prev1IsChar = false; } + public void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; } + public bool IsShortRep() { return (BackPrev == 0); } + }; + Optimal[] _optimum = new Optimal[kNumOpts]; + LZ.IMatchFinder _matchFinder = null; + RangeCoder.Encoder _rangeEncoder = new RangeCoder.Encoder(); + + RangeCoder.BitEncoder[] _isMatch = new RangeCoder.BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + RangeCoder.BitEncoder[] _isRep = new RangeCoder.BitEncoder[Base.kNumStates]; + RangeCoder.BitEncoder[] _isRepG0 = new RangeCoder.BitEncoder[Base.kNumStates]; + RangeCoder.BitEncoder[] _isRepG1 = new RangeCoder.BitEncoder[Base.kNumStates]; + RangeCoder.BitEncoder[] _isRepG2 = new RangeCoder.BitEncoder[Base.kNumStates]; + RangeCoder.BitEncoder[] _isRep0Long = new RangeCoder.BitEncoder[Base.kNumStates << Base.kNumPosStatesBitsMax]; + + RangeCoder.BitTreeEncoder[] _posSlotEncoder = new RangeCoder.BitTreeEncoder[Base.kNumLenToPosStates]; + + RangeCoder.BitEncoder[] _posEncoders = new RangeCoder.BitEncoder[Base.kNumFullDistances - Base.kEndPosModelIndex]; + RangeCoder.BitTreeEncoder _posAlignEncoder = new RangeCoder.BitTreeEncoder(Base.kNumAlignBits); + + LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder(); + LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder(); + + LiteralEncoder _literalEncoder = new LiteralEncoder(); + + UInt32[] _matchDistances = new UInt32[Base.kMatchMaxLen * 2 + 2]; + + UInt32 _numFastBytes = kNumFastBytesDefault; + UInt32 _longestMatchLength; + UInt32 _numDistancePairs; + + UInt32 _additionalOffset; + + UInt32 _optimumEndIndex; + UInt32 _optimumCurrentIndex; + + bool _longestMatchWasFound; + + UInt32[] _posSlotPrices = new UInt32[1 << (Base.kNumPosSlotBits + Base.kNumLenToPosStatesBits)]; + UInt32[] _distancesPrices = new UInt32[Base.kNumFullDistances << Base.kNumLenToPosStatesBits]; + UInt32[] _alignPrices = new UInt32[Base.kAlignTableSize]; + UInt32 _alignPriceCount; + + UInt32 _distTableSize = (kDefaultDictionaryLogSize * 2); + + int _posStateBits = 2; + UInt32 _posStateMask = (4 - 1); + int _numLiteralPosStateBits = 0; + int _numLiteralContextBits = 3; + + UInt32 _dictionarySize = (1 << kDefaultDictionaryLogSize); + UInt32 _dictionarySizePrev = 0xFFFFFFFF; + UInt32 _numFastBytesPrev = 0xFFFFFFFF; + + Int64 nowPos64; + bool _finished; + System.IO.Stream _inStream; + + EMatchFinderType _matchFinderType = EMatchFinderType.BT4; + bool _writeEndMark = false; + + bool _needReleaseMFStream; + + void Create() + { + if (_matchFinder == null) + { + LZ.BinTree bt = new LZ.BinTree(); + int numHashBytes = 4; + if (_matchFinderType == EMatchFinderType.BT2) + numHashBytes = 2; + bt.SetType(numHashBytes); + _matchFinder = bt; + } + _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits); + + if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes) + return; + _matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, Base.kMatchMaxLen + 1); + _dictionarySizePrev = _dictionarySize; + _numFastBytesPrev = _numFastBytes; + } + + public Encoder() + { + for (int i = 0; i < kNumOpts; i++) + _optimum[i] = new Optimal(); + for (int i = 0; i < Base.kNumLenToPosStates; i++) + _posSlotEncoder[i] = new RangeCoder.BitTreeEncoder(Base.kNumPosSlotBits); + } + + void SetWriteEndMarkerMode(bool writeEndMarker) + { + _writeEndMark = writeEndMarker; + } + + void Init() + { + BaseInit(); + _rangeEncoder.Init(); + + uint i; + for (i = 0; i < Base.kNumStates; i++) + { + for (uint j = 0; j <= _posStateMask; j++) + { + uint complexState = (i << Base.kNumPosStatesBitsMax) + j; + _isMatch[complexState].Init(); + _isRep0Long[complexState].Init(); + } + _isRep[i].Init(); + _isRepG0[i].Init(); + _isRepG1[i].Init(); + _isRepG2[i].Init(); + } + _literalEncoder.Init(); + for (i = 0; i < Base.kNumLenToPosStates; i++) + _posSlotEncoder[i].Init(); + for (i = 0; i < Base.kNumFullDistances - Base.kEndPosModelIndex; i++) + _posEncoders[i].Init(); + + _lenEncoder.Init((UInt32)1 << _posStateBits); + _repMatchLenEncoder.Init((UInt32)1 << _posStateBits); + + _posAlignEncoder.Init(); + + _longestMatchWasFound = false; + _optimumEndIndex = 0; + _optimumCurrentIndex = 0; + _additionalOffset = 0; + } + + void ReadMatchDistances(out UInt32 lenRes, out UInt32 numDistancePairs) + { + lenRes = 0; + numDistancePairs = _matchFinder.GetMatches(_matchDistances); + if (numDistancePairs > 0) + { + lenRes = _matchDistances[numDistancePairs - 2]; + if (lenRes == _numFastBytes) + lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[numDistancePairs - 1], + Base.kMatchMaxLen - lenRes); + } + _additionalOffset++; + } + + + void MovePos(UInt32 num) + { + if (num > 0) + { + _matchFinder.Skip(num); + _additionalOffset += num; + } + } + + UInt32 GetRepLen1Price(Base.State state, UInt32 posState) + { + return _isRepG0[state.Index].GetPrice0() + + _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0(); + } + + UInt32 GetPureRepPrice(UInt32 repIndex, Base.State state, UInt32 posState) + { + UInt32 price; + if (repIndex == 0) + { + price = _isRepG0[state.Index].GetPrice0(); + price += _isRep0Long[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + } + else + { + price = _isRepG0[state.Index].GetPrice1(); + if (repIndex == 1) + price += _isRepG1[state.Index].GetPrice0(); + else + { + price += _isRepG1[state.Index].GetPrice1(); + price += _isRepG2[state.Index].GetPrice(repIndex - 2); + } + } + return price; + } + + UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, Base.State state, UInt32 posState) + { + UInt32 price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState); + return price + GetPureRepPrice(repIndex, state, posState); + } + + UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState) + { + UInt32 price; + UInt32 lenToPosState = Base.GetLenToPosState(len); + if (pos < Base.kNumFullDistances) + price = _distancesPrices[(lenToPosState * Base.kNumFullDistances) + pos]; + else + price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] + + _alignPrices[pos & Base.kAlignMask]; + return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState); + } + + UInt32 Backward(out UInt32 backRes, UInt32 cur) + { + _optimumEndIndex = cur; + UInt32 posMem = _optimum[cur].PosPrev; + UInt32 backMem = _optimum[cur].BackPrev; + do + { + if (_optimum[cur].Prev1IsChar) + { + _optimum[posMem].MakeAsChar(); + _optimum[posMem].PosPrev = posMem - 1; + if (_optimum[cur].Prev2) + { + _optimum[posMem - 1].Prev1IsChar = false; + _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; + _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; + } + } + UInt32 posPrev = posMem; + UInt32 backCur = backMem; + + backMem = _optimum[posPrev].BackPrev; + posMem = _optimum[posPrev].PosPrev; + + _optimum[posPrev].BackPrev = backCur; + _optimum[posPrev].PosPrev = cur; + cur = posPrev; + } + while (cur > 0); + backRes = _optimum[0].BackPrev; + _optimumCurrentIndex = _optimum[0].PosPrev; + return _optimumCurrentIndex; + } + + UInt32[] reps = new UInt32[Base.kNumRepDistances]; + UInt32[] repLens = new UInt32[Base.kNumRepDistances]; + + + UInt32 GetOptimum(UInt32 position, out UInt32 backRes) + { + if (_optimumEndIndex != _optimumCurrentIndex) + { + UInt32 lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; + backRes = _optimum[_optimumCurrentIndex].BackPrev; + _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; + return lenRes; + } + _optimumCurrentIndex = _optimumEndIndex = 0; + + UInt32 lenMain, numDistancePairs; + if (!_longestMatchWasFound) + { + ReadMatchDistances(out lenMain, out numDistancePairs); + } + else + { + lenMain = _longestMatchLength; + numDistancePairs = _numDistancePairs; + _longestMatchWasFound = false; + } + + UInt32 numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1; + if (numAvailableBytes < 2) + { + backRes = 0xFFFFFFFF; + return 1; + } + if (numAvailableBytes > Base.kMatchMaxLen) + numAvailableBytes = Base.kMatchMaxLen; + + UInt32 repMaxIndex = 0; + UInt32 i; + for (i = 0; i < Base.kNumRepDistances; i++) + { + reps[i] = _repDistances[i]; + repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen); + if (repLens[i] > repLens[repMaxIndex]) + repMaxIndex = i; + } + if (repLens[repMaxIndex] >= _numFastBytes) + { + backRes = repMaxIndex; + UInt32 lenRes = repLens[repMaxIndex]; + MovePos(lenRes - 1); + return lenRes; + } + + if (lenMain >= _numFastBytes) + { + backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances; + MovePos(lenMain - 1); + return lenMain; + } + + Byte currentByte = _matchFinder.GetIndexByte(0 - 1); + Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - 1)); + + if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) + { + backRes = (UInt32)0xFFFFFFFF; + return 1; + } + + _optimum[0].State = _state; + + UInt32 posState = (position & _posStateMask); + + _optimum[1].Price = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + + _literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!_state.IsCharState(), matchByte, currentByte); + _optimum[1].MakeAsChar(); + + UInt32 matchPrice = _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); + + if (matchByte == currentByte) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); + if (shortRepPrice < _optimum[1].Price) + { + _optimum[1].Price = shortRepPrice; + _optimum[1].MakeAsShortRep(); + } + } + + UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); + + if(lenEnd < 2) + { + backRes = _optimum[1].BackPrev; + return 1; + } + + _optimum[1].PosPrev = 0; + + _optimum[0].Backs0 = reps[0]; + _optimum[0].Backs1 = reps[1]; + _optimum[0].Backs2 = reps[2]; + _optimum[0].Backs3 = reps[3]; + + UInt32 len = lenEnd; + do + _optimum[len--].Price = kIfinityPrice; + while (len >= 2); + + for (i = 0; i < Base.kNumRepDistances; i++) + { + UInt32 repLen = repLens[i]; + if (repLen < 2) + continue; + UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState); + do + { + UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); + Optimal optimum = _optimum[repLen]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = i; + optimum.Prev1IsChar = false; + } + } + while (--repLen >= 2); + } + + UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); + + len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= lenMain) + { + UInt32 offs = 0; + while (len > _matchDistances[offs]) + offs += 2; + for (; ; len++) + { + UInt32 distance = _matchDistances[offs + 1]; + UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); + Optimal optimum = _optimum[len]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = distance + Base.kNumRepDistances; + optimum.Prev1IsChar = false; + } + if (len == _matchDistances[offs]) + { + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + + UInt32 cur = 0; + + while (true) + { + cur++; + if (cur == lenEnd) + return Backward(out backRes, cur); + UInt32 newLen; + ReadMatchDistances(out newLen, out numDistancePairs); + if (newLen >= _numFastBytes) + { + _numDistancePairs = numDistancePairs; + _longestMatchLength = newLen; + _longestMatchWasFound = true; + return Backward(out backRes, cur); + } + position++; + UInt32 posPrev = _optimum[cur].PosPrev; + Base.State state; + if (_optimum[cur].Prev1IsChar) + { + posPrev--; + if (_optimum[cur].Prev2) + { + state = _optimum[_optimum[cur].PosPrev2].State; + if (_optimum[cur].BackPrev2 < Base.kNumRepDistances) + state.UpdateRep(); + else + state.UpdateMatch(); + } + else + state = _optimum[posPrev].State; + state.UpdateChar(); + } + else + state = _optimum[posPrev].State; + if (posPrev == cur - 1) + { + if (_optimum[cur].IsShortRep()) + state.UpdateShortRep(); + else + state.UpdateChar(); + } + else + { + UInt32 pos; + if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2) + { + posPrev = _optimum[cur].PosPrev2; + pos = _optimum[cur].BackPrev2; + state.UpdateRep(); + } + else + { + pos = _optimum[cur].BackPrev; + if (pos < Base.kNumRepDistances) + state.UpdateRep(); + else + state.UpdateMatch(); + } + Optimal opt = _optimum[posPrev]; + if (pos < Base.kNumRepDistances) + { + if (pos == 0) + { + reps[0] = opt.Backs0; + reps[1] = opt.Backs1; + reps[2] = opt.Backs2; + reps[3] = opt.Backs3; + } + else if (pos == 1) + { + reps[0] = opt.Backs1; + reps[1] = opt.Backs0; + reps[2] = opt.Backs2; + reps[3] = opt.Backs3; + } + else if (pos == 2) + { + reps[0] = opt.Backs2; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs3; + } + else + { + reps[0] = opt.Backs3; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs2; + } + } + else + { + reps[0] = (pos - Base.kNumRepDistances); + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs2; + } + } + _optimum[cur].State = state; + _optimum[cur].Backs0 = reps[0]; + _optimum[cur].Backs1 = reps[1]; + _optimum[cur].Backs2 = reps[2]; + _optimum[cur].Backs3 = reps[3]; + UInt32 curPrice = _optimum[cur].Price; + + currentByte = _matchFinder.GetIndexByte(0 - 1); + matchByte = _matchFinder.GetIndexByte((Int32)(0 - reps[0] - 1 - 1)); + + posState = (position & _posStateMask); + + UInt32 curAnd1Price = curPrice + + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice0() + + _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). + GetPrice(!state.IsCharState(), matchByte, currentByte); + + Optimal nextOptimum = _optimum[cur + 1]; + + bool nextIsChar = false; + if (curAnd1Price < nextOptimum.Price) + { + nextOptimum.Price = curAnd1Price; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsChar(); + nextIsChar = true; + } + + matchPrice = curPrice + _isMatch[(state.Index << Base.kNumPosStatesBitsMax) + posState].GetPrice1(); + repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); + + if (matchByte == currentByte && + !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); + if (shortRepPrice <= nextOptimum.Price) + { + nextOptimum.Price = shortRepPrice; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsShortRep(); + nextIsChar = true; + } + } + + UInt32 numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1; + numAvailableBytesFull = Math.Min(kNumOpts - 1 - cur, numAvailableBytesFull); + numAvailableBytes = numAvailableBytesFull; + + if (numAvailableBytes < 2) + continue; + if (numAvailableBytes > _numFastBytes) + numAvailableBytes = _numFastBytes; + if (!nextIsChar && matchByte != currentByte) + { + // try Literal + rep0 + UInt32 t = Math.Min(numAvailableBytesFull - 1, _numFastBytes); + UInt32 lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t); + if (lenTest2 >= 2) + { + Base.State state2 = state; + state2.UpdateChar(); + UInt32 posStateNext = (position + 1) & _posStateMask; + UInt32 nextRepMatchPrice = curAnd1Price + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1() + + _isRep[state2.Index].GetPrice1(); + { + UInt32 offset = cur + 1 + lenTest2; + while (lenEnd < offset) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice( + 0, lenTest2, state2, posStateNext); + Optimal optimum = _optimum[offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = false; + } + } + } + } + + UInt32 startLen = 2; // speed optimization + + for (UInt32 repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++) + { + UInt32 lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); + if (lenTest < 2) + continue; + UInt32 lenTestTemp = lenTest; + do + { + while (lenEnd < cur + lenTest) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); + Optimal optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = repIndex; + optimum.Prev1IsChar = false; + } + } + while(--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + // if (_maxMode) + if (lenTest < numAvailableBytesFull) + { + UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); + UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, reps[repIndex], t); + if (lenTest2 >= 2) + { + Base.State state2 = state; + state2.UpdateRep(); + UInt32 posStateNext = (position + lenTest) & _posStateMask; + UInt32 curAndLenCharPrice = + repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + + _literalEncoder.GetSubCoder(position + lenTest, + _matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)).GetPrice(true, + _matchFinder.GetIndexByte((Int32)((Int32)lenTest - 1 - (Int32)(reps[repIndex] + 1))), + _matchFinder.GetIndexByte((Int32)lenTest - 1)); + state2.UpdateChar(); + posStateNext = (position + lenTest + 1) & _posStateMask; + UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); + UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); + + // for(; lenTest2 >= 2; lenTest2--) + { + UInt32 offset = lenTest + 1 + lenTest2; + while(lenEnd < cur + offset) + _optimum[++lenEnd].Price = kIfinityPrice; + UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + Optimal optimum = _optimum[cur + offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = repIndex; + } + } + } + } + } + + if (newLen > numAvailableBytes) + { + newLen = numAvailableBytes; + for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ; + _matchDistances[numDistancePairs] = newLen; + numDistancePairs += 2; + } + if (newLen >= startLen) + { + normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); + while (lenEnd < cur + newLen) + _optimum[++lenEnd].Price = kIfinityPrice; + + UInt32 offs = 0; + while (startLen > _matchDistances[offs]) + offs += 2; + + for (UInt32 lenTest = startLen; ; lenTest++) + { + UInt32 curBack = _matchDistances[offs + 1]; + UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); + Optimal optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = curBack + Base.kNumRepDistances; + optimum.Prev1IsChar = false; + } + + if (lenTest == _matchDistances[offs]) + { + if (lenTest < numAvailableBytesFull) + { + UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); + UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, curBack, t); + if (lenTest2 >= 2) + { + Base.State state2 = state; + state2.UpdateMatch(); + UInt32 posStateNext = (position + lenTest) & _posStateMask; + UInt32 curAndLenCharPrice = curAndLenPrice + + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + + _literalEncoder.GetSubCoder(position + lenTest, + _matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)). + GetPrice(true, + _matchFinder.GetIndexByte((Int32)lenTest - (Int32)(curBack + 1) - 1), + _matchFinder.GetIndexByte((Int32)lenTest - 1)); + state2.UpdateChar(); + posStateNext = (position + lenTest + 1) & _posStateMask; + UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << Base.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); + UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); + + UInt32 offset = lenTest + 1 + lenTest2; + while (lenEnd < cur + offset) + _optimum[++lenEnd].Price = kIfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + optimum = _optimum[cur + offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = curBack + Base.kNumRepDistances; + } + } + } + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + } + } + + bool ChangePair(UInt32 smallDist, UInt32 bigDist) + { + const int kDif = 7; + return (smallDist < ((UInt32)(1) << (32 - kDif)) && bigDist >= (smallDist << kDif)); + } + + void WriteEndMarker(UInt32 posState) + { + if (!_writeEndMark) + return; + + _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1); + _isRep[_state.Index].Encode(_rangeEncoder, 0); + _state.UpdateMatch(); + UInt32 len = Base.kMatchMinLen; + _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + UInt32 posSlot = (1 << Base.kNumPosSlotBits) - 1; + UInt32 lenToPosState = Base.GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); + int footerBits = 30; + UInt32 posReduced = (((UInt32)1) << footerBits) - 1; + _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); + _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); + } + + void Flush(UInt32 nowPos) + { + ReleaseMFStream(); + WriteEndMarker(nowPos & _posStateMask); + _rangeEncoder.FlushData(); + _rangeEncoder.FlushStream(); + } + + public void CodeOneBlock(out Int64 inSize, out Int64 outSize, out bool finished) + { + inSize = 0; + outSize = 0; + finished = true; + + if (_inStream != null) + { + _matchFinder.SetStream(_inStream); + _matchFinder.Init(); + _needReleaseMFStream = true; + _inStream = null; + if (_trainSize > 0) + _matchFinder.Skip(_trainSize); + } + + if (_finished) + return; + _finished = true; + + + Int64 progressPosValuePrev = nowPos64; + if (nowPos64 == 0) + { + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((UInt32)nowPos64); + return; + } + UInt32 len, numDistancePairs; // it's not used + ReadMatchDistances(out len, out numDistancePairs); + UInt32 posState = (UInt32)(nowPos64) & _posStateMask; + _isMatch[(_state.Index << Base.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0); + _state.UpdateChar(); + Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset)); + _literalEncoder.GetSubCoder((UInt32)(nowPos64), _previousByte).Encode(_rangeEncoder, curByte); + _previousByte = curByte; + _additionalOffset--; + nowPos64++; + } + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((UInt32)nowPos64); + return; + } + while (true) + { + UInt32 pos; + UInt32 len = GetOptimum((UInt32)nowPos64, out pos); + + UInt32 posState = ((UInt32)nowPos64) & _posStateMask; + UInt32 complexState = (_state.Index << Base.kNumPosStatesBitsMax) + posState; + if (len == 1 && pos == 0xFFFFFFFF) + { + _isMatch[complexState].Encode(_rangeEncoder, 0); + Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset)); + LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((UInt32)nowPos64, _previousByte); + if (!_state.IsCharState()) + { + Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - _additionalOffset)); + subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); + } + else + subCoder.Encode(_rangeEncoder, curByte); + _previousByte = curByte; + _state.UpdateChar(); + } + else + { + _isMatch[complexState].Encode(_rangeEncoder, 1); + if (pos < Base.kNumRepDistances) + { + _isRep[_state.Index].Encode(_rangeEncoder, 1); + if (pos == 0) + { + _isRepG0[_state.Index].Encode(_rangeEncoder, 0); + if (len == 1) + _isRep0Long[complexState].Encode(_rangeEncoder, 0); + else + _isRep0Long[complexState].Encode(_rangeEncoder, 1); + } + else + { + _isRepG0[_state.Index].Encode(_rangeEncoder, 1); + if (pos == 1) + _isRepG1[_state.Index].Encode(_rangeEncoder, 0); + else + { + _isRepG1[_state.Index].Encode(_rangeEncoder, 1); + _isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2); + } + } + if (len == 1) + _state.UpdateShortRep(); + else + { + _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + _state.UpdateRep(); + } + UInt32 distance = _repDistances[pos]; + if (pos != 0) + { + for (UInt32 i = pos; i >= 1; i--) + _repDistances[i] = _repDistances[i - 1]; + _repDistances[0] = distance; + } + } + else + { + _isRep[_state.Index].Encode(_rangeEncoder, 0); + _state.UpdateMatch(); + _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + pos -= Base.kNumRepDistances; + UInt32 posSlot = GetPosSlot(pos); + UInt32 lenToPosState = Base.GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); + + if (posSlot >= Base.kStartPosModelIndex) + { + int footerBits = (int)((posSlot >> 1) - 1); + UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits); + UInt32 posReduced = pos - baseVal; + + if (posSlot < Base.kEndPosModelIndex) + RangeCoder.BitTreeEncoder.ReverseEncode(_posEncoders, + baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced); + else + { + _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); + _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); + _alignPriceCount++; + } + } + UInt32 distance = pos; + for (UInt32 i = Base.kNumRepDistances - 1; i >= 1; i--) + _repDistances[i] = _repDistances[i - 1]; + _repDistances[0] = distance; + _matchPriceCount++; + } + _previousByte = _matchFinder.GetIndexByte((Int32)(len - 1 - _additionalOffset)); + } + _additionalOffset -= len; + nowPos64 += len; + if (_additionalOffset == 0) + { + // if (!_fastMode) + if (_matchPriceCount >= (1 << 7)) + FillDistancesPrices(); + if (_alignPriceCount >= Base.kAlignTableSize) + FillAlignPrices(); + inSize = nowPos64; + outSize = _rangeEncoder.GetProcessedSizeAdd(); + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((UInt32)nowPos64); + return; + } + + if (nowPos64 - progressPosValuePrev >= (1 << 12)) + { + _finished = false; + finished = false; + return; + } + } + } + } + + void ReleaseMFStream() + { + if (_matchFinder != null && _needReleaseMFStream) + { + _matchFinder.ReleaseStream(); + _needReleaseMFStream = false; + } + } + + void SetOutStream(System.IO.Stream outStream) { _rangeEncoder.SetStream(outStream); } + void ReleaseOutStream() { _rangeEncoder.ReleaseStream(); } + + void ReleaseStreams() + { + ReleaseMFStream(); + ReleaseOutStream(); + } + + void SetStreams(System.IO.Stream inStream, System.IO.Stream outStream, + Int64 inSize, Int64 outSize) + { + _inStream = inStream; + _finished = false; + Create(); + SetOutStream(outStream); + Init(); + + // if (!_fastMode) + { + FillDistancesPrices(); + FillAlignPrices(); + } + + _lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); + _lenEncoder.UpdateTables((UInt32)1 << _posStateBits); + _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); + _repMatchLenEncoder.UpdateTables((UInt32)1 << _posStateBits); + + nowPos64 = 0; + } + + + public void Code(System.IO.Stream inStream, System.IO.Stream outStream, + Int64 inSize, Int64 outSize, ICodeProgress progress) + { + _needReleaseMFStream = false; + try + { + SetStreams(inStream, outStream, inSize, outSize); + while (true) + { + Int64 processedInSize; + Int64 processedOutSize; + bool finished; + CodeOneBlock(out processedInSize, out processedOutSize, out finished); + if (finished) + return; + if (progress != null) + { + progress.SetProgress(processedInSize, processedOutSize); + } + } + } + finally + { + ReleaseStreams(); + } + } + + const int kPropSize = 5; + Byte[] properties = new Byte[kPropSize]; + + public void WriteCoderProperties(System.IO.Stream outStream) + { + properties[0] = (Byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); + for (int i = 0; i < 4; i++) + properties[1 + i] = (Byte)(_dictionarySize >> (8 * i)); + outStream.Write(properties, 0, kPropSize); + } + + UInt32[] tempPrices = new UInt32[Base.kNumFullDistances]; + UInt32 _matchPriceCount; + + void FillDistancesPrices() + { + for (UInt32 i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++) + { + UInt32 posSlot = GetPosSlot(i); + int footerBits = (int)((posSlot >> 1) - 1); + UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits); + tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, + baseVal - posSlot - 1, footerBits, i - baseVal); + } + + for (UInt32 lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++) + { + UInt32 posSlot; + RangeCoder.BitTreeEncoder encoder = _posSlotEncoder[lenToPosState]; + + UInt32 st = (lenToPosState << Base.kNumPosSlotBits); + for (posSlot = 0; posSlot < _distTableSize; posSlot++) + _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); + for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) + _posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - Base.kNumAlignBits) << RangeCoder.BitEncoder.kNumBitPriceShiftBits); + + UInt32 st2 = lenToPosState * Base.kNumFullDistances; + UInt32 i; + for (i = 0; i < Base.kStartPosModelIndex; i++) + _distancesPrices[st2 + i] = _posSlotPrices[st + i]; + for (; i < Base.kNumFullDistances; i++) + _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; + } + _matchPriceCount = 0; + } + + void FillAlignPrices() + { + for (UInt32 i = 0; i < Base.kAlignTableSize; i++) + _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); + _alignPriceCount = 0; + } + + + static string[] kMatchFinderIDs = + { + "BT2", + "BT4", + }; + + static int FindMatchFinder(string s) + { + for (int m = 0; m < kMatchFinderIDs.Length; m++) + if (s == kMatchFinderIDs[m]) + return m; + return -1; + } + + public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) + { + for (UInt32 i = 0; i < properties.Length; i++) + { + object prop = properties[i]; + switch (propIDs[i]) + { + case CoderPropID.NumFastBytes: + { + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 numFastBytes = (Int32)prop; + if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen) + throw new InvalidParamException(); + _numFastBytes = (UInt32)numFastBytes; + break; + } + case CoderPropID.Algorithm: + { + /* + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 maximize = (Int32)prop; + _fastMode = (maximize == 0); + _maxMode = (maximize >= 2); + */ + break; + } + case CoderPropID.MatchFinder: + { + if (!(prop is String)) + throw new InvalidParamException(); + EMatchFinderType matchFinderIndexPrev = _matchFinderType; + int m = FindMatchFinder(((string)prop).ToUpper()); + if (m < 0) + throw new InvalidParamException(); + _matchFinderType = (EMatchFinderType)m; + if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType) + { + _dictionarySizePrev = 0xFFFFFFFF; + _matchFinder = null; + } + break; + } + case CoderPropID.DictionarySize: + { + const int kDicLogSizeMaxCompress = 30; + if (!(prop is Int32)) + throw new InvalidParamException(); ; + Int32 dictionarySize = (Int32)prop; + if (dictionarySize < (UInt32)(1 << Base.kDicLogSizeMin) || + dictionarySize > (UInt32)(1 << kDicLogSizeMaxCompress)) + throw new InvalidParamException(); + _dictionarySize = (UInt32)dictionarySize; + int dicLogSize; + for (dicLogSize = 0; dicLogSize < (UInt32)kDicLogSizeMaxCompress; dicLogSize++) + if (dictionarySize <= ((UInt32)(1) << dicLogSize)) + break; + _distTableSize = (UInt32)dicLogSize * 2; + break; + } + case CoderPropID.PosStateBits: + { + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 v = (Int32)prop; + if (v < 0 || v > (UInt32)Base.kNumPosStatesBitsEncodingMax) + throw new InvalidParamException(); + _posStateBits = (int)v; + _posStateMask = (((UInt32)1) << (int)_posStateBits) - 1; + break; + } + case CoderPropID.LitPosBits: + { + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 v = (Int32)prop; + if (v < 0 || v > (UInt32)Base.kNumLitPosStatesBitsEncodingMax) + throw new InvalidParamException(); + _numLiteralPosStateBits = (int)v; + break; + } + case CoderPropID.LitContextBits: + { + if (!(prop is Int32)) + throw new InvalidParamException(); + Int32 v = (Int32)prop; + if (v < 0 || v > (UInt32)Base.kNumLitContextBitsMax) + throw new InvalidParamException(); ; + _numLiteralContextBits = (int)v; + break; + } + case CoderPropID.EndMarker: + { + if (!(prop is Boolean)) + throw new InvalidParamException(); + SetWriteEndMarkerMode((Boolean)prop); + break; + } + default: + throw new InvalidParamException(); + } + } + } + + uint _trainSize = 0; + public void SetTrainSize(uint trainSize) + { + _trainSize = trainSize; + } + + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,364 @@ +using System; +using System.IO; +namespace SevenZip +{ + using CommandLineParser; + + public class CDoubleStream: Stream + { + public System.IO.Stream s1; + public System.IO.Stream s2; + public int fileIndex; + public long skipSize; + + public override bool CanRead { get { return true; }} + public override bool CanWrite { get { return false; }} + public override bool CanSeek { get { return false; }} + public override long Length { get { return s1.Length + s2.Length - skipSize; } } + public override long Position + { + get { return 0; } + set { } + } + public override void Flush() { } + public override int Read(byte[] buffer, int offset, int count) + { + int numTotal = 0; + while (count > 0) + { + if (fileIndex == 0) + { + int num = s1.Read(buffer, offset, count); + offset += num; + count -= num; + numTotal += num; + if (num == 0) + fileIndex++; + } + if (fileIndex == 1) + { + numTotal += s2.Read(buffer, offset, count); + return numTotal; + } + } + return numTotal; + } + public override void Write(byte[] buffer, int offset, int count) + { + throw (new Exception("can't Write")); + } + public override long Seek(long offset, System.IO.SeekOrigin origin) + { + throw (new Exception("can't Seek")); + } + public override void SetLength(long value) + { + throw (new Exception("can't SetLength")); + } + } + + class LzmaAlone + { + enum Key + { + Help1 = 0, + Help2, + Mode, + Dictionary, + FastBytes, + LitContext, + LitPos, + PosBits, + MatchFinder, + EOS, + StdIn, + StdOut, + Train + }; + + static void PrintHelp() + { + System.Console.WriteLine("\nUsage: LZMA [...] inputFile outputFile\n" + + " e: encode file\n" + + " d: decode file\n" + + " b: Benchmark\n" + + "\n" + + // " -a{N}: set compression mode - [0, 1], default: 1 (max)\n" + + " -d{N}: set dictionary - [0, 29], default: 23 (8MB)\n" + + " -fb{N}: set number of fast bytes - [5, 273], default: 128\n" + + " -lc{N}: set number of literal context bits - [0, 8], default: 3\n" + + " -lp{N}: set number of literal pos bits - [0, 4], default: 0\n" + + " -pb{N}: set number of pos bits - [0, 4], default: 2\n" + + " -mf{MF_ID}: set Match Finder: [bt2, bt4], default: bt4\n" + + " -eos: write End Of Stream marker\n" + // + " -si: read data from stdin\n" + // + " -so: write data to stdout\n" + ); + } + + static bool GetNumber(string s, out Int32 v) + { + v = 0; + for (int i = 0; i < s.Length; i++) + { + char c = s[i]; + if (c < '0' || c > '9') + return false; + v *= 10; + v += (Int32)(c - '0'); + } + return true; + } + + static int IncorrectCommand() + { + throw (new Exception("Command line error")); + // System.Console.WriteLine("\nCommand line error\n"); + // return 1; + } + static int Main2(string[] args) + { + System.Console.WriteLine("\nLZMA# 4.49 Copyright (c) 1999-2007 Igor Pavlov 2006-07-05\n"); + + if (args.Length == 0) + { + PrintHelp(); + return 0; + } + + SwitchForm[] kSwitchForms = new SwitchForm[13]; + int sw = 0; + kSwitchForms[sw++] = new SwitchForm("?", SwitchType.Simple, false); + kSwitchForms[sw++] = new SwitchForm("H", SwitchType.Simple, false); + kSwitchForms[sw++] = new SwitchForm("A", SwitchType.UnLimitedPostString, false, 1); + kSwitchForms[sw++] = new SwitchForm("D", SwitchType.UnLimitedPostString, false, 1); + kSwitchForms[sw++] = new SwitchForm("FB", SwitchType.UnLimitedPostString, false, 1); + kSwitchForms[sw++] = new SwitchForm("LC", SwitchType.UnLimitedPostString, false, 1); + kSwitchForms[sw++] = new SwitchForm("LP", SwitchType.UnLimitedPostString, false, 1); + kSwitchForms[sw++] = new SwitchForm("PB", SwitchType.UnLimitedPostString, false, 1); + kSwitchForms[sw++] = new SwitchForm("MF", SwitchType.UnLimitedPostString, false, 1); + kSwitchForms[sw++] = new SwitchForm("EOS", SwitchType.Simple, false); + kSwitchForms[sw++] = new SwitchForm("SI", SwitchType.Simple, false); + kSwitchForms[sw++] = new SwitchForm("SO", SwitchType.Simple, false); + kSwitchForms[sw++] = new SwitchForm("T", SwitchType.UnLimitedPostString, false, 1); + + + Parser parser = new Parser(sw); + try + { + parser.ParseStrings(kSwitchForms, args); + } + catch + { + return IncorrectCommand(); + } + + if (parser[(int)Key.Help1].ThereIs || parser[(int)Key.Help2].ThereIs) + { + PrintHelp(); + return 0; + } + + System.Collections.ArrayList nonSwitchStrings = parser.NonSwitchStrings; + + int paramIndex = 0; + if (paramIndex >= nonSwitchStrings.Count) + return IncorrectCommand(); + string command = (string)nonSwitchStrings[paramIndex++]; + command = command.ToLower(); + + bool dictionaryIsDefined = false; + Int32 dictionary = 1 << 21; + if (parser[(int)Key.Dictionary].ThereIs) + { + Int32 dicLog; + if (!GetNumber((string)parser[(int)Key.Dictionary].PostStrings[0], out dicLog)) + IncorrectCommand(); + dictionary = (Int32)1 << dicLog; + dictionaryIsDefined = true; + } + string mf = "bt4"; + if (parser[(int)Key.MatchFinder].ThereIs) + mf = (string)parser[(int)Key.MatchFinder].PostStrings[0]; + mf = mf.ToLower(); + + if (command == "b") + { + const Int32 kNumDefaultItereations = 10; + Int32 numIterations = kNumDefaultItereations; + if (paramIndex < nonSwitchStrings.Count) + if (!GetNumber((string)nonSwitchStrings[paramIndex++], out numIterations)) + numIterations = kNumDefaultItereations; + return LzmaBench.LzmaBenchmark(numIterations, (UInt32)dictionary); + } + + string train = ""; + if (parser[(int)Key.Train].ThereIs) + train = (string)parser[(int)Key.Train].PostStrings[0]; + + bool encodeMode = false; + if (command == "e") + encodeMode = true; + else if (command == "d") + encodeMode = false; + else + IncorrectCommand(); + + bool stdInMode = parser[(int)Key.StdIn].ThereIs; + bool stdOutMode = parser[(int)Key.StdOut].ThereIs; + + Stream inStream = null; + if (stdInMode) + { + throw (new Exception("Not implemeted")); + } + else + { + if (paramIndex >= nonSwitchStrings.Count) + IncorrectCommand(); + string inputName = (string)nonSwitchStrings[paramIndex++]; + inStream = new FileStream(inputName, FileMode.Open, FileAccess.Read); + } + + FileStream outStream = null; + if (stdOutMode) + { + throw (new Exception("Not implemeted")); + } + else + { + if (paramIndex >= nonSwitchStrings.Count) + IncorrectCommand(); + string outputName = (string)nonSwitchStrings[paramIndex++]; + outStream = new FileStream(outputName, FileMode.Create, FileAccess.Write); + } + + FileStream trainStream = null; + if (train.Length != 0) + trainStream = new FileStream(train, FileMode.Open, FileAccess.Read); + + if (encodeMode) + { + if (!dictionaryIsDefined) + dictionary = 1 << 23; + + Int32 posStateBits = 2; + Int32 litContextBits = 3; // for normal files + // UInt32 litContextBits = 0; // for 32-bit data + Int32 litPosBits = 0; + // UInt32 litPosBits = 2; // for 32-bit data + Int32 algorithm = 2; + Int32 numFastBytes = 128; + + bool eos = parser[(int)Key.EOS].ThereIs || stdInMode; + + if (parser[(int)Key.Mode].ThereIs) + if (!GetNumber((string)parser[(int)Key.Mode].PostStrings[0], out algorithm)) + IncorrectCommand(); + + if (parser[(int)Key.FastBytes].ThereIs) + if (!GetNumber((string)parser[(int)Key.FastBytes].PostStrings[0], out numFastBytes)) + IncorrectCommand(); + if (parser[(int)Key.LitContext].ThereIs) + if (!GetNumber((string)parser[(int)Key.LitContext].PostStrings[0], out litContextBits)) + IncorrectCommand(); + if (parser[(int)Key.LitPos].ThereIs) + if (!GetNumber((string)parser[(int)Key.LitPos].PostStrings[0], out litPosBits)) + IncorrectCommand(); + if (parser[(int)Key.PosBits].ThereIs) + if (!GetNumber((string)parser[(int)Key.PosBits].PostStrings[0], out posStateBits)) + IncorrectCommand(); + + CoderPropID[] propIDs = + { + CoderPropID.DictionarySize, + CoderPropID.PosStateBits, + CoderPropID.LitContextBits, + CoderPropID.LitPosBits, + CoderPropID.Algorithm, + CoderPropID.NumFastBytes, + CoderPropID.MatchFinder, + CoderPropID.EndMarker + }; + object[] properties = + { + (Int32)(dictionary), + (Int32)(posStateBits), + (Int32)(litContextBits), + (Int32)(litPosBits), + (Int32)(algorithm), + (Int32)(numFastBytes), + mf, + eos + }; + + Compression.LZMA.Encoder encoder = new Compression.LZMA.Encoder(); + encoder.SetCoderProperties(propIDs, properties); + encoder.WriteCoderProperties(outStream); + Int64 fileSize; + if (eos || stdInMode) + fileSize = -1; + else + fileSize = inStream.Length; + for (int i = 0; i < 8; i++) + outStream.WriteByte((Byte)(fileSize >> (8 * i))); + if (trainStream != null) + { + CDoubleStream doubleStream = new CDoubleStream(); + doubleStream.s1 = trainStream; + doubleStream.s2 = inStream; + doubleStream.fileIndex = 0; + inStream = doubleStream; + long trainFileSize = trainStream.Length; + doubleStream.skipSize = 0; + if (trainFileSize > dictionary) + doubleStream.skipSize = trainFileSize - dictionary; + trainStream.Seek(doubleStream.skipSize, SeekOrigin.Begin); + encoder.SetTrainSize((uint)(trainFileSize - doubleStream.skipSize)); + } + encoder.Code(inStream, outStream, -1, -1, null); + } + else if (command == "d") + { + byte[] properties = new byte[5]; + if (inStream.Read(properties, 0, 5) != 5) + throw (new Exception("input .lzma is too short")); + Compression.LZMA.Decoder decoder = new Compression.LZMA.Decoder(); + decoder.SetDecoderProperties(properties); + if (trainStream != null) + { + if (!decoder.Train(trainStream)) + throw (new Exception("can't train")); + } + long outSize = 0; + for (int i = 0; i < 8; i++) + { + int v = inStream.ReadByte(); + if (v < 0) + throw (new Exception("Can't Read 1")); + outSize |= ((long)(byte)v) << (8 * i); + } + long compressedSize = inStream.Length - inStream.Position; + decoder.Code(inStream, outStream, compressedSize, outSize, null); + } + else + throw (new Exception("Command Error")); + return 0; + } + + [STAThread] + static int Main(string[] args) + { + try + { + return Main2(args); + } + catch (Exception e) + { + Console.WriteLine("{0} Caught exception #1.", e); + // throw e; + return 1; + } + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.csproj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.csproj Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,90 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {CE33DF18-F9C8-4D6F-9057-DBB4DB96E973} + Exe + LzmaAlone + Lzma# + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + AnyCPU + + + + + + + + + Common\CommandLineParser.cs + + + Common\CRC.cs + + + ICoder.cs + + + LZ\IMatchFinder.cs + + + LZ\LzBinTree.cs + + + LZ\LzInWindow.cs + + + LZ\LzOutWindow.cs + + + LZMA\LzmaBase.cs + + + LZMA\LzmaDecoder.cs + + + LZMA\LzmaEncoder.cs + + + RangeCoder\RangeCoder.cs + + + RangeCoder\RangeCoderBit.cs + + + RangeCoder\RangeCoderBitTree.cs + + + Code + + + Code + + + + True + Settings.settings + + + SettingsSingleFileGenerator + Settings.cs + + + + + \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.sln --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.sln Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C# Express 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LzmaAlone", "LzmaAlone.csproj", "{CE33DF18-F9C8-4D6F-9057-DBB4DB96E973}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CE33DF18-F9C8-4D6F-9057-DBB4DB96E973}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE33DF18-F9C8-4D6F-9057-DBB4DB96E973}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE33DF18-F9C8-4D6F-9057-DBB4DB96E973}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE33DF18-F9C8-4D6F-9057-DBB4DB96E973}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/LzmaBench.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/LzmaBench.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,340 @@ +// LzmaBench.cs + +using System; +using System.IO; + +namespace SevenZip +{ + ///

+ /// LZMA Benchmark + /// + internal abstract class LzmaBench + { + const UInt32 kAdditionalSize = (6 << 20); + const UInt32 kCompressedAdditionalSize = (1 << 10); + const UInt32 kMaxLzmaPropSize = 10; + + class CRandomGenerator + { + UInt32 A1; + UInt32 A2; + public CRandomGenerator() { Init(); } + public void Init() { A1 = 362436069; A2 = 521288629; } + public UInt32 GetRnd() + { + return + ((A1 = 36969 * (A1 & 0xffff) + (A1 >> 16)) << 16) ^ + ((A2 = 18000 * (A2 & 0xffff) + (A2 >> 16))); + } + }; + + class CBitRandomGenerator + { + CRandomGenerator RG = new CRandomGenerator(); + UInt32 Value; + int NumBits; + public void Init() + { + Value = 0; + NumBits = 0; + } + public UInt32 GetRnd(int numBits) + { + UInt32 result; + if (NumBits > numBits) + { + result = Value & (((UInt32)1 << numBits) - 1); + Value >>= numBits; + NumBits -= numBits; + return result; + } + numBits -= NumBits; + result = (Value << numBits); + Value = RG.GetRnd(); + result |= Value & (((UInt32)1 << numBits) - 1); + Value >>= numBits; + NumBits = 32 - numBits; + return result; + } + }; + + class CBenchRandomGenerator + { + CBitRandomGenerator RG = new CBitRandomGenerator(); + UInt32 Pos; + UInt32 Rep0; + + public UInt32 BufferSize; + public Byte[] Buffer = null; + + public CBenchRandomGenerator() { } + + public void Set(UInt32 bufferSize) + { + Buffer = new Byte[bufferSize]; + Pos = 0; + BufferSize = bufferSize; + } + UInt32 GetRndBit() { return RG.GetRnd(1); } + UInt32 GetLogRandBits(int numBits) + { + UInt32 len = RG.GetRnd(numBits); + return RG.GetRnd((int)len); + } + UInt32 GetOffset() + { + if (GetRndBit() == 0) + return GetLogRandBits(4); + return (GetLogRandBits(4) << 10) | RG.GetRnd(10); + } + UInt32 GetLen1() { return RG.GetRnd(1 + (int)RG.GetRnd(2)); } + UInt32 GetLen2() { return RG.GetRnd(2 + (int)RG.GetRnd(2)); } + public void Generate() + { + RG.Init(); + Rep0 = 1; + while (Pos < BufferSize) + { + if (GetRndBit() == 0 || Pos < 1) + Buffer[Pos++] = (Byte)RG.GetRnd(8); + else + { + UInt32 len; + if (RG.GetRnd(3) == 0) + len = 1 + GetLen1(); + else + { + do + Rep0 = GetOffset(); + while (Rep0 >= Pos); + Rep0++; + len = 2 + GetLen2(); + } + for (UInt32 i = 0; i < len && Pos < BufferSize; i++, Pos++) + Buffer[Pos] = Buffer[Pos - Rep0]; + } + } + } + }; + + class CrcOutStream : System.IO.Stream + { + public CRC CRC = new CRC(); + public void Init() { CRC.Init(); } + public UInt32 GetDigest() { return CRC.GetDigest(); } + + public override bool CanRead { get { return false; } } + public override bool CanSeek { get { return false; } } + public override bool CanWrite { get { return true; } } + public override Int64 Length { get { return 0; } } + public override Int64 Position { get { return 0; } set { } } + public override void Flush() { } + public override long Seek(long offset, SeekOrigin origin) { return 0; } + public override void SetLength(long value) { } + public override int Read(byte[] buffer, int offset, int count) { return 0; } + + public override void WriteByte(byte b) + { + CRC.UpdateByte(b); + } + public override void Write(byte[] buffer, int offset, int count) + { + CRC.Update(buffer, (uint)offset, (uint)count); + } + }; + + class CProgressInfo : ICodeProgress + { + public Int64 ApprovedStart; + public Int64 InSize; + public System.DateTime Time; + public void Init() { InSize = 0; } + public void SetProgress(Int64 inSize, Int64 outSize) + { + if (inSize >= ApprovedStart && InSize == 0) + { + Time = DateTime.UtcNow; + InSize = inSize; + } + } + } + const int kSubBits = 8; + + static UInt32 GetLogSize(UInt32 size) + { + for (int i = kSubBits; i < 32; i++) + for (UInt32 j = 0; j < (1 << kSubBits); j++) + if (size <= (((UInt32)1) << i) + (j << (i - kSubBits))) + return (UInt32)(i << kSubBits) + j; + return (32 << kSubBits); + } + + static UInt64 MyMultDiv64(UInt64 value, UInt64 elapsedTime) + { + UInt64 freq = TimeSpan.TicksPerSecond; + UInt64 elTime = elapsedTime; + while (freq > 1000000) + { + freq >>= 1; + elTime >>= 1; + } + if (elTime == 0) + elTime = 1; + return value * freq / elTime; + } + + static UInt64 GetCompressRating(UInt32 dictionarySize, UInt64 elapsedTime, UInt64 size) + { + UInt64 t = GetLogSize(dictionarySize) - (18 << kSubBits); + UInt64 numCommandsForOne = 1060 + ((t * t * 10) >> (2 * kSubBits)); + UInt64 numCommands = (UInt64)(size) * numCommandsForOne; + return MyMultDiv64(numCommands, elapsedTime); + } + + static UInt64 GetDecompressRating(UInt64 elapsedTime, UInt64 outSize, UInt64 inSize) + { + UInt64 numCommands = inSize * 220 + outSize * 20; + return MyMultDiv64(numCommands, elapsedTime); + } + + static UInt64 GetTotalRating( + UInt32 dictionarySize, + UInt64 elapsedTimeEn, UInt64 sizeEn, + UInt64 elapsedTimeDe, + UInt64 inSizeDe, UInt64 outSizeDe) + { + return (GetCompressRating(dictionarySize, elapsedTimeEn, sizeEn) + + GetDecompressRating(elapsedTimeDe, inSizeDe, outSizeDe)) / 2; + } + + static void PrintValue(UInt64 v) + { + string s = v.ToString(); + for (int i = 0; i + s.Length < 6; i++) + System.Console.Write(" "); + System.Console.Write(s); + } + + static void PrintRating(UInt64 rating) + { + PrintValue(rating / 1000000); + System.Console.Write(" MIPS"); + } + + static void PrintResults( + UInt32 dictionarySize, + UInt64 elapsedTime, + UInt64 size, + bool decompressMode, UInt64 secondSize) + { + UInt64 speed = MyMultDiv64(size, elapsedTime); + PrintValue(speed / 1024); + System.Console.Write(" KB/s "); + UInt64 rating; + if (decompressMode) + rating = GetDecompressRating(elapsedTime, size, secondSize); + else + rating = GetCompressRating(dictionarySize, elapsedTime, size); + PrintRating(rating); + } + + static public int LzmaBenchmark(Int32 numIterations, UInt32 dictionarySize) + { + if (numIterations <= 0) + return 0; + if (dictionarySize < (1 << 18)) + { + System.Console.WriteLine("\nError: dictionary size for benchmark must be >= 19 (512 KB)"); + return 1; + } + System.Console.Write("\n Compressing Decompressing\n\n"); + + Compression.LZMA.Encoder encoder = new Compression.LZMA.Encoder(); + Compression.LZMA.Decoder decoder = new Compression.LZMA.Decoder(); + + + CoderPropID[] propIDs = + { + CoderPropID.DictionarySize, + }; + object[] properties = + { + (Int32)(dictionarySize), + }; + + UInt32 kBufferSize = dictionarySize + kAdditionalSize; + UInt32 kCompressedBufferSize = (kBufferSize / 2) + kCompressedAdditionalSize; + + encoder.SetCoderProperties(propIDs, properties); + System.IO.MemoryStream propStream = new System.IO.MemoryStream(); + encoder.WriteCoderProperties(propStream); + byte[] propArray = propStream.ToArray(); + + CBenchRandomGenerator rg = new CBenchRandomGenerator(); + + rg.Set(kBufferSize); + rg.Generate(); + CRC crc = new CRC(); + crc.Init(); + crc.Update(rg.Buffer, 0, rg.BufferSize); + + CProgressInfo progressInfo = new CProgressInfo(); + progressInfo.ApprovedStart = dictionarySize; + + UInt64 totalBenchSize = 0; + UInt64 totalEncodeTime = 0; + UInt64 totalDecodeTime = 0; + UInt64 totalCompressedSize = 0; + + MemoryStream inStream = new MemoryStream(rg.Buffer, 0, (int)rg.BufferSize); + MemoryStream compressedStream = new MemoryStream((int)kCompressedBufferSize); + CrcOutStream crcOutStream = new CrcOutStream(); + for (Int32 i = 0; i < numIterations; i++) + { + progressInfo.Init(); + inStream.Seek(0, SeekOrigin.Begin); + compressedStream.Seek(0, SeekOrigin.Begin); + encoder.Code(inStream, compressedStream, -1, -1, progressInfo); + TimeSpan sp2 = DateTime.UtcNow - progressInfo.Time; + UInt64 encodeTime = (UInt64)sp2.Ticks; + + long compressedSize = compressedStream.Position; + if (progressInfo.InSize == 0) + throw (new Exception("Internal ERROR 1282")); + + UInt64 decodeTime = 0; + for (int j = 0; j < 2; j++) + { + compressedStream.Seek(0, SeekOrigin.Begin); + crcOutStream.Init(); + + decoder.SetDecoderProperties(propArray); + UInt64 outSize = kBufferSize; + System.DateTime startTime = DateTime.UtcNow; + decoder.Code(compressedStream, crcOutStream, 0, (Int64)outSize, null); + TimeSpan sp = (DateTime.UtcNow - startTime); + decodeTime = (ulong)sp.Ticks; + if (crcOutStream.GetDigest() != crc.GetDigest()) + throw (new Exception("CRC Error")); + } + UInt64 benchSize = kBufferSize - (UInt64)progressInfo.InSize; + PrintResults(dictionarySize, encodeTime, benchSize, false, 0); + System.Console.Write(" "); + PrintResults(dictionarySize, decodeTime, kBufferSize, true, (ulong)compressedSize); + System.Console.WriteLine(); + + totalBenchSize += benchSize; + totalEncodeTime += encodeTime; + totalDecodeTime += decodeTime; + totalCompressedSize += (ulong)compressedSize; + } + System.Console.WriteLine("---------------------------------------------------"); + PrintResults(dictionarySize, totalEncodeTime, totalBenchSize, false, 0); + System.Console.Write(" "); + PrintResults(dictionarySize, totalDecodeTime, + kBufferSize * (UInt64)numIterations, true, totalCompressedSize); + System.Console.WriteLine(" Average"); + return 0; + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/Properties/AssemblyInfo.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/Properties/AssemblyInfo.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LZMA#")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Igor Pavlov")] +[assembly: AssemblyProduct("LZMA# SDK")] +[assembly: AssemblyCopyright("Copyright @ Igor Pavlov 1999-2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("4.12.*")] diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/Properties/Resources.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/Properties/Resources.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.42 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace LzmaAlone.Properties +{ + using System; + using System.IO; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture + { + get + { + return _resCulture; + } + set + { + _resCulture = value; + } + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/Properties/Settings.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/LzmaAlone/Properties/Settings.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.42 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace LzmaAlone.Properties +{ + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + public static Settings Value + { + get + { + if ((Settings.m_Value == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) + { + try + { + Settings.m_Value = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/RangeCoder/RangeCoder.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/RangeCoder/RangeCoder.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,234 @@ +using System; + +namespace SevenZip.Compression.RangeCoder +{ + class Encoder + { + public const uint kTopValue = (1 << 24); + + System.IO.Stream Stream; + + public UInt64 Low; + public uint Range; + uint _cacheSize; + byte _cache; + + long StartPosition; + + public void SetStream(System.IO.Stream stream) + { + Stream = stream; + } + + public void ReleaseStream() + { + Stream = null; + } + + public void Init() + { + StartPosition = Stream.Position; + + Low = 0; + Range = 0xFFFFFFFF; + _cacheSize = 1; + _cache = 0; + } + + public void FlushData() + { + for (int i = 0; i < 5; i++) + ShiftLow(); + } + + public void FlushStream() + { + Stream.Flush(); + } + + public void CloseStream() + { + Stream.Close(); + } + + public void Encode(uint start, uint size, uint total) + { + Low += start * (Range /= total); + Range *= size; + while (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + + public void ShiftLow() + { + if ((uint)Low < (uint)0xFF000000 || (uint)(Low >> 32) == 1) + { + byte temp = _cache; + do + { + Stream.WriteByte((byte)(temp + (Low >> 32))); + temp = 0xFF; + } + while (--_cacheSize != 0); + _cache = (byte)(((uint)Low) >> 24); + } + _cacheSize++; + Low = ((uint)Low) << 8; + } + + public void EncodeDirectBits(uint v, int numTotalBits) + { + for (int i = numTotalBits - 1; i >= 0; i--) + { + Range >>= 1; + if (((v >> i) & 1) == 1) + Low += Range; + if (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + } + + public void EncodeBit(uint size0, int numTotalBits, uint symbol) + { + uint newBound = (Range >> numTotalBits) * size0; + if (symbol == 0) + Range = newBound; + else + { + Low += newBound; + Range -= newBound; + } + while (Range < kTopValue) + { + Range <<= 8; + ShiftLow(); + } + } + + public long GetProcessedSizeAdd() + { + return _cacheSize + + Stream.Position - StartPosition + 4; + // (long)Stream.GetProcessedSize(); + } + } + + class Decoder + { + public const uint kTopValue = (1 << 24); + public uint Range; + public uint Code; + // public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16); + public System.IO.Stream Stream; + + public void Init(System.IO.Stream stream) + { + // Stream.Init(stream); + Stream = stream; + + Code = 0; + Range = 0xFFFFFFFF; + for (int i = 0; i < 5; i++) + Code = (Code << 8) | (byte)Stream.ReadByte(); + } + + public void ReleaseStream() + { + // Stream.ReleaseStream(); + Stream = null; + } + + public void CloseStream() + { + Stream.Close(); + } + + public void Normalize() + { + while (Range < kTopValue) + { + Code = (Code << 8) | (byte)Stream.ReadByte(); + Range <<= 8; + } + } + + public void Normalize2() + { + if (Range < kTopValue) + { + Code = (Code << 8) | (byte)Stream.ReadByte(); + Range <<= 8; + } + } + + public uint GetThreshold(uint total) + { + return Code / (Range /= total); + } + + public void Decode(uint start, uint size, uint total) + { + Code -= start * Range; + Range *= size; + Normalize(); + } + + public uint DecodeDirectBits(int numTotalBits) + { + uint range = Range; + uint code = Code; + uint result = 0; + for (int i = numTotalBits; i > 0; i--) + { + range >>= 1; + /* + result <<= 1; + if (code >= range) + { + code -= range; + result |= 1; + } + */ + uint t = (code - range) >> 31; + code -= range & (t - 1); + result = (result << 1) | (1 - t); + + if (range < kTopValue) + { + code = (code << 8) | (byte)Stream.ReadByte(); + range <<= 8; + } + } + Range = range; + Code = code; + return result; + } + + public uint DecodeBit(uint size0, int numTotalBits) + { + uint newBound = (Range >> numTotalBits) * size0; + uint symbol; + if (Code < newBound) + { + symbol = 0; + Range = newBound; + } + else + { + symbol = 1; + Code -= newBound; + Range -= newBound; + } + Normalize(); + return symbol; + } + + // ulong GetProcessedSize() {return Stream.GetProcessedSize(); } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/RangeCoder/RangeCoderBit.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/RangeCoder/RangeCoderBit.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,117 @@ +using System; + +namespace SevenZip.Compression.RangeCoder +{ + struct BitEncoder + { + public const int kNumBitModelTotalBits = 11; + public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); + const int kNumMoveBits = 5; + const int kNumMoveReducingBits = 2; + public const int kNumBitPriceShiftBits = 6; + + uint Prob; + + public void Init() { Prob = kBitModelTotal >> 1; } + + public void UpdateModel(uint symbol) + { + if (symbol == 0) + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + else + Prob -= (Prob) >> kNumMoveBits; + } + + public void Encode(Encoder encoder, uint symbol) + { + // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol); + // UpdateModel(symbol); + uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob; + if (symbol == 0) + { + encoder.Range = newBound; + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + } + else + { + encoder.Low += newBound; + encoder.Range -= newBound; + Prob -= (Prob) >> kNumMoveBits; + } + if (encoder.Range < Encoder.kTopValue) + { + encoder.Range <<= 8; + encoder.ShiftLow(); + } + } + + private static UInt32[] ProbPrices = new UInt32[kBitModelTotal >> kNumMoveReducingBits]; + + static BitEncoder() + { + const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); + for (int i = kNumBits - 1; i >= 0; i--) + { + UInt32 start = (UInt32)1 << (kNumBits - i - 1); + UInt32 end = (UInt32)1 << (kNumBits - i); + for (UInt32 j = start; j < end; j++) + ProbPrices[j] = ((UInt32)i << kNumBitPriceShiftBits) + + (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); + } + } + + public uint GetPrice(uint symbol) + { + return ProbPrices[(((Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; + } + public uint GetPrice0() { return ProbPrices[Prob >> kNumMoveReducingBits]; } + public uint GetPrice1() { return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; } + } + + struct BitDecoder + { + public const int kNumBitModelTotalBits = 11; + public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); + const int kNumMoveBits = 5; + + uint Prob; + + public void UpdateModel(int numMoveBits, uint symbol) + { + if (symbol == 0) + Prob += (kBitModelTotal - Prob) >> numMoveBits; + else + Prob -= (Prob) >> numMoveBits; + } + + public void Init() { Prob = kBitModelTotal >> 1; } + + public uint Decode(RangeCoder.Decoder rangeDecoder) + { + uint newBound = (uint)(rangeDecoder.Range >> kNumBitModelTotalBits) * (uint)Prob; + if (rangeDecoder.Code < newBound) + { + rangeDecoder.Range = newBound; + Prob += (kBitModelTotal - Prob) >> kNumMoveBits; + if (rangeDecoder.Range < Decoder.kTopValue) + { + rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); + rangeDecoder.Range <<= 8; + } + return 0; + } + else + { + rangeDecoder.Range -= newBound; + rangeDecoder.Code -= newBound; + Prob -= (Prob) >> kNumMoveBits; + if (rangeDecoder.Range < Decoder.kTopValue) + { + rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); + rangeDecoder.Range <<= 8; + } + return 1; + } + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/Compress/RangeCoder/RangeCoderBitTree.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/Compress/RangeCoder/RangeCoderBitTree.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,157 @@ +using System; + +namespace SevenZip.Compression.RangeCoder +{ + struct BitTreeEncoder + { + BitEncoder[] Models; + int NumBitLevels; + + public BitTreeEncoder(int numBitLevels) + { + NumBitLevels = numBitLevels; + Models = new BitEncoder[1 << numBitLevels]; + } + + public void Init() + { + for (uint i = 1; i < (1 << NumBitLevels); i++) + Models[i].Init(); + } + + public void Encode(Encoder rangeEncoder, UInt32 symbol) + { + UInt32 m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0; ) + { + bitIndex--; + UInt32 bit = (symbol >> bitIndex) & 1; + Models[m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + } + } + + public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol) + { + UInt32 m = 1; + for (UInt32 i = 0; i < NumBitLevels; i++) + { + UInt32 bit = symbol & 1; + Models[m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + symbol >>= 1; + } + } + + public UInt32 GetPrice(UInt32 symbol) + { + UInt32 price = 0; + UInt32 m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0; ) + { + bitIndex--; + UInt32 bit = (symbol >> bitIndex) & 1; + price += Models[m].GetPrice(bit); + m = (m << 1) + bit; + } + return price; + } + + public UInt32 ReverseGetPrice(UInt32 symbol) + { + UInt32 price = 0; + UInt32 m = 1; + for (int i = NumBitLevels; i > 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += Models[m].GetPrice(bit); + m = (m << 1) | bit; + } + return price; + } + + public static UInt32 ReverseGetPrice(BitEncoder[] Models, UInt32 startIndex, + int NumBitLevels, UInt32 symbol) + { + UInt32 price = 0; + UInt32 m = 1; + for (int i = NumBitLevels; i > 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += Models[startIndex + m].GetPrice(bit); + m = (m << 1) | bit; + } + return price; + } + + public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex, + Encoder rangeEncoder, int NumBitLevels, UInt32 symbol) + { + UInt32 m = 1; + for (int i = 0; i < NumBitLevels; i++) + { + UInt32 bit = symbol & 1; + Models[startIndex + m].Encode(rangeEncoder, bit); + m = (m << 1) | bit; + symbol >>= 1; + } + } + } + + struct BitTreeDecoder + { + BitDecoder[] Models; + int NumBitLevels; + + public BitTreeDecoder(int numBitLevels) + { + NumBitLevels = numBitLevels; + Models = new BitDecoder[1 << numBitLevels]; + } + + public void Init() + { + for (uint i = 1; i < (1 << NumBitLevels); i++) + Models[i].Init(); + } + + public uint Decode(RangeCoder.Decoder rangeDecoder) + { + uint m = 1; + for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--) + m = (m << 1) + Models[m].Decode(rangeDecoder); + return m - ((uint)1 << NumBitLevels); + } + + public uint ReverseDecode(RangeCoder.Decoder rangeDecoder) + { + uint m = 1; + uint symbol = 0; + for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + uint bit = Models[m].Decode(rangeDecoder); + m <<= 1; + m += bit; + symbol |= (bit << bitIndex); + } + return symbol; + } + + public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex, + RangeCoder.Decoder rangeDecoder, int NumBitLevels) + { + uint m = 1; + uint symbol = 0; + for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + uint bit = Models[startIndex + m].Decode(rangeDecoder); + m <<= 1; + m += bit; + symbol |= (bit << bitIndex); + } + return symbol; + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/CS/7zip/ICoder.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/CS/7zip/ICoder.cs Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,145 @@ +// ICoder.h + +using System; + +namespace SevenZip +{ + /// + /// The exception that is thrown when an error in input stream occurs during decoding. + /// + class DataErrorException : ApplicationException + { + public DataErrorException(): base("Data Error") { } + } + + /// + /// The exception that is thrown when the value of an argument is outside the allowable range. + /// + class InvalidParamException : ApplicationException + { + public InvalidParamException(): base("Invalid Parameter") { } + } + + public interface ICodeProgress + { + /// + /// Callback progress. + /// + /// + /// input size. -1 if unknown. + /// + /// + /// output size. -1 if unknown. + /// + void SetProgress(Int64 inSize, Int64 outSize); + }; + + public interface ICoder + { + /// + /// Codes streams. + /// + /// + /// input Stream. + /// + /// + /// output Stream. + /// + /// + /// input Size. -1 if unknown. + /// + /// + /// output Size. -1 if unknown. + /// + /// + /// callback progress reference. + /// + /// + /// if input stream is not valid + /// + void Code(System.IO.Stream inStream, System.IO.Stream outStream, + Int64 inSize, Int64 outSize, ICodeProgress progress); + }; + + /* + public interface ICoder2 + { + void Code(ISequentialInStream []inStreams, + const UInt64 []inSizes, + ISequentialOutStream []outStreams, + UInt64 []outSizes, + ICodeProgress progress); + }; + */ + + /// + /// Provides the fields that represent properties idenitifiers for compressing. + /// + public enum CoderPropID + { + /// + /// Specifies size of dictionary. + /// + DictionarySize = 0x400, + /// + /// Specifies size of memory for PPM*. + /// + UsedMemorySize, + /// + /// Specifies order for PPM methods. + /// + Order, + /// + /// Specifies number of postion state bits for LZMA (0 <= x <= 4). + /// + PosStateBits = 0x440, + /// + /// Specifies number of literal context bits for LZMA (0 <= x <= 8). + /// + LitContextBits, + /// + /// Specifies number of literal position bits for LZMA (0 <= x <= 4). + /// + LitPosBits, + /// + /// Specifies number of fast bytes for LZ*. + /// + NumFastBytes = 0x450, + /// + /// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B". + /// + MatchFinder, + /// + /// Specifies number of passes. + /// + NumPasses = 0x460, + /// + /// Specifies number of algorithm. + /// + Algorithm = 0x470, + /// + /// Specifies multithread mode. + /// + MultiThread = 0x480, + /// + /// Specifies mode with end marker. + /// + EndMarker = 0x490 + }; + + + public interface ISetCoderProperties + { + void SetCoderProperties(CoderPropID[] propIDs, object[] properties); + }; + + public interface IWriteCoderProperties + { + void WriteCoderProperties(System.IO.Stream outStream); + } + + public interface ISetDecoderProperties + { + void SetDecoderProperties(byte[] properties); + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/CRC.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/CRC.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,52 @@ +// SevenZip/CRC.java + +package SevenZip; + +public class CRC +{ + static public int[] Table = new int[256]; + + static + { + for (int i = 0; i < 256; i++) + { + int r = i; + for (int j = 0; j < 8; j++) + if ((r & 1) != 0) + r = (r >>> 1) ^ 0xEDB88320; + else + r >>>= 1; + Table[i] = r; + } + } + + int _value = -1; + + public void Init() + { + _value = -1; + } + + public void Update(byte[] data, int offset, int size) + { + for (int i = 0; i < size; i++) + _value = Table[(_value ^ data[offset + i]) & 0xFF] ^ (_value >>> 8); + } + + public void Update(byte[] data) + { + int size = data.length; + for (int i = 0; i < size; i++) + _value = Table[(_value ^ data[i]) & 0xFF] ^ (_value >>> 8); + } + + public void UpdateByte(int b) + { + _value = Table[(_value ^ b) & 0xFF] ^ (_value >>> 8); + } + + public int GetDigest() + { + return _value ^ (-1); + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/LZ/BinTree.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/LZ/BinTree.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,382 @@ +// LZ.BinTree + +package SevenZip.Compression.LZ; +import java.io.IOException; + + +public class BinTree extends InWindow +{ + int _cyclicBufferPos; + int _cyclicBufferSize = 0; + int _matchMaxLen; + + int[] _son; + int[] _hash; + + int _cutValue = 0xFF; + int _hashMask; + int _hashSizeSum = 0; + + boolean HASH_ARRAY = true; + + static final int kHash2Size = 1 << 10; + static final int kHash3Size = 1 << 16; + static final int kBT2HashSize = 1 << 16; + static final int kStartMaxLen = 1; + static final int kHash3Offset = kHash2Size; + static final int kEmptyHashValue = 0; + static final int kMaxValForNormalize = (1 << 30) - 1; + + int kNumHashDirectBytes = 0; + int kMinMatchCheck = 4; + int kFixHashSize = kHash2Size + kHash3Size; + + public void SetType(int numHashBytes) + { + HASH_ARRAY = (numHashBytes > 2); + if (HASH_ARRAY) + { + kNumHashDirectBytes = 0; + kMinMatchCheck = 4; + kFixHashSize = kHash2Size + kHash3Size; + } + else + { + kNumHashDirectBytes = 2; + kMinMatchCheck = 2 + 1; + kFixHashSize = 0; + } + } + + + + + public void Init() throws IOException + { + super.Init(); + for (int i = 0; i < _hashSizeSum; i++) + _hash[i] = kEmptyHashValue; + _cyclicBufferPos = 0; + ReduceOffsets(-1); + } + + public void MovePos() throws IOException + { + if (++_cyclicBufferPos >= _cyclicBufferSize) + _cyclicBufferPos = 0; + super.MovePos(); + if (_pos == kMaxValForNormalize) + Normalize(); + } + + + + + + + + + public boolean Create(int historySize, int keepAddBufferBefore, + int matchMaxLen, int keepAddBufferAfter) + { + if (historySize > kMaxValForNormalize - 256) + return false; + _cutValue = 16 + (matchMaxLen >> 1); + + int windowReservSize = (historySize + keepAddBufferBefore + + matchMaxLen + keepAddBufferAfter) / 2 + 256; + + super.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); + + _matchMaxLen = matchMaxLen; + + int cyclicBufferSize = historySize + 1; + if (_cyclicBufferSize != cyclicBufferSize) + _son = new int[(_cyclicBufferSize = cyclicBufferSize) * 2]; + + int hs = kBT2HashSize; + + if (HASH_ARRAY) + { + hs = historySize - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + hs |= 0xFFFF; + if (hs > (1 << 24)) + hs >>= 1; + _hashMask = hs; + hs++; + hs += kFixHashSize; + } + if (hs != _hashSizeSum) + _hash = new int [_hashSizeSum = hs]; + return true; + } + public int GetMatches(int[] distances) throws IOException + { + int lenLimit; + if (_pos + _matchMaxLen <= _streamPos) + lenLimit = _matchMaxLen; + else + { + lenLimit = _streamPos - _pos; + if (lenLimit < kMinMatchCheck) + { + MovePos(); + return 0; + } + } + + int offset = 0; + int matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; + int cur = _bufferOffset + _pos; + int maxLen = kStartMaxLen; // to avoid items for len < hashSize; + int hashValue, hash2Value = 0, hash3Value = 0; + + if (HASH_ARRAY) + { + int temp = CrcTable[_bufferBase[cur] & 0xFF] ^ (_bufferBase[cur + 1] & 0xFF); + hash2Value = temp & (kHash2Size - 1); + temp ^= ((int)(_bufferBase[cur + 2] & 0xFF) << 8); + hash3Value = temp & (kHash3Size - 1); + hashValue = (temp ^ (CrcTable[_bufferBase[cur + 3] & 0xFF] << 5)) & _hashMask; + } + else + hashValue = ((_bufferBase[cur] & 0xFF) ^ ((int)(_bufferBase[cur + 1] & 0xFF) << 8)); + + int curMatch = _hash[kFixHashSize + hashValue]; + if (HASH_ARRAY) + { + int curMatch2 = _hash[hash2Value]; + int curMatch3 = _hash[kHash3Offset + hash3Value]; + _hash[hash2Value] = _pos; + _hash[kHash3Offset + hash3Value] = _pos; + if (curMatch2 > matchMinPos) + if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur]) + { + distances[offset++] = maxLen = 2; + distances[offset++] = _pos - curMatch2 - 1; + } + if (curMatch3 > matchMinPos) + if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur]) + { + if (curMatch3 == curMatch2) + offset -= 2; + distances[offset++] = maxLen = 3; + distances[offset++] = _pos - curMatch3 - 1; + curMatch2 = curMatch3; + } + if (offset != 0 && curMatch2 == curMatch) + { + offset -= 2; + maxLen = kStartMaxLen; + } + } + + _hash[kFixHashSize + hashValue] = _pos; + + int ptr0 = (_cyclicBufferPos << 1) + 1; + int ptr1 = (_cyclicBufferPos << 1); + + int len0, len1; + len0 = len1 = kNumHashDirectBytes; + + if (kNumHashDirectBytes != 0) + { + if (curMatch > matchMinPos) + { + if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != + _bufferBase[cur + kNumHashDirectBytes]) + { + distances[offset++] = maxLen = kNumHashDirectBytes; + distances[offset++] = _pos - curMatch - 1; + } + } + } + + int count = _cutValue; + + while (true) + { + if (curMatch <= matchMinPos || count-- == 0) + { + _son[ptr0] = _son[ptr1] = kEmptyHashValue; + break; + } + int delta = _pos - curMatch; + int cyclicPos = ((delta <= _cyclicBufferPos) ? + (_cyclicBufferPos - delta) : + (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; + + int pby1 = _bufferOffset + curMatch; + int len = Math.min(len0, len1); + if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) + { + while(++len != lenLimit) + if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) + break; + if (maxLen < len) + { + distances[offset++] = maxLen = len; + distances[offset++] = delta - 1; + if (len == lenLimit) + { + _son[ptr1] = _son[cyclicPos]; + _son[ptr0] = _son[cyclicPos + 1]; + break; + } + } + } + if ((_bufferBase[pby1 + len] & 0xFF) < (_bufferBase[cur + len] & 0xFF)) + { + _son[ptr1] = curMatch; + ptr1 = cyclicPos + 1; + curMatch = _son[ptr1]; + len1 = len; + } + else + { + _son[ptr0] = curMatch; + ptr0 = cyclicPos; + curMatch = _son[ptr0]; + len0 = len; + } + } + MovePos(); + return offset; + } + + public void Skip(int num) throws IOException + { + do + { + int lenLimit; + if (_pos + _matchMaxLen <= _streamPos) + lenLimit = _matchMaxLen; + else + { + lenLimit = _streamPos - _pos; + if (lenLimit < kMinMatchCheck) + { + MovePos(); + continue; + } + } + + int matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; + int cur = _bufferOffset + _pos; + + int hashValue; + + if (HASH_ARRAY) + { + int temp = CrcTable[_bufferBase[cur] & 0xFF] ^ (_bufferBase[cur + 1] & 0xFF); + int hash2Value = temp & (kHash2Size - 1); + _hash[hash2Value] = _pos; + temp ^= ((int)(_bufferBase[cur + 2] & 0xFF) << 8); + int hash3Value = temp & (kHash3Size - 1); + _hash[kHash3Offset + hash3Value] = _pos; + hashValue = (temp ^ (CrcTable[_bufferBase[cur + 3] & 0xFF] << 5)) & _hashMask; + } + else + hashValue = ((_bufferBase[cur] & 0xFF) ^ ((int)(_bufferBase[cur + 1] & 0xFF) << 8)); + + int curMatch = _hash[kFixHashSize + hashValue]; + _hash[kFixHashSize + hashValue] = _pos; + + int ptr0 = (_cyclicBufferPos << 1) + 1; + int ptr1 = (_cyclicBufferPos << 1); + + int len0, len1; + len0 = len1 = kNumHashDirectBytes; + + int count = _cutValue; + while (true) + { + if (curMatch <= matchMinPos || count-- == 0) + { + _son[ptr0] = _son[ptr1] = kEmptyHashValue; + break; + } + + int delta = _pos - curMatch; + int cyclicPos = ((delta <= _cyclicBufferPos) ? + (_cyclicBufferPos - delta) : + (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; + + int pby1 = _bufferOffset + curMatch; + int len = Math.min(len0, len1); + if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) + { + while (++len != lenLimit) + if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) + break; + if (len == lenLimit) + { + _son[ptr1] = _son[cyclicPos]; + _son[ptr0] = _son[cyclicPos + 1]; + break; + } + } + if ((_bufferBase[pby1 + len] & 0xFF) < (_bufferBase[cur + len] & 0xFF)) + { + _son[ptr1] = curMatch; + ptr1 = cyclicPos + 1; + curMatch = _son[ptr1]; + len1 = len; + } + else + { + _son[ptr0] = curMatch; + ptr0 = cyclicPos; + curMatch = _son[ptr0]; + len0 = len; + } + } + MovePos(); + } + while (--num != 0); + } + + void NormalizeLinks(int[] items, int numItems, int subValue) + { + for (int i = 0; i < numItems; i++) + { + int value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; + } + } + + void Normalize() + { + int subValue = _pos - _cyclicBufferSize; + NormalizeLinks(_son, _cyclicBufferSize * 2, subValue); + NormalizeLinks(_hash, _hashSizeSum, subValue); + ReduceOffsets(subValue); + } + + public void SetCutValue(int cutValue) { _cutValue = cutValue; } + + private static final int[] CrcTable = new int[256]; + + static + { + for (int i = 0; i < 256; i++) + { + int r = i; + for (int j = 0; j < 8; j++) + if ((r & 1) != 0) + r = (r >>> 1) ^ 0xEDB88320; + else + r >>>= 1; + CrcTable[i] = r; + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/LZ/InWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/LZ/InWindow.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,131 @@ +// LZ.InWindow + +package SevenZip.Compression.LZ; + +import java.io.IOException; + +public class InWindow +{ + public byte[] _bufferBase; // pointer to buffer with data + java.io.InputStream _stream; + int _posLimit; // offset (from _buffer) of first byte when new block reading must be done + boolean _streamEndWasReached; // if (true) then _streamPos shows real end of stream + + int _pointerToLastSafePosition; + + public int _bufferOffset; + + public int _blockSize; // Size of Allocated memory block + public int _pos; // offset (from _buffer) of curent byte + int _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos + int _keepSizeAfter; // how many BYTEs must be kept buffer after _pos + public int _streamPos; // offset (from _buffer) of first not read byte from Stream + + public void MoveBlock() + { + int offset = _bufferOffset + _pos - _keepSizeBefore; + // we need one additional byte, since MovePos moves on 1 byte. + if (offset > 0) + offset--; + + int numBytes = _bufferOffset + _streamPos - offset; + + // check negative offset ???? + for (int i = 0; i < numBytes; i++) + _bufferBase[i] = _bufferBase[offset + i]; + _bufferOffset -= offset; + } + + public void ReadBlock() throws IOException + { + if (_streamEndWasReached) + return; + while (true) + { + int size = (0 - _bufferOffset) + _blockSize - _streamPos; + if (size == 0) + return; + int numReadBytes = _stream.read(_bufferBase, _bufferOffset + _streamPos, size); + if (numReadBytes == -1) + { + _posLimit = _streamPos; + int pointerToPostion = _bufferOffset + _posLimit; + if (pointerToPostion > _pointerToLastSafePosition) + _posLimit = _pointerToLastSafePosition - _bufferOffset; + + _streamEndWasReached = true; + return; + } + _streamPos += numReadBytes; + if (_streamPos >= _pos + _keepSizeAfter) + _posLimit = _streamPos - _keepSizeAfter; + } + } + + void Free() { _bufferBase = null; } + + public void Create(int keepSizeBefore, int keepSizeAfter, int keepSizeReserv) + { + _keepSizeBefore = keepSizeBefore; + _keepSizeAfter = keepSizeAfter; + int blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; + if (_bufferBase == null || _blockSize != blockSize) + { + Free(); + _blockSize = blockSize; + _bufferBase = new byte[_blockSize]; + } + _pointerToLastSafePosition = _blockSize - keepSizeAfter; + } + + public void SetStream(java.io.InputStream stream) { _stream = stream; } + public void ReleaseStream() { _stream = null; } + + public void Init() throws IOException + { + _bufferOffset = 0; + _pos = 0; + _streamPos = 0; + _streamEndWasReached = false; + ReadBlock(); + } + + public void MovePos() throws IOException + { + _pos++; + if (_pos > _posLimit) + { + int pointerToPostion = _bufferOffset + _pos; + if (pointerToPostion > _pointerToLastSafePosition) + MoveBlock(); + ReadBlock(); + } + } + + public byte GetIndexByte(int index) { return _bufferBase[_bufferOffset + _pos + index]; } + + // index + limit have not to exceed _keepSizeAfter; + public int GetMatchLen(int index, int distance, int limit) + { + if (_streamEndWasReached) + if ((_pos + index) + limit > _streamPos) + limit = _streamPos - (_pos + index); + distance++; + // Byte *pby = _buffer + (size_t)_pos + index; + int pby = _bufferOffset + _pos + index; + + int i; + for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++); + return i; + } + + public int GetNumAvailableBytes() { return _streamPos - _pos; } + + public void ReduceOffsets(int subValue) + { + _bufferOffset += subValue; + _posLimit -= subValue; + _pos -= subValue; + _streamPos -= subValue; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/LZ/OutWindow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/LZ/OutWindow.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,85 @@ +// LZ.OutWindow + +package SevenZip.Compression.LZ; + +import java.io.IOException; + +public class OutWindow +{ + byte[] _buffer; + int _pos; + int _windowSize = 0; + int _streamPos; + java.io.OutputStream _stream; + + public void Create(int windowSize) + { + if (_buffer == null || _windowSize != windowSize) + _buffer = new byte[windowSize]; + _windowSize = windowSize; + _pos = 0; + _streamPos = 0; + } + + public void SetStream(java.io.OutputStream stream) throws IOException + { + ReleaseStream(); + _stream = stream; + } + + public void ReleaseStream() throws IOException + { + Flush(); + _stream = null; + } + + public void Init(boolean solid) + { + if (!solid) + { + _streamPos = 0; + _pos = 0; + } + } + + public void Flush() throws IOException + { + int size = _pos - _streamPos; + if (size == 0) + return; + _stream.write(_buffer, _streamPos, size); + if (_pos >= _windowSize) + _pos = 0; + _streamPos = _pos; + } + + public void CopyBlock(int distance, int len) throws IOException + { + int pos = _pos - distance - 1; + if (pos < 0) + pos += _windowSize; + for (; len != 0; len--) + { + if (pos >= _windowSize) + pos = 0; + _buffer[_pos++] = _buffer[pos++]; + if (_pos >= _windowSize) + Flush(); + } + } + + public void PutByte(byte b) throws IOException + { + _buffer[_pos++] = b; + if (_pos >= _windowSize) + Flush(); + } + + public byte GetByte(int distance) + { + int pos = _pos - distance - 1; + if (pos < 0) + pos += _windowSize; + return _buffer[pos]; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/LZMA/Base.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/LZMA/Base.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,88 @@ +// Base.java + +package SevenZip.Compression.LZMA; + +public class Base +{ + public static final int kNumRepDistances = 4; + public static final int kNumStates = 12; + + public static final int StateInit() + { + return 0; + } + + public static final int StateUpdateChar(int index) + { + if (index < 4) + return 0; + if (index < 10) + return index - 3; + return index - 6; + } + + public static final int StateUpdateMatch(int index) + { + return (index < 7 ? 7 : 10); + } + + public static final int StateUpdateRep(int index) + { + return (index < 7 ? 8 : 11); + } + + public static final int StateUpdateShortRep(int index) + { + return (index < 7 ? 9 : 11); + } + + public static final boolean StateIsCharState(int index) + { + return index < 7; + } + + public static final int kNumPosSlotBits = 6; + public static final int kDicLogSizeMin = 0; + // public static final int kDicLogSizeMax = 28; + // public static final int kDistTableSizeMax = kDicLogSizeMax * 2; + + public static final int kNumLenToPosStatesBits = 2; // it's for speed optimization + public static final int kNumLenToPosStates = 1 << kNumLenToPosStatesBits; + + public static final int kMatchMinLen = 2; + + public static final int GetLenToPosState(int len) + { + len -= kMatchMinLen; + if (len < kNumLenToPosStates) + return len; + return (int)(kNumLenToPosStates - 1); + } + + public static final int kNumAlignBits = 4; + public static final int kAlignTableSize = 1 << kNumAlignBits; + public static final int kAlignMask = (kAlignTableSize - 1); + + public static final int kStartPosModelIndex = 4; + public static final int kEndPosModelIndex = 14; + public static final int kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; + + public static final int kNumFullDistances = 1 << (kEndPosModelIndex / 2); + + public static final int kNumLitPosStatesBitsEncodingMax = 4; + public static final int kNumLitContextBitsMax = 8; + + public static final int kNumPosStatesBitsMax = 4; + public static final int kNumPosStatesMax = (1 << kNumPosStatesBitsMax); + public static final int kNumPosStatesBitsEncodingMax = 4; + public static final int kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); + + public static final int kNumLowLenBits = 3; + public static final int kNumMidLenBits = 3; + public static final int kNumHighLenBits = 8; + public static final int kNumLowLenSymbols = 1 << kNumLowLenBits; + public static final int kNumMidLenSymbols = 1 << kNumMidLenBits; + public static final int kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + + (1 << kNumHighLenBits); + public static final int kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/LZMA/Decoder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/LZMA/Decoder.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,329 @@ +package SevenZip.Compression.LZMA; + +import SevenZip.Compression.RangeCoder.BitTreeDecoder; +import SevenZip.Compression.LZMA.Base; +import SevenZip.Compression.LZ.OutWindow; +import java.io.IOException; + +public class Decoder +{ + class LenDecoder + { + short[] m_Choice = new short[2]; + BitTreeDecoder[] m_LowCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; + BitTreeDecoder[] m_MidCoder = new BitTreeDecoder[Base.kNumPosStatesMax]; + BitTreeDecoder m_HighCoder = new BitTreeDecoder(Base.kNumHighLenBits); + int m_NumPosStates = 0; + + public void Create(int numPosStates) + { + for (; m_NumPosStates < numPosStates; m_NumPosStates++) + { + m_LowCoder[m_NumPosStates] = new BitTreeDecoder(Base.kNumLowLenBits); + m_MidCoder[m_NumPosStates] = new BitTreeDecoder(Base.kNumMidLenBits); + } + } + + public void Init() + { + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_Choice); + for (int posState = 0; posState < m_NumPosStates; posState++) + { + m_LowCoder[posState].Init(); + m_MidCoder[posState].Init(); + } + m_HighCoder.Init(); + } + + public int Decode(SevenZip.Compression.RangeCoder.Decoder rangeDecoder, int posState) throws IOException + { + if (rangeDecoder.DecodeBit(m_Choice, 0) == 0) + return m_LowCoder[posState].Decode(rangeDecoder); + int symbol = Base.kNumLowLenSymbols; + if (rangeDecoder.DecodeBit(m_Choice, 1) == 0) + symbol += m_MidCoder[posState].Decode(rangeDecoder); + else + symbol += Base.kNumMidLenSymbols + m_HighCoder.Decode(rangeDecoder); + return symbol; + } + } + + class LiteralDecoder + { + class Decoder2 + { + short[] m_Decoders = new short[0x300]; + + public void Init() + { + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_Decoders); + } + + public byte DecodeNormal(SevenZip.Compression.RangeCoder.Decoder rangeDecoder) throws IOException + { + int symbol = 1; + do + symbol = (symbol << 1) | rangeDecoder.DecodeBit(m_Decoders, symbol); + while (symbol < 0x100); + return (byte)symbol; + } + + public byte DecodeWithMatchByte(SevenZip.Compression.RangeCoder.Decoder rangeDecoder, byte matchByte) throws IOException + { + int symbol = 1; + do + { + int matchBit = (matchByte >> 7) & 1; + matchByte <<= 1; + int bit = rangeDecoder.DecodeBit(m_Decoders, ((1 + matchBit) << 8) + symbol); + symbol = (symbol << 1) | bit; + if (matchBit != bit) + { + while (symbol < 0x100) + symbol = (symbol << 1) | rangeDecoder.DecodeBit(m_Decoders, symbol); + break; + } + } + while (symbol < 0x100); + return (byte)symbol; + } + } + + Decoder2[] m_Coders; + int m_NumPrevBits; + int m_NumPosBits; + int m_PosMask; + + public void Create(int numPosBits, int numPrevBits) + { + if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) + return; + m_NumPosBits = numPosBits; + m_PosMask = (1 << numPosBits) - 1; + m_NumPrevBits = numPrevBits; + int numStates = 1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new Decoder2[numStates]; + for (int i = 0; i < numStates; i++) + m_Coders[i] = new Decoder2(); + } + + public void Init() + { + int numStates = 1 << (m_NumPrevBits + m_NumPosBits); + for (int i = 0; i < numStates; i++) + m_Coders[i].Init(); + } + + Decoder2 GetDecoder(int pos, byte prevByte) + { + return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + ((prevByte & 0xFF) >>> (8 - m_NumPrevBits))]; + } + } + + OutWindow m_OutWindow = new OutWindow(); + SevenZip.Compression.RangeCoder.Decoder m_RangeDecoder = new SevenZip.Compression.RangeCoder.Decoder(); + + short[] m_IsMatchDecoders = new short[Base.kNumStates << Base.kNumPosStatesBitsMax]; + short[] m_IsRepDecoders = new short[Base.kNumStates]; + short[] m_IsRepG0Decoders = new short[Base.kNumStates]; + short[] m_IsRepG1Decoders = new short[Base.kNumStates]; + short[] m_IsRepG2Decoders = new short[Base.kNumStates]; + short[] m_IsRep0LongDecoders = new short[Base.kNumStates << Base.kNumPosStatesBitsMax]; + + BitTreeDecoder[] m_PosSlotDecoder = new BitTreeDecoder[Base.kNumLenToPosStates]; + short[] m_PosDecoders = new short[Base.kNumFullDistances - Base.kEndPosModelIndex]; + + BitTreeDecoder m_PosAlignDecoder = new BitTreeDecoder(Base.kNumAlignBits); + + LenDecoder m_LenDecoder = new LenDecoder(); + LenDecoder m_RepLenDecoder = new LenDecoder(); + + LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); + + int m_DictionarySize = -1; + int m_DictionarySizeCheck = -1; + + int m_PosStateMask; + + public Decoder() + { + for (int i = 0; i < Base.kNumLenToPosStates; i++) + m_PosSlotDecoder[i] = new BitTreeDecoder(Base.kNumPosSlotBits); + } + + boolean SetDictionarySize(int dictionarySize) + { + if (dictionarySize < 0) + return false; + if (m_DictionarySize != dictionarySize) + { + m_DictionarySize = dictionarySize; + m_DictionarySizeCheck = Math.max(m_DictionarySize, 1); + m_OutWindow.Create(Math.max(m_DictionarySizeCheck, (1 << 12))); + } + return true; + } + + boolean SetLcLpPb(int lc, int lp, int pb) + { + if (lc > Base.kNumLitContextBitsMax || lp > 4 || pb > Base.kNumPosStatesBitsMax) + return false; + m_LiteralDecoder.Create(lp, lc); + int numPosStates = 1 << pb; + m_LenDecoder.Create(numPosStates); + m_RepLenDecoder.Create(numPosStates); + m_PosStateMask = numPosStates - 1; + return true; + } + + void Init() throws IOException + { + m_OutWindow.Init(false); + + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsMatchDecoders); + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRep0LongDecoders); + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRepDecoders); + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRepG0Decoders); + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRepG1Decoders); + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_IsRepG2Decoders); + SevenZip.Compression.RangeCoder.Decoder.InitBitModels(m_PosDecoders); + + m_LiteralDecoder.Init(); + int i; + for (i = 0; i < Base.kNumLenToPosStates; i++) + m_PosSlotDecoder[i].Init(); + m_LenDecoder.Init(); + m_RepLenDecoder.Init(); + m_PosAlignDecoder.Init(); + m_RangeDecoder.Init(); + } + + public boolean Code(java.io.InputStream inStream, java.io.OutputStream outStream, + long outSize) throws IOException + { + m_RangeDecoder.SetStream(inStream); + m_OutWindow.SetStream(outStream); + Init(); + + int state = Base.StateInit(); + int rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; + + long nowPos64 = 0; + byte prevByte = 0; + while (outSize < 0 || nowPos64 < outSize) + { + int posState = (int)nowPos64 & m_PosStateMask; + if (m_RangeDecoder.DecodeBit(m_IsMatchDecoders, (state << Base.kNumPosStatesBitsMax) + posState) == 0) + { + LiteralDecoder.Decoder2 decoder2 = m_LiteralDecoder.GetDecoder((int)nowPos64, prevByte); + if (!Base.StateIsCharState(state)) + prevByte = decoder2.DecodeWithMatchByte(m_RangeDecoder, m_OutWindow.GetByte(rep0)); + else + prevByte = decoder2.DecodeNormal(m_RangeDecoder); + m_OutWindow.PutByte(prevByte); + state = Base.StateUpdateChar(state); + nowPos64++; + } + else + { + int len; + if (m_RangeDecoder.DecodeBit(m_IsRepDecoders, state) == 1) + { + len = 0; + if (m_RangeDecoder.DecodeBit(m_IsRepG0Decoders, state) == 0) + { + if (m_RangeDecoder.DecodeBit(m_IsRep0LongDecoders, (state << Base.kNumPosStatesBitsMax) + posState) == 0) + { + state = Base.StateUpdateShortRep(state); + len = 1; + } + } + else + { + int distance; + if (m_RangeDecoder.DecodeBit(m_IsRepG1Decoders, state) == 0) + distance = rep1; + else + { + if (m_RangeDecoder.DecodeBit(m_IsRepG2Decoders, state) == 0) + distance = rep2; + else + { + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + if (len == 0) + { + len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + Base.kMatchMinLen; + state = Base.StateUpdateRep(state); + } + } + else + { + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + len = Base.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); + state = Base.StateUpdateMatch(state); + int posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(m_RangeDecoder); + if (posSlot >= Base.kStartPosModelIndex) + { + int numDirectBits = (posSlot >> 1) - 1; + rep0 = ((2 | (posSlot & 1)) << numDirectBits); + if (posSlot < Base.kEndPosModelIndex) + rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders, + rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); + else + { + rep0 += (m_RangeDecoder.DecodeDirectBits( + numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits); + rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); + if (rep0 < 0) + { + if (rep0 == -1) + break; + return false; + } + } + } + else + rep0 = posSlot; + } + if (rep0 >= nowPos64 || rep0 >= m_DictionarySizeCheck) + { + // m_OutWindow.Flush(); + return false; + } + m_OutWindow.CopyBlock(rep0, len); + nowPos64 += len; + prevByte = m_OutWindow.GetByte(0); + } + } + m_OutWindow.Flush(); + m_OutWindow.ReleaseStream(); + m_RangeDecoder.ReleaseStream(); + return true; + } + + public boolean SetDecoderProperties(byte[] properties) + { + if (properties.length < 5) + return false; + int val = properties[0] & 0xFF; + int lc = val % 9; + int remainder = val / 9; + int lp = remainder % 5; + int pb = remainder / 5; + int dictionarySize = 0; + for (int i = 0; i < 4; i++) + dictionarySize += ((int)(properties[1 + i]) & 0xFF) << (i * 8); + if (!SetLcLpPb(lc, lp, pb)) + return false; + return SetDictionarySize(dictionarySize); + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/LZMA/Encoder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/LZMA/Encoder.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1416 @@ +package SevenZip.Compression.LZMA; + +import SevenZip.Compression.RangeCoder.BitTreeEncoder; +import SevenZip.Compression.LZMA.Base; +import SevenZip.Compression.LZ.BinTree; +import SevenZip.ICodeProgress; +import java.io.IOException; + +public class Encoder +{ + public static final int EMatchFinderTypeBT2 = 0; + public static final int EMatchFinderTypeBT4 = 1; + + + + + static final int kIfinityPrice = 0xFFFFFFF; + + static byte[] g_FastPos = new byte[1 << 11]; + + static + { + int kFastSlots = 22; + int c = 2; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + for (int slotFast = 2; slotFast < kFastSlots; slotFast++) + { + int k = (1 << ((slotFast >> 1) - 1)); + for (int j = 0; j < k; j++, c++) + g_FastPos[c] = (byte)slotFast; + } + } + + static int GetPosSlot(int pos) + { + if (pos < (1 << 11)) + return g_FastPos[pos]; + if (pos < (1 << 21)) + return (g_FastPos[pos >> 10] + 20); + return (g_FastPos[pos >> 20] + 40); + } + + static int GetPosSlot2(int pos) + { + if (pos < (1 << 17)) + return (g_FastPos[pos >> 6] + 12); + if (pos < (1 << 27)) + return (g_FastPos[pos >> 16] + 32); + return (g_FastPos[pos >> 26] + 52); + } + + int _state = Base.StateInit(); + byte _previousByte; + int[] _repDistances = new int[Base.kNumRepDistances]; + + void BaseInit() + { + _state = Base.StateInit(); + _previousByte = 0; + for (int i = 0; i < Base.kNumRepDistances; i++) + _repDistances[i] = 0; + } + + static final int kDefaultDictionaryLogSize = 22; + static final int kNumFastBytesDefault = 0x20; + + class LiteralEncoder + { + class Encoder2 + { + short[] m_Encoders = new short[0x300]; + + public void Init() { SevenZip.Compression.RangeCoder.Encoder.InitBitModels(m_Encoders); } + + + + public void Encode(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, byte symbol) throws IOException + { + int context = 1; + for (int i = 7; i >= 0; i--) + { + int bit = ((symbol >> i) & 1); + rangeEncoder.Encode(m_Encoders, context, bit); + context = (context << 1) | bit; + } + } + + public void EncodeMatched(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) throws IOException + { + int context = 1; + boolean same = true; + for (int i = 7; i >= 0; i--) + { + int bit = ((symbol >> i) & 1); + int state = context; + if (same) + { + int matchBit = ((matchByte >> i) & 1); + state += ((1 + matchBit) << 8); + same = (matchBit == bit); + } + rangeEncoder.Encode(m_Encoders, state, bit); + context = (context << 1) | bit; + } + } + + public int GetPrice(boolean matchMode, byte matchByte, byte symbol) + { + int price = 0; + int context = 1; + int i = 7; + if (matchMode) + { + for (; i >= 0; i--) + { + int matchBit = (matchByte >> i) & 1; + int bit = (symbol >> i) & 1; + price += SevenZip.Compression.RangeCoder.Encoder.GetPrice(m_Encoders[((1 + matchBit) << 8) + context], bit); + context = (context << 1) | bit; + if (matchBit != bit) + { + i--; + break; + } + } + } + for (; i >= 0; i--) + { + int bit = (symbol >> i) & 1; + price += SevenZip.Compression.RangeCoder.Encoder.GetPrice(m_Encoders[context], bit); + context = (context << 1) | bit; + } + return price; + } + } + + Encoder2[] m_Coders; + int m_NumPrevBits; + int m_NumPosBits; + int m_PosMask; + + public void Create(int numPosBits, int numPrevBits) + { + if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) + return; + m_NumPosBits = numPosBits; + m_PosMask = (1 << numPosBits) - 1; + m_NumPrevBits = numPrevBits; + int numStates = 1 << (m_NumPrevBits + m_NumPosBits); + m_Coders = new Encoder2[numStates]; + for (int i = 0; i < numStates; i++) + m_Coders[i] = new Encoder2(); + } + + public void Init() + { + int numStates = 1 << (m_NumPrevBits + m_NumPosBits); + for (int i = 0; i < numStates; i++) + m_Coders[i].Init(); + } + + public Encoder2 GetSubCoder(int pos, byte prevByte) + { return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + ((prevByte & 0xFF) >>> (8 - m_NumPrevBits))]; } + } + + class LenEncoder + { + short[] _choice = new short[2]; + BitTreeEncoder[] _lowCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; + BitTreeEncoder[] _midCoder = new BitTreeEncoder[Base.kNumPosStatesEncodingMax]; + BitTreeEncoder _highCoder = new BitTreeEncoder(Base.kNumHighLenBits); + + + public LenEncoder() + { + for (int posState = 0; posState < Base.kNumPosStatesEncodingMax; posState++) + { + _lowCoder[posState] = new BitTreeEncoder(Base.kNumLowLenBits); + _midCoder[posState] = new BitTreeEncoder(Base.kNumMidLenBits); + } + } + + public void Init(int numPosStates) + { + SevenZip.Compression.RangeCoder.Encoder.InitBitModels(_choice); + + for (int posState = 0; posState < numPosStates; posState++) + { + _lowCoder[posState].Init(); + _midCoder[posState].Init(); + } + _highCoder.Init(); + } + + public void Encode(SevenZip.Compression.RangeCoder.Encoder rangeEncoder, int symbol, int posState) throws IOException + { + if (symbol < Base.kNumLowLenSymbols) + { + rangeEncoder.Encode(_choice, 0, 0); + _lowCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + symbol -= Base.kNumLowLenSymbols; + rangeEncoder.Encode(_choice, 0, 1); + if (symbol < Base.kNumMidLenSymbols) + { + rangeEncoder.Encode(_choice, 1, 0); + _midCoder[posState].Encode(rangeEncoder, symbol); + } + else + { + rangeEncoder.Encode(_choice, 1, 1); + _highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols); + } + } + } + + public void SetPrices(int posState, int numSymbols, int[] prices, int st) + { + int a0 = SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_choice[0]); + int a1 = SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_choice[0]); + int b0 = a1 + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_choice[1]); + int b1 = a1 + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_choice[1]); + int i = 0; + for (i = 0; i < Base.kNumLowLenSymbols; i++) + { + if (i >= numSymbols) + return; + prices[st + i] = a0 + _lowCoder[posState].GetPrice(i); + } + for (; i < Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; i++) + { + if (i >= numSymbols) + return; + prices[st + i] = b0 + _midCoder[posState].GetPrice(i - Base.kNumLowLenSymbols); + } + for (; i < numSymbols; i++) + prices[st + i] = b1 + _highCoder.GetPrice(i - Base.kNumLowLenSymbols - Base.kNumMidLenSymbols); + } + }; + + public static final int kNumLenSpecSymbols = Base.kNumLowLenSymbols + Base.kNumMidLenSymbols; + + class LenPriceTableEncoder extends LenEncoder + { + int[] _prices = new int[Base.kNumLenSymbols< 0) + { + lenRes = _matchDistances[_numDistancePairs - 2]; + if (lenRes == _numFastBytes) + lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[_numDistancePairs - 1], + Base.kMatchMaxLen - lenRes); + } + _additionalOffset++; + return lenRes; + } + + void MovePos(int num) throws java.io.IOException + { + if (num > 0) + { + _matchFinder.Skip(num); + _additionalOffset += num; + } + } + + int GetRepLen1Price(int state, int posState) + { + return SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRepG0[state]) + + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRep0Long[(state << Base.kNumPosStatesBitsMax) + posState]); + } + + int GetPureRepPrice(int repIndex, int state, int posState) + { + int price; + if (repIndex == 0) + { + price = SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRepG0[state]); + price += SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep0Long[(state << Base.kNumPosStatesBitsMax) + posState]); + } + else + { + price = SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRepG0[state]); + if (repIndex == 1) + price += SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRepG1[state]); + else + { + price += SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRepG1[state]); + price += SevenZip.Compression.RangeCoder.Encoder.GetPrice(_isRepG2[state], repIndex - 2); + } + } + return price; + } + + int GetRepPrice(int repIndex, int len, int state, int posState) + { + int price = _repMatchLenEncoder.GetPrice(len - Base.kMatchMinLen, posState); + return price + GetPureRepPrice(repIndex, state, posState); + } + + int GetPosLenPrice(int pos, int len, int posState) + { + int price; + int lenToPosState = Base.GetLenToPosState(len); + if (pos < Base.kNumFullDistances) + price = _distancesPrices[(lenToPosState * Base.kNumFullDistances) + pos]; + else + price = _posSlotPrices[(lenToPosState << Base.kNumPosSlotBits) + GetPosSlot2(pos)] + + _alignPrices[pos & Base.kAlignMask]; + return price + _lenEncoder.GetPrice(len - Base.kMatchMinLen, posState); + } + + int Backward(int cur) + { + _optimumEndIndex = cur; + int posMem = _optimum[cur].PosPrev; + int backMem = _optimum[cur].BackPrev; + do + { + if (_optimum[cur].Prev1IsChar) + { + _optimum[posMem].MakeAsChar(); + _optimum[posMem].PosPrev = posMem - 1; + if (_optimum[cur].Prev2) + { + _optimum[posMem - 1].Prev1IsChar = false; + _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; + _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; + } + } + int posPrev = posMem; + int backCur = backMem; + + backMem = _optimum[posPrev].BackPrev; + posMem = _optimum[posPrev].PosPrev; + + _optimum[posPrev].BackPrev = backCur; + _optimum[posPrev].PosPrev = cur; + cur = posPrev; + } + while (cur > 0); + backRes = _optimum[0].BackPrev; + _optimumCurrentIndex = _optimum[0].PosPrev; + return _optimumCurrentIndex; + } + + int[] reps = new int[Base.kNumRepDistances]; + int[] repLens = new int[Base.kNumRepDistances]; + int backRes; + + int GetOptimum(int position) throws IOException + { + if (_optimumEndIndex != _optimumCurrentIndex) + { + int lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; + backRes = _optimum[_optimumCurrentIndex].BackPrev; + _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; + return lenRes; + } + _optimumCurrentIndex = _optimumEndIndex = 0; + + int lenMain, numDistancePairs; + if (!_longestMatchWasFound) + { + lenMain = ReadMatchDistances(); + } + else + { + lenMain = _longestMatchLength; + _longestMatchWasFound = false; + } + numDistancePairs = _numDistancePairs; + + int numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1; + if (numAvailableBytes < 2) + { + backRes = -1; + return 1; + } + if (numAvailableBytes > Base.kMatchMaxLen) + numAvailableBytes = Base.kMatchMaxLen; + + int repMaxIndex = 0; + int i; + for (i = 0; i < Base.kNumRepDistances; i++) + { + reps[i] = _repDistances[i]; + repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], Base.kMatchMaxLen); + if (repLens[i] > repLens[repMaxIndex]) + repMaxIndex = i; + } + if (repLens[repMaxIndex] >= _numFastBytes) + { + backRes = repMaxIndex; + int lenRes = repLens[repMaxIndex]; + MovePos(lenRes - 1); + return lenRes; + } + + if (lenMain >= _numFastBytes) + { + backRes = _matchDistances[numDistancePairs - 1] + Base.kNumRepDistances; + MovePos(lenMain - 1); + return lenMain; + } + + byte currentByte = _matchFinder.GetIndexByte(0 - 1); + byte matchByte = _matchFinder.GetIndexByte(0 - _repDistances[0] - 1 - 1); + + if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) + { + backRes = -1; + return 1; + } + + _optimum[0].State = _state; + + int posState = (position & _posStateMask); + + _optimum[1].Price = SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isMatch[(_state << Base.kNumPosStatesBitsMax) + posState]) + + _literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!Base.StateIsCharState(_state), matchByte, currentByte); + _optimum[1].MakeAsChar(); + + int matchPrice = SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(_state << Base.kNumPosStatesBitsMax) + posState]); + int repMatchPrice = matchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[_state]); + + if (matchByte == currentByte) + { + int shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); + if (shortRepPrice < _optimum[1].Price) + { + _optimum[1].Price = shortRepPrice; + _optimum[1].MakeAsShortRep(); + } + } + + int lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); + + if (lenEnd < 2) + { + backRes = _optimum[1].BackPrev; + return 1; + } + + _optimum[1].PosPrev = 0; + + _optimum[0].Backs0 = reps[0]; + _optimum[0].Backs1 = reps[1]; + _optimum[0].Backs2 = reps[2]; + _optimum[0].Backs3 = reps[3]; + + int len = lenEnd; + do + _optimum[len--].Price = kIfinityPrice; + while (len >= 2); + + for (i = 0; i < Base.kNumRepDistances; i++) + { + int repLen = repLens[i]; + if (repLen < 2) + continue; + int price = repMatchPrice + GetPureRepPrice(i, _state, posState); + do + { + int curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); + Optimal optimum = _optimum[repLen]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = i; + optimum.Prev1IsChar = false; + } + } + while (--repLen >= 2); + } + + int normalMatchPrice = matchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRep[_state]); + + len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= lenMain) + { + int offs = 0; + while (len > _matchDistances[offs]) + offs += 2; + for (; ; len++) + { + int distance = _matchDistances[offs + 1]; + int curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); + Optimal optimum = _optimum[len]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = 0; + optimum.BackPrev = distance + Base.kNumRepDistances; + optimum.Prev1IsChar = false; + } + if (len == _matchDistances[offs]) + { + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + + int cur = 0; + + while (true) + { + cur++; + if (cur == lenEnd) + return Backward(cur); + int newLen = ReadMatchDistances(); + numDistancePairs = _numDistancePairs; + if (newLen >= _numFastBytes) + { + + _longestMatchLength = newLen; + _longestMatchWasFound = true; + return Backward(cur); + } + position++; + int posPrev = _optimum[cur].PosPrev; + int state; + if (_optimum[cur].Prev1IsChar) + { + posPrev--; + if (_optimum[cur].Prev2) + { + state = _optimum[_optimum[cur].PosPrev2].State; + if (_optimum[cur].BackPrev2 < Base.kNumRepDistances) + state = Base.StateUpdateRep(state); + else + state = Base.StateUpdateMatch(state); + } + else + state = _optimum[posPrev].State; + state = Base.StateUpdateChar(state); + } + else + state = _optimum[posPrev].State; + if (posPrev == cur - 1) + { + if (_optimum[cur].IsShortRep()) + state = Base.StateUpdateShortRep(state); + else + state = Base.StateUpdateChar(state); + } + else + { + int pos; + if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2) + { + posPrev = _optimum[cur].PosPrev2; + pos = _optimum[cur].BackPrev2; + state = Base.StateUpdateRep(state); + } + else + { + pos = _optimum[cur].BackPrev; + if (pos < Base.kNumRepDistances) + state = Base.StateUpdateRep(state); + else + state = Base.StateUpdateMatch(state); + } + Optimal opt = _optimum[posPrev]; + if (pos < Base.kNumRepDistances) + { + if (pos == 0) + { + reps[0] = opt.Backs0; + reps[1] = opt.Backs1; + reps[2] = opt.Backs2; + reps[3] = opt.Backs3; + } + else if (pos == 1) + { + reps[0] = opt.Backs1; + reps[1] = opt.Backs0; + reps[2] = opt.Backs2; + reps[3] = opt.Backs3; + } + else if (pos == 2) + { + reps[0] = opt.Backs2; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs3; + } + else + { + reps[0] = opt.Backs3; + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs2; + } + } + else + { + reps[0] = (pos - Base.kNumRepDistances); + reps[1] = opt.Backs0; + reps[2] = opt.Backs1; + reps[3] = opt.Backs2; + } + } + _optimum[cur].State = state; + _optimum[cur].Backs0 = reps[0]; + _optimum[cur].Backs1 = reps[1]; + _optimum[cur].Backs2 = reps[2]; + _optimum[cur].Backs3 = reps[3]; + int curPrice = _optimum[cur].Price; + + currentByte = _matchFinder.GetIndexByte(0 - 1); + matchByte = _matchFinder.GetIndexByte(0 - reps[0] - 1 - 1); + + posState = (position & _posStateMask); + + int curAnd1Price = curPrice + + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isMatch[(state << Base.kNumPosStatesBitsMax) + posState]) + + _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). + GetPrice(!Base.StateIsCharState(state), matchByte, currentByte); + + Optimal nextOptimum = _optimum[cur + 1]; + + boolean nextIsChar = false; + if (curAnd1Price < nextOptimum.Price) + { + nextOptimum.Price = curAnd1Price; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsChar(); + nextIsChar = true; + } + + matchPrice = curPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(state << Base.kNumPosStatesBitsMax) + posState]); + repMatchPrice = matchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[state]); + + if (matchByte == currentByte && + !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) + { + int shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); + if (shortRepPrice <= nextOptimum.Price) + { + nextOptimum.Price = shortRepPrice; + nextOptimum.PosPrev = cur; + nextOptimum.MakeAsShortRep(); + nextIsChar = true; + } + } + + int numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1; + numAvailableBytesFull = Math.min(kNumOpts - 1 - cur, numAvailableBytesFull); + numAvailableBytes = numAvailableBytesFull; + + if (numAvailableBytes < 2) + continue; + if (numAvailableBytes > _numFastBytes) + numAvailableBytes = _numFastBytes; + if (!nextIsChar && matchByte != currentByte) + { + // try Literal + rep0 + int t = Math.min(numAvailableBytesFull - 1, _numFastBytes); + int lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t); + if (lenTest2 >= 2) + { + int state2 = Base.StateUpdateChar(state); + + int posStateNext = (position + 1) & _posStateMask; + int nextRepMatchPrice = curAnd1Price + + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]) + + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[state2]); + { + int offset = cur + 1 + lenTest2; + while (lenEnd < offset) + _optimum[++lenEnd].Price = kIfinityPrice; + int curAndLenPrice = nextRepMatchPrice + GetRepPrice( + 0, lenTest2, state2, posStateNext); + Optimal optimum = _optimum[offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = false; + } + } + } + } + + int startLen = 2; // speed optimization + + for (int repIndex = 0; repIndex < Base.kNumRepDistances; repIndex++) + { + int lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); + if (lenTest < 2) + continue; + int lenTestTemp = lenTest; + do + { + while (lenEnd < cur + lenTest) + _optimum[++lenEnd].Price = kIfinityPrice; + int curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); + Optimal optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = repIndex; + optimum.Prev1IsChar = false; + } + } + while (--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + // if (_maxMode) + if (lenTest < numAvailableBytesFull) + { + int t = Math.min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); + int lenTest2 = _matchFinder.GetMatchLen(lenTest, reps[repIndex], t); + if (lenTest2 >= 2) + { + int state2 = Base.StateUpdateRep(state); + + int posStateNext = (position + lenTest) & _posStateMask; + int curAndLenCharPrice = + repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]) + + _literalEncoder.GetSubCoder(position + lenTest, + _matchFinder.GetIndexByte(lenTest - 1 - 1)).GetPrice(true, + _matchFinder.GetIndexByte(lenTest - 1 - (reps[repIndex] + 1)), + _matchFinder.GetIndexByte(lenTest - 1)); + state2 = Base.StateUpdateChar(state2); + posStateNext = (position + lenTest + 1) & _posStateMask; + int nextMatchPrice = curAndLenCharPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]); + int nextRepMatchPrice = nextMatchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[state2]); + + // for(; lenTest2 >= 2; lenTest2--) + { + int offset = lenTest + 1 + lenTest2; + while (lenEnd < cur + offset) + _optimum[++lenEnd].Price = kIfinityPrice; + int curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + Optimal optimum = _optimum[cur + offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = repIndex; + } + } + } + } + } + + if (newLen > numAvailableBytes) + { + newLen = numAvailableBytes; + for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ; + _matchDistances[numDistancePairs] = newLen; + numDistancePairs += 2; + } + if (newLen >= startLen) + { + normalMatchPrice = matchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isRep[state]); + while (lenEnd < cur + newLen) + _optimum[++lenEnd].Price = kIfinityPrice; + + int offs = 0; + while (startLen > _matchDistances[offs]) + offs += 2; + + for (int lenTest = startLen; ; lenTest++) + { + int curBack = _matchDistances[offs + 1]; + int curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); + Optimal optimum = _optimum[cur + lenTest]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur; + optimum.BackPrev = curBack + Base.kNumRepDistances; + optimum.Prev1IsChar = false; + } + + if (lenTest == _matchDistances[offs]) + { + if (lenTest < numAvailableBytesFull) + { + int t = Math.min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); + int lenTest2 = _matchFinder.GetMatchLen(lenTest, curBack, t); + if (lenTest2 >= 2) + { + int state2 = Base.StateUpdateMatch(state); + + int posStateNext = (position + lenTest) & _posStateMask; + int curAndLenCharPrice = curAndLenPrice + + SevenZip.Compression.RangeCoder.Encoder.GetPrice0(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]) + + _literalEncoder.GetSubCoder(position + lenTest, + _matchFinder.GetIndexByte(lenTest - 1 - 1)). + GetPrice(true, + _matchFinder.GetIndexByte(lenTest - (curBack + 1) - 1), + _matchFinder.GetIndexByte(lenTest - 1)); + state2 = Base.StateUpdateChar(state2); + posStateNext = (position + lenTest + 1) & _posStateMask; + int nextMatchPrice = curAndLenCharPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isMatch[(state2 << Base.kNumPosStatesBitsMax) + posStateNext]); + int nextRepMatchPrice = nextMatchPrice + SevenZip.Compression.RangeCoder.Encoder.GetPrice1(_isRep[state2]); + + int offset = lenTest + 1 + lenTest2; + while (lenEnd < cur + offset) + _optimum[++lenEnd].Price = kIfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); + optimum = _optimum[cur + offset]; + if (curAndLenPrice < optimum.Price) + { + optimum.Price = curAndLenPrice; + optimum.PosPrev = cur + lenTest + 1; + optimum.BackPrev = 0; + optimum.Prev1IsChar = true; + optimum.Prev2 = true; + optimum.PosPrev2 = cur; + optimum.BackPrev2 = curBack + Base.kNumRepDistances; + } + } + } + offs += 2; + if (offs == numDistancePairs) + break; + } + } + } + } + } + + boolean ChangePair(int smallDist, int bigDist) + { + int kDif = 7; + return (smallDist < (1 << (32 - kDif)) && bigDist >= (smallDist << kDif)); + } + + void WriteEndMarker(int posState) throws IOException + { + if (!_writeEndMark) + return; + + _rangeEncoder.Encode(_isMatch, (_state << Base.kNumPosStatesBitsMax) + posState, 1); + _rangeEncoder.Encode(_isRep, _state, 0); + _state = Base.StateUpdateMatch(_state); + int len = Base.kMatchMinLen; + _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + int posSlot = (1 << Base.kNumPosSlotBits) - 1; + int lenToPosState = Base.GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); + int footerBits = 30; + int posReduced = (1 << footerBits) - 1; + _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); + _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); + } + + void Flush(int nowPos) throws IOException + { + ReleaseMFStream(); + WriteEndMarker(nowPos & _posStateMask); + _rangeEncoder.FlushData(); + _rangeEncoder.FlushStream(); + } + + public void CodeOneBlock(long[] inSize, long[] outSize, boolean[] finished) throws IOException + { + inSize[0] = 0; + outSize[0] = 0; + finished[0] = true; + + if (_inStream != null) + { + _matchFinder.SetStream(_inStream); + _matchFinder.Init(); + _needReleaseMFStream = true; + _inStream = null; + } + + if (_finished) + return; + _finished = true; + + + long progressPosValuePrev = nowPos64; + if (nowPos64 == 0) + { + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((int)nowPos64); + return; + } + + ReadMatchDistances(); + int posState = (int)(nowPos64) & _posStateMask; + _rangeEncoder.Encode(_isMatch, (_state << Base.kNumPosStatesBitsMax) + posState, 0); + _state = Base.StateUpdateChar(_state); + byte curByte = _matchFinder.GetIndexByte(0 - _additionalOffset); + _literalEncoder.GetSubCoder((int)(nowPos64), _previousByte).Encode(_rangeEncoder, curByte); + _previousByte = curByte; + _additionalOffset--; + nowPos64++; + } + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((int)nowPos64); + return; + } + while (true) + { + + int len = GetOptimum((int)nowPos64); + int pos = backRes; + int posState = ((int)nowPos64) & _posStateMask; + int complexState = (_state << Base.kNumPosStatesBitsMax) + posState; + if (len == 1 && pos == -1) + { + _rangeEncoder.Encode(_isMatch, complexState, 0); + byte curByte = _matchFinder.GetIndexByte((int)(0 - _additionalOffset)); + LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((int)nowPos64, _previousByte); + if (!Base.StateIsCharState(_state)) + { + byte matchByte = _matchFinder.GetIndexByte((int)(0 - _repDistances[0] - 1 - _additionalOffset)); + subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); + } + else + subCoder.Encode(_rangeEncoder, curByte); + _previousByte = curByte; + _state = Base.StateUpdateChar(_state); + } + else + { + _rangeEncoder.Encode(_isMatch, complexState, 1); + if (pos < Base.kNumRepDistances) + { + _rangeEncoder.Encode(_isRep, _state, 1); + if (pos == 0) + { + _rangeEncoder.Encode(_isRepG0, _state, 0); + if (len == 1) + _rangeEncoder.Encode(_isRep0Long, complexState, 0); + else + _rangeEncoder.Encode(_isRep0Long, complexState, 1); + } + else + { + _rangeEncoder.Encode(_isRepG0, _state, 1); + if (pos == 1) + _rangeEncoder.Encode(_isRepG1, _state, 0); + else + { + _rangeEncoder.Encode(_isRepG1, _state, 1); + _rangeEncoder.Encode(_isRepG2, _state, pos - 2); + } + } + if (len == 1) + _state = Base.StateUpdateShortRep(_state); + else + { + _repMatchLenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + _state = Base.StateUpdateRep(_state); + } + int distance = _repDistances[pos]; + if (pos != 0) + { + for (int i = pos; i >= 1; i--) + _repDistances[i] = _repDistances[i - 1]; + _repDistances[0] = distance; + } + } + else + { + _rangeEncoder.Encode(_isRep, _state, 0); + _state = Base.StateUpdateMatch(_state); + _lenEncoder.Encode(_rangeEncoder, len - Base.kMatchMinLen, posState); + pos -= Base.kNumRepDistances; + int posSlot = GetPosSlot(pos); + int lenToPosState = Base.GetLenToPosState(len); + _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); + + if (posSlot >= Base.kStartPosModelIndex) + { + int footerBits = (int)((posSlot >> 1) - 1); + int baseVal = ((2 | (posSlot & 1)) << footerBits); + int posReduced = pos - baseVal; + + if (posSlot < Base.kEndPosModelIndex) + BitTreeEncoder.ReverseEncode(_posEncoders, + baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced); + else + { + _rangeEncoder.EncodeDirectBits(posReduced >> Base.kNumAlignBits, footerBits - Base.kNumAlignBits); + _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & Base.kAlignMask); + _alignPriceCount++; + } + } + int distance = pos; + for (int i = Base.kNumRepDistances - 1; i >= 1; i--) + _repDistances[i] = _repDistances[i - 1]; + _repDistances[0] = distance; + _matchPriceCount++; + } + _previousByte = _matchFinder.GetIndexByte(len - 1 - _additionalOffset); + } + _additionalOffset -= len; + nowPos64 += len; + if (_additionalOffset == 0) + { + // if (!_fastMode) + if (_matchPriceCount >= (1 << 7)) + FillDistancesPrices(); + if (_alignPriceCount >= Base.kAlignTableSize) + FillAlignPrices(); + inSize[0] = nowPos64; + outSize[0] = _rangeEncoder.GetProcessedSizeAdd(); + if (_matchFinder.GetNumAvailableBytes() == 0) + { + Flush((int)nowPos64); + return; + } + + if (nowPos64 - progressPosValuePrev >= (1 << 12)) + { + _finished = false; + finished[0] = false; + return; + } + } + } + } + + void ReleaseMFStream() + { + if (_matchFinder != null && _needReleaseMFStream) + { + _matchFinder.ReleaseStream(); + _needReleaseMFStream = false; + } + } + + void SetOutStream(java.io.OutputStream outStream) + { _rangeEncoder.SetStream(outStream); } + void ReleaseOutStream() + { _rangeEncoder.ReleaseStream(); } + + void ReleaseStreams() + { + ReleaseMFStream(); + ReleaseOutStream(); + } + + void SetStreams(java.io.InputStream inStream, java.io.OutputStream outStream, + long inSize, long outSize) + { + _inStream = inStream; + _finished = false; + Create(); + SetOutStream(outStream); + Init(); + + // if (!_fastMode) + { + FillDistancesPrices(); + FillAlignPrices(); + } + + _lenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); + _lenEncoder.UpdateTables(1 << _posStateBits); + _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - Base.kMatchMinLen); + _repMatchLenEncoder.UpdateTables(1 << _posStateBits); + + nowPos64 = 0; + } + + long[] processedInSize = new long[1]; long[] processedOutSize = new long[1]; boolean[] finished = new boolean[1]; + public void Code(java.io.InputStream inStream, java.io.OutputStream outStream, + long inSize, long outSize, ICodeProgress progress) throws IOException + { + _needReleaseMFStream = false; + try + { + SetStreams(inStream, outStream, inSize, outSize); + while (true) + { + + + + CodeOneBlock(processedInSize, processedOutSize, finished); + if (finished[0]) + return; + if (progress != null) + { + progress.SetProgress(processedInSize[0], processedOutSize[0]); + } + } + } + finally + { + ReleaseStreams(); + } + } + + public static final int kPropSize = 5; + byte[] properties = new byte[kPropSize]; + + public void WriteCoderProperties(java.io.OutputStream outStream) throws IOException + { + properties[0] = (byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); + for (int i = 0; i < 4; i++) + properties[1 + i] = (byte)(_dictionarySize >> (8 * i)); + outStream.write(properties, 0, kPropSize); + } + + int[] tempPrices = new int[Base.kNumFullDistances]; + int _matchPriceCount; + + void FillDistancesPrices() + { + for (int i = Base.kStartPosModelIndex; i < Base.kNumFullDistances; i++) + { + int posSlot = GetPosSlot(i); + int footerBits = (int)((posSlot >> 1) - 1); + int baseVal = ((2 | (posSlot & 1)) << footerBits); + tempPrices[i] = BitTreeEncoder.ReverseGetPrice(_posEncoders, + baseVal - posSlot - 1, footerBits, i - baseVal); + } + + for (int lenToPosState = 0; lenToPosState < Base.kNumLenToPosStates; lenToPosState++) + { + int posSlot; + BitTreeEncoder encoder = _posSlotEncoder[lenToPosState]; + + int st = (lenToPosState << Base.kNumPosSlotBits); + for (posSlot = 0; posSlot < _distTableSize; posSlot++) + _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); + for (posSlot = Base.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) + _posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - Base.kNumAlignBits) << SevenZip.Compression.RangeCoder.Encoder.kNumBitPriceShiftBits); + + int st2 = lenToPosState * Base.kNumFullDistances; + int i; + for (i = 0; i < Base.kStartPosModelIndex; i++) + _distancesPrices[st2 + i] = _posSlotPrices[st + i]; + for (; i < Base.kNumFullDistances; i++) + _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; + } + _matchPriceCount = 0; + } + + void FillAlignPrices() + { + for (int i = 0; i < Base.kAlignTableSize; i++) + _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); + _alignPriceCount = 0; + } + + + public boolean SetAlgorithm(int algorithm) + { + /* + _fastMode = (algorithm == 0); + _maxMode = (algorithm >= 2); + */ + return true; + } + + public boolean SetDictionarySize(int dictionarySize) + { + int kDicLogSizeMaxCompress = 29; + if (dictionarySize < (1 << Base.kDicLogSizeMin) || dictionarySize > (1 << kDicLogSizeMaxCompress)) + return false; + _dictionarySize = dictionarySize; + int dicLogSize; + for (dicLogSize = 0; dictionarySize > (1 << dicLogSize); dicLogSize++) ; + _distTableSize = dicLogSize * 2; + return true; + } + + public boolean SeNumFastBytes(int numFastBytes) + { + if (numFastBytes < 5 || numFastBytes > Base.kMatchMaxLen) + return false; + _numFastBytes = numFastBytes; + return true; + } + + public boolean SetMatchFinder(int matchFinderIndex) + { + if (matchFinderIndex < 0 || matchFinderIndex > 2) + return false; + int matchFinderIndexPrev = _matchFinderType; + _matchFinderType = matchFinderIndex; + if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType) + { + _dictionarySizePrev = -1; + _matchFinder = null; + } + return true; + } + + public boolean SetLcLpPb(int lc, int lp, int pb) + { + if ( + lp < 0 || lp > Base.kNumLitPosStatesBitsEncodingMax || + lc < 0 || lc > Base.kNumLitContextBitsMax || + pb < 0 || pb > Base.kNumPosStatesBitsEncodingMax) + return false; + _numLiteralPosStateBits = lp; + _numLiteralContextBits = lc; + _posStateBits = pb; + _posStateMask = ((1) << _posStateBits) - 1; + return true; + } + + public void SetEndMarkerMode(boolean endMarkerMode) + { + _writeEndMark = endMarkerMode; + } +} + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeDecoder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeDecoder.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,55 @@ +package SevenZip.Compression.RangeCoder; + +public class BitTreeDecoder +{ + short[] Models; + int NumBitLevels; + + public BitTreeDecoder(int numBitLevels) + { + NumBitLevels = numBitLevels; + Models = new short[1 << numBitLevels]; + } + + public void Init() + { + Decoder.InitBitModels(Models); + } + + public int Decode(Decoder rangeDecoder) throws java.io.IOException + { + int m = 1; + for (int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--) + m = (m << 1) + rangeDecoder.DecodeBit(Models, m); + return m - (1 << NumBitLevels); + } + + public int ReverseDecode(Decoder rangeDecoder) throws java.io.IOException + { + int m = 1; + int symbol = 0; + for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + int bit = rangeDecoder.DecodeBit(Models, m); + m <<= 1; + m += bit; + symbol |= (bit << bitIndex); + } + return symbol; + } + + public static int ReverseDecode(short[] Models, int startIndex, + Decoder rangeDecoder, int NumBitLevels) throws java.io.IOException + { + int m = 1; + int symbol = 0; + for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) + { + int bit = rangeDecoder.DecodeBit(Models, startIndex + m); + m <<= 1; + m += bit; + symbol |= (bit << bitIndex); + } + return symbol; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeEncoder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeEncoder.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,99 @@ +package SevenZip.Compression.RangeCoder; +import java.io.IOException; + +public class BitTreeEncoder +{ + short[] Models; + int NumBitLevels; + + public BitTreeEncoder(int numBitLevels) + { + NumBitLevels = numBitLevels; + Models = new short[1 << numBitLevels]; + } + + public void Init() + { + Decoder.InitBitModels(Models); + } + + public void Encode(Encoder rangeEncoder, int symbol) throws IOException + { + int m = 1; + for (int bitIndex = NumBitLevels; bitIndex != 0; ) + { + bitIndex--; + int bit = (symbol >>> bitIndex) & 1; + rangeEncoder.Encode(Models, m, bit); + m = (m << 1) | bit; + } + } + + public void ReverseEncode(Encoder rangeEncoder, int symbol) throws IOException + { + int m = 1; + for (int i = 0; i < NumBitLevels; i++) + { + int bit = symbol & 1; + rangeEncoder.Encode(Models, m, bit); + m = (m << 1) | bit; + symbol >>= 1; + } + } + + public int GetPrice(int symbol) + { + int price = 0; + int m = 1; + for (int bitIndex = NumBitLevels; bitIndex != 0; ) + { + bitIndex--; + int bit = (symbol >>> bitIndex) & 1; + price += Encoder.GetPrice(Models[m], bit); + m = (m << 1) + bit; + } + return price; + } + + public int ReverseGetPrice(int symbol) + { + int price = 0; + int m = 1; + for (int i = NumBitLevels; i != 0; i--) + { + int bit = symbol & 1; + symbol >>>= 1; + price += Encoder.GetPrice(Models[m], bit); + m = (m << 1) | bit; + } + return price; + } + + public static int ReverseGetPrice(short[] Models, int startIndex, + int NumBitLevels, int symbol) + { + int price = 0; + int m = 1; + for (int i = NumBitLevels; i != 0; i--) + { + int bit = symbol & 1; + symbol >>>= 1; + price += Encoder.GetPrice(Models[startIndex + m], bit); + m = (m << 1) | bit; + } + return price; + } + + public static void ReverseEncode(short[] Models, int startIndex, + Encoder rangeEncoder, int NumBitLevels, int symbol) throws IOException + { + int m = 1; + for (int i = 0; i < NumBitLevels; i++) + { + int bit = symbol & 1; + rangeEncoder.Encode(Models, startIndex + m, bit); + m = (m << 1) | bit; + symbol >>= 1; + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/Decoder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/Decoder.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,88 @@ +package SevenZip.Compression.RangeCoder; +import java.io.IOException; + +public class Decoder +{ + static final int kTopMask = ~((1 << 24) - 1); + + static final int kNumBitModelTotalBits = 11; + static final int kBitModelTotal = (1 << kNumBitModelTotalBits); + static final int kNumMoveBits = 5; + + int Range; + int Code; + + java.io.InputStream Stream; + + public final void SetStream(java.io.InputStream stream) + { + Stream = stream; + } + + public final void ReleaseStream() + { + Stream = null; + } + + public final void Init() throws IOException + { + Code = 0; + Range = -1; + for (int i = 0; i < 5; i++) + Code = (Code << 8) | Stream.read(); + } + + public final int DecodeDirectBits(int numTotalBits) throws IOException + { + int result = 0; + for (int i = numTotalBits; i != 0; i--) + { + Range >>>= 1; + int t = ((Code - Range) >>> 31); + Code -= Range & (t - 1); + result = (result << 1) | (1 - t); + + if ((Range & kTopMask) == 0) + { + Code = (Code << 8) | Stream.read(); + Range <<= 8; + } + } + return result; + } + + public int DecodeBit(short []probs, int index) throws IOException + { + int prob = probs[index]; + int newBound = (Range >>> kNumBitModelTotalBits) * prob; + if ((Code ^ 0x80000000) < (newBound ^ 0x80000000)) + { + Range = newBound; + probs[index] = (short)(prob + ((kBitModelTotal - prob) >>> kNumMoveBits)); + if ((Range & kTopMask) == 0) + { + Code = (Code << 8) | Stream.read(); + Range <<= 8; + } + return 0; + } + else + { + Range -= newBound; + Code -= newBound; + probs[index] = (short)(prob - ((prob) >>> kNumMoveBits)); + if ((Range & kTopMask) == 0) + { + Code = (Code << 8) | Stream.read(); + Range <<= 8; + } + return 1; + } + } + + public static void InitBitModels(short []probs) + { + for (int i = 0; i < probs.length; i++) + probs[i] = (kBitModelTotal >>> 1); + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/Encoder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/Encoder.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,151 @@ +package SevenZip.Compression.RangeCoder; +import java.io.IOException; + +public class Encoder +{ + static final int kTopMask = ~((1 << 24) - 1); + + static final int kNumBitModelTotalBits = 11; + static final int kBitModelTotal = (1 << kNumBitModelTotalBits); + static final int kNumMoveBits = 5; + + java.io.OutputStream Stream; + + long Low; + int Range; + int _cacheSize; + int _cache; + + long _position; + + public void SetStream(java.io.OutputStream stream) + { + Stream = stream; + } + + public void ReleaseStream() + { + Stream = null; + } + + public void Init() + { + _position = 0; + Low = 0; + Range = -1; + _cacheSize = 1; + _cache = 0; + } + + public void FlushData() throws IOException + { + for (int i = 0; i < 5; i++) + ShiftLow(); + } + + public void FlushStream() throws IOException + { + Stream.flush(); + } + + public void ShiftLow() throws IOException + { + int LowHi = (int)(Low >>> 32); + if (LowHi != 0 || Low < 0xFF000000L) + { + _position += _cacheSize; + int temp = _cache; + do + { + Stream.write(temp + LowHi); + temp = 0xFF; + } + while(--_cacheSize != 0); + _cache = (((int)Low) >>> 24); + } + _cacheSize++; + Low = (Low & 0xFFFFFF) << 8; + } + + public void EncodeDirectBits(int v, int numTotalBits) throws IOException + { + for (int i = numTotalBits - 1; i >= 0; i--) + { + Range >>>= 1; + if (((v >>> i) & 1) == 1) + Low += Range; + if ((Range & Encoder.kTopMask) == 0) + { + Range <<= 8; + ShiftLow(); + } + } + } + + + public long GetProcessedSizeAdd() + { + return _cacheSize + _position + 4; + } + + + + static final int kNumMoveReducingBits = 2; + public static final int kNumBitPriceShiftBits = 6; + + public static void InitBitModels(short []probs) + { + for (int i = 0; i < probs.length; i++) + probs[i] = (kBitModelTotal >>> 1); + } + + public void Encode(short []probs, int index, int symbol) throws IOException + { + int prob = probs[index]; + int newBound = (Range >>> kNumBitModelTotalBits) * prob; + if (symbol == 0) + { + Range = newBound; + probs[index] = (short)(prob + ((kBitModelTotal - prob) >>> kNumMoveBits)); + } + else + { + Low += (newBound & 0xFFFFFFFFL); + Range -= newBound; + probs[index] = (short)(prob - ((prob) >>> kNumMoveBits)); + } + if ((Range & kTopMask) == 0) + { + Range <<= 8; + ShiftLow(); + } + } + + private static int[] ProbPrices = new int[kBitModelTotal >>> kNumMoveReducingBits]; + + static + { + int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); + for (int i = kNumBits - 1; i >= 0; i--) + { + int start = 1 << (kNumBits - i - 1); + int end = 1 << (kNumBits - i); + for (int j = start; j < end; j++) + ProbPrices[j] = (i << kNumBitPriceShiftBits) + + (((end - j) << kNumBitPriceShiftBits) >>> (kNumBits - i - 1)); + } + } + + static public int GetPrice(int Prob, int symbol) + { + return ProbPrices[(((Prob - symbol) ^ ((-symbol))) & (kBitModelTotal - 1)) >>> kNumMoveReducingBits]; + } + static public int GetPrice0(int Prob) + { + return ProbPrices[Prob >>> kNumMoveReducingBits]; + } + static public int GetPrice1(int Prob) + { + return ProbPrices[(kBitModelTotal - Prob) >>> kNumMoveReducingBits]; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/ICodeProgress.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/ICodeProgress.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,6 @@ +package SevenZip; + +public interface ICodeProgress +{ + public void SetProgress(long inSize, long outSize); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/LzmaAlone.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/LzmaAlone.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,253 @@ +package SevenZip; + +public class LzmaAlone +{ + static public class CommandLine + { + public static final int kEncode = 0; + public static final int kDecode = 1; + public static final int kBenchmak = 2; + + public int Command = -1; + public int NumBenchmarkPasses = 10; + + public int DictionarySize = 1 << 23; + public boolean DictionarySizeIsDefined = false; + + public int Lc = 3; + public int Lp = 0; + public int Pb = 2; + + public int Fb = 128; + public boolean FbIsDefined = false; + + public boolean Eos = false; + + public int Algorithm = 2; + public int MatchFinder = 1; + + public String InFile; + public String OutFile; + + boolean ParseSwitch(String s) + { + if (s.startsWith("d")) + { + DictionarySize = 1 << Integer.parseInt(s.substring(1)); + DictionarySizeIsDefined = true; + } + else if (s.startsWith("fb")) + { + Fb = Integer.parseInt(s.substring(2)); + FbIsDefined = true; + } + else if (s.startsWith("a")) + Algorithm = Integer.parseInt(s.substring(1)); + else if (s.startsWith("lc")) + Lc = Integer.parseInt(s.substring(2)); + else if (s.startsWith("lp")) + Lp = Integer.parseInt(s.substring(2)); + else if (s.startsWith("pb")) + Pb = Integer.parseInt(s.substring(2)); + else if (s.startsWith("eos")) + Eos = true; + else if (s.startsWith("mf")) + { + String mfs = s.substring(2); + if (mfs.equals("bt2")) + MatchFinder = 0; + else if (mfs.equals("bt4")) + MatchFinder = 1; + else if (mfs.equals("bt4b")) + MatchFinder = 2; + else + return false; + } + else + return false; + return true; + } + + public boolean Parse(String[] args) throws Exception + { + int pos = 0; + boolean switchMode = true; + for (int i = 0; i < args.length; i++) + { + String s = args[i]; + if (s.length() == 0) + return false; + if (switchMode) + { + if (s.compareTo("--") == 0) + { + switchMode = false; + continue; + } + if (s.charAt(0) == '-') + { + String sw = s.substring(1).toLowerCase(); + if (sw.length() == 0) + return false; + try + { + if (!ParseSwitch(sw)) + return false; + } + catch (NumberFormatException e) + { + return false; + } + continue; + } + } + if (pos == 0) + { + if (s.equalsIgnoreCase("e")) + Command = kEncode; + else if (s.equalsIgnoreCase("d")) + Command = kDecode; + else if (s.equalsIgnoreCase("b")) + Command = kBenchmak; + else + return false; + } + else if(pos == 1) + { + if (Command == kBenchmak) + { + try + { + NumBenchmarkPasses = Integer.parseInt(s); + if (NumBenchmarkPasses < 1) + return false; + } + catch (NumberFormatException e) + { + return false; + } + } + else + InFile = s; + } + else if(pos == 2) + OutFile = s; + else + return false; + pos++; + continue; + } + return true; + } + } + + + static void PrintHelp() + { + System.out.println( + "\nUsage: LZMA [...] inputFile outputFile\n" + + " e: encode file\n" + + " d: decode file\n" + + " b: Benchmark\n" + + "\n" + + // " -a{N}: set compression mode - [0, 1], default: 1 (max)\n" + + " -d{N}: set dictionary - [0,28], default: 23 (8MB)\n" + + " -fb{N}: set number of fast bytes - [5, 273], default: 128\n" + + " -lc{N}: set number of literal context bits - [0, 8], default: 3\n" + + " -lp{N}: set number of literal pos bits - [0, 4], default: 0\n" + + " -pb{N}: set number of pos bits - [0, 4], default: 2\n" + + " -mf{MF_ID}: set Match Finder: [bt2, bt4], default: bt4\n" + + " -eos: write End Of Stream marker\n" + ); + } + + public static void main(String[] args) throws Exception + { + System.out.println("\nLZMA (Java) 4.42 Copyright (c) 1999-2006 Igor Pavlov 2006-05-15\n"); + + if (args.length < 1) + { + PrintHelp(); + return; + } + + CommandLine params = new CommandLine(); + if (!params.Parse(args)) + { + System.out.println("\nIncorrect command"); + return; + } + + if (params.Command == CommandLine.kBenchmak) + { + int dictionary = (1 << 21); + if (params.DictionarySizeIsDefined) + dictionary = params.DictionarySize; + if (params.MatchFinder > 1) + throw new Exception("Unsupported match finder"); + SevenZip.LzmaBench.LzmaBenchmark(params.NumBenchmarkPasses, dictionary); + } + else if (params.Command == CommandLine.kEncode || params.Command == CommandLine.kDecode) + { + java.io.File inFile = new java.io.File(params.InFile); + java.io.File outFile = new java.io.File(params.OutFile); + + java.io.BufferedInputStream inStream = new java.io.BufferedInputStream(new java.io.FileInputStream(inFile)); + java.io.BufferedOutputStream outStream = new java.io.BufferedOutputStream(new java.io.FileOutputStream(outFile)); + + boolean eos = false; + if (params.Eos) + eos = true; + if (params.Command == CommandLine.kEncode) + { + SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder(); + if (!encoder.SetAlgorithm(params.Algorithm)) + throw new Exception("Incorrect compression mode"); + if (!encoder.SetDictionarySize(params.DictionarySize)) + throw new Exception("Incorrect dictionary size"); + if (!encoder.SeNumFastBytes(params.Fb)) + throw new Exception("Incorrect -fb value"); + if (!encoder.SetMatchFinder(params.MatchFinder)) + throw new Exception("Incorrect -mf value"); + if (!encoder.SetLcLpPb(params.Lc, params.Lp, params.Pb)) + throw new Exception("Incorrect -lc or -lp or -pb value"); + encoder.SetEndMarkerMode(eos); + encoder.WriteCoderProperties(outStream); + long fileSize; + if (eos) + fileSize = -1; + else + fileSize = inFile.length(); + for (int i = 0; i < 8; i++) + outStream.write((int)(fileSize >>> (8 * i)) & 0xFF); + encoder.Code(inStream, outStream, -1, -1, null); + } + else + { + int propertiesSize = 5; + byte[] properties = new byte[propertiesSize]; + if (inStream.read(properties, 0, propertiesSize) != propertiesSize) + throw new Exception("input .lzma file is too short"); + SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder(); + if (!decoder.SetDecoderProperties(properties)) + throw new Exception("Incorrect stream properties"); + long outSize = 0; + for (int i = 0; i < 8; i++) + { + int v = inStream.read(); + if (v < 0) + throw new Exception("Can't read stream size"); + outSize |= ((long)v) << (8 * i); + } + if (!decoder.Code(inStream, outStream, outSize)) + throw new Exception("Error in data stream"); + } + outStream.flush(); + outStream.close(); + inStream.close(); + } + else + throw new Exception("Incorrect command"); + return; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Java/SevenZip/LzmaBench.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Java/SevenZip/LzmaBench.java Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,392 @@ +package SevenZip; + +import java.io.ByteArrayOutputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +public class LzmaBench +{ + static final int kAdditionalSize = (1 << 21); + static final int kCompressedAdditionalSize = (1 << 10); + + static class CRandomGenerator + { + int A1; + int A2; + public CRandomGenerator() { Init(); } + public void Init() { A1 = 362436069; A2 = 521288629; } + public int GetRnd() + { + return + ((A1 = 36969 * (A1 & 0xffff) + (A1 >>> 16)) << 16) ^ + ((A2 = 18000 * (A2 & 0xffff) + (A2 >>> 16))); + } + }; + + static class CBitRandomGenerator + { + CRandomGenerator RG = new CRandomGenerator(); + int Value; + int NumBits; + public void Init() + { + Value = 0; + NumBits = 0; + } + public int GetRnd(int numBits) + { + int result; + if (NumBits > numBits) + { + result = Value & ((1 << numBits) - 1); + Value >>>= numBits; + NumBits -= numBits; + return result; + } + numBits -= NumBits; + result = (Value << numBits); + Value = RG.GetRnd(); + result |= Value & (((int)1 << numBits) - 1); + Value >>>= numBits; + NumBits = 32 - numBits; + return result; + } + }; + + static class CBenchRandomGenerator + { + CBitRandomGenerator RG = new CBitRandomGenerator(); + int Pos; + int Rep0; + + public int BufferSize; + public byte[] Buffer = null; + + public CBenchRandomGenerator() { } + public void Set(int bufferSize) + { + Buffer = new byte[bufferSize]; + Pos = 0; + BufferSize = bufferSize; + } + int GetRndBit() { return RG.GetRnd(1); } + int GetLogRandBits(int numBits) + { + int len = RG.GetRnd(numBits); + return RG.GetRnd((int)len); + } + int GetOffset() + { + if (GetRndBit() == 0) + return GetLogRandBits(4); + return (GetLogRandBits(4) << 10) | RG.GetRnd(10); + } + int GetLen1() { return RG.GetRnd(1 + (int)RG.GetRnd(2)); } + int GetLen2() { return RG.GetRnd(2 + (int)RG.GetRnd(2)); } + public void Generate() + { + RG.Init(); + Rep0 = 1; + while (Pos < BufferSize) + { + if (GetRndBit() == 0 || Pos < 1) + Buffer[Pos++] = (byte)(RG.GetRnd(8)); + else + { + int len; + if (RG.GetRnd(3) == 0) + len = 1 + GetLen1(); + else + { + do + Rep0 = GetOffset(); + while (Rep0 >= Pos); + Rep0++; + len = 2 + GetLen2(); + } + for (int i = 0; i < len && Pos < BufferSize; i++, Pos++) + Buffer[Pos] = Buffer[Pos - Rep0]; + } + } + } + }; + + static class CrcOutStream extends java.io.OutputStream + { + public CRC CRC = new CRC(); + + public void Init() + { + CRC.Init(); + } + public int GetDigest() + { + return CRC.GetDigest(); + } + public void write(byte[] b) + { + CRC.Update(b); + } + public void write(byte[] b, int off, int len) + { + CRC.Update(b, off, len); + } + public void write(int b) + { + CRC.UpdateByte(b); + } + }; + + static class MyOutputStream extends java.io.OutputStream + { + byte[] _buffer; + int _size; + int _pos; + + public MyOutputStream(byte[] buffer) + { + _buffer = buffer; + _size = _buffer.length; + } + + public void reset() + { + _pos = 0; + } + + public void write(int b) throws IOException + { + if (_pos >= _size) + throw new IOException("Error"); + _buffer[_pos++] = (byte)b; + } + + public int size() + { + return _pos; + } + }; + + static class MyInputStream extends java.io.InputStream + { + byte[] _buffer; + int _size; + int _pos; + + public MyInputStream(byte[] buffer, int size) + { + _buffer = buffer; + _size = size; + } + + public void reset() + { + _pos = 0; + } + + public int read() + { + if (_pos >= _size) + return -1; + return _buffer[_pos++] & 0xFF; + } + }; + + static class CProgressInfo implements ICodeProgress + { + public long ApprovedStart; + public long InSize; + public long Time; + public void Init() + { InSize = 0; } + public void SetProgress(long inSize, long outSize) + { + if (inSize >= ApprovedStart && InSize == 0) + { + Time = System.currentTimeMillis(); + InSize = inSize; + } + } + } + static final int kSubBits = 8; + + static int GetLogSize(int size) + { + for (int i = kSubBits; i < 32; i++) + for (int j = 0; j < (1 << kSubBits); j++) + if (size <= ((1) << i) + (j << (i - kSubBits))) + return (i << kSubBits) + j; + return (32 << kSubBits); + } + + static long MyMultDiv64(long value, long elapsedTime) + { + long freq = 1000; // ms + long elTime = elapsedTime; + while (freq > 1000000) + { + freq >>>= 1; + elTime >>>= 1; + } + if (elTime == 0) + elTime = 1; + return value * freq / elTime; + } + + static long GetCompressRating(int dictionarySize, long elapsedTime, long size) + { + long t = GetLogSize(dictionarySize) - (18 << kSubBits); + long numCommandsForOne = 1060 + ((t * t * 10) >> (2 * kSubBits)); + long numCommands = (long)(size) * numCommandsForOne; + return MyMultDiv64(numCommands, elapsedTime); + } + + static long GetDecompressRating(long elapsedTime, long outSize, long inSize) + { + long numCommands = inSize * 220 + outSize * 20; + return MyMultDiv64(numCommands, elapsedTime); + } + + static long GetTotalRating( + int dictionarySize, + long elapsedTimeEn, long sizeEn, + long elapsedTimeDe, + long inSizeDe, long outSizeDe) + { + return (GetCompressRating(dictionarySize, elapsedTimeEn, sizeEn) + + GetDecompressRating(elapsedTimeDe, inSizeDe, outSizeDe)) / 2; + } + + static void PrintValue(long v) + { + String s = ""; + s += v; + for (int i = 0; i + s.length() < 6; i++) + System.out.print(" "); + System.out.print(s); + } + + static void PrintRating(long rating) + { + PrintValue(rating / 1000000); + System.out.print(" MIPS"); + } + + static void PrintResults( + int dictionarySize, + long elapsedTime, + long size, + boolean decompressMode, long secondSize) + { + long speed = MyMultDiv64(size, elapsedTime); + PrintValue(speed / 1024); + System.out.print(" KB/s "); + long rating; + if (decompressMode) + rating = GetDecompressRating(elapsedTime, size, secondSize); + else + rating = GetCompressRating(dictionarySize, elapsedTime, size); + PrintRating(rating); + } + + static public int LzmaBenchmark(int numIterations, int dictionarySize) throws Exception + { + if (numIterations <= 0) + return 0; + if (dictionarySize < (1 << 18)) + { + System.out.println("\nError: dictionary size for benchmark must be >= 18 (256 KB)"); + return 1; + } + System.out.print("\n Compressing Decompressing\n\n"); + + SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder(); + SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder(); + + if (!encoder.SetDictionarySize(dictionarySize)) + throw new Exception("Incorrect dictionary size"); + + int kBufferSize = dictionarySize + kAdditionalSize; + int kCompressedBufferSize = (kBufferSize / 2) + kCompressedAdditionalSize; + + ByteArrayOutputStream propStream = new ByteArrayOutputStream(); + encoder.WriteCoderProperties(propStream); + byte[] propArray = propStream.toByteArray(); + decoder.SetDecoderProperties(propArray); + + CBenchRandomGenerator rg = new CBenchRandomGenerator(); + + rg.Set(kBufferSize); + rg.Generate(); + CRC crc = new CRC(); + crc.Init(); + crc.Update(rg.Buffer, 0, rg.BufferSize); + + CProgressInfo progressInfo = new CProgressInfo(); + progressInfo.ApprovedStart = dictionarySize; + + long totalBenchSize = 0; + long totalEncodeTime = 0; + long totalDecodeTime = 0; + long totalCompressedSize = 0; + + MyInputStream inStream = new MyInputStream(rg.Buffer, rg.BufferSize); + + byte[] compressedBuffer = new byte[kCompressedBufferSize]; + MyOutputStream compressedStream = new MyOutputStream(compressedBuffer); + CrcOutStream crcOutStream = new CrcOutStream(); + MyInputStream inputCompressedStream = null; + int compressedSize = 0; + for (int i = 0; i < numIterations; i++) + { + progressInfo.Init(); + inStream.reset(); + compressedStream.reset(); + encoder.Code(inStream, compressedStream, -1, -1, progressInfo); + long encodeTime = System.currentTimeMillis() - progressInfo.Time; + + if (i == 0) + { + compressedSize = compressedStream.size(); + inputCompressedStream = new MyInputStream(compressedBuffer, compressedSize); + } + else if (compressedSize != compressedStream.size()) + throw (new Exception("Encoding error")); + + if (progressInfo.InSize == 0) + throw (new Exception("Internal ERROR 1282")); + + long decodeTime = 0; + for (int j = 0; j < 2; j++) + { + inputCompressedStream.reset(); + crcOutStream.Init(); + + long outSize = kBufferSize; + long startTime = System.currentTimeMillis(); + if (!decoder.Code(inputCompressedStream, crcOutStream, outSize)) + throw (new Exception("Decoding Error"));; + decodeTime = System.currentTimeMillis() - startTime; + if (crcOutStream.GetDigest() != crc.GetDigest()) + throw (new Exception("CRC Error")); + } + long benchSize = kBufferSize - (long)progressInfo.InSize; + PrintResults(dictionarySize, encodeTime, benchSize, false, 0); + System.out.print(" "); + PrintResults(dictionarySize, decodeTime, kBufferSize, true, compressedSize); + System.out.println(); + + totalBenchSize += benchSize; + totalEncodeTime += encodeTime; + totalDecodeTime += decodeTime; + totalCompressedSize += compressedSize; + } + System.out.println("---------------------------------------------------"); + PrintResults(dictionarySize, totalEncodeTime, totalBenchSize, false, 0); + System.out.print(" "); + PrintResults(dictionarySize, totalDecodeTime, + kBufferSize * (long)numIterations, true, totalCompressedSize); + System.out.println(" Average"); + return 0; + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/LGPL.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/LGPL.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/Methods.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/Methods.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,141 @@ +7-Zip method IDs (4.56) +----------------------- + +Each compression or crypto method in 7z has unique binary value (ID). +The length of ID in bytes is arbitrary but it can not exceed 63 bits (8 bytes). + +If you want to add some new ID, you have two ways: +1) Write request for allocating IDs to 7-zip developers. +2) Generate 8-bytes ID: + + 7F ZZ ZZ ZZ ZZ ZZ MM MM + + 7F - Prefix for random IDs (1 byte) + ZZ ZZ ZZ ZZ ZZ - Developer ID (5 bytes). Use real random bytes. + + MM MM - Method ID (2 bytes) + + You can notify 7-Zip developers about your Developer ID / Method ID. + + Note: Use new ID only if old codec can not decode data encoded with new version. + + +List of defined IDs +------------------- + +00 - Copy +01 - Reserved +02 - Common + 03 Swap + - 2 Swap2 + - 4 Swap4 + 04 Delta (subject to change) + +03 - 7z + 01 - LZMA + 01 - Version + + 03 - Branch + 01 - x86 + 03 - BCJ + 1B - BCJ2 + 02 - PPC + 05 - BC_PPC_B (Big Endian) + 03 - Alpha + 01 - BC_Alpha + 04 - IA64 + 01 - BC_IA64 + 05 - ARM + 01 - BC_ARM + 06 - M68 + 05 - BC_M68_B (Big Endian) + 07 - ARM Thumb + 01 - BC_ARMThumb + 08 - SPARC + 05 - BC_SPARC + + 04 - PPMD + 01 - Version + + 7F - + 01 - experimental methods. + + 80 - reserved for independent developers + + E0 - Random IDs + +04 - Misc + 00 - Reserved + 01 - Zip + 00 - Copy (not used). Use {00} instead + 01 - Shrink + 06 - Implode + 08 - Deflate + 09 - Deflate64 + 12 - BZip2 (not used). Use {04 02 02} instead + 02 - BZip + 02 - BZip2 + 03 - Rar + 01 - Rar15 + 02 - Rar20 + 03 - Rar29 + 04 - Arj + 01 - Arj (1,2,3) + 02 - Arj 4 + 05 - Z + 06 - Lzh + 07 - Reserved for 7z + 08 - Cab + 09 - NSIS + 01 - DeflateNSIS + 02 - BZip2NSIS + + +06 - Crypto + 00 - + 01 - AES + 0x - AES-128 + 4x - AES-192 + 8x - AES-256 + Cx - AES + + x0 - ECB + x1 - CBC + x2 - CFB + x3 - OFB + + 07 - Reserved + 0F - Reserved + + F0 - Misc Ciphers (Real Ciphers without hashing algo) + + F1 - Misc Ciphers (Combine) + 01 - Zip + 01 - Main Zip crypto algo + 03 - RAR + 02 - + 03 - Rar29 AES-128 + (modified SHA-1) + 07 - 7z + 01 - AES-256 + SHA-256 + +07 - Hash (subject to change) + 00 - + 01 - CRC + 02 - SHA-1 + 03 - SHA-256 + 04 - SHA-384 + 05 - SHA-512 + + F0 - Misc Hash + + F1 - Misc + 03 - RAR + 03 - Rar29 Password Hashing (modified SHA1) + 07 - 7z + 01 - SHA-256 Password Hashing + + + + +--- +End of document diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/history.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/history.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,198 @@ +HISTORY of the LZMA SDK +----------------------- + + 4.57 2007-12-12 + ------------------------- + - Speed optimizations in ++ LZMA Decoder. + - Small changes for more compatibility with some C/C++ compilers. + + + 4.49 beta 2007-07-05 + ------------------------- + - .7z ANSI-C Decoder: + - now it supports BCJ and BCJ2 filters + - now it supports files larger than 4 GB. + - now it supports "Last Write Time" field for files. + - C++ code for .7z archives compressing/decompressing from 7-zip + was included to LZMA SDK. + + + 4.43 2006-06-04 + ------------------------- + - Small changes for more compatibility with some C/C++ compilers. + + + 4.42 2006-05-15 + ------------------------- + - Small changes in .h files in ANSI-C version. + + + 4.39 beta 2006-04-14 + ------------------------- + - Bug in versions 4.33b:4.38b was fixed: + C++ version of LZMA encoder could not correctly compress + files larger than 2 GB with HC4 match finder (-mfhc4). + + + 4.37 beta 2005-04-06 + ------------------------- + - Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined. + + + 4.35 beta 2005-03-02 + ------------------------- + - Bug was fixed in C++ version of LZMA Decoder: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. + + + 4.34 beta 2006-02-27 + ------------------------- + - Compressing speed and memory requirements for compressing were increased + - LZMA now can use only these match finders: HC4, BT2, BT3, BT4 + + + 4.32 2005-12-09 + ------------------------- + - Java version of LZMA SDK was included + + + 4.30 2005-11-20 + ------------------------- + - Compression ratio was improved in -a2 mode + - Speed optimizations for compressing in -a2 mode + - -fb switch now supports values up to 273 + - Bug in 7z_C (7zIn.c) was fixed: + It used Alloc/Free functions from different memory pools. + So if program used two memory pools, it worked incorrectly. + - 7z_C: .7z format supporting was improved + - LZMA# SDK (C#.NET version) was included + + + 4.27 (Updated) 2005-09-21 + ------------------------- + - Some GUIDs/interfaces in C++ were changed. + IStream.h: + ISequentialInStream::Read now works as old ReadPart + ISequentialOutStream::Write now works as old WritePart + + + 4.27 2005-08-07 + ------------------------- + - Bug in LzmaDecodeSize.c was fixed: + if _LZMA_IN_CB and _LZMA_OUT_READ were defined, + decompressing worked incorrectly. + + + 4.26 2005-08-05 + ------------------------- + - Fixes in 7z_C code and LzmaTest.c: + previous versions could work incorrectly, + if malloc(0) returns 0 + + + 4.23 2005-06-29 + ------------------------- + - Small fixes in C++ code + + + 4.22 2005-06-10 + ------------------------- + - Small fixes + + + 4.21 2005-06-08 + ------------------------- + - Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed + - New additional version of ANSI-C LZMA Decoder with zlib-like interface: + - LzmaStateDecode.h + - LzmaStateDecode.c + - LzmaStateTest.c + - ANSI-C LZMA Decoder now can decompress files larger than 4 GB + + + 4.17 2005-04-18 + ------------------------- + - New example for RAM->RAM compressing/decompressing: + LZMA + BCJ (filter for x86 code): + - LzmaRam.h + - LzmaRam.cpp + - LzmaRamDecode.h + - LzmaRamDecode.c + - -f86 switch for lzma.exe + + + 4.16 2005-03-29 + ------------------------- + - Bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder): + If _LZMA_OUT_READ was defined, and if encoded stream was corrupted, + decoder could access memory outside of allocated range. + - Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster). + Old version of LZMA Decoder now is in file LzmaDecodeSize.c. + LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c + - Small speed optimization in LZMA C++ code + - filter for SPARC's code was added + - Simplified version of .7z ANSI-C Decoder was included + + + 4.06 2004-09-05 + ------------------------- + - Bug in v4.05 was fixed: + LZMA-Encoder didn't release output stream in some cases. + + + 4.05 2004-08-25 + ------------------------- + - Source code of filters for x86, IA-64, ARM, ARM-Thumb + and PowerPC code was included to SDK + - Some internal minor changes + + + 4.04 2004-07-28 + ------------------------- + - More compatibility with some C++ compilers + + + 4.03 2004-06-18 + ------------------------- + - "Benchmark" command was added. It measures compressing + and decompressing speed and shows rating values. + Also it checks hardware errors. + + + 4.02 2004-06-10 + ------------------------- + - C++ LZMA Encoder/Decoder code now is more portable + and it can be compiled by GCC on Linux. + + + 4.01 2004-02-15 + ------------------------- + - Some detection of data corruption was enabled. + LzmaDecode.c / RangeDecoderReadByte + ..... + { + rd->ExtraBytes = 1; + return 0xFF; + } + + + 4.00 2004-02-13 + ------------------------- + - Original version of LZMA SDK + + + +HISTORY of the LZMA +------------------- + 2001-2007: Improvements to LZMA compressing/decompressing code, + keeping compatibility with original LZMA format + 1996-2001: Development of LZMA compression format + + Some milestones: + + 2001-08-30: LZMA compression was added to 7-Zip + 1999-01-02: First version of 7-Zip was released + + +End of document diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/lzma/lzma.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/lzma/lzma.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,663 @@ +LZMA SDK 4.57 +------------- + +LZMA SDK Copyright (C) 1999-2007 Igor Pavlov + +LZMA SDK provides the documentation, samples, header files, libraries, +and tools you need to develop applications that use LZMA compression. + +LZMA is default and general compression method of 7z format +in 7-Zip compression program (www.7-zip.org). LZMA provides high +compression ratio and very fast decompression. + +LZMA is an improved version of famous LZ77 compression algorithm. +It was improved in way of maximum increasing of compression ratio, +keeping high decompression speed and low memory requirements for +decompressing. + + + +LICENSE +------- + +LZMA SDK is available under any of the following licenses: + +1) GNU Lesser General Public License (GNU LGPL) +2) Common Public License (CPL) +3) Simplified license for unmodified code (read SPECIAL EXCEPTION) +4) Proprietary license + +It means that you can select one of these four options and follow rules of that license. + + +1,2) GNU LGPL and CPL licenses are pretty similar and both these +licenses are classified as + - "Free software licenses" at http://www.gnu.org/ + - "OSI-approved" at http://www.opensource.org/ + + +3) SPECIAL EXCEPTION + +Igor Pavlov, as the author of this code, expressly permits you +to statically or dynamically link your code (or bind by name) +to the files from LZMA SDK without subjecting your linked +code to the terms of the CPL or GNU LGPL. +Any modifications or additions to files from LZMA SDK, however, +are subject to the GNU LGPL or CPL terms. + +SPECIAL EXCEPTION allows you to use LZMA SDK in applications with closed code, +while you keep LZMA SDK code unmodified. + + +SPECIAL EXCEPTION #2: Igor Pavlov, as the author of this code, expressly permits +you to use this code under the same terms and conditions contained in the License +Agreement you have for any previous version of LZMA SDK developed by Igor Pavlov. + +SPECIAL EXCEPTION #2 allows owners of proprietary licenses to use latest version +of LZMA SDK as update for previous versions. + + +SPECIAL EXCEPTION #3: Igor Pavlov, as the author of this code, expressly permits +you to use code of the following files: +BranchTypes.h, LzmaTypes.h, LzmaTest.c, LzmaStateTest.c, LzmaAlone.cpp, +LzmaAlone.cs, LzmaAlone.java +as public domain code. + + +4) Proprietary license + +LZMA SDK also can be available under a proprietary license which +can include: + +1) Right to modify code without subjecting modified code to the +terms of the CPL or GNU LGPL +2) Technical support for code + +To request such proprietary license or any additional consultations, +send email message from that page: +http://www.7-zip.org/support.html + + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +You should have received a copy of the Common Public License +along with this library. + + +LZMA SDK Contents +----------------- + +LZMA SDK includes: + + - C++ source code of LZMA compressing and decompressing + - ANSI-C compatible source code for LZMA decompressing + - C# source code for LZMA compressing and decompressing + - Java source code for LZMA compressing and decompressing + - Compiled file->file LZMA compressing/decompressing program for Windows system + +ANSI-C LZMA decompression code was ported from original C++ sources to C. +Also it was simplified and optimized for code size. +But it is fully compatible with LZMA from 7-Zip. + + +UNIX/Linux version +------------------ +To compile C++ version of file->file LZMA, go to directory +C/7zip/Compress/LZMA_Alone +and type "make" or "make clean all" to recompile all. + +In some UNIX/Linux versions you must compile LZMA with static libraries. +To compile with static libraries, change string in makefile +LIB = -lm +to string +LIB = -lm -static + + +Files +--------------------- +C - C source code +CPP - CPP source code +CS - C# source code +Java - Java source code +lzma.txt - LZMA SDK description (this file) +7zFormat.txt - 7z Format description +7zC.txt - 7z ANSI-C Decoder description (this file) +methods.txt - Compression method IDs for .7z +LGPL.txt - GNU Lesser General Public License +CPL.html - Common Public License +lzma.exe - Compiled file->file LZMA encoder/decoder for Windows +history.txt - history of the LZMA SDK + + +Source code structure +--------------------- + +C - C files + Compress - files related to compression/decompression + Lz - files related to LZ (Lempel-Ziv) compression algorithm + Lzma - ANSI-C compatible LZMA decompressor + + LzmaDecode.h - interface for LZMA decoding on ANSI-C + LzmaDecode.c - LZMA decoding on ANSI-C (new fastest version) + LzmaDecodeSize.c - LZMA decoding on ANSI-C (old size-optimized version) + LzmaTest.c - test application that decodes LZMA encoded file + LzmaTypes.h - basic types for LZMA Decoder + LzmaStateDecode.h - interface for LZMA decoding (State version) + LzmaStateDecode.c - LZMA decoding on ANSI-C (State version) + LzmaStateTest.c - test application (State version) + + Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code + + Archive - files related to archiving + 7z_C - 7z ANSI-C Decoder + + +CPP -- CPP files + + Common - common files for C++ projects + Windows - common files for Windows related code + 7zip - files related to 7-Zip Project + + Common - common files for 7-Zip + + Compress - files related to compression/decompression + + LZ - files related to LZ (Lempel-Ziv) compression algorithm + + Copy - Copy coder + RangeCoder - Range Coder (special code of compression/decompression) + LZMA - LZMA compression/decompression on C++ + LZMA_Alone - file->file LZMA compression/decompression + + Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code + + Archive - files related to archiving + + Common - common files for archive handling + 7z - 7z C++ Encoder/Decoder + + Bundles - Modules that are bundles of other modules + + Alone7z - 7zr.exe: Standalone version of 7z.exe that supports only 7z/LZMA/BCJ/BCJ2 + Format7zR - 7zr.dll: Reduced version of 7za.dll: extracting/compressing to 7z/LZMA/BCJ/BCJ2 + Format7zExtractR - 7zxr.dll: Reduced version of 7zxa.dll: extracting from 7z/LZMA/BCJ/BCJ2. + + UI - User Interface files + + Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll + Common - Common UI files + Console - Code for console archiver + + + +CS - C# files + 7zip + Common - some common files for 7-Zip + Compress - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + LzmaAlone - file->file LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + +Java - Java files + SevenZip + Compression - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + +C/C++ source code of LZMA SDK is part of 7-Zip project. + +You can find ANSI-C LZMA decompressing code at folder + C/7zip/Compress/Lzma +7-Zip doesn't use that ANSI-C LZMA code and that code was developed +specially for this SDK. And files from C/7zip/Compress/Lzma do not need +files from other directories of SDK for compiling. + +7-Zip source code can be downloaded from 7-Zip's SourceForge page: + + http://sourceforge.net/projects/sevenzip/ + + +LZMA features +------------- + - Variable dictionary size (up to 1 GB) + - Estimated compressing speed: about 1 MB/s on 1 GHz CPU + - Estimated decompressing speed: + - 8-12 MB/s on 1 GHz Intel Pentium 3 or AMD Athlon + - 500-1000 KB/s on 100 MHz ARM, MIPS, PowerPC or other simple RISC + - Small memory requirements for decompressing (8-32 KB + DictionarySize) + - Small code size for decompressing: 2-8 KB (depending from + speed optimizations) + +LZMA decoder uses only integer operations and can be +implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions). + +Some critical operations that affect to speed of LZMA decompression: + 1) 32*16 bit integer multiply + 2) Misspredicted branches (penalty mostly depends from pipeline length) + 3) 32-bit shift and arithmetic operations + +Speed of LZMA decompressing mostly depends from CPU speed. +Memory speed has no big meaning. But if your CPU has small data cache, +overall weight of memory speed will slightly increase. + + +How To Use +---------- + +Using LZMA encoder/decoder executable +-------------------------------------- + +Usage: LZMA inputFile outputFile [...] + + e: encode file + + d: decode file + + b: Benchmark. There are two tests: compressing and decompressing + with LZMA method. Benchmark shows rating in MIPS (million + instructions per second). Rating value is calculated from + measured speed and it is normalized with AMD Athlon 64 X2 CPU + results. Also Benchmark checks possible hardware errors (RAM + errors in most cases). Benchmark uses these settings: + (-a1, -d21, -fb32, -mfbt4). You can change only -d. Also you + can change number of iterations. Example for 30 iterations: + LZMA b 30 + Default number of iterations is 10. + + + + + -a{N}: set compression mode 0 = fast, 1 = normal + default: 1 (normal) + + d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB) + The maximum value for dictionary size is 1 GB = 2^30 bytes. + Dictionary size is calculated as DictionarySize = 2^N bytes. + For decompressing file compressed by LZMA method with dictionary + size D = 2^N you need about D bytes of memory (RAM). + + -fb{N}: set number of fast bytes - [5, 273], default: 128 + Usually big number gives a little bit better compression ratio + and slower compression process. + + -lc{N}: set number of literal context bits - [0, 8], default: 3 + Sometimes lc=4 gives gain for big files. + + -lp{N}: set number of literal pos bits - [0, 4], default: 0 + lp switch is intended for periodical data when period is + equal 2^N. For example, for 32-bit (4 bytes) + periodical data you can use lp=2. Often it's better to set lc0, + if you change lp switch. + + -pb{N}: set number of pos bits - [0, 4], default: 2 + pb switch is intended for periodical data + when period is equal 2^N. + + -mf{MF_ID}: set Match Finder. Default: bt4. + Algorithms from hc* group doesn't provide good compression + ratio, but they often works pretty fast in combination with + fast mode (-a0). + + Memory requirements depend from dictionary size + (parameter "d" in table below). + + MF_ID Memory Description + + bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing. + bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing. + bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing. + hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing. + + -eos: write End Of Stream marker. By default LZMA doesn't write + eos marker, since LZMA decoder knows uncompressed size + stored in .lzma file header. + + -si: Read data from stdin (it will write End Of Stream marker). + -so: Write data to stdout + + +Examples: + +1) LZMA e file.bin file.lzma -d16 -lc0 + +compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K) +and 0 literal context bits. -lc0 allows to reduce memory requirements +for decompression. + + +2) LZMA e file.bin file.lzma -lc0 -lp2 + +compresses file.bin to file.lzma with settings suitable +for 32-bit periodical data (for example, ARM or MIPS code). + +3) LZMA d file.lzma file.bin + +decompresses file.lzma to file.bin. + + +Compression ratio hints +----------------------- + +Recommendations +--------------- + +To increase compression ratio for LZMA compressing it's desirable +to have aligned data (if it's possible) and also it's desirable to locate +data in such order, where code is grouped in one place and data is +grouped in other place (it's better than such mixing: code, data, code, +data, ...). + + +Using Filters +------------- +You can increase compression ratio for some data types, using +special filters before compressing. For example, it's possible to +increase compression ratio on 5-10% for code for those CPU ISAs: +x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC. + +You can find C/C++ source code of such filters in folder "7zip/Compress/Branch" + +You can check compression ratio gain of these filters with such +7-Zip commands (example for ARM code): +No filter: + 7z a a1.7z a.bin -m0=lzma + +With filter for little-endian ARM code: + 7z a a2.7z a.bin -m0=bc_arm -m1=lzma + +With filter for big-endian ARM code (using additional Swap4 filter): + 7z a a3.7z a.bin -m0=swap4 -m1=bc_arm -m2=lzma + +It works in such manner: +Compressing = Filter_encoding + LZMA_encoding +Decompressing = LZMA_decoding + Filter_decoding + +Compressing and decompressing speed of such filters is very high, +so it will not increase decompressing time too much. +Moreover, it reduces decompression time for LZMA_decoding, +since compression ratio with filtering is higher. + +These filters convert CALL (calling procedure) instructions +from relative offsets to absolute addresses, so such data becomes more +compressible. Source code of these CALL filters is pretty simple +(about 20 lines of C++), so you can convert it from C++ version yourself. + +For some ISAs (for example, for MIPS) it's impossible to get gain from such filter. + + +LZMA compressed file format +--------------------------- +Offset Size Description + 0 1 Special LZMA properties for compressed data + 1 4 Dictionary size (little endian) + 5 8 Uncompressed size (little endian). -1 means unknown size + 13 Compressed data + + +ANSI-C LZMA Decoder +~~~~~~~~~~~~~~~~~~~ + +To compile ANSI-C LZMA Decoder you can use one of the following files sets: +1) LzmaDecode.h + LzmaDecode.c + LzmaTest.c (fastest version) +2) LzmaDecode.h + LzmaDecodeSize.c + LzmaTest.c (old size-optimized version) +3) LzmaStateDecode.h + LzmaStateDecode.c + LzmaStateTest.c (zlib-like interface) + + +Memory requirements for LZMA decoding +------------------------------------- + +LZMA decoder doesn't allocate memory itself, so you must +allocate memory and send it to LZMA. + +Stack usage of LZMA decoding function for local variables is not +larger than 200 bytes. + +How To decompress data +---------------------- + +LZMA Decoder (ANSI-C version) now supports 5 interfaces: +1) Single-call Decompressing +2) Single-call Decompressing with input stream callback +3) Multi-call Decompressing with output buffer +4) Multi-call Decompressing with input callback and output buffer +5) Multi-call State Decompressing (zlib-like interface) + +Variant-5 is similar to Variant-4, but Variant-5 doesn't use callback functions. + +Decompressing steps +------------------- + +1) read LZMA properties (5 bytes): + unsigned char properties[LZMA_PROPERTIES_SIZE]; + +2) read uncompressed size (8 bytes, little-endian) + +3) Decode properties: + + CLzmaDecoderState state; /* it's 24-140 bytes structure, if int is 32-bit */ + + if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK) + return PrintError(rs, "Incorrect stream properties"); + +4) Allocate memory block for internal Structures: + + state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); + if (state.Probs == 0) + return PrintError(rs, kCantAllocateMessage); + + LZMA decoder uses array of CProb variables as internal structure. + By default, CProb is unsigned_short. But you can define _LZMA_PROB32 to make + it unsigned_int. It can increase speed on some 32-bit CPUs, but memory + usage will be doubled in that case. + + +5) Main Decompressing + +You must use one of the following interfaces: + +5.1 Single-call Decompressing +----------------------------- +When to use: RAM->RAM decompressing +Compile files: LzmaDecode.h, LzmaDecode.c +Compile defines: no defines +Memory Requirements: + - Input buffer: compressed size + - Output buffer: uncompressed size + - LZMA Internal Structures (~16 KB for default settings) + +Interface: + int res = LzmaDecode(&state, + inStream, compressedSize, &inProcessed, + outStream, outSize, &outProcessed); + + +5.2 Single-call Decompressing with input stream callback +-------------------------------------------------------- +When to use: File->RAM or Flash->RAM decompressing. +Compile files: LzmaDecode.h, LzmaDecode.c +Compile defines: _LZMA_IN_CB +Memory Requirements: + - Buffer for input stream: any size (for example, 16 KB) + - Output buffer: uncompressed size + - LZMA Internal Structures (~16 KB for default settings) + +Interface: + typedef struct _CBuffer + { + ILzmaInCallback InCallback; + FILE *File; + unsigned char Buffer[kInBufferSize]; + } CBuffer; + + int LzmaReadCompressed(void *object, const unsigned char **buffer, SizeT *size) + { + CBuffer *bo = (CBuffer *)object; + *buffer = bo->Buffer; + *size = MyReadFile(bo->File, bo->Buffer, kInBufferSize); + return LZMA_RESULT_OK; + } + + CBuffer g_InBuffer; + + g_InBuffer.File = inFile; + g_InBuffer.InCallback.Read = LzmaReadCompressed; + int res = LzmaDecode(&state, + &g_InBuffer.InCallback, + outStream, outSize, &outProcessed); + + +5.3 Multi-call decompressing with output buffer +----------------------------------------------- +When to use: RAM->File decompressing +Compile files: LzmaDecode.h, LzmaDecode.c +Compile defines: _LZMA_OUT_READ +Memory Requirements: + - Input buffer: compressed size + - Buffer for output stream: any size (for example, 16 KB) + - LZMA Internal Structures (~16 KB for default settings) + - LZMA dictionary (dictionary size is encoded in stream properties) + +Interface: + + state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); + + LzmaDecoderInit(&state); + do + { + LzmaDecode(&state, + inBuffer, inAvail, &inProcessed, + g_OutBuffer, outAvail, &outProcessed); + inAvail -= inProcessed; + inBuffer += inProcessed; + } + while you need more bytes + + see LzmaTest.c for more details. + + +5.4 Multi-call decompressing with input callback and output buffer +------------------------------------------------------------------ +When to use: File->File decompressing +Compile files: LzmaDecode.h, LzmaDecode.c +Compile defines: _LZMA_IN_CB, _LZMA_OUT_READ +Memory Requirements: + - Buffer for input stream: any size (for example, 16 KB) + - Buffer for output stream: any size (for example, 16 KB) + - LZMA Internal Structures (~16 KB for default settings) + - LZMA dictionary (dictionary size is encoded in stream properties) + +Interface: + + state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); + + LzmaDecoderInit(&state); + do + { + LzmaDecode(&state, + &bo.InCallback, + g_OutBuffer, outAvail, &outProcessed); + } + while you need more bytes + + see LzmaTest.c for more details: + + +5.5 Multi-call State Decompressing (zlib-like interface) +------------------------------------------------------------------ +When to use: file->file decompressing +Compile files: LzmaStateDecode.h, LzmaStateDecode.c +Compile defines: +Memory Requirements: + - Buffer for input stream: any size (for example, 16 KB) + - Buffer for output stream: any size (for example, 16 KB) + - LZMA Internal Structures (~16 KB for default settings) + - LZMA dictionary (dictionary size is encoded in stream properties) + +Interface: + + state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize); + + + LzmaDecoderInit(&state); + do + { + res = LzmaDecode(&state, + inBuffer, inAvail, &inProcessed, + g_OutBuffer, outAvail, &outProcessed, + finishDecoding); + inAvail -= inProcessed; + inBuffer += inProcessed; + } + while you need more bytes + + see LzmaStateTest.c for more details: + + +6) Free all allocated blocks + + +Note +---- +LzmaDecodeSize.c is size-optimized version of LzmaDecode.c. +But compiled code of LzmaDecodeSize.c can be larger than +compiled code of LzmaDecode.c. So it's better to use +LzmaDecode.c in most cases. + + +EXIT codes +----------- + +LZMA decoder can return one of the following codes: + +#define LZMA_RESULT_OK 0 +#define LZMA_RESULT_DATA_ERROR 1 + +If you use callback function for input data and you return some +error code, LZMA Decoder also returns that code. + + + +LZMA Defines +------------ + +_LZMA_IN_CB - Use callback for input data + +_LZMA_OUT_READ - Use read function for output data + +_LZMA_LOC_OPT - Enable local speed optimizations inside code. + _LZMA_LOC_OPT is only for LzmaDecodeSize.c (size-optimized version). + _LZMA_LOC_OPT doesn't affect LzmaDecode.c (speed-optimized version) + and LzmaStateDecode.c + +_LZMA_PROB32 - It can increase speed on some 32-bit CPUs, + but memory usage will be doubled in that case + +_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler + and long is 32-bit. + +_LZMA_SYSTEM_SIZE_T - Define it if you want to use system's size_t. + You can use it to enable 64-bit sizes supporting + + + +C++ LZMA Encoder/Decoder +~~~~~~~~~~~~~~~~~~~~~~~~ +C++ LZMA code use COM-like interfaces. So if you want to use it, +you can study basics of COM/OLE. + +By default, LZMA Encoder contains all Match Finders. +But for compressing it's enough to have just one of them. +So for reducing size of compressing code you can define: + #define COMPRESS_MF_BT + #define COMPRESS_MF_BT4 +and it will use only bt4 match finder. + + +--- + +http://www.7-zip.org +http://www.7-zip.org/support.html diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/physfs.c --- a/misc/libphysfs/physfs.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/physfs.c Sun Dec 17 00:09:24 2017 +0100 @@ -46,48 +46,6 @@ } ErrState; -/* The various i/o drivers...some of these may not be compiled in. */ -extern const PHYSFS_Archiver __PHYSFS_Archiver_ZIP; -extern const PHYSFS_Archiver __PHYSFS_Archiver_LZMA; -extern const PHYSFS_Archiver __PHYSFS_Archiver_GRP; -extern const PHYSFS_Archiver __PHYSFS_Archiver_QPAK; -extern const PHYSFS_Archiver __PHYSFS_Archiver_HOG; -extern const PHYSFS_Archiver __PHYSFS_Archiver_MVL; -extern const PHYSFS_Archiver __PHYSFS_Archiver_WAD; -extern const PHYSFS_Archiver __PHYSFS_Archiver_DIR; -extern const PHYSFS_Archiver __PHYSFS_Archiver_ISO9660; - -static const PHYSFS_Archiver *staticArchivers[] = -{ -#if PHYSFS_SUPPORTS_ZIP - &__PHYSFS_Archiver_ZIP, -#endif -#if PHYSFS_SUPPORTS_7Z - &__PHYSFS_Archiver_LZMA, -#endif -#if PHYSFS_SUPPORTS_GRP - &__PHYSFS_Archiver_GRP, -#endif -#if PHYSFS_SUPPORTS_QPAK - &__PHYSFS_Archiver_QPAK, -#endif -#if PHYSFS_SUPPORTS_HOG - &__PHYSFS_Archiver_HOG, -#endif -#if PHYSFS_SUPPORTS_MVL - &__PHYSFS_Archiver_MVL, -#endif -#if PHYSFS_SUPPORTS_WAD - &__PHYSFS_Archiver_WAD, -#endif -#if PHYSFS_SUPPORTS_ISO9660 - &__PHYSFS_Archiver_ISO9660, -#endif - NULL -}; - - - /* General PhysicsFS state ... */ static int initialized = 0; static ErrState *errorStates = NULL; @@ -101,6 +59,7 @@ static int allowSymLinks = 0; static const PHYSFS_Archiver **archivers = NULL; static const PHYSFS_ArchiveInfo **archiveInfo = NULL; +static volatile size_t numArchivers = 0; /* mutexes ... */ static void *errorLock = NULL; /* protects error message list. */ @@ -486,7 +445,7 @@ memcpy(retval, io, sizeof (PHYSFS_Io)); retval->opaque = newfh; return retval; - + handleIo_dupe_failed: if (newfh) { @@ -580,7 +539,7 @@ if (ecd.errcode) { - __PHYSFS_setError(ecd.errcode); + PHYSFS_setErrorCode(ecd.errcode); return NULL; } /* if */ @@ -655,7 +614,7 @@ { /* * Quicksort w/ Bubblesort fallback algorithm inspired by code from here: - * http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html + * https://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html */ if (max > 0) __PHYSFS_quick_sort(entries, 0, max - 1, cmpfn, swapfn); @@ -692,7 +651,64 @@ } /* findErrorForCurrentThread */ -void __PHYSFS_setError(const PHYSFS_ErrorCode errcode) +/* this doesn't reset the error state. */ +static inline PHYSFS_ErrorCode currentErrorCode(void) +{ + const ErrState *err = findErrorForCurrentThread(); + return err ? err->code : PHYSFS_ERR_OK; +} /* currentErrorCode */ + + +PHYSFS_ErrorCode PHYSFS_getLastErrorCode(void) +{ + ErrState *err = findErrorForCurrentThread(); + const PHYSFS_ErrorCode retval = (err) ? err->code : PHYSFS_ERR_OK; + if (err) + err->code = PHYSFS_ERR_OK; + return retval; +} /* PHYSFS_getLastErrorCode */ + + +PHYSFS_DECL const char *PHYSFS_getErrorByCode(PHYSFS_ErrorCode code) +{ + switch (code) + { + case PHYSFS_ERR_OK: return "no error"; + case PHYSFS_ERR_OTHER_ERROR: return "unknown error"; + case PHYSFS_ERR_OUT_OF_MEMORY: return "out of memory"; + case PHYSFS_ERR_NOT_INITIALIZED: return "not initialized"; + case PHYSFS_ERR_IS_INITIALIZED: return "already initialized"; + case PHYSFS_ERR_ARGV0_IS_NULL: return "argv[0] is NULL"; + case PHYSFS_ERR_UNSUPPORTED: return "unsupported"; + case PHYSFS_ERR_PAST_EOF: return "past end of file"; + case PHYSFS_ERR_FILES_STILL_OPEN: return "files still open"; + case PHYSFS_ERR_INVALID_ARGUMENT: return "invalid argument"; + case PHYSFS_ERR_NOT_MOUNTED: return "not mounted"; + case PHYSFS_ERR_NOT_FOUND: return "not found"; + case PHYSFS_ERR_SYMLINK_FORBIDDEN: return "symlinks are forbidden"; + case PHYSFS_ERR_NO_WRITE_DIR: return "write directory is not set"; + case PHYSFS_ERR_OPEN_FOR_READING: return "file open for reading"; + case PHYSFS_ERR_OPEN_FOR_WRITING: return "file open for writing"; + case PHYSFS_ERR_NOT_A_FILE: return "not a file"; + case PHYSFS_ERR_READ_ONLY: return "read-only filesystem"; + case PHYSFS_ERR_CORRUPT: return "corrupted"; + case PHYSFS_ERR_SYMLINK_LOOP: return "infinite symbolic link loop"; + case PHYSFS_ERR_IO: return "i/o error"; + case PHYSFS_ERR_PERMISSION: return "permission denied"; + case PHYSFS_ERR_NO_SPACE: return "no space available for writing"; + case PHYSFS_ERR_BAD_FILENAME: return "filename is illegal or insecure"; + case PHYSFS_ERR_BUSY: return "tried to modify a file the OS needs"; + case PHYSFS_ERR_DIR_NOT_EMPTY: return "directory isn't empty"; + case PHYSFS_ERR_OS_ERROR: return "OS reported an error"; + case PHYSFS_ERR_DUPLICATE: return "duplicate resource"; + case PHYSFS_ERR_BAD_PASSWORD: return "bad password"; + } /* switch */ + + return NULL; /* don't know this error code. */ +} /* PHYSFS_getErrorByCode */ + + +void PHYSFS_setErrorCode(PHYSFS_ErrorCode errcode) { ErrState *err; @@ -720,59 +736,6 @@ } /* if */ err->code = errcode; -} /* __PHYSFS_setError */ - - -PHYSFS_ErrorCode PHYSFS_getLastErrorCode(void) -{ - ErrState *err = findErrorForCurrentThread(); - const PHYSFS_ErrorCode retval = (err) ? err->code : PHYSFS_ERR_OK; - if (err) - err->code = PHYSFS_ERR_OK; - return retval; -} /* PHYSFS_getLastErrorCode */ - - -PHYSFS_DECL const char *PHYSFS_getErrorByCode(PHYSFS_ErrorCode code) -{ - switch (code) - { - case PHYSFS_ERR_OK: return "no error"; - case PHYSFS_ERR_OTHER_ERROR: return "unknown error"; - case PHYSFS_ERR_OUT_OF_MEMORY: return "out of memory"; - case PHYSFS_ERR_NOT_INITIALIZED: return "not initialized"; - case PHYSFS_ERR_IS_INITIALIZED: return "already initialized"; - case PHYSFS_ERR_ARGV0_IS_NULL: return "argv[0] is NULL"; - case PHYSFS_ERR_UNSUPPORTED: return "unsupported"; - case PHYSFS_ERR_PAST_EOF: return "past end of file"; - case PHYSFS_ERR_FILES_STILL_OPEN: return "files still open"; - case PHYSFS_ERR_INVALID_ARGUMENT: return "invalid argument"; - case PHYSFS_ERR_NOT_MOUNTED: return "not mounted"; - case PHYSFS_ERR_NO_SUCH_PATH: return "no such path"; - case PHYSFS_ERR_SYMLINK_FORBIDDEN: return "symlinks are forbidden"; - case PHYSFS_ERR_NO_WRITE_DIR: return "write directory is not set"; - case PHYSFS_ERR_OPEN_FOR_READING: return "file open for reading"; - case PHYSFS_ERR_OPEN_FOR_WRITING: return "file open for writing"; - case PHYSFS_ERR_NOT_A_FILE: return "not a file"; - case PHYSFS_ERR_READ_ONLY: return "read-only filesystem"; - case PHYSFS_ERR_CORRUPT: return "corrupted"; - case PHYSFS_ERR_SYMLINK_LOOP: return "infinite symbolic link loop"; - case PHYSFS_ERR_IO: return "i/o error"; - case PHYSFS_ERR_PERMISSION: return "permission denied"; - case PHYSFS_ERR_NO_SPACE: return "no space available for writing"; - case PHYSFS_ERR_BAD_FILENAME: return "filename is illegal or insecure"; - case PHYSFS_ERR_BUSY: return "tried to modify a file the OS needs"; - case PHYSFS_ERR_DIR_NOT_EMPTY: return "directory isn't empty"; - case PHYSFS_ERR_OS_ERROR: return "OS reported an error"; - } /* switch */ - - return NULL; /* don't know this error code. */ -} /* PHYSFS_getErrorByCode */ - - -void PHYSFS_setErrorCode(PHYSFS_ErrorCode code) -{ - __PHYSFS_setError(code); } /* PHYSFS_setErrorCode */ @@ -866,18 +829,21 @@ DirHandle *retval = NULL; const PHYSFS_Archiver **i; const char *ext; + int created_io = 0; assert((io != NULL) || (d != NULL)); if (io == NULL) { /* DIR gets first shot (unlike the rest, it doesn't deal with files). */ + extern const PHYSFS_Archiver __PHYSFS_Archiver_DIR; retval = tryOpenDir(io, &__PHYSFS_Archiver_DIR, d, forWriting); if (retval != NULL) return retval; io = __PHYSFS_createNativeIo(d, forWriting ? 'w' : 'r'); BAIL_IF_MACRO(!io, ERRPASS, 0); + created_io = 1; } /* if */ ext = find_filename_extension(d); @@ -886,14 +852,14 @@ /* Look for archivers with matching file extensions first... */ for (i = archivers; (*i != NULL) && (retval == NULL); i++) { - if (__PHYSFS_stricmpASCII(ext, (*i)->info.extension) == 0) + if (__PHYSFS_utf8stricmp(ext, (*i)->info.extension) == 0) retval = tryOpenDir(io, *i, d, forWriting); } /* for */ /* failing an exact file extension match, try all the others... */ for (i = archivers; (*i != NULL) && (retval == NULL); i++) { - if (__PHYSFS_stricmpASCII(ext, (*i)->info.extension) != 0) + if (__PHYSFS_utf8stricmp(ext, (*i)->info.extension) != 0) retval = tryOpenDir(io, *i, d, forWriting); } /* for */ } /* if */ @@ -904,6 +870,9 @@ retval = tryOpenDir(io, *i, d, forWriting); } /* else */ + if ((!retval) && (created_io)) + io->destroy(io); + BAIL_IF_MACRO(!retval, PHYSFS_ERR_UNSUPPORTED, NULL); return retval; } /* openDirectory */ @@ -1121,32 +1090,52 @@ } /* initializeMutexes */ -static void setDefaultAllocator(void); +static int doRegisterArchiver(const PHYSFS_Archiver *_archiver); static int initStaticArchivers(void) { - const size_t numStaticArchivers = __PHYSFS_ARRAYLEN(staticArchivers); - const size_t len = numStaticArchivers * sizeof (void *); - size_t i; - - assert(numStaticArchivers > 0); /* seriously, none at all?! */ - assert(staticArchivers[numStaticArchivers - 1] == NULL); - - archiveInfo = (const PHYSFS_ArchiveInfo **) allocator.Malloc(len); - BAIL_IF_MACRO(!archiveInfo, PHYSFS_ERR_OUT_OF_MEMORY, 0); - archivers = (const PHYSFS_Archiver **) allocator.Malloc(len); - BAIL_IF_MACRO(!archivers, PHYSFS_ERR_OUT_OF_MEMORY, 0); - - for (i = 0; i < numStaticArchivers - 1; i++) - archiveInfo[i] = &staticArchivers[i]->info; - archiveInfo[numStaticArchivers - 1] = NULL; - - memcpy(archivers, staticArchivers, len); + #define REGISTER_STATIC_ARCHIVER(arc) { \ + extern const PHYSFS_Archiver __PHYSFS_Archiver_##arc; \ + if (!doRegisterArchiver(&__PHYSFS_Archiver_##arc)) { \ + return 0; \ + } \ + } + + #if PHYSFS_SUPPORTS_ZIP + REGISTER_STATIC_ARCHIVER(ZIP); + #endif + #if PHYSFS_SUPPORTS_7Z + REGISTER_STATIC_ARCHIVER(LZMA); + #endif + #if PHYSFS_SUPPORTS_GRP + REGISTER_STATIC_ARCHIVER(GRP); + #endif + #if PHYSFS_SUPPORTS_QPAK + REGISTER_STATIC_ARCHIVER(QPAK); + #endif + #if PHYSFS_SUPPORTS_HOG + REGISTER_STATIC_ARCHIVER(HOG); + #endif + #if PHYSFS_SUPPORTS_MVL + REGISTER_STATIC_ARCHIVER(MVL); + #endif + #if PHYSFS_SUPPORTS_WAD + REGISTER_STATIC_ARCHIVER(WAD); + #endif + #if PHYSFS_SUPPORTS_SLB + REGISTER_STATIC_ARCHIVER(SLB); + #endif + #if PHYSFS_SUPPORTS_ISO9660 + REGISTER_STATIC_ARCHIVER(ISO9660); + #endif + + #undef REGISTER_STATIC_ARCHIVER return 1; } /* initStaticArchivers */ +static void setDefaultAllocator(void); static int doDeinit(void); int PHYSFS_init(const char *argv0) @@ -1183,7 +1172,7 @@ initialized = 1; /* This makes sure that the error subsystem is initialized. */ - __PHYSFS_setError(PHYSFS_getLastErrorCode()); + PHYSFS_setErrorCode(PHYSFS_getLastErrorCode()); return 1; @@ -1204,7 +1193,7 @@ PHYSFS_Io *io = i->io; next = i->next; - if (!io->flush(io)) + if (io->flush && !io->flush(io)) { *list = i; return 0; @@ -1239,14 +1228,70 @@ } /* freeSearchPath */ +/* MAKE SURE you hold stateLock before calling this! */ +static int archiverInUse(const PHYSFS_Archiver *arc, const DirHandle *list) +{ + const DirHandle *i; + for (i = list; i != NULL; i = i->next) + { + if (i->funcs == arc) + return 1; + } /* for */ + + return 0; /* not in use */ +} /* archiverInUse */ + + +/* MAKE SURE you hold stateLock before calling this! */ +static int doDeregisterArchiver(const size_t idx) +{ + const size_t len = (numArchivers - idx) * sizeof (void *); + const PHYSFS_ArchiveInfo *info = archiveInfo[idx]; + const PHYSFS_Archiver *arc = archivers[idx]; + + /* make sure nothing is still using this archiver */ + if (archiverInUse(arc, searchPath) || archiverInUse(arc, writeDir)) + BAIL_MACRO(PHYSFS_ERR_FILES_STILL_OPEN, 0); + + allocator.Free((void *) info->extension); + allocator.Free((void *) info->description); + allocator.Free((void *) info->author); + allocator.Free((void *) info->url); + allocator.Free((void *) arc); + + memmove(&archiveInfo[idx], &archiveInfo[idx+1], len); + memmove(&archivers[idx], &archivers[idx+1], len); + + assert(numArchivers > 0); + numArchivers--; + + return 1; +} /* doDeregisterArchiver */ + + +/* Does NOT hold the state lock; we're shutting down. */ +static void freeArchivers(void) +{ + while (numArchivers > 0) + { + if (!doDeregisterArchiver(numArchivers - 1)) + assert(!"nothing should be mounted during shutdown."); + } /* while */ + + allocator.Free(archivers); + allocator.Free(archiveInfo); + archivers = NULL; + archiveInfo = NULL; +} /* freeArchivers */ + + static int doDeinit(void) { - BAIL_IF_MACRO(!__PHYSFS_platformDeinit(), ERRPASS, 0); - closeFileHandleList(&openWriteList); BAIL_IF_MACRO(!PHYSFS_setWriteDir(NULL), PHYSFS_ERR_FILES_STILL_OPEN, 0); freeSearchPath(); + freeArchivers(); freeErrorStates(); if (baseDir != NULL) @@ -1289,6 +1334,10 @@ allocator.Deinit(); errorLock = stateLock = NULL; + + /* !!! FIXME: what on earth are you supposed to do if this fails? */ + BAIL_IF_MACRO(!__PHYSFS_platformDeinit(), ERRPASS, 0); + return 1; } /* doDeinit */ @@ -1306,6 +1355,143 @@ } /* PHYSFS_isInit */ +char *__PHYSFS_strdup(const char *str) +{ + char *retval = (char *) allocator.Malloc(strlen(str) + 1); + if (retval) + strcpy(retval, str); + return retval; +} /* __PHYSFS_strdup */ + + +PHYSFS_uint32 __PHYSFS_hashString(const char *str, size_t len) +{ + PHYSFS_uint32 hash = 5381; + while (len--) + hash = ((hash << 5) + hash) ^ *(str++); + return hash; +} /* __PHYSFS_hashString */ + + +/* MAKE SURE you hold stateLock before calling this! */ +static int doRegisterArchiver(const PHYSFS_Archiver *_archiver) +{ + const PHYSFS_uint32 maxver = CURRENT_PHYSFS_ARCHIVER_API_VERSION; + const size_t len = (numArchivers + 2) * sizeof (void *); + PHYSFS_Archiver *archiver = NULL; + PHYSFS_ArchiveInfo *info = NULL; + const char *ext = NULL; + void *ptr = NULL; + size_t i; + + BAIL_IF_MACRO(!_archiver, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(_archiver->version > maxver, PHYSFS_ERR_UNSUPPORTED, 0); + BAIL_IF_MACRO(!_archiver->info.extension, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->info.description, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->info.author, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->info.url, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->openArchive, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->enumerateFiles, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->openRead, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->openWrite, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->openAppend, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->remove, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->mkdir, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->closeArchive, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!_archiver->stat, PHYSFS_ERR_INVALID_ARGUMENT, 0); + + ext = _archiver->info.extension; + for (i = 0; i < numArchivers; i++) + { + if (__PHYSFS_utf8stricmp(archiveInfo[i]->extension, ext) == 0) + BAIL_MACRO(PHYSFS_ERR_DUPLICATE, 0); /* !!! FIXME: better error? ERR_IN_USE? */ + } /* for */ + + /* make a copy of the data. */ + archiver = (PHYSFS_Archiver *) allocator.Malloc(sizeof (*archiver)); + GOTO_IF_MACRO(!archiver, PHYSFS_ERR_OUT_OF_MEMORY, regfailed); + + /* Must copy sizeof (OLD_VERSION_OF_STRUCT) when version changes! */ + memcpy(archiver, _archiver, sizeof (*archiver)); + + info = (PHYSFS_ArchiveInfo *) &archiver->info; + memset(info, '\0', sizeof (*info)); /* NULL in case an alloc fails. */ + #define CPYSTR(item) \ + info->item = __PHYSFS_strdup(_archiver->info.item); \ + GOTO_IF_MACRO(!info->item, PHYSFS_ERR_OUT_OF_MEMORY, regfailed); + CPYSTR(extension); + CPYSTR(description); + CPYSTR(author); + CPYSTR(url); + info->supportsSymlinks = _archiver->info.supportsSymlinks; + #undef CPYSTR + + ptr = allocator.Realloc(archiveInfo, len); + GOTO_IF_MACRO(!ptr, PHYSFS_ERR_OUT_OF_MEMORY, regfailed); + archiveInfo = (const PHYSFS_ArchiveInfo **) ptr; + + ptr = allocator.Realloc(archivers, len); + GOTO_IF_MACRO(!ptr, PHYSFS_ERR_OUT_OF_MEMORY, regfailed); + archivers = (const PHYSFS_Archiver **) ptr; + + archiveInfo[numArchivers] = info; + archiveInfo[numArchivers + 1] = NULL; + + archivers[numArchivers] = archiver; + archivers[numArchivers + 1] = NULL; + + numArchivers++; + + return 1; + +regfailed: + if (info != NULL) + { + allocator.Free((void *) info->extension); + allocator.Free((void *) info->description); + allocator.Free((void *) info->author); + allocator.Free((void *) info->url); + } /* if */ + allocator.Free(archiver); + + return 0; +} /* doRegisterArchiver */ + + +int PHYSFS_registerArchiver(const PHYSFS_Archiver *archiver) +{ + int retval; + BAIL_IF_MACRO(!initialized, PHYSFS_ERR_NOT_INITIALIZED, 0); + __PHYSFS_platformGrabMutex(stateLock); + retval = doRegisterArchiver(archiver); + __PHYSFS_platformReleaseMutex(stateLock); + return retval; +} /* PHYSFS_registerArchiver */ + + +int PHYSFS_deregisterArchiver(const char *ext) +{ + size_t i; + + BAIL_IF_MACRO(!initialized, PHYSFS_ERR_NOT_INITIALIZED, 0); + BAIL_IF_MACRO(!ext, PHYSFS_ERR_INVALID_ARGUMENT, 0); + + __PHYSFS_platformGrabMutex(stateLock); + for (i = 0; i < numArchivers; i++) + { + if (__PHYSFS_utf8stricmp(archiveInfo[i]->extension, ext) == 0) + { + const int retval = doDeregisterArchiver(i); + __PHYSFS_platformReleaseMutex(stateLock); + return retval; + } /* if */ + } /* for */ + __PHYSFS_platformReleaseMutex(stateLock); + + BAIL_MACRO(PHYSFS_ERR_NOT_FOUND, 0); +} /* PHYSFS_deregisterArchiver */ + + const PHYSFS_ArchiveInfo **PHYSFS_supportedArchiveTypes(void) { BAIL_IF_MACRO(!initialized, PHYSFS_ERR_NOT_INITIALIZED, NULL); @@ -1351,7 +1537,6 @@ PHYSFS_Stat statbuf; char *ptr = NULL; char *endstr = NULL; - int exists = 0; BAIL_IF_MACRO(!initialized, PHYSFS_ERR_NOT_INITIALIZED, 0); BAIL_IF_MACRO(!org, PHYSFS_ERR_INVALID_ARGUMENT, NULL); @@ -1368,7 +1553,7 @@ assert(*endstr == dirsep); *endstr = '\0'; /* mask out the final dirsep for now. */ - if (!__PHYSFS_platformStat(prefDir, &exists, &statbuf)) + if (!__PHYSFS_platformStat(prefDir, &statbuf)) { for (ptr = strchr(prefDir, dirsep); ptr; ptr = strchr(ptr+1, dirsep)) { @@ -1698,7 +1883,7 @@ if ((l > extlen) && ((*i)[l - extlen - 1] == '.')) { ext = (*i) + (l - extlen); - if (__PHYSFS_stricmpASCII(ext, archiveExt) == 0) + if (__PHYSFS_utf8stricmp(ext, archiveExt) == 0) setSaneCfgAddPath(*i, l, dirsep, archivesFirst); } /* if */ } /* for */ @@ -1759,12 +1944,12 @@ size_t len = strlen(fname); assert(mntpntlen > 1); /* root mount points should be NULL. */ /* not under the mountpoint, so skip this archive. */ - BAIL_IF_MACRO(len < mntpntlen-1, PHYSFS_ERR_NO_SUCH_PATH, 0); + BAIL_IF_MACRO(len < mntpntlen-1, PHYSFS_ERR_NOT_FOUND, 0); /* !!! FIXME: Case insensitive? */ retval = strncmp(h->mountPoint, fname, mntpntlen-1); - BAIL_IF_MACRO(retval != 0, PHYSFS_ERR_NO_SUCH_PATH, 0); + BAIL_IF_MACRO(retval != 0, PHYSFS_ERR_NOT_FOUND, 0); if (len > mntpntlen-1) /* corner case... */ - BAIL_IF_MACRO(fname[mntpntlen-1]!='/', PHYSFS_ERR_NO_SUCH_PATH, 0); + BAIL_IF_MACRO(fname[mntpntlen-1]!='/', PHYSFS_ERR_NOT_FOUND, 0); fname += mntpntlen-1; /* move to start of actual archive path. */ if (*fname == '/') fname++; @@ -1782,9 +1967,12 @@ end = strchr(start, '/'); if (end != NULL) *end = '\0'; - rc = h->funcs->stat(h->opaque, fname, &retval, &statbuf); + rc = h->funcs->stat(h->opaque, fname, &statbuf); if (rc) rc = (statbuf.filetype == PHYSFS_FILETYPE_SYMLINK); + else if (currentErrorCode() == PHYSFS_ERR_NOT_FOUND) + retval = 0; + if (end != NULL) *end = '/'; /* insecure path (has a disallowed symlink in it)? */ @@ -1840,7 +2028,9 @@ if (exists) { PHYSFS_Stat statbuf; - const int rc = h->funcs->stat(h->opaque, dname, &exists, &statbuf); + const int rc = h->funcs->stat(h->opaque, dname, &statbuf); + if ((!rc) && (currentErrorCode() == PHYSFS_ERR_NOT_FOUND)) + exists = 0; retval = ((rc) && (statbuf.filetype == PHYSFS_FILETYPE_DIRECTORY)); } /* if */ @@ -1937,11 +2127,9 @@ else if (verifyPath(i, &arcfname, 0)) { PHYSFS_Stat statbuf; - int exists = 0; - if (i->funcs->stat(i->opaque, arcfname, &exists, &statbuf)) + if (i->funcs->stat(i->opaque, arcfname, &statbuf)) { - if (exists) - retval = i->dirName; + retval = i->dirName; break; } /* if */ } /* if */ @@ -2060,6 +2248,40 @@ } /* enumerateFromMountPoint */ +typedef struct SymlinkFilterData +{ + PHYSFS_EnumFilesCallback callback; + void *callbackData; + DirHandle *dirhandle; +} SymlinkFilterData; + +/* !!! FIXME: broken if in a virtual mountpoint (stat call fails). */ +static void enumCallbackFilterSymLinks(void *_data, const char *origdir, + const char *fname) +{ + const char *trimmedDir = (*origdir == '/') ? (origdir+1) : origdir; + const size_t slen = strlen(trimmedDir) + strlen(fname) + 2; + char *path = (char *) __PHYSFS_smallAlloc(slen); + + if (path != NULL) + { + SymlinkFilterData *data = (SymlinkFilterData *) _data; + const DirHandle *dh = data->dirhandle; + PHYSFS_Stat statbuf; + + sprintf(path, "%s%s%s", trimmedDir, *trimmedDir ? "/" : "", fname); + if (dh->funcs->stat(dh->opaque, path, &statbuf)) + { + /* Pass it on to the application if it's not a symlink. */ + if (statbuf.filetype != PHYSFS_FILETYPE_SYMLINK) + data->callback(data->callbackData, origdir, fname); + } /* if */ + + __PHYSFS_smallFree(path); + } /* if */ +} /* enumCallbackFilterSymLinks */ + + /* !!! FIXME: this should report error conditions. */ void PHYSFS_enumerateFilesCallback(const char *_fname, PHYSFS_EnumFilesCallback callback, @@ -2078,10 +2300,17 @@ if (sanitizePlatformIndependentPath(_fname, fname)) { DirHandle *i; - int noSyms; + SymlinkFilterData filterdata; __PHYSFS_platformGrabMutex(stateLock); - noSyms = !allowSymLinks; + + if (!allowSymLinks) + { + memset(&filterdata, '\0', sizeof (filterdata)); + filterdata.callback = callback; + filterdata.callbackData = data; + } /* if */ + for (i = searchPath; i != NULL; i = i->next) { char *arcfname = fname; @@ -2090,8 +2319,18 @@ else if (verifyPath(i, &arcfname, 0)) { - i->funcs->enumerateFiles(i->opaque, arcfname, noSyms, - callback, _fname, data); + if ((!allowSymLinks) && (i->funcs->info.supportsSymlinks)) + { + filterdata.dirhandle = i; + i->funcs->enumerateFiles(i->opaque, arcfname, + enumCallbackFilterSymLinks, + _fname, &filterdata); + } /* if */ + else + { + i->funcs->enumerateFiles(i->opaque, arcfname, + callback, _fname, data); + } /* else */ } /* else if */ } /* for */ __PHYSFS_platformReleaseMutex(stateLock); @@ -2212,20 +2451,19 @@ if (sanitizePlatformIndependentPath(_fname, fname)) { - int fileExists = 0; DirHandle *i = NULL; PHYSFS_Io *io = NULL; __PHYSFS_platformGrabMutex(stateLock); - GOTO_IF_MACRO(!searchPath, PHYSFS_ERR_NO_SUCH_PATH, openReadEnd); - - for (i = searchPath; (i != NULL) && (!fileExists); i = i->next) + GOTO_IF_MACRO(!searchPath, PHYSFS_ERR_NOT_FOUND, openReadEnd); + + for (i = searchPath; i != NULL; i = i->next) { char *arcfname = fname; if (verifyPath(i, &arcfname, 0)) { - io = i->funcs->openRead(i->opaque, arcfname, &fileExists); + io = i->funcs->openRead(i->opaque, arcfname); if (io) break; } /* if */ @@ -2330,39 +2568,40 @@ memcpy(buffer, fh->buffer + fh->bufpos, (size_t) len); fh->bufpos += (PHYSFS_uint32) len; return (PHYSFS_sint64) len; - } /* else if */ - - if (buffered > 0) /* partially in the buffer... */ + } /* if */ + + else if (buffered > 0) /* partially in the buffer... */ { memcpy(buffer, fh->buffer + fh->bufpos, (size_t) buffered); buffer = ((PHYSFS_uint8 *) buffer) + buffered; len -= buffered; retval = buffered; - fh->buffill = fh->bufpos = 0; } /* if */ /* if you got here, the buffer is drained and we still need bytes. */ assert(len > 0); + fh->buffill = fh->bufpos = 0; + io = fh->io; if (len >= fh->bufsize) /* need more than the buffer takes. */ { /* leave buffer empty, go right to output instead. */ rc = io->read(io, buffer, len); - if (rc < 0) + if (rc <= 0) return ((retval == 0) ? rc : retval); return retval + rc; } /* if */ /* need less than buffer can take. Fill buffer. */ rc = io->read(io, fh->buffer, fh->bufsize); - if (rc < 0) + if (rc <= 0) return ((retval == 0) ? rc : retval); assert(fh->bufpos == 0); fh->buffill = (PHYSFS_uint32) rc; rc = doBufferedRead(fh, buffer, len); /* go from the start, again. */ - if (rc < 0) + if (rc <= 0) return ((retval == 0) ? rc : retval); return retval + rc; @@ -2582,7 +2821,7 @@ rc = io->write(io, fh->buffer + fh->bufpos, fh->buffill - fh->bufpos); BAIL_IF_MACRO(rc <= 0, ERRPASS, 0); fh->bufpos = fh->buffill = 0; - return io->flush(io); + return io->flush ? io->flush(io) : 1; } /* PHYSFS_flush */ @@ -2592,11 +2831,11 @@ char *fname; size_t len; - BAIL_IF_MACRO(!_fname, PHYSFS_ERR_INVALID_ARGUMENT, -1); - BAIL_IF_MACRO(!stat, PHYSFS_ERR_INVALID_ARGUMENT, -1); + BAIL_IF_MACRO(!_fname, PHYSFS_ERR_INVALID_ARGUMENT, 0); + BAIL_IF_MACRO(!stat, PHYSFS_ERR_INVALID_ARGUMENT, 0); len = strlen(_fname) + 1; fname = (char *) __PHYSFS_smallAlloc(len); - BAIL_IF_MACRO(!fname, PHYSFS_ERR_OUT_OF_MEMORY, -1); + BAIL_IF_MACRO(!fname, PHYSFS_ERR_OUT_OF_MEMORY, 0); /* set some sane defaults... */ stat->filesize = -1; @@ -2634,7 +2873,9 @@ /* !!! FIXME: this test is wrong and should be elsewhere. */ stat->readonly = !(writeDir && (strcmp(writeDir->dirName, i->dirName) == 0)); - retval = i->funcs->stat(i->opaque, arcfname, &exists, stat); + retval = i->funcs->stat(i->opaque, arcfname, stat); + if ((retval) || (currentErrorCode() != PHYSFS_ERR_NOT_FOUND)) + exists = 1; } /* else if */ } /* for */ __PHYSFS_platformReleaseMutex(stateLock); diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/physfs.h --- a/misc/libphysfs/physfs.h Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/physfs.h Sun Dec 17 00:09:24 2017 +0100 @@ -8,7 +8,7 @@ * \mainpage PhysicsFS * * The latest version of PhysicsFS can be found at: - * http://icculus.org/physfs/ + * https://icculus.org/physfs/ * * PhysicsFS; a portable, flexible file i/o abstraction. * @@ -20,10 +20,6 @@ * - It's flexible. Archives (.ZIP files) can be used transparently as * directory structures. * - * This system is largely inspired by Quake 3's PK3 files and the related - * fs_* cvars. If you've ever tinkered with these, then this API will be - * familiar to you. - * * With PhysicsFS, you have a single writing directory and multiple * directories (the "search path") for reading. You can think of this as a * filesystem within a filesystem. If (on Windows) you were to set the @@ -128,9 +124,9 @@ * * PhysicsFS is mostly thread safe. The error messages returned by * PHYSFS_getLastError() are unique by thread, and library-state-setting - * functions are mutex'd. For efficiency, individual file accesses are - * not locked, so you can not safely read/write/seek/close/etc the same - * file from two threads at the same time. Other race conditions are bugs + * functions are mutex'd. For efficiency, individual file accesses are + * not locked, so you can not safely read/write/seek/close/etc the same + * file from two threads at the same time. Other race conditions are bugs * that should be reported/patched. * * While you CAN use stdio/syscall file access in a program that has PHYSFS_* @@ -403,6 +399,8 @@ * supported. * * \sa PHYSFS_supportedArchiveTypes + * \sa PHYSFS_registerArchiver + * \sa PHYSFS_deregisterArchiver */ typedef struct PHYSFS_ArchiveInfo { @@ -410,6 +408,7 @@ const char *description; /**< Human-readable archive description. */ const char *author; /**< Person who did support for this archive. */ const char *url; /**< URL related to this archive */ + int supportsSymlinks; /**< non-zero if archive offers symbolic links. */ } PHYSFS_ArchiveInfo; @@ -577,9 +576,13 @@ * * The return values are pointers to internal memory, and should * be considered READ ONLY, and never freed. The returned values are - * valid until the next call to PHYSFS_deinit(). + * valid until the next call to PHYSFS_deinit(), PHYSFS_registerArchiver(), + * or PHYSFS_deregisterArchiver(). * * \return READ ONLY Null-terminated array of READ ONLY structures. + * + * \sa PHYSFS_registerArchiver + * \sa PHYSFS_deregisterArchiver */ PHYSFS_DECL const PHYSFS_ArchiveInfo **PHYSFS_supportedArchiveTypes(void); @@ -1094,8 +1097,9 @@ * We've got [z.sav]. * We've got [w.sav].\endverbatim * - * Feel free to sort the list however you like. We only promise there will - * be no duplicates, but not what order the final list will come back in. + * Feel free to sort the list however you like. However, the returned data + * will always contain no duplicates, and will be always sorted in alphabetic + * (rather: Unicode) order for you. * * Don't forget to call PHYSFS_freeList() with the return value from this * function when you are done with it. @@ -1546,7 +1550,7 @@ * \param val value to convert * \return converted value. * - * \warning Remember, PHYSFS_uint64 is only 32 bits on platforms without + * \warning Remember, PHYSFS_sint64 is only 32 bits on platforms without * any sort of 64-bit support. */ PHYSFS_DECL PHYSFS_sint64 PHYSFS_swapSLE64(PHYSFS_sint64 val); @@ -1629,7 +1633,7 @@ * \param val value to convert * \return converted value. * - * \warning Remember, PHYSFS_uint64 is only 32 bits on platforms without + * \warning Remember, PHYSFS_sint64 is only 32 bits on platforms without * any sort of 64-bit support. */ PHYSFS_DECL PHYSFS_sint64 PHYSFS_swapSBE64(PHYSFS_sint64 val); @@ -1993,7 +1997,7 @@ * \return zero on failure, non-zero on success. On failure, you can * find out what went wrong from PHYSFS_getLastError(). * - * \warning Remember, PHYSFS_uint64 is only 32 bits on platforms without + * \warning Remember, PHYSFS_sint64 is only 32 bits on platforms without * any sort of 64-bit support. */ PHYSFS_DECL int PHYSFS_writeSLE64(PHYSFS_File *file, PHYSFS_sint64 val); @@ -2029,7 +2033,7 @@ * \return zero on failure, non-zero on success. On failure, you can * find out what went wrong from PHYSFS_getLastError(). * - * \warning Remember, PHYSFS_uint64 is only 32 bits on platforms without + * \warning Remember, PHYSFS_sint64 is only 32 bits on platforms without * any sort of 64-bit support. */ PHYSFS_DECL int PHYSFS_writeSBE64(PHYSFS_File *file, PHYSFS_sint64 val); @@ -2604,10 +2608,10 @@ */ typedef enum PHYSFS_FileType { - PHYSFS_FILETYPE_REGULAR, /**< a normal file */ - PHYSFS_FILETYPE_DIRECTORY, /**< a directory */ - PHYSFS_FILETYPE_SYMLINK, /**< a symlink */ - PHYSFS_FILETYPE_OTHER /**< something completely different like a device */ + PHYSFS_FILETYPE_REGULAR, /**< a normal file */ + PHYSFS_FILETYPE_DIRECTORY, /**< a directory */ + PHYSFS_FILETYPE_SYMLINK, /**< a symlink */ + PHYSFS_FILETYPE_OTHER /**< something completely different like a device */ } PHYSFS_FileType; /** @@ -2628,12 +2632,12 @@ */ typedef struct PHYSFS_Stat { - PHYSFS_sint64 filesize; /**< size in bytes, -1 for non-files and unknown */ - PHYSFS_sint64 modtime; /**< last modification time */ - PHYSFS_sint64 createtime; /**< like modtime, but for file creation time */ - PHYSFS_sint64 accesstime; /**< like modtime, but for file access time */ - PHYSFS_FileType filetype; /**< File? Directory? Symlink? */ - int readonly; /**< non-zero if read only, zero if writable. */ + PHYSFS_sint64 filesize; /**< size in bytes, -1 for non-files and unknown */ + PHYSFS_sint64 modtime; /**< last modification time */ + PHYSFS_sint64 createtime; /**< like modtime, but for file creation time */ + PHYSFS_sint64 accesstime; /**< like modtime, but for file access time */ + PHYSFS_FileType filetype; /**< File? Directory? Symlink? */ + int readonly; /**< non-zero if read only, zero if writable. */ } PHYSFS_Stat; /** @@ -3133,7 +3137,7 @@ PHYSFS_ERR_FILES_STILL_OPEN, /**< Files still open. */ PHYSFS_ERR_INVALID_ARGUMENT, /**< Bad parameter passed to an function. */ PHYSFS_ERR_NOT_MOUNTED, /**< Requested archive/dir not mounted. */ - PHYSFS_ERR_NO_SUCH_PATH, /**< No such file, directory, or parent. */ + PHYSFS_ERR_NOT_FOUND, /**< File (or whatever) not found. */ PHYSFS_ERR_SYMLINK_FORBIDDEN,/**< Symlink seen when not permitted. */ PHYSFS_ERR_NO_WRITE_DIR, /**< No write dir has been specified. */ PHYSFS_ERR_OPEN_FOR_READING, /**< Wrote to a file opened for reading. */ @@ -3148,7 +3152,9 @@ PHYSFS_ERR_BAD_FILENAME, /**< Filename is bogus/insecure. */ PHYSFS_ERR_BUSY, /**< Tried to modify a file the OS needs. */ PHYSFS_ERR_DIR_NOT_EMPTY, /**< Tried to delete dir with files in it. */ - PHYSFS_ERR_OS_ERROR /**< Unspecified OS-level error. */ + PHYSFS_ERR_OS_ERROR, /**< Unspecified OS-level error. */ + PHYSFS_ERR_DUPLICATE, /**< Duplicate entry. */ + PHYSFS_ERR_BAD_PASSWORD /**< Bad password. */ } PHYSFS_ErrorCode; @@ -3311,9 +3317,224 @@ PHYSFS_DECL const char *PHYSFS_getPrefDir(const char *org, const char *app); +/** + * \struct PHYSFS_Archiver + * \brief Abstract interface to provide support for user-defined archives. + * + * \warning This is advanced, hardcore stuff. You don't need this unless you + * really know what you're doing. Most apps will not need this. + * + * Historically, PhysicsFS provided a means to mount various archive file + * formats, and physical directories in the native filesystem. However, + * applications have been limited to the file formats provided by the + * library. This interface allows an application to provide their own + * archive file types. + * + * Conceptually, a PHYSFS_Archiver provides directory entries, while + * PHYSFS_Io provides data streams for those directory entries. The most + * obvious use of PHYSFS_Archiver is to provide support for an archive + * file type that isn't provided by PhysicsFS directly: perhaps some + * proprietary format that only your application needs to understand. + * + * Internally, all the built-in archive support uses this interface, so the + * best examples for building a PHYSFS_Archiver is the source code to + * PhysicsFS itself. + * + * An archiver is added to the system with PHYSFS_registerArchiver(), and then + * it will be available for use automatically with PHYSFS_mount(); if a + * given archive can be handled with your archiver, it will be given control + * as appropriate. + * + * These methods deal with dir handles. You have one instance of your + * archiver, and it generates a unique, opaque handle for each opened + * archive in its openArchive() method. Since the lifetime of an Archiver + * (not an archive) is generally the entire lifetime of the process, and it's + * assumed to be a singleton, we do not provide any instance data for the + * archiver itself; the app can just use some static variables if necessary. + * + * Symlinks should always be followed (except in stat()); PhysicsFS will + * use the stat() method to check for symlinks and make a judgement on + * whether to continue to call other methods based on that. + * + * Archivers, when necessary, should set the PhysicsFS error state with + * PHYSFS_setErrorCode() before returning. PhysicsFS will pass these errors + * back to the application unmolested in most cases. + * + * Thread safety: TO BE DECIDED. !!! FIXME + * + * \sa PHYSFS_registerArchiver + * \sa PHYSFS_deregisterArchiver + * \sa PHYSFS_supportedArchiveTypes + */ +typedef struct PHYSFS_Archiver +{ + +// !!! FIXME: split read/write interfaces? + + /** + * \brief Binary compatibility information. + * + * This must be set to zero at this time. Future versions of this + * struct will increment this field, so we know what a given + * implementation supports. We'll presumably keep supporting older + * versions as we offer new features, though. + */ + PHYSFS_uint32 version; + + /** + * \brief Basic info about this archiver. + * + * This is used to identify your archive, and is returned in + * PHYSFS_supportedArchiveTypes(). + */ + PHYSFS_ArchiveInfo info; + +// !!! FIXME: documentation: \brief? + /** + * \brief + * + * Open an archive provided by (io). + * (name) is a filename associated with (io), but doesn't necessarily + * map to anything, let alone a real filename. This possibly- + * meaningless name is in platform-dependent notation. + * (forWrite) is non-zero if this is to be used for + * the write directory, and zero if this is to be used for an + * element of the search path. + * Return NULL on failure. We ignore any error code you set here; + * when PHYSFS_mount() returns, the error will be PHYSFS_ERR_UNSUPPORTED + * (no Archivers could handle this data). // !!! FIXME: yeah? + * Returns non-NULL on success. The pointer returned will be + * passed as the "opaque" parameter for later calls. + */ + void *(*openArchive)(PHYSFS_Io *io, const char *name, int forWrite); + + /** + * List all files in (dirname). Each file is passed to (cb), + * where a copy is made if appropriate, so you should dispose of + * it properly upon return from the callback. + * If you have a failure, report as much as you can. + * (dirname) is in platform-independent notation. + */ + void (*enumerateFiles)(void *opaque, const char *dirname, + PHYSFS_EnumFilesCallback cb, + const char *origdir, void *callbackdata); + + /** + * Open file for reading. + * This filename, (fnm), is in platform-independent notation. + * If you can't handle multiple opens of the same file, + * you can opt to fail for the second call. + * Fail if the file does not exist. + * Returns NULL on failure, and calls PHYSFS_setErrorCode(). + * Returns non-NULL on success. The pointer returned will be + * passed as the "opaque" parameter for later file calls. + */ + PHYSFS_Io *(*openRead)(void *opaque, const char *fnm); + + /** + * Open file for writing. + * If the file does not exist, it should be created. If it exists, + * it should be truncated to zero bytes. The writing + * offset should be the start of the file. + * This filename is in platform-independent notation. + * If you can't handle multiple opens of the same file, + * you can opt to fail for the second call. + * Returns NULL on failure, and calls PHYSFS_setErrorCode(). + * Returns non-NULL on success. The pointer returned will be + * passed as the "opaque" parameter for later file calls. + */ + PHYSFS_Io *(*openWrite)(void *opaque, const char *filename); + + /** + * Open file for appending. + * If the file does not exist, it should be created. The writing + * offset should be the end of the file. + * This filename is in platform-independent notation. + * If you can't handle multiple opens of the same file, + * you can opt to fail for the second call. + * Returns NULL on failure, and calls PHYSFS_setErrorCode(). + * Returns non-NULL on success. The pointer returned will be + * passed as the "opaque" parameter for later file calls. + */ + PHYSFS_Io *(*openAppend)(void *opaque, const char *filename); + + /** + * Delete a file in the archive/directory. + * Return non-zero on success, zero on failure. + * This filename is in platform-independent notation. + * This method may be NULL. + * On failure, call PHYSFS_setErrorCode(). + */ + int (*remove)(void *opaque, const char *filename); + + /** + * Create a directory in the archive/directory. + * If the application is trying to make multiple dirs, PhysicsFS + * will split them up into multiple calls before passing them to + * your driver. + * Return non-zero on success, zero on failure. + * This filename is in platform-independent notation. + * This method may be NULL. + * On failure, call PHYSFS_setErrorCode(). + */ + int (*mkdir)(void *opaque, const char *filename); + + /** + * Obtain basic file metadata. + * Returns non-zero on success, zero on failure. + * On failure, call PHYSFS_setErrorCode(). + */ + int (*stat)(void *opaque, const char *fn, PHYSFS_Stat *stat); + + /** + * Close directories/archives, and free any associated memory, + * including the original PHYSFS_Io and (opaque) itself, if + * applicable. Implementation can assume that it won't be called if + * there are still files open from this archive. + */ + void (*closeArchive)(void *opaque); +} PHYSFS_Archiver; + +/** + * \fn int PHYSFS_registerArchiver(const PHYSFS_Archiver *archiver) + * \brief Add a new archiver to the system. + * + * !!! FIXME: write me. + * + * You may not have two archivers that handle the same extension. If you are + * going to have a clash, you can deregister the other archiver (including + * built-in ones) with PHYSFS_deregisterArchiver(). + * + * The data in (archiver) is copied; you may free this pointer when this + * function returns. + * + * \param archiver The archiver to register. + * \return Zero on error, non-zero on success. + * + * \sa PHYSFS_Archiver + * \sa PHYSFS_deregisterArchiver + */ +PHYSFS_DECL int PHYSFS_registerArchiver(const PHYSFS_Archiver *archiver); + +/** + * \fn int PHYSFS_deregisterArchiver(const char *ext) + * \brief Remove an archiver from the system. + * + * !!! FIXME: write me. + * + * This fails if there are any archives still open that use this archiver. + * + * \param ext Filename extension that the archiver handles. + * \return Zero on error, non-zero on success. + * + * \sa PHYSFS_Archiver + * \sa PHYSFS_registerArchiver + */ +PHYSFS_DECL int PHYSFS_deregisterArchiver(const char *ext); + + /* Everything above this line is part of the PhysicsFS 2.1 API. */ - #ifdef __cplusplus } #endif diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/physfs_casefolding.h --- a/misc/libphysfs/physfs_casefolding.h Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/physfs_casefolding.h Sun Dec 17 00:09:24 2017 +0100 @@ -1,5 +1,5 @@ /* - * This file is part of PhysicsFS (http://icculus.org/physfs/) + * This file is part of PhysicsFS (https://icculus.org/physfs/) * * This data generated by physfs/extras/makecasefoldhashtable.pl ... * Do not manually edit this file! diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/physfs_internal.h --- a/misc/libphysfs/physfs_internal.h Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/physfs_internal.h Sun Dec 17 00:09:24 2017 +0100 @@ -114,6 +114,9 @@ #ifndef PHYSFS_SUPPORTS_WAD #define PHYSFS_SUPPORTS_WAD 0 #endif +#ifndef PHYSFS_SUPPORTS_SLB +#define PHYSFS_SUPPORTS_SLB 0 +#endif #ifndef PHYSFS_SUPPORTS_ISO9660 #define PHYSFS_SUPPORTS_ISO9660 0 #endif @@ -121,162 +124,27 @@ /* The latest supported PHYSFS_Io::version value. */ #define CURRENT_PHYSFS_IO_API_VERSION 0 -/* Opaque data for file and dir handlers... */ -typedef void PHYSFS_Dir; - -typedef struct -{ - /* - * Basic info about this archiver... - */ - const PHYSFS_ArchiveInfo info; - - - /* - * DIRECTORY ROUTINES: - * These functions are for dir handles. Generate a handle with the - * openArchive() method, then pass it as the "opaque" PHYSFS_Dir to the - * others. - * - * Symlinks should always be followed (except in stat()); PhysicsFS will - * use the stat() method to check for symlinks and make a judgement on - * whether to continue to call other methods based on that. - */ - - /* - * Open a dirhandle for dir/archive data provided by (io). - * (name) is a filename associated with (io), but doesn't necessarily - * map to anything, let alone a real filename. This possibly- - * meaningless name is in platform-dependent notation. - * (forWrite) is non-zero if this is to be used for - * the write directory, and zero if this is to be used for an - * element of the search path. - * Returns NULL on failure. We ignore any error code you set here. - * Returns non-NULL on success. The pointer returned will be - * passed as the "opaque" parameter for later calls. - */ - PHYSFS_Dir *(*openArchive)(PHYSFS_Io *io, const char *name, int forWrite); - - /* - * List all files in (dirname). Each file is passed to (cb), - * where a copy is made if appropriate, so you should dispose of - * it properly upon return from the callback. - * You should omit symlinks if (omitSymLinks) is non-zero. - * If you have a failure, report as much as you can. - * (dirname) is in platform-independent notation. - */ - void (*enumerateFiles)(PHYSFS_Dir *opaque, const char *dirname, - int omitSymLinks, PHYSFS_EnumFilesCallback cb, - const char *origdir, void *callbackdata); - - /* - * Open file for reading. - * This filename, (fnm), is in platform-independent notation. - * If you can't handle multiple opens of the same file, - * you can opt to fail for the second call. - * Fail if the file does not exist. - * Returns NULL on failure, and calls __PHYSFS_setError(). - * Returns non-NULL on success. The pointer returned will be - * passed as the "opaque" parameter for later file calls. - * - * Regardless of success or failure, please set *exists to - * non-zero if the file existed (even if it's a broken symlink!), - * zero if it did not. - */ - PHYSFS_Io *(*openRead)(PHYSFS_Dir *opaque, const char *fnm, int *exists); +/* The latest supported PHYSFS_Archiver::version value. */ +#define CURRENT_PHYSFS_ARCHIVER_API_VERSION 0 - /* - * Open file for writing. - * If the file does not exist, it should be created. If it exists, - * it should be truncated to zero bytes. The writing - * offset should be the start of the file. - * This filename is in platform-independent notation. - * If you can't handle multiple opens of the same file, - * you can opt to fail for the second call. - * Returns NULL on failure, and calls __PHYSFS_setError(). - * Returns non-NULL on success. The pointer returned will be - * passed as the "opaque" parameter for later file calls. - */ - PHYSFS_Io *(*openWrite)(PHYSFS_Dir *opaque, const char *filename); - - /* - * Open file for appending. - * If the file does not exist, it should be created. The writing - * offset should be the end of the file. - * This filename is in platform-independent notation. - * If you can't handle multiple opens of the same file, - * you can opt to fail for the second call. - * Returns NULL on failure, and calls __PHYSFS_setError(). - * Returns non-NULL on success. The pointer returned will be - * passed as the "opaque" parameter for later file calls. - */ - PHYSFS_Io *(*openAppend)(PHYSFS_Dir *opaque, const char *filename); - - /* - * Delete a file in the archive/directory. - * Return non-zero on success, zero on failure. - * This filename is in platform-independent notation. - * This method may be NULL. - * On failure, call __PHYSFS_setError(). - */ - int (*remove)(PHYSFS_Dir *opaque, const char *filename); - - /* - * Create a directory in the archive/directory. - * If the application is trying to make multiple dirs, PhysicsFS - * will split them up into multiple calls before passing them to - * your driver. - * Return non-zero on success, zero on failure. - * This filename is in platform-independent notation. - * This method may be NULL. - * On failure, call __PHYSFS_setError(). - */ - int (*mkdir)(PHYSFS_Dir *opaque, const char *filename); - - /* - * Close directories/archives, and free any associated memory, - * including the original PHYSFS_Io and (opaque) itself, if - * applicable. Implementation can assume that it won't be called if - * there are still files open from this archive. - */ - void (*closeArchive)(PHYSFS_Dir *opaque); - - /* - * Obtain basic file metadata. - * Returns non-zero on success, zero on failure. - * On failure, call __PHYSFS_setError(). - */ - int (*stat)(PHYSFS_Dir *opaque, const char *fn, - int *exists, PHYSFS_Stat *stat); -} PHYSFS_Archiver; - - -/* - * Call this to set the message returned by PHYSFS_getLastError(). - * Please only use the ERR_* constants above, or add new constants to the - * above group, but I want these all in one place. - * - * Calling this with a NULL argument is a safe no-op. - */ -void __PHYSFS_setError(const PHYSFS_ErrorCode err); - - -/* This byteorder stuff was lifted from SDL. http://www.libsdl.org/ */ +/* This byteorder stuff was lifted from SDL. https://www.libsdl.org/ */ #define PHYSFS_LIL_ENDIAN 1234 #define PHYSFS_BIG_ENDIAN 4321 -#if defined(__i386__) || defined(__ia64__) || \ - defined(_M_IX86) || defined(_M_IA64) || defined(_M_X64) || \ - (defined(__alpha__) || defined(__alpha)) || \ - defined(__arm__) || defined(ARM) || \ - (defined(__mips__) && defined(__MIPSEL__)) || \ - defined(__SYMBIAN32__) || \ - defined(__x86_64__) || \ - defined(__LITTLE_ENDIAN__) -#define PHYSFS_BYTEORDER PHYSFS_LIL_ENDIAN +#ifdef __linux__ +#include +#define PHYSFS_BYTEORDER __BYTE_ORDER +#else /* __linux__ */ +#if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MISPEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ + defined(__sparc__) +#define PHYSFS_BYTEORDER PHYSFS_BIG_ENDIAN #else -#define PHYSFS_BYTEORDER PHYSFS_BIG_ENDIAN +#define PHYSFS_BYTEORDER PHYSFS_LIL_ENDIAN #endif +#endif /* __linux__ */ /* @@ -296,8 +164,6 @@ * a QuickSort and BubbleSort internally. * (cmpfn) is used to determine ordering, and (swapfn) does the actual * swapping of elements in the list. - * - * See zip.c for an example. */ void __PHYSFS_sort(void *entries, size_t max, int (*cmpfn)(void *, size_t, size_t), @@ -310,14 +176,14 @@ #define ERRPASS PHYSFS_ERR_OK /* These get used all over for lessening code clutter. */ -#define BAIL_MACRO(e, r) do { if (e) __PHYSFS_setError(e); return r; } while (0) -#define BAIL_IF_MACRO(c, e, r) do { if (c) { if (e) __PHYSFS_setError(e); return r; } } while (0) -#define BAIL_MACRO_MUTEX(e, m, r) do { if (e) __PHYSFS_setError(e); __PHYSFS_platformReleaseMutex(m); return r; } while (0) -#define BAIL_IF_MACRO_MUTEX(c, e, m, r) do { if (c) { if (e) __PHYSFS_setError(e); __PHYSFS_platformReleaseMutex(m); return r; } } while (0) -#define GOTO_MACRO(e, g) do { if (e) __PHYSFS_setError(e); goto g; } while (0) -#define GOTO_IF_MACRO(c, e, g) do { if (c) { if (e) __PHYSFS_setError(e); goto g; } } while (0) -#define GOTO_MACRO_MUTEX(e, m, g) do { if (e) __PHYSFS_setError(e); __PHYSFS_platformReleaseMutex(m); goto g; } while (0) -#define GOTO_IF_MACRO_MUTEX(c, e, m, g) do { if (c) { if (e) __PHYSFS_setError(e); __PHYSFS_platformReleaseMutex(m); goto g; } } while (0) +#define BAIL_MACRO(e, r) do { if (e) PHYSFS_setErrorCode(e); return r; } while (0) +#define BAIL_IF_MACRO(c, e, r) do { if (c) { if (e) PHYSFS_setErrorCode(e); return r; } } while (0) +#define BAIL_MACRO_MUTEX(e, m, r) do { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); return r; } while (0) +#define BAIL_IF_MACRO_MUTEX(c, e, m, r) do { if (c) { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); return r; } } while (0) +#define GOTO_MACRO(e, g) do { if (e) PHYSFS_setErrorCode(e); goto g; } while (0) +#define GOTO_IF_MACRO(c, e, g) do { if (c) { if (e) PHYSFS_setErrorCode(e); goto g; } } while (0) +#define GOTO_MACRO_MUTEX(e, m, g) do { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); goto g; } while (0) +#define GOTO_IF_MACRO_MUTEX(c, e, m, g) do { if (c) { if (e) PHYSFS_setErrorCode(e); __PHYSFS_platformReleaseMutex(m); goto g; } } while (0) #define __PHYSFS_ARRAYLEN(x) ( (sizeof (x)) / (sizeof (x[0])) ) @@ -381,6 +247,16 @@ */ int __PHYSFS_strnicmpASCII(const char *s1, const char *s2, PHYSFS_uint32 l); +/* + * Like strdup(), but uses the current PhysicsFS allocator. + */ +char *__PHYSFS_strdup(const char *str); + +/* + * Give a hash value for a C string (uses djb's xor hashing algorithm). + */ +PHYSFS_uint32 __PHYSFS_hashString(const char *str, size_t len); + /* * The current allocator. Not valid before PHYSFS_init is called! @@ -417,22 +293,22 @@ typedef struct { - char name[56]; + char name[64]; PHYSFS_uint32 startPos; PHYSFS_uint32 size; } UNPKentry; -void UNPK_closeArchive(PHYSFS_Dir *opaque); -PHYSFS_Dir *UNPK_openArchive(PHYSFS_Io *io,UNPKentry *e,const PHYSFS_uint32 n); -void UNPK_enumerateFiles(PHYSFS_Dir *opaque, const char *dname, - int omitSymLinks, PHYSFS_EnumFilesCallback cb, +void UNPK_closeArchive(void *opaque); +void *UNPK_openArchive(PHYSFS_Io *io,UNPKentry *e,const PHYSFS_uint32 n); +void UNPK_enumerateFiles(void *opaque, const char *dname, + PHYSFS_EnumFilesCallback cb, const char *origdir, void *callbackdata); -PHYSFS_Io *UNPK_openRead(PHYSFS_Dir *opaque, const char *fnm, int *fileExists); -PHYSFS_Io *UNPK_openWrite(PHYSFS_Dir *opaque, const char *name); -PHYSFS_Io *UNPK_openAppend(PHYSFS_Dir *opaque, const char *name); -int UNPK_remove(PHYSFS_Dir *opaque, const char *name); -int UNPK_mkdir(PHYSFS_Dir *opaque, const char *name); -int UNPK_stat(PHYSFS_Dir *opaque, const char *fn, int *exist, PHYSFS_Stat *st); +PHYSFS_Io *UNPK_openRead(void *opaque, const char *name); +PHYSFS_Io *UNPK_openWrite(void *opaque, const char *name); +PHYSFS_Io *UNPK_openAppend(void *opaque, const char *name); +int UNPK_remove(void *opaque, const char *name); +int UNPK_mkdir(void *opaque, const char *name); +int UNPK_stat(void *opaque, const char *fn, PHYSFS_Stat *st); /*--------------------------------------------------------------------------*/ @@ -489,7 +365,7 @@ * a unique file handle; this is frequently employed to prevent race * conditions in the archivers. * - * Call __PHYSFS_setError() and return (NULL) if the file can't be opened. + * Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened. */ void *__PHYSFS_platformOpenRead(const char *filename); @@ -506,7 +382,7 @@ * * Opening a file for write multiple times has undefined results. * - * Call __PHYSFS_setError() and return (NULL) if the file can't be opened. + * Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened. */ void *__PHYSFS_platformOpenWrite(const char *filename); @@ -524,7 +400,7 @@ * * Opening a file for append multiple times has undefined results. * - * Call __PHYSFS_setError() and return (NULL) if the file can't be opened. + * Call PHYSFS_setErrorCode() and return (NULL) if the file can't be opened. */ void *__PHYSFS_platformOpenAppend(const char *filename); @@ -536,7 +412,7 @@ * immediately after those bytes. * On success, return (len) and position the file pointer immediately past * the end of the last read byte. Return (-1) if there is a catastrophic - * error, and call __PHYSFS_setError() to describe the problem; the file + * error, and call PHYSFS_setErrorCode() to describe the problem; the file * pointer should not move in such a case. A partial read is success; only * return (-1) on total failure; presumably, the next read call after a * partial read will fail as such. @@ -549,7 +425,7 @@ * 8-bit bytes from the area pointed to by (buffer). If there is a problem, * return the number of bytes written, and position the file pointer * immediately after those bytes. Return (-1) if there is a catastrophic - * error, and call __PHYSFS_setError() to describe the problem; the file + * error, and call PHYSFS_setErrorCode() to describe the problem; the file * pointer should not move in such a case. A partial write is success; only * return (-1) on total failure; presumably, the next write call after a * partial write will fail as such. @@ -565,7 +441,7 @@ * * Not all file types can seek; this is to be expected by the caller. * - * On error, call __PHYSFS_setError() and return zero. On success, return + * On error, call PHYSFS_setErrorCode() and return zero. On success, return * a non-zero value. */ int __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos); @@ -578,7 +454,7 @@ * * Not all file types can "tell"; this is to be expected by the caller. * - * On error, call __PHYSFS_setError() and return -1. On success, return >= 0. + * On error, call PHYSFS_setErrorCode() and return -1. On success, return >= 0. */ PHYSFS_sint64 __PHYSFS_platformTell(void *opaque); @@ -589,7 +465,7 @@ * The caller expects that this information may not be available for all * file types on all platforms. * - * Return -1 if you can't do it, and call __PHYSFS_setError(). Otherwise, + * Return -1 if you can't do it, and call PHYSFS_setErrorCode(). Otherwise, * return the file length in 8-bit bytes. */ PHYSFS_sint64 __PHYSFS_platformFileLength(void *handle); @@ -598,7 +474,7 @@ /* * !!! FIXME: comment me. */ -int __PHYSFS_platformStat(const char *fn, int *exists, PHYSFS_Stat *stat); +int __PHYSFS_platformStat(const char *fn, PHYSFS_Stat *stat); /* * Flush any pending writes to disk. (opaque) should be cast to whatever data @@ -672,14 +548,13 @@ /* * Enumerate a directory of files. This follows the rules for the - * PHYSFS_Archiver->enumerateFiles() method (see above), except that the + * PHYSFS_Archiver::enumerateFiles() method, except that the * (dirName) that is passed to this function is converted to * platform-DEPENDENT notation by the caller. The PHYSFS_Archiver version * uses platform-independent notation. Note that ".", "..", and other - * metaentries should always be ignored. + * meta-entries should always be ignored. */ void __PHYSFS_platformEnumerateFiles(const char *dirname, - int omitSymLinks, PHYSFS_EnumFilesCallback callback, const char *origdir, void *callbackdata); @@ -726,27 +601,27 @@ /* * Grab possession of a platform-specific mutex. Mutexes should be recursive; * that is, the same thread should be able to call this function multiple - * times in a row without causing a deadlock. This function should block + * times in a row without causing a deadlock. This function should block * until a thread can gain possession of the mutex. * - * Return non-zero if the mutex was grabbed, zero if there was an - * unrecoverable problem grabbing it (this should not be a matter of - * timing out! We're talking major system errors; block until the mutex + * Return non-zero if the mutex was grabbed, zero if there was an + * unrecoverable problem grabbing it (this should not be a matter of + * timing out! We're talking major system errors; block until the mutex * is available otherwise.) * - * _DO NOT_ call __PHYSFS_setError() in here! Since setError calls this + * _DO NOT_ call PHYSFS_setErrorCode() in here! Since setErrorCode calls this * function, you'll cause an infinite recursion. This means you can't * use the BAIL_*MACRO* macros, either. */ int __PHYSFS_platformGrabMutex(void *mutex); /* - * Relinquish possession of the mutex when this method has been called + * Relinquish possession of the mutex when this method has been called * once for each time that platformGrabMutex was called. Once possession has * been released, the next thread in line to grab the mutex (if any) may * proceed. * - * _DO NOT_ call __PHYSFS_setError() in here! Since setError calls this + * _DO NOT_ call PHYSFS_setErrorCode() in here! Since setErrorCode calls this * function, you'll cause an infinite recursion. This means you can't * use the BAIL_*MACRO* macros, either. */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/physfs_miniz.h --- a/misc/libphysfs/physfs_miniz.h Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/physfs_miniz.h Sun Dec 17 00:09:24 2017 +0100 @@ -1,7 +1,7 @@ /* tinfl.c v1.11 - public domain inflate with zlib header parsing/adler32 checking (inflate-only subset of miniz.c) See "unlicense" statement at the end of this file. Rich Geldreich , last updated May 20, 2011 - Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt + Implements RFC 1950: https://www.ietf.org/rfc/rfc1950.txt and RFC 1951: https://www.ietf.org/rfc/rfc1951.txt The entire decompressor coroutine is implemented in tinfl_decompress(). The other functions are optional high-level helpers. */ @@ -12,7 +12,7 @@ typedef PHYSFS_sint16 mz_int16; typedef PHYSFS_uint16 mz_uint16; typedef PHYSFS_uint32 mz_uint32; -typedef unsigned int mz_uint; +typedef unsigned int mz_uint; typedef PHYSFS_uint64 mz_uint64; /* For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. */ @@ -266,7 +266,10 @@ { mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i; r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); - for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8; + for ( i = 0; i <= 143; ++i) *p++ = 8; + for ( ; i <= 255; ++i) *p++ = 9; + for ( ; i <= 279; ++i) *p++ = 7; + for ( ; i <= 287; ++i) *p++ = 8; } else { @@ -670,7 +673,7 @@ #endif /* #ifndef TINFL_HEADER_FILE_ONLY */ -/* +/* This is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or @@ -694,5 +697,5 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - For more information, please refer to + For more information, please refer to */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/physfs_platforms.h --- a/misc/libphysfs/physfs_platforms.h Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/physfs_platforms.h Sun Dec 17 00:09:24 2017 +0100 @@ -21,6 +21,10 @@ # define PHYSFS_PLATFORM_POSIX 1 #elif (defined _WIN32_WCE) || (defined _WIN64_WCE) # error PocketPC support was dropped from PhysicsFS 2.1. Sorry. +#elif ((defined WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define PHYSFS_PLATFORM_WINRT 1 +# define PHYSFS_NO_CDROM_SUPPORT 1 +# define PHYSFS_PLATFORM_WINDOWS 1 #elif (((defined _WIN32) || (defined _WIN64)) && (!defined __CYGWIN__)) # define PHYSFS_PLATFORM_WINDOWS 1 #elif (defined OS2) @@ -35,6 +39,11 @@ # define PHYSFS_PLATFORM_POSIX 1 #elif defined(macintosh) # error Classic Mac OS support was dropped from PhysicsFS 2.0. Move to OS X. +#elif defined(ANDROID) +# define PHYSFS_PLATFORM_LINUX 1 +# define PHYSFS_PLATFORM_UNIX 1 +# define PHYSFS_PLATFORM_POSIX 1 +# define PHYSFS_NO_CDROM_SUPPORT 1 #elif defined(__linux) # define PHYSFS_PLATFORM_LINUX 1 # define PHYSFS_PLATFORM_UNIX 1 @@ -43,7 +52,12 @@ # define PHYSFS_PLATFORM_SOLARIS 1 # define PHYSFS_PLATFORM_UNIX 1 # define PHYSFS_PLATFORM_POSIX 1 -#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__) +#elif defined(__FreeBSD__) || defined(__DragonFly__) +# define PHYSFS_PLATFORM_FREEBSD 1 +# define PHYSFS_PLATFORM_BSD 1 +# define PHYSFS_PLATFORM_UNIX 1 +# define PHYSFS_PLATFORM_POSIX 1 +#elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) # define PHYSFS_PLATFORM_BSD 1 # define PHYSFS_PLATFORM_UNIX 1 # define PHYSFS_PLATFORM_POSIX 1 diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/physfs_unicode.c --- a/misc/libphysfs/physfs_unicode.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/physfs_unicode.c Sun Dec 17 00:09:24 2017 +0100 @@ -4,7 +4,7 @@ /* * From rfc3629, the UTF-8 spec: - * http://www.ietf.org/rfc/rfc3629.txt + * https://www.ietf.org/rfc/rfc3629.txt * * Char. number range | UTF-8 octet sequence * (hexadecimal) | (binary) @@ -447,11 +447,27 @@ static int utf8codepointcmp(const PHYSFS_uint32 cp1, const PHYSFS_uint32 cp2) { PHYSFS_uint32 folded1[3], folded2[3]; + + if (cp1 == cp2) + return 0; /* obviously matches. */ + locate_case_fold_mapping(cp1, folded1); locate_case_fold_mapping(cp2, folded2); - return ( (folded1[0] == folded2[0]) && - (folded1[1] == folded2[1]) && - (folded1[2] == folded2[2]) ); + + if (folded1[0] < folded2[0]) + return -1; + else if (folded1[0] > folded2[0]) + return 1; + else if (folded1[1] < folded2[1]) + return -1; + else if (folded1[1] > folded2[1]) + return 1; + else if (folded1[2] < folded2[2]) + return -1; + else if (folded1[2] > folded2[2]) + return 1; + + return 0; /* complete match. */ } /* utf8codepointcmp */ @@ -461,8 +477,11 @@ { const PHYSFS_uint32 cp1 = utf8codepoint(&str1); const PHYSFS_uint32 cp2 = utf8codepoint(&str2); - if (!utf8codepointcmp(cp1, cp2)) break; - if (cp1 == 0) return 1; + const int rc = utf8codepointcmp(cp1, cp2); + if (rc != 0) + return rc; + else if (cp1 == 0) + break; /* complete match. */ } /* while */ return 0; @@ -475,12 +494,15 @@ { const PHYSFS_uint32 cp1 = utf8codepoint(&str1); const PHYSFS_uint32 cp2 = utf8codepoint(&str2); - if (!utf8codepointcmp(cp1, cp2)) return 0; - if (cp1 == 0) return 1; + const int rc = utf8codepointcmp(cp1, cp2); + if (rc != 0) + return rc; + else if (cp1 == 0) + return 0; n--; } /* while */ - return 1; /* matched to n chars. */ + return 0; /* matched to n chars. */ } /* __PHYSFS_utf8strnicmp */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/platform_beos.cpp --- a/misc/libphysfs/platform_beos.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/platform_beos.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -87,7 +87,7 @@ /* * This function is lifted from Simple Directmedia Layer (SDL): - * http://www.libsdl.org/ ... this is zlib-licensed code, too. + * https://www.libsdl.org/ ... this is zlib-licensed code, too. */ static void tryDir(const char *d, PHYSFS_StringCallback callback, void *data) { diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/platform_macosx.c --- a/misc/libphysfs/platform_macosx.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/platform_macosx.c Sun Dec 17 00:09:24 2017 +0100 @@ -29,58 +29,14 @@ #include "physfs_internal.h" -#if defined(__APPLE__) -#if defined(TARGET_OS_MAC) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 -/* __eprintf shouldn't have been made visible from libstdc++, or anywhere, but - on Mac OS X 10.4 it was defined in libstdc++.6.0.3.dylib; so on that platform - we have to keep defining it to keep binary compatibility. - We can't just put the libgcc version in the export list, because that - doesn't work; once a symbol is marked as hidden, it stays that way. */ - -void __eprintf (const char *string, const char *expression, - unsigned int line, const char *filename) -{ - fprintf(stderr, string, expression, line, filename); - fflush(stderr); - abort(); -} - - -/* apparently libssp is missing from 10.4 SDK - code from http://wiki.osdev.org/GCC_Stack_Smashing_Protector */ -void * __stack_chk_guard = NULL; - -void __stack_chk_guard_setup() -{ - unsigned char * p; - p = (unsigned char *) &__stack_chk_guard; - - /* If you have the ability to generate random numbers in your kernel then use them, - otherwise for 32-bit code: *p = 0x00000aff; */ - *p = random(); -} - -void __attribute__((noreturn)) __stack_chk_fail() -{ - /* put your panic function or similar in here */ - unsigned char * vid = (unsigned char *)0xB8000; - vid[1] = 7; - for(;;) - vid[0]++; -} - -#endif -#endif /* __APPLE__ */ - - /* Wrap PHYSFS_Allocator in a CFAllocator... */ static CFAllocatorRef cfallocator = NULL; -static CFStringRef cfallocDesc(const void *info) +static CFStringRef cfallocCopyDesc(const void *info) { return CFStringCreateWithCString(cfallocator, "PhysicsFS", kCFStringEncodingASCII); -} /* cfallocDesc */ +} /* cfallocCopyDesc */ static void *cfallocMalloc(CFIndex allocSize, CFOptionFlags hint, void *info) @@ -109,7 +65,7 @@ /* set up a CFAllocator, so Carbon can use the physfs allocator, too. */ CFAllocatorContext ctx; memset(&ctx, '\0', sizeof (ctx)); - ctx.copyDescription = cfallocDesc; + ctx.copyDescription = cfallocCopyDesc; ctx.allocate = cfallocMalloc; ctx.reallocate = cfallocRealloc; ctx.deallocate = cfallocFree; @@ -132,7 +88,7 @@ /* * Code based on sample from Apple Developer Connection: - * http://developer.apple.com/samplecode/Sample_Code/Devices_and_Hardware/Disks/VolumeToBSDNode/VolumeToBSDNode.c.htm + * https://developer.apple.com/samplecode/Sample_Code/Devices_and_Hardware/Disks/VolumeToBSDNode/VolumeToBSDNode.c.htm */ #if !defined(PHYSFS_NO_CDROM_SUPPORT) @@ -144,7 +100,7 @@ if (!IOObjectConformsTo(service, kIOMediaClass)) return 0; - + wholeMedia = IORegistryEntryCreateCFProperty(service, CFSTR(kIOMediaWholeKey), cfallocator, 0); @@ -180,7 +136,7 @@ rc = IORegistryEntryCreateIterator(service, kIOServicePlane, kIORegistryIterateRecursively | kIORegistryIterateParents, &iter); - + if (!iter) return 0; @@ -204,7 +160,7 @@ } /* if */ IOObjectRelease(service); } while ((service = IOIteratorNext(iter)) && (!retval)); - + IOObjectRelease(iter); IOObjectRelease(service); diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/platform_posix.c --- a/misc/libphysfs/platform_posix.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/platform_posix.c Sun Dec 17 00:09:24 2017 +0100 @@ -41,9 +41,9 @@ case ELOOP: return PHYSFS_ERR_SYMLINK_LOOP; case EMLINK: return PHYSFS_ERR_NO_SPACE; case ENAMETOOLONG: return PHYSFS_ERR_BAD_FILENAME; - case ENOENT: return PHYSFS_ERR_NO_SUCH_PATH; + case ENOENT: return PHYSFS_ERR_NOT_FOUND; case ENOSPC: return PHYSFS_ERR_NO_SPACE; - case ENOTDIR: return PHYSFS_ERR_NO_SUCH_PATH; + case ENOTDIR: return PHYSFS_ERR_NOT_FOUND; case EISDIR: return PHYSFS_ERR_NOT_A_FILE; case EROFS: return PHYSFS_ERR_READ_ONLY; case ETXTBSY: return PHYSFS_ERR_BUSY; @@ -83,7 +83,7 @@ } /* if */ } /* if */ } /* if */ - + return retval; } /* getUserDirByUID */ @@ -122,31 +122,13 @@ void __PHYSFS_platformEnumerateFiles(const char *dirname, - int omitSymLinks, PHYSFS_EnumFilesCallback callback, const char *origdir, void *callbackdata) { DIR *dir; struct dirent *ent; - int bufsize = 0; char *buf = NULL; - int dlen = 0; - - if (omitSymLinks) /* !!! FIXME: this malloc sucks. */ - { - dlen = strlen(dirname); - bufsize = dlen + 256; - buf = (char *) allocator.Malloc(bufsize); - if (buf == NULL) - return; - strcpy(buf, dirname); - if (buf[dlen - 1] != '/') - { - buf[dlen++] = '/'; - buf[dlen] = '\0'; - } /* if */ - } /* if */ errno = 0; dir = opendir(dirname); @@ -160,35 +142,9 @@ { if (strcmp(ent->d_name, ".") == 0) continue; - - if (strcmp(ent->d_name, "..") == 0) + else if (strcmp(ent->d_name, "..") == 0) continue; - if (omitSymLinks) - { - PHYSFS_Stat statbuf; - int exists = 0; - char *p; - int len = strlen(ent->d_name) + dlen + 1; - if (len > bufsize) - { - p = (char *) allocator.Realloc(buf, len); - if (p == NULL) - continue; - buf = p; - bufsize = len; - } /* if */ - - strcpy(buf + dlen, ent->d_name); - - if (!__PHYSFS_platformStat(buf, &exists, &statbuf)) - continue; - else if (!exists) - continue; /* probably can't happen, but just in case. */ - else if (statbuf.filetype == PHYSFS_FILETYPE_SYMLINK) - continue; - } /* if */ - callback(callbackdata, origdir, ent->d_name); } /* while */ @@ -323,7 +279,8 @@ int __PHYSFS_platformFlush(void *opaque) { const int fd = *((int *) opaque); - BAIL_IF_MACRO(fsync(fd) == -1, errcodeFromErrno(), 0); + if ((fcntl(fd, F_GETFL) & O_ACCMODE) != O_RDONLY) + BAIL_IF_MACRO(fsync(fd) == -1, errcodeFromErrno(), 0); return 1; } /* __PHYSFS_platformFlush */ @@ -343,17 +300,11 @@ } /* __PHYSFS_platformDelete */ -int __PHYSFS_platformStat(const char *filename, int *exists, PHYSFS_Stat *st) +int __PHYSFS_platformStat(const char *filename, PHYSFS_Stat *st) { struct stat statbuf; - if (lstat(filename, &statbuf) == -1) - { - *exists = (errno != ENOENT); - BAIL_MACRO(errcodeFromErrno(), 0); - } /* if */ - - *exists = 1; + BAIL_IF_MACRO(lstat(filename, &statbuf) == -1, errcodeFromErrno(), 0); if (S_ISREG(statbuf.st_mode)) { @@ -367,6 +318,12 @@ st->filesize = 0; } /* else if */ + else if(S_ISLNK(statbuf.st_mode)) + { + st->filetype = PHYSFS_FILETYPE_SYMLINK; + st->filesize = 0; + } /* else if */ + else { st->filetype = PHYSFS_FILETYPE_OTHER; diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/platform_unix.c --- a/misc/libphysfs/platform_unix.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/platform_unix.c Sun Dec 17 00:09:24 2017 +0100 @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,7 @@ #include #include #include +#include #if PHYSFS_PLATFORM_LINUX && !defined(PHYSFS_HAVE_MNTENT_H) #define PHYSFS_HAVE_MNTENT_H 1 @@ -171,7 +173,7 @@ binlen = strlen(bin); size = strlen(start) + binlen + 2; - if (size > alloc_size) + if (size >= alloc_size) { char *x = (char *) allocator.Realloc(exe, size); if (!x) @@ -193,7 +195,7 @@ if (access(exe, X_OK) == 0) /* Exists as executable? We're done. */ { - exe[size - binlen - 1] = '\0'; /* chop off filename, leave '/' */ + exe[(size - binlen) - 1] = '\0'; /* chop off filename, leave '/' */ return exe; } /* if */ @@ -244,20 +246,45 @@ char *retval = NULL; const char *envr = NULL; - /* - * Try to avoid using argv0 unless forced to. If there's a Linux-like - * /proc filesystem, you can get the full path to the current process from - * the /proc/self/exe symlink. + /* Try to avoid using argv0 unless forced to. Try system-specific stuff. */ + + #if PHYSFS_PLATFORM_FREEBSD + { + char fullpath[PATH_MAX]; + size_t buflen = sizeof (fullpath); + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + if (sysctl(mib, 4, fullpath, &buflen, NULL, 0) != -1) + retval = __PHYSFS_strdup(fullpath); + } + #elif PHYSFS_PLATFORM_SOLARIS + { + const char *path = getexecname(); + if ((path != NULL) && (path[0] == '/')) /* must be absolute path... */ + retval = __PHYSFS_strdup(path); + } + #endif + + if (retval) + return retval; /* already got it. */ + + /* If there's a Linux-like /proc filesystem, you can get the full path to + * the current process from a symlink in there. */ - retval = readSymLink("/proc/self/exe"); - if (retval == NULL) + + if (access("/proc", F_OK) == 0) { - /* older kernels don't have /proc/self ... try PID version... */ - const unsigned long long pid = (unsigned long long) getpid(); - char path[64]; - const int rc = (int) snprintf(path,sizeof(path),"/proc/%llu/exe",pid); - if ( (rc > 0) && (rc < sizeof(path)) ) - retval = readSymLink(path); + retval = readSymLink("/proc/self/exe"); + if (!retval) retval = readSymLink("/proc/curproc/file"); + if (!retval) retval = readSymLink("/proc/curproc/exe"); + if (retval == NULL) + { + /* older kernels don't have /proc/self ... try PID version... */ + const unsigned long long pid = (unsigned long long) getpid(); + char path[64]; + const int rc = (int) snprintf(path,sizeof(path),"/proc/%llu/exe",pid); + if ( (rc > 0) && (rc < sizeof(path)) ) + retval = readSymLink(path); + } /* if */ } /* if */ if (retval != NULL) /* chop off filename. */ @@ -272,7 +299,7 @@ } /* else */ } /* if */ - /* No /proc/self/exe, but we have an argv[0] we can parse? */ + /* No /proc/self/exe, etc, but we have an argv[0] we can parse? */ if ((retval == NULL) && (argv0 != NULL)) { /* fast path: default behaviour can handle this. */ @@ -310,7 +337,7 @@ * This isn't strictly correct, but the results are relatively sane * in any case. * - * http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + * https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html */ const char *envr = getenv("XDG_DATA_HOME"); const char *append = "/"; diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/platform_windows.c --- a/misc/libphysfs/platform_windows.c Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphysfs/platform_windows.c Sun Dec 17 00:09:24 2017 +0100 @@ -10,6 +10,7 @@ #include "physfs_platforms.h" #ifdef PHYSFS_PLATFORM_WINDOWS +#ifndef PHYSFS_PLATFORM_WINRT /* Forcibly disable UNICODE macro, since we manage this ourselves. */ #ifdef UNICODE @@ -124,13 +125,13 @@ case ERROR_INVALID_NAME: return PHYSFS_ERR_BAD_FILENAME; case ERROR_BAD_PATHNAME: return PHYSFS_ERR_BAD_FILENAME; case ERROR_DIRECTORY: return PHYSFS_ERR_BAD_FILENAME; - case ERROR_FILE_NOT_FOUND: return PHYSFS_ERR_NO_SUCH_PATH; - case ERROR_PATH_NOT_FOUND: return PHYSFS_ERR_NO_SUCH_PATH; - case ERROR_DELETE_PENDING: return PHYSFS_ERR_NO_SUCH_PATH; - case ERROR_INVALID_DRIVE: return PHYSFS_ERR_NO_SUCH_PATH; + case ERROR_FILE_NOT_FOUND: return PHYSFS_ERR_NOT_FOUND; + case ERROR_PATH_NOT_FOUND: return PHYSFS_ERR_NOT_FOUND; + case ERROR_DELETE_PENDING: return PHYSFS_ERR_NOT_FOUND; + case ERROR_INVALID_DRIVE: return PHYSFS_ERR_NOT_FOUND; case ERROR_HANDLE_DISK_FULL: return PHYSFS_ERR_NO_SPACE; case ERROR_DISK_FULL: return PHYSFS_ERR_NO_SPACE; - /* !!! FIXME: ?? case ENOTDIR: return PHYSFS_ERR_NO_SUCH_PATH; */ + /* !!! FIXME: ?? case ENOTDIR: return PHYSFS_ERR_NOT_FOUND; */ /* !!! FIXME: ?? case EISDIR: return PHYSFS_ERR_NOT_A_FILE; */ case ERROR_WRITE_PROTECT: return PHYSFS_ERR_READ_ONLY; case ERROR_LOCK_VIOLATION: return PHYSFS_ERR_BUSY; @@ -171,7 +172,7 @@ stem(SEM_FAILCRITICALERRORS, &oldErrorMode); else oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); - + /* Do detection. This may block if a disc is spinning up. */ for (i = 'A'; i <= 'Z'; i++) { @@ -369,7 +370,7 @@ } /* while */ if ((ptr == modpath) && (*ptr != '\\')) - __PHYSFS_setError(PHYSFS_ERR_OTHER_ERROR); /* oh well. */ + PHYSFS_setErrorCode(PHYSFS_ERR_OTHER_ERROR); /* oh well. */ else { *(ptr+1) = '\0'; /* chop off filename. */ @@ -412,6 +413,7 @@ } /* if */ sprintf(retval, "%s\\%s\\%s\\", utf8, org, app); + allocator.Free(utf8); return retval; } /* __PHYSFS_platformCalcPrefDir */ @@ -443,7 +445,7 @@ * psize. Also note that the second parameter can't be * NULL or the function fails. */ - rc = pGetDir(accessToken, &dummy, &psize); + rc = pGetDir(accessToken, &dummy, &psize); assert(!rc); /* !!! FIXME: handle this gracefully. */ (void) rc; @@ -478,16 +480,7 @@ return ( (void *) ((size_t) GetCurrentThreadId()) ); } /* __PHYSFS_platformGetThreadID */ - -static int isSymlinkAttrs(const DWORD attr, const DWORD tag) -{ - return ( (attr & FILE_ATTRIBUTE_REPARSE_POINT) && - (tag == PHYSFS_IO_REPARSE_TAG_SYMLINK) ); -} /* isSymlinkAttrs */ - - void __PHYSFS_platformEnumerateFiles(const char *dirname, - int omitSymLinks, PHYSFS_EnumFilesCallback callback, const char *origdir, void *callbackdata) @@ -529,8 +522,6 @@ do { - const DWORD attr = entw.dwFileAttributes; - const DWORD tag = entw.dwReserved0; const WCHAR *fn = entw.cFileName; char *utf8; @@ -538,8 +529,6 @@ continue; if ((fn[0] == '.') && (fn[1] == '.') && (fn[2] == '\0')) continue; - if ((omitSymLinks) && (isSymlinkAttrs(attr, tag))) - continue; utf8 = unicodeToUtf8Heap(fn); if (utf8 != NULL) @@ -720,7 +709,7 @@ { BAIL_MACRO(errcodeFromWinApi(), 0); } /* if */ - + return 1; /* No error occured */ } /* __PHYSFS_platformSeek */ @@ -876,7 +865,8 @@ return retval; } /* FileTimeToPhysfsTime */ -int __PHYSFS_platformStat(const char *filename, int *exists, PHYSFS_Stat *stat) + +int __PHYSFS_platformStat(const char *filename, PHYSFS_Stat *st) { WIN32_FILE_ATTRIBUTE_DATA winstat; WCHAR *wstr = NULL; @@ -887,37 +877,36 @@ BAIL_IF_MACRO(!wstr, PHYSFS_ERR_OUT_OF_MEMORY, 0); rc = GetFileAttributesExW(wstr, GetFileExInfoStandard, &winstat); err = (!rc) ? GetLastError() : 0; - *exists = ((err != ERROR_FILE_NOT_FOUND) && (err != ERROR_PATH_NOT_FOUND)); __PHYSFS_smallFree(wstr); BAIL_IF_MACRO(!rc, errcodeFromWinApiError(err), 0); - stat->modtime = FileTimeToPhysfsTime(&winstat.ftLastWriteTime); - stat->accesstime = FileTimeToPhysfsTime(&winstat.ftLastAccessTime); - stat->createtime = FileTimeToPhysfsTime(&winstat.ftCreationTime); + st->modtime = FileTimeToPhysfsTime(&winstat.ftLastWriteTime); + st->accesstime = FileTimeToPhysfsTime(&winstat.ftLastAccessTime); + st->createtime = FileTimeToPhysfsTime(&winstat.ftCreationTime); if(winstat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - stat->filetype = PHYSFS_FILETYPE_DIRECTORY; - stat->filesize = 0; + st->filetype = PHYSFS_FILETYPE_DIRECTORY; + st->filesize = 0; } /* if */ else if(winstat.dwFileAttributes & (FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_DEVICE)) { /* !!! FIXME: what are reparse points? */ - stat->filetype = PHYSFS_FILETYPE_OTHER; + st->filetype = PHYSFS_FILETYPE_OTHER; /* !!! FIXME: don't rely on this */ - stat->filesize = 0; + st->filesize = 0; } /* else if */ /* !!! FIXME: check for symlinks on Vista. */ else { - stat->filetype = PHYSFS_FILETYPE_REGULAR; - stat->filesize = (((PHYSFS_uint64) winstat.nFileSizeHigh) << 32) | winstat.nFileSizeLow; + st->filetype = PHYSFS_FILETYPE_REGULAR; + st->filesize = (((PHYSFS_uint64) winstat.nFileSizeHigh) << 32) | winstat.nFileSizeLow; } /* else */ - stat->readonly = ((winstat.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0); + st->readonly = ((winstat.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0); return 1; } /* __PHYSFS_platformStat */ @@ -930,6 +919,7 @@ } /* __PHYSFS_platformSetDefaultAllocator */ #endif /* PHYSFS_PLATFORM_WINDOWS */ +#endif /* PHYSFS_PLATFORM_WINRT */ /* end of windows.c ... */ diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphysfs/platform_winrt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc/libphysfs/platform_winrt.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,676 @@ +/* +* Windows Runtime support routines for PhysicsFS. +* +* Please see the file LICENSE.txt in the source's root directory. +* +* This file is based on "platform_windows.c" by Ryan C. Gordon and Gregory S. Read. +* Windows Runtime-specific additions and changes are made by Martin "T-Bone" Ahrnbom. +* +* Instructions for setting up PhysFS in a WinRT Universal 8.1 app in Visual Studio 2013: +* (hopefully these instructions will be somewhat valid with Windows 10 Apps as well...) +* +* 1. In Visual Studio 2013 (or later?), hit File -> New -> Project... +* 2. On the left, navigate to Templates -> Visual C++ -> Store Apps -> Universal Apps +* 3. In the middle of the window, select "DLL (Universal Apps)" +* 4. Near the bottom, give the project a name (like PhysFS-WinRT) and choose a location +* 5. In the Solution Explorer (to the right typically), delete all .cpp and .h files in +* PhysFS-WinRT.Shared except targetver.h. +* 6. In Windows Explorer, find the "src" folder of the PhysFS source code. Select all files +* in the folder (ignore the "lzma" folder, we're not including 7Zip support because it's messy to compile). +* Drag and drop all of the source files onto PhysFS-WinRT-Shared in Visual Studio. +* 7. In Windows Explorer, find the file called "physfs.h". Copy this file into a folder of its own somewhere. +* I suggest naming that folder "include". This will be your "include" folder for any projects using PhysFS. +* 8. In the Solution Explorer, right click on PhysFS-WinRT.Windows and select Properties. Make sure that "Configuration" is set to +* "All Configurations" and "Platform" is set to "All Platforms" near the top of the window. +* 9. On the left, select "Precompiled Headers". Change "Precompiled Header" from "Use (/Yu)" to "Not Using Precompiled Headers". +* 10. On the left, navigate to Configuration Properties -> C/C++ -> Preprocessor. In Preprocessor Definitions, add "_CRT_SECURE_NO_WARNINGS" +* 11. Hit the OK button. +* 12. Repeat steps 8-11 but for PhysFS-WinRT.WindowsPhone. +* 13. In the Solution Explorer, find "platform_winrt.cpp" in PhysFS-WinRT.Shared. Right click on it and select "Properties". +* 14. On the left, navigate to Configuration Properties -> C/C++ -> General. On the right, change "Consume Windows Runtime Extensions" +* from "No" to "Yes (/ZW)". Hit "OK". +* 15. Near the top of the Visual Studio window, select BUILD -> Batch Build... Hit "Select All", and then "Build". +* 16. Now you have a bunch of .dll and .lib files, as well as an include folder that you can use in your projects! +* 17. ??? +* 18. Profit! +*/ + +/* !!! FIXME: remove the tabstops from this file. */ +/* !!! FIXME: maybe just merge this back into platform_windows.c? */ + +#define __PHYSICSFS_INTERNAL__ +#include "physfs_platforms.h" + +#ifdef PHYSFS_PLATFORM_WINRT + +#include "physfs_internal.h" + +#include +#include +#include +#include + +#define LOWORDER_UINT64(pos) ((PHYSFS_uint32) (pos & 0xFFFFFFFF)) +#define HIGHORDER_UINT64(pos) ((PHYSFS_uint32) ((pos >> 32) & 0xFFFFFFFF)) + + +/* +* Users without the platform SDK don't have this defined. The original docs +* for SetFilePointer() just said to compare with 0xFFFFFFFF, so this should +* work as desired. +*/ +#define PHYSFS_INVALID_SET_FILE_POINTER 0xFFFFFFFF + +/* just in case... */ +#define PHYSFS_INVALID_FILE_ATTRIBUTES 0xFFFFFFFF + +/* Not defined before the Vista SDK. */ +#define PHYSFS_IO_REPARSE_TAG_SYMLINK 0xA000000C + + +#define UTF8_TO_UNICODE_STACK_MACRO(w_assignto, str) { \ + if (str == NULL) \ + w_assignto = NULL; \ + else { \ + const PHYSFS_uint64 len = (PHYSFS_uint64) ((strlen(str) + 1) * 2); \ + w_assignto = (WCHAR *) __PHYSFS_smallAlloc(len); \ + if (w_assignto != NULL) \ + PHYSFS_utf8ToUtf16(str, (PHYSFS_uint16 *) w_assignto, len); \ + } \ +} \ + +/* Note this counts WCHARs, not codepoints! */ +static PHYSFS_uint64 wStrLen(const WCHAR *wstr) +{ + PHYSFS_uint64 len = 0; + while (*(wstr++)) + len++; + return len; +} /* wStrLen */ + +/* !!! FIXME: do we really need readonly? If not, do we need this struct? */ +typedef struct +{ + HANDLE handle; + int readonly; +} WinApiFile; + +static HANDLE detectCDThreadHandle = NULL; +static HWND detectCDHwnd = 0; +static volatile int initialDiscDetectionComplete = 0; +static volatile DWORD drivesWithMediaBitmap = 0; + + +static PHYSFS_ErrorCode errcodeFromWinApiError(const DWORD err) +{ + /* + * win32 error codes are sort of a tricky thing; Microsoft intentionally + * doesn't list which ones a given API might trigger, there are several + * with overlapping and unclear meanings...and there's 16 thousand of + * them in Windows 7. It looks like the ones we care about are in the + * first 500, but I can't say this list is perfect; we might miss + * important values or misinterpret others. + * + * Don't treat this list as anything other than a work in progress. + */ + switch (err) + { + case ERROR_SUCCESS: return PHYSFS_ERR_OK; + case ERROR_ACCESS_DENIED: return PHYSFS_ERR_PERMISSION; + case ERROR_NETWORK_ACCESS_DENIED: return PHYSFS_ERR_PERMISSION; + case ERROR_NOT_READY: return PHYSFS_ERR_IO; + case ERROR_CRC: return PHYSFS_ERR_IO; + case ERROR_SEEK: return PHYSFS_ERR_IO; + case ERROR_SECTOR_NOT_FOUND: return PHYSFS_ERR_IO; + case ERROR_NOT_DOS_DISK: return PHYSFS_ERR_IO; + case ERROR_WRITE_FAULT: return PHYSFS_ERR_IO; + case ERROR_READ_FAULT: return PHYSFS_ERR_IO; + case ERROR_DEV_NOT_EXIST: return PHYSFS_ERR_IO; + /* !!! FIXME: ?? case ELOOP: return PHYSFS_ERR_SYMLINK_LOOP; */ + case ERROR_BUFFER_OVERFLOW: return PHYSFS_ERR_BAD_FILENAME; + case ERROR_INVALID_NAME: return PHYSFS_ERR_BAD_FILENAME; + case ERROR_BAD_PATHNAME: return PHYSFS_ERR_BAD_FILENAME; + case ERROR_DIRECTORY: return PHYSFS_ERR_BAD_FILENAME; + case ERROR_FILE_NOT_FOUND: return PHYSFS_ERR_NOT_FOUND; + case ERROR_PATH_NOT_FOUND: return PHYSFS_ERR_NOT_FOUND; + case ERROR_DELETE_PENDING: return PHYSFS_ERR_NOT_FOUND; + case ERROR_INVALID_DRIVE: return PHYSFS_ERR_NOT_FOUND; + case ERROR_HANDLE_DISK_FULL: return PHYSFS_ERR_NO_SPACE; + case ERROR_DISK_FULL: return PHYSFS_ERR_NO_SPACE; + /* !!! FIXME: ?? case ENOTDIR: return PHYSFS_ERR_NOT_FOUND; */ + /* !!! FIXME: ?? case EISDIR: return PHYSFS_ERR_NOT_A_FILE; */ + case ERROR_WRITE_PROTECT: return PHYSFS_ERR_READ_ONLY; + case ERROR_LOCK_VIOLATION: return PHYSFS_ERR_BUSY; + case ERROR_SHARING_VIOLATION: return PHYSFS_ERR_BUSY; + case ERROR_CURRENT_DIRECTORY: return PHYSFS_ERR_BUSY; + case ERROR_DRIVE_LOCKED: return PHYSFS_ERR_BUSY; + case ERROR_PATH_BUSY: return PHYSFS_ERR_BUSY; + case ERROR_BUSY: return PHYSFS_ERR_BUSY; + case ERROR_NOT_ENOUGH_MEMORY: return PHYSFS_ERR_OUT_OF_MEMORY; + case ERROR_OUTOFMEMORY: return PHYSFS_ERR_OUT_OF_MEMORY; + case ERROR_DIR_NOT_EMPTY: return PHYSFS_ERR_DIR_NOT_EMPTY; + default: return PHYSFS_ERR_OS_ERROR; + } /* switch */ +} /* errcodeFromWinApiError */ + +static inline PHYSFS_ErrorCode errcodeFromWinApi(void) +{ + return errcodeFromWinApiError(GetLastError()); +} /* errcodeFromWinApi */ + + +typedef BOOL(WINAPI *fnSTEM)(DWORD, LPDWORD b); + +static DWORD pollDiscDrives(void) +{ + // We don't do discs + return 0; +} /* pollDiscDrives */ + + +static LRESULT CALLBACK detectCDWndProc(HWND hwnd, UINT msg, + WPARAM wp, LPARAM lparam) +{ + return FALSE; +} /* detectCDWndProc */ + + +static DWORD WINAPI detectCDThread(LPVOID lpParameter) +{ + return 0; +} /* detectCDThread */ + + +void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data) +{ + return; +} /* __PHYSFS_platformDetectAvailableCDs */ + + +static char *unicodeToUtf8Heap(const WCHAR *w_str) +{ + char *retval = NULL; + if (w_str != NULL) + { + void *ptr = NULL; + const PHYSFS_uint64 len = (wStrLen(w_str) * 4) + 1; + retval = (char*)allocator.Malloc(len); + BAIL_IF_MACRO(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL); + PHYSFS_utf8FromUtf16((const PHYSFS_uint16 *)w_str, retval, len); + ptr = allocator.Realloc(retval, strlen(retval) + 1); /* shrink. */ + if (ptr != NULL) + retval = (char *)ptr; + } /* if */ + return retval; +} /* unicodeToUtf8Heap */ + +char *__PHYSFS_platformCalcBaseDir(const char *argv0) +{ + const wchar_t* path = Windows::ApplicationModel::Package::Current->InstalledLocation->Path->Data(); + wchar_t path2[1024]; + wcscpy_s(path2, path); + wcscat_s(path2, L"\\"); + return unicodeToUtf8Heap(path2); + +} /* __PHYSFS_platformCalcBaseDir */ + + +char *__PHYSFS_platformCalcPrefDir(const char *org, const char *app) +{ + const wchar_t* path = Windows::Storage::ApplicationData::Current->LocalFolder->Path->Data(); + wchar_t path2[1024]; + wcscpy_s(path2, path); + wcscat_s(path2, L"\\"); + return unicodeToUtf8Heap(path2); +} /* __PHYSFS_platformCalcPrefDir */ + + +char *__PHYSFS_platformCalcUserDir(void) +{ + return __PHYSFS_platformCalcPrefDir(NULL, NULL); +} /* __PHYSFS_platformCalcUserDir */ + + +void *__PHYSFS_platformGetThreadID(void) +{ + return ((void *)((size_t)GetCurrentThreadId())); +} /* __PHYSFS_platformGetThreadID */ + + +static int isSymlinkAttrs(const DWORD attr, const DWORD tag) +{ + return ((attr & FILE_ATTRIBUTE_REPARSE_POINT) && + (tag == PHYSFS_IO_REPARSE_TAG_SYMLINK)); +} /* isSymlinkAttrs */ + + +void __PHYSFS_platformEnumerateFiles(const char *dirname, + PHYSFS_EnumFilesCallback callback, + const char *origdir, + void *callbackdata) +{ + + HANDLE dir = INVALID_HANDLE_VALUE; + WIN32_FIND_DATAW entw; + size_t len = strlen(dirname); + char *searchPath = NULL; + WCHAR *wSearchPath = NULL; + + /* Allocate a new string for path, maybe '\\', "*", and NULL terminator */ + searchPath = (char *)__PHYSFS_smallAlloc(len + 3); + if (searchPath == NULL) + return; + + /* Copy current dirname */ + strcpy(searchPath, dirname); + + /* if there's no '\\' at the end of the path, stick one in there. */ + if (searchPath[len - 1] != '\\') + { + searchPath[len++] = '\\'; + searchPath[len] = '\0'; + } /* if */ + + /* Append the "*" to the end of the string */ + strcat(searchPath, "*"); + + UTF8_TO_UNICODE_STACK_MACRO(wSearchPath, searchPath); + if (!wSearchPath) + return; /* oh well. */ + + //dir = FindFirstFileW(wSearchPath, &entw); + dir = FindFirstFileExW(wSearchPath, FindExInfoStandard, &entw, FindExSearchNameMatch, NULL, 0); + + __PHYSFS_smallFree(wSearchPath); + __PHYSFS_smallFree(searchPath); + if (dir == INVALID_HANDLE_VALUE) + return; + + do + { + const DWORD attr = entw.dwFileAttributes; + const DWORD tag = entw.dwReserved0; + const WCHAR *fn = entw.cFileName; + char *utf8; + + if ((fn[0] == '.') && (fn[1] == '\0')) + continue; + if ((fn[0] == '.') && (fn[1] == '.') && (fn[2] == '\0')) + continue; + + utf8 = unicodeToUtf8Heap(fn); + if (utf8 != NULL) + { + callback(callbackdata, origdir, utf8); + allocator.Free(utf8); + } /* if */ + } while (FindNextFileW(dir, &entw) != 0); + + FindClose(dir); +} /* __PHYSFS_platformEnumerateFiles */ + + +int __PHYSFS_platformMkDir(const char *path) +{ + WCHAR *wpath; + DWORD rc; + UTF8_TO_UNICODE_STACK_MACRO(wpath, path); + rc = CreateDirectoryW(wpath, NULL); + __PHYSFS_smallFree(wpath); + BAIL_IF_MACRO(rc == 0, errcodeFromWinApi(), 0); + return 1; +} /* __PHYSFS_platformMkDir */ + + +int __PHYSFS_platformInit(void) +{ + return 1; /* It's all good */ +} /* __PHYSFS_platformInit */ + + +int __PHYSFS_platformDeinit(void) +{ + return 1; /* It's all good */ +} /* __PHYSFS_platformDeinit */ + + +static void *doOpen(const char *fname, DWORD mode, DWORD creation, int rdonly) +{ + HANDLE fileh; + WinApiFile *retval; + WCHAR *wfname; + + UTF8_TO_UNICODE_STACK_MACRO(wfname, fname); + BAIL_IF_MACRO(!wfname, PHYSFS_ERR_OUT_OF_MEMORY, NULL); + //fileh = CreateFileW(wfname, mode, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, creation, FILE_ATTRIBUTE_NORMAL, NULL); + fileh = CreateFile2(wfname, mode, FILE_SHARE_READ | FILE_SHARE_WRITE, creation, NULL); + __PHYSFS_smallFree(wfname); + + BAIL_IF_MACRO(fileh == INVALID_HANDLE_VALUE, errcodeFromWinApi(), NULL); + + retval = (WinApiFile *)allocator.Malloc(sizeof(WinApiFile)); + if (!retval) + { + CloseHandle(fileh); + BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL); + } /* if */ + + retval->readonly = rdonly; + retval->handle = fileh; + return retval; +} /* doOpen */ + + +void *__PHYSFS_platformOpenRead(const char *filename) +{ + return doOpen(filename, GENERIC_READ, OPEN_EXISTING, 1); +} /* __PHYSFS_platformOpenRead */ + + +void *__PHYSFS_platformOpenWrite(const char *filename) +{ + return doOpen(filename, GENERIC_WRITE, CREATE_ALWAYS, 0); +} /* __PHYSFS_platformOpenWrite */ + + +void *__PHYSFS_platformOpenAppend(const char *filename) +{ + void *retval = doOpen(filename, GENERIC_WRITE, OPEN_ALWAYS, 0); + if (retval != NULL) + { + HANDLE h = ((WinApiFile *)retval)->handle; + //DWORD rc = SetFilePointer(h, 0, NULL, FILE_END); + const LARGE_INTEGER zero = { 0 }; + DWORD rc = SetFilePointerEx(h, zero, NULL, FILE_END); + if (rc == PHYSFS_INVALID_SET_FILE_POINTER) + { + const PHYSFS_ErrorCode err = errcodeFromWinApi(); + CloseHandle(h); + allocator.Free(retval); + BAIL_MACRO(err, NULL); + } /* if */ + } /* if */ + + return retval; +} /* __PHYSFS_platformOpenAppend */ + + +PHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buf, PHYSFS_uint64 len) +{ + HANDLE Handle = ((WinApiFile *)opaque)->handle; + PHYSFS_sint64 totalRead = 0; + + if (!__PHYSFS_ui64FitsAddressSpace(len)) + BAIL_MACRO(PHYSFS_ERR_INVALID_ARGUMENT, -1); + + while (len > 0) + { + const DWORD thislen = (len > 0xFFFFFFFF) ? 0xFFFFFFFF : (DWORD)len; + DWORD numRead = 0; + if (!ReadFile(Handle, buf, thislen, &numRead, NULL)) + BAIL_MACRO(errcodeFromWinApi(), -1); + len -= (PHYSFS_uint64)numRead; + totalRead += (PHYSFS_sint64)numRead; + if (numRead != thislen) + break; + } /* while */ + + return totalRead; +} /* __PHYSFS_platformRead */ + + +PHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer, + PHYSFS_uint64 len) +{ + HANDLE Handle = ((WinApiFile *)opaque)->handle; + PHYSFS_sint64 totalWritten = 0; + + if (!__PHYSFS_ui64FitsAddressSpace(len)) + BAIL_MACRO(PHYSFS_ERR_INVALID_ARGUMENT, -1); + + while (len > 0) + { + const DWORD thislen = (len > 0xFFFFFFFF) ? 0xFFFFFFFF : (DWORD)len; + DWORD numWritten = 0; + if (!WriteFile(Handle, buffer, thislen, &numWritten, NULL)) + BAIL_MACRO(errcodeFromWinApi(), -1); + len -= (PHYSFS_uint64)numWritten; + totalWritten += (PHYSFS_sint64)numWritten; + if (numWritten != thislen) + break; + } /* while */ + + return totalWritten; +} /* __PHYSFS_platformWrite */ + + +int __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos) +{ + HANDLE Handle = ((WinApiFile *)opaque)->handle; + BOOL rc; + + LARGE_INTEGER li; + li.LowPart = LOWORDER_UINT64(pos); + li.HighPart = HIGHORDER_UINT64(pos); + + rc = SetFilePointerEx(Handle, li, NULL, FILE_BEGIN); + + if (!rc && (GetLastError() != NO_ERROR)) + { + BAIL_MACRO(errcodeFromWinApi(), 0); + } /* if */ + + return 1; /* No error occured */ +} /* __PHYSFS_platformSeek */ + + +PHYSFS_sint64 __PHYSFS_platformTell(void *opaque) +{ + HANDLE Handle = ((WinApiFile *)opaque)->handle; + PHYSFS_sint64 retval; + BOOL rc; + + LARGE_INTEGER zero; + zero.QuadPart = 0; + LARGE_INTEGER out; + + rc = SetFilePointerEx(Handle, zero, &out, FILE_CURRENT); + if (!rc) + { + BAIL_MACRO(errcodeFromWinApi(), -1); + } /* if */ + else + { + retval = out.QuadPart; + assert(retval >= 0); + } /* else */ + + return retval; +} /* __PHYSFS_platformTell */ + + +PHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque) +{ + HANDLE Handle = ((WinApiFile *)opaque)->handle; + PHYSFS_sint64 retval; + + FILE_STANDARD_INFO file_info = { 0 }; + const BOOL res = GetFileInformationByHandleEx(Handle, FileStandardInfo, &file_info, sizeof(file_info)); + if (res) { + retval = file_info.EndOfFile.QuadPart; + assert(retval >= 0); + } + else { + PHYSFS_setErrorCode(PHYSFS_ERR_NOT_FOUND); + } + + + return retval; +} /* __PHYSFS_platformFileLength */ + + +int __PHYSFS_platformFlush(void *opaque) +{ + WinApiFile *fh = ((WinApiFile *)opaque); + if (!fh->readonly) + BAIL_IF_MACRO(!FlushFileBuffers(fh->handle), errcodeFromWinApi(), 0); + + return 1; +} /* __PHYSFS_platformFlush */ + + +void __PHYSFS_platformClose(void *opaque) +{ + HANDLE Handle = ((WinApiFile *)opaque)->handle; + (void)CloseHandle(Handle); /* ignore errors. You should have flushed! */ + allocator.Free(opaque); +} /* __PHYSFS_platformClose */ + + +static int doPlatformDelete(LPWSTR wpath) +{ + //const int isdir = (GetFileAttributesW(wpath) & FILE_ATTRIBUTE_DIRECTORY); + int isdir = 0; + WIN32_FILE_ATTRIBUTE_DATA file_info; + const BOOL res = GetFileAttributesEx(wpath, GetFileExInfoStandard, &file_info); + if (res) { + isdir = (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); + } + + const BOOL rc = (isdir) ? RemoveDirectoryW(wpath) : DeleteFileW(wpath); + BAIL_IF_MACRO(!rc, errcodeFromWinApi(), 0); + return 1; /* if you made it here, it worked. */ +} /* doPlatformDelete */ + + +int __PHYSFS_platformDelete(const char *path) +{ + int retval = 0; + LPWSTR wpath = NULL; + UTF8_TO_UNICODE_STACK_MACRO(wpath, path); + BAIL_IF_MACRO(!wpath, PHYSFS_ERR_OUT_OF_MEMORY, 0); + retval = doPlatformDelete(wpath); + __PHYSFS_smallFree(wpath); + return retval; +} /* __PHYSFS_platformDelete */ + + +void *__PHYSFS_platformCreateMutex(void) +{ + LPCRITICAL_SECTION lpcs; + lpcs = (LPCRITICAL_SECTION)allocator.Malloc(sizeof(CRITICAL_SECTION)); + BAIL_IF_MACRO(!lpcs, PHYSFS_ERR_OUT_OF_MEMORY, NULL); + //InitializeCriticalSection(lpcs); + InitializeCriticalSectionEx(lpcs, 2000, 0); + return lpcs; +} /* __PHYSFS_platformCreateMutex */ + + +void __PHYSFS_platformDestroyMutex(void *mutex) +{ + DeleteCriticalSection((LPCRITICAL_SECTION)mutex); + allocator.Free(mutex); +} /* __PHYSFS_platformDestroyMutex */ + + +int __PHYSFS_platformGrabMutex(void *mutex) +{ + EnterCriticalSection((LPCRITICAL_SECTION)mutex); + return 1; +} /* __PHYSFS_platformGrabMutex */ + + +void __PHYSFS_platformReleaseMutex(void *mutex) +{ + LeaveCriticalSection((LPCRITICAL_SECTION)mutex); +} /* __PHYSFS_platformReleaseMutex */ + + +static PHYSFS_sint64 FileTimeToPhysfsTime(const FILETIME *ft) +{ + SYSTEMTIME st_utc; + SYSTEMTIME st_localtz; + TIME_ZONE_INFORMATION tzi; + DWORD tzid; + PHYSFS_sint64 retval; + struct tm tm; + BOOL rc; + + BAIL_IF_MACRO(!FileTimeToSystemTime(ft, &st_utc), errcodeFromWinApi(), -1); + tzid = GetTimeZoneInformation(&tzi); + BAIL_IF_MACRO(tzid == TIME_ZONE_ID_INVALID, errcodeFromWinApi(), -1); + rc = SystemTimeToTzSpecificLocalTime(&tzi, &st_utc, &st_localtz); + BAIL_IF_MACRO(!rc, errcodeFromWinApi(), -1); + + /* Convert to a format that mktime() can grok... */ + tm.tm_sec = st_localtz.wSecond; + tm.tm_min = st_localtz.wMinute; + tm.tm_hour = st_localtz.wHour; + tm.tm_mday = st_localtz.wDay; + tm.tm_mon = st_localtz.wMonth - 1; + tm.tm_year = st_localtz.wYear - 1900; + tm.tm_wday = -1 /*st_localtz.wDayOfWeek*/; + tm.tm_yday = -1; + tm.tm_isdst = -1; + + /* Convert to a format PhysicsFS can grok... */ + retval = (PHYSFS_sint64)mktime(&tm); + BAIL_IF_MACRO(retval == -1, PHYSFS_ERR_OS_ERROR, -1); + return retval; +} /* FileTimeToPhysfsTime */ + + +int __PHYSFS_platformStat(const char *filename, PHYSFS_Stat *st) +{ + WIN32_FILE_ATTRIBUTE_DATA winstat; + WCHAR *wstr = NULL; + DWORD err = 0; + BOOL rc = 0; + + UTF8_TO_UNICODE_STACK_MACRO(wstr, filename); + BAIL_IF_MACRO(!wstr, PHYSFS_ERR_OUT_OF_MEMORY, 0); + rc = GetFileAttributesExW(wstr, GetFileExInfoStandard, &winstat); + err = (!rc) ? GetLastError() : 0; + __PHYSFS_smallFree(wstr); + BAIL_IF_MACRO(!rc, errcodeFromWinApiError(err), 0); + + st->modtime = FileTimeToPhysfsTime(&winstat.ftLastWriteTime); + st->accesstime = FileTimeToPhysfsTime(&winstat.ftLastAccessTime); + st->createtime = FileTimeToPhysfsTime(&winstat.ftCreationTime); + + if (winstat.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + st->filetype = PHYSFS_FILETYPE_DIRECTORY; + st->filesize = 0; + } /* if */ + + else if (winstat.dwFileAttributes & (FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_DEVICE)) + { + /* !!! FIXME: what are reparse points? */ + st->filetype = PHYSFS_FILETYPE_OTHER; + /* !!! FIXME: don't rely on this */ + st->filesize = 0; + } /* else if */ + + /* !!! FIXME: check for symlinks on Vista. */ + + else + { + st->filetype = PHYSFS_FILETYPE_REGULAR; + st->filesize = (((PHYSFS_uint64)winstat.nFileSizeHigh) << 32) | winstat.nFileSizeLow; + } /* else */ + + st->readonly = ((winstat.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0); + + return 1; +} /* __PHYSFS_platformStat */ + + +/* !!! FIXME: Don't use C runtime for allocators? */ +int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a) +{ + return 0; /* just use malloc() and friends. */ +} /* __PHYSFS_platformSetDefaultAllocator */ + + +#endif /* PHYSFS_PLATFORM_WINRT */ \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/libphyslayer/CMakeLists.txt --- a/misc/libphyslayer/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/misc/libphyslayer/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -14,7 +14,9 @@ #compiles and links actual library add_library (physlayer ${PHYSLAYER_SRCS}) -#TODO: find good VERSION and SOVERSION values +set_target_properties(physlayer PROPERTIES + VERSION 1.0 + SOVERSION 1.0) target_link_libraries(physlayer ${SDL2_LIBRARY} lua physfs) install(TARGETS physlayer RUNTIME DESTINATION ${target_binary_install_dir} LIBRARY DESTINATION ${target_library_install_dir} diff -r 01f88c3b7b66 -r 1b2b84315d27 misc/loc_gen.txt --- a/misc/loc_gen.txt Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -# this is inefficient and clunky, but, figured it might as well be kept somewhere so people are aware of it -# Is how I'm currently updated the locale files. -# collect strings - run in Data -grep -F 'loc("' */*/*.lua | sed 's/")/")\n/g' | sed 's/.*loc("/loc("/;s/").*/")/' | grep loc | sort | uniq > loc.txt -# Update locale files - run in Locale -for i in *.lua;do cat ../loc.txt | while read f;do STR=$(echo "$f" | sed 's/loc("//;s/")\s*$//;s/"/\\"/g');MAPS=$(grep -F -l -- "loc(\"${STR}\")" ../*/*/*.lua ../*/*/*/*.lua | sed 's/.*\/\([^\/]*\)\/map.lua/\1/;s/.*Campaign\/\([^\/]*\)\//\1:/;s/.*\///;s/.lua//;s/ /_/g' | xargs | sed 's/ /, /g');C=$(echo $MAPS | sed 's/,/\n/' | wc -l);grep -Fq -- "[\"${STR}\"]" $i;if(($?));then if((C>0));then echo "-- [\"${STR}\"] = \"\", -- $MAPS" >> $i;else echo "-- [\"${STR}\"] = \"\"," >> $i;fi;fi;done;done -# sort - run in Locale -for i in *.lua;do rm temphead temptail templua;cat $i | grep -Ev "}|{" | grep -Ev "^[[:space:]]*$" | sort | uniq > templua;echo "locale = {" > temphead;echo " }" > temptail;cat temphead templua temptail > $i;done -# drop unused - run in Locale -cat stub.lua | grep '"] =' | while read f;do PHRASE=$(echo "$f" | sed 's/[^[]*\["//;s/"] =.*//;s/"/\\"/g');CNT=$(grep -Frc "loc(\"$PHRASE\")" ../*/*/*.lua ../*/*/*/*.lua | grep -v ":0" | wc -l);if(($CNT==0));then echo "|$PHRASE|";PHRASE=$(echo "$PHRASE" | sed 's/\\/\\\\/g;s/\[/\\[/g;s/\]/\\]/g;s/\//\\\//g');sed -i "s/.*\[\"$PHRASE\"\].*//" *.lua;fi;done diff -r 01f88c3b7b66 -r 1b2b84315d27 project_files/HedgewarsMobile/Info.plist --- a/project_files/HedgewarsMobile/Info.plist Thu Aug 11 23:05:14 2016 +0300 +++ b/project_files/HedgewarsMobile/Info.plist Sun Dec 17 00:09:24 2017 +0100 @@ -29,7 +29,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.0 + 2.1 CFBundleSignature ???? CFBundleVersion diff -r 01f88c3b7b66 -r 1b2b84315d27 project_files/hedgewars.kdevelop --- a/project_files/hedgewars.kdevelop Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,243 +0,0 @@ - - - - Igor Ulyanov - disinbox@gmail.com - 1 - KDevCustomProject - C++ - - kdevfilegroups - kdevdoxygen - kdevregexptest - kdevabbrev - kdevdistpart - kdevscripting - kdevfilter - kdevastyle - - hedgewars - . - false - - kdevsubversion - - - - - executable - / - bin/hedgewars - -style plastique - false - true - - - /usr/home/unC0Rr/Sources/Hedgewars/Hedgewars-FF/trunk - false - false - false - - - *.h - *.c - *.cc - *.cpp - *.c++ - CMakeLists.txt - *.pas - *.inc - *.dpr - *.hs - *.pro - Find*.cmake - *.cfg - - - - - - - make - - - - true - 4 - 0 - false - - - - default - - - - - - 0 - - - - default - - - - - - - - - - - - - - true - false - false - false - - - false - true - 10 - - - - - ada - ada_bugs_gcc - bash - bash_bugs - clanlib - fortran_bugs_gcc - gnome1 - gnustep - gtk - gtk_bugs - haskell - haskell_bugs_ghc - java_bugs_gcc - java_bugs_sun - kde2book - opengl - pascal_bugs_fp - php - php_bugs - perl - perl_bugs - python - python_bugs - qt-kdev3 - ruby - ruby_bugs - sdl - sw - w3c-dom-level2-html - w3c-svg - w3c-uaag10 - wxwidgets_bugs - - - Guide to the Qt Translation Tools - Qt Assistant Manual - Qt Designer Manual - Qt Reference Documentation - qmake User Guide - - - KDE Libraries (Doxygen) - - - - - - - - - - - - - true - 4 - 4 - /usr/qt/3 - EmbeddedKDevDesigner - /usr/local/bin/qmake-qt4 - /usr/local/bin/designer-qt4 - - - - - true - true - true - 250 - 400 - 250 - false - 0 - true - true - false - std=_GLIBCXX_STD;__gnu_cxx=std - true - false - false - false - false - true - true - false - .; - true - true - true - false - - - - set - m_,_ - theValue - true - true - - - false - true - Vertical - - - - - false - false - - - - true - false - - - - - .h - .cpp - - - - - - - - - - - - /usr/home/unC0Rr/Sources/Hedgewars/Hedgewars-GNA/tags - - - diff -r 01f88c3b7b66 -r 1b2b84315d27 project_files/hedgewars.pro --- a/project_files/hedgewars.pro Thu Aug 11 23:05:14 2016 +0300 +++ b/project_files/hedgewars.pro Sun Dec 17 00:09:24 2017 +0100 @@ -117,6 +117,7 @@ ../QTfrontend/servermessages.h \ ../QTfrontend/ui/widget/roomnameprompt.h \ ../QTfrontend/weapons.h \ + ../QTfrontend/ui/widget/MinesTimeSpinBox.h \ ../QTfrontend/net/hwmapoptimizer.h @@ -216,6 +217,7 @@ ../QTfrontend/ui/widget/feedbackdialog.cpp \ ../QTfrontend/ui/widget/lineeditcursor.cpp \ ../QTfrontend/ui/widget/roomnameprompt.cpp \ + ../QTfrontend/ui/widget/MinesTimeSpinBox.cpp \ ../QTfrontend/net/hwmapoptimizer.cpp @@ -271,7 +273,6 @@ win32 { RC_FILE = ../QTfrontend/hedgewars.rc - SOURCES += ../QTfrontend/util/platform/xfire.cpp ../QTfrontend/util/platform/xfiregameclient.cpp LIBS += -L../misc/winutils/lib INCLUDEPATH += ../misc/winutils/include } diff -r 01f88c3b7b66 -r 1b2b84315d27 project_files/hwc/CMakeLists.txt --- a/project_files/hwc/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/project_files/hwc/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -2,10 +2,10 @@ find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(SDL2 REQUIRED) -find_package(SDL2_mixer REQUIRED) -find_package(SDL2_net REQUIRED) -find_package(SDL2_image REQUIRED) -find_package(SDL2_ttf REQUIRED) +find_package(SDL2_mixer 2 REQUIRED) +find_package(SDL2_net 2 REQUIRED) +find_package(SDL2_image 2 REQUIRED) +find_package(SDL2_ttf 2 REQUIRED) #compile our rtl implementation include_directories(${GLEW_INCLUDE_DIR}) @@ -13,7 +13,7 @@ include_directories(${PHYSFS_INCLUDE_DIR}) include_directories(${PHYSLAYER_INCLUDE_DIR}) include_directories(${LUA_INCLUDE_DIR}) -include_directories(${SDL2_INCLUDE_DIR}) +include_directories(${SDL2_INCLUDE_DIRS}) add_subdirectory(rtl) # convert list into pascal array @@ -103,10 +103,10 @@ ${LUA_LIBRARY} ${OPENGL_LIBRARY} ${SDL2_LIBRARY} - ${SDL2_MIXER_LIBRARY} - ${SDL2_NET_LIBRARY} - ${SDL2_IMAGE_LIBRARY} - ${SDL2_TTF_LIBRARY} + ${SDL2_MIXER_LIBRARIES} + ${SDL2_NET_LIBRARIES} + ${SDL2_IMAGE_LIBRARIES} + ${SDL2_TTF_LIBRARIES} ${GLEW_LIBRARY} physfs physlayer diff -r 01f88c3b7b66 -r 1b2b84315d27 project_files/hwc/rtl/pas2c.h --- a/project_files/hwc/rtl/pas2c.h Thu Aug 11 23:05:14 2016 +0300 +++ b/project_files/hwc/rtl/pas2c.h Sun Dec 17 00:09:24 2017 +0100 @@ -65,7 +65,7 @@ typedef wchar_t widechar; typedef wchar_t* PWideChar; typedef char Char; -typedef LongInt SizeInt; +typedef PtrInt SizeInt; typedef char ** PPChar; typedef Word* PWord; diff -r 01f88c3b7b66 -r 1b2b84315d27 qmlFrontend/hwengine.cpp --- a/qmlFrontend/hwengine.cpp Thu Aug 11 23:05:14 2016 +0300 +++ b/qmlFrontend/hwengine.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -97,7 +97,7 @@ flibJoinRoom = (joinRoom_t*) hwlib.resolve("joinRoom"); flibPartRoom = (partRoom_t*) hwlib.resolve("partRoom"); - flibInit("/usr/home/unC0Rr/Sources/Hedgewars/Hedgewars-GC/share/hedgewars/Data", "/usr/home/unC0Rr/.hedgewars"); + flibInit("/usr/home/unC0Rr/Sources/Hedgewars/MainRepo/share/hedgewars/Data", "/usr/home/unC0Rr/.hedgewars"); flibRegisterUIMessagesCallback(this, &guiMessagesCallback); ThemeIconProvider * themeIcon = (ThemeIconProvider *)m_engine->imageProvider(QLatin1String("theme")); diff -r 01f88c3b7b66 -r 1b2b84315d27 qmlfrontend/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 2.8.12) + +project(qmlfrontend LANGUAGES CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(Qt5 COMPONENTS Core Quick REQUIRED) + +add_executable(${PROJECT_NAME} "main.cpp" "qml.qrc") + +target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Quick) diff -r 01f88c3b7b66 -r 1b2b84315d27 qmlfrontend/Page1.qml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/Page1.qml Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,7 @@ +import QtQuick 2.7 + +Page1Form { + button1.onClicked: { + console.log("Button Pressed. Entered text: " + textField1.text); + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 qmlfrontend/Page1Form.ui.qml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/Page1Form.ui.qml Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,24 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Layouts 1.3 + +Item { + property alias textField1: textField1 + property alias button1: button1 + + RowLayout { + anchors.horizontalCenter: parent.horizontalCenter + anchors.topMargin: 20 + anchors.top: parent.top + + TextField { + id: textField1 + placeholderText: qsTr("Text Field") + } + + Button { + id: button1 + text: qsTr("Press Me") + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 qmlfrontend/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/main.cpp Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,15 @@ +#include +#include + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + engine.load(QUrl(QLatin1String("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()) + return -1; + + return app.exec(); +} diff -r 01f88c3b7b66 -r 1b2b84315d27 qmlfrontend/main.qml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/main.qml Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,37 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Layouts 1.3 + +ApplicationWindow { + visible: true + width: 640 + height: 480 + title: qsTr("Hello World") + + SwipeView { + id: swipeView + anchors.fill: parent + currentIndex: tabBar.currentIndex + + Page1 { + } + + Page { + Label { + text: qsTr("Second page") + anchors.centerIn: parent + } + } + } + + footer: TabBar { + id: tabBar + currentIndex: swipeView.currentIndex + TabButton { + text: qsTr("First") + } + TabButton { + text: qsTr("Second") + } + } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 qmlfrontend/qml.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/qml.qrc Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,9 @@ + + + + main.qml + Page1.qml + Page1Form.ui.qml + qtquickcontrols2.conf + + diff -r 01f88c3b7b66 -r 1b2b84315d27 qmlfrontend/qtquickcontrols2.conf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/qtquickcontrols2.conf Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,15 @@ +; This file can be edited to change the style of the application +; See Styling Qt Quick Controls 2 in the documentation for details: +; http://doc.qt.io/qt-5/qtquickcontrols2-styles.html + +[Controls] +Style=Default + +[Universal] +Theme=Light +;Accent=Steel + +[Material] +Theme=Light +;Accent=BlueGrey +;Primary=BlueGray diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars.appdata.xml --- a/share/hedgewars.appdata.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars.appdata.xml Sun Dec 17 00:09:24 2017 +0100 @@ -1,32 +1,93 @@ - - hedgewars.desktop - GFDL + + hedgewars.desktop + GFDL-1.2 + GPL-2.0 Hedgewars Funny turn-based artillery game, featuring fighting Hedgehogs! + Lustiges zugbasiertes Artilleriespiel mit kämpfenden Igeln!

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.

+

+ Hedgewars ist ein lustiges zugbasiertes Strategie- und Artilleriespiel mit grotesken und launischen rosa Igeln, die sich von den Untiefen der Hölle bis zu den Tiefen des Weltraums gegenseitig bekämpfen.

As commander, it's your job to assemble your crack team of hedgehog soldiers and bring the war to your enemy.

-

Game Features:

+

+ Als Kommandant ist es deine Aufgabe, deine Topmannschaft aus Igelsoldaten aufzustellen und in den Krieg gegen deinen Feind zu führen. +

+

Game features:

+

Spiel-Features:

  • Hilarious and strategic turn based combat for up to 8 players
  • -
  • Both local and network multiplayer, with optional AI opponentsBattle on an infinite number of randomly generated maps, with over 22 environments
  • +
  • Absurder und strategischer zugbasierter Kampf mit bis zu 8 Spielern
  • +
  • Both local and network multiplayer, with optional AI opponents
  • +
  • Mehrspielermodus sowohl lokal als auch über das Netzwerk, mit optionalen KI-Gegnern
  • +
  • Battle on an infinite number of randomly generated maps, with over 22 environments
  • +
  • Kämpfe auf einer unendlichen Anzahl auf zufällig erstellten Landschaften mit über 22 Szenerien
  • Utilise 47 (and counting) devastating weapons!
  • +
  • Benutze 47 zerstörerische Waffen – und es werden ständig mehr
  • Including the piano strike and explosive robotic cake
  • +
  • Darunter auch der Pianoangriff und ein explosiver robotischer Kuchen
  • Play the game your way, with 18 different game modifiers, tweak almost every aspect of the match
  • +
  • Spiel das Spiel wie du magst, mit 18 verschiedenen Spielmodifikatoren; du kannst fast jeden Aspekt des Spiels anpassen
  • Customize your team, with over 120 costumes, 30 graves, 12 forts, 100s of flags and unique voice packs
  • +
  • Gestalte dein Team mit über 120 Kostümen, 30 Gräbern, 12 Festungen, hunderten Flaggen und einzigartigen Stimmen
  • Huge battles with up to 48 hogs
  • +
  • Riesige Schlachten mit bis zu 48 Igeln
  • Play both singleplayer and multiplayer minigames
  • +
  • Spiele Minispiele im Einzel- und Mehrspielermodus
  • Plugin your own custom maps, costumes, and other artwork
  • +
  • Baue benutzerestellte Karten, Kostüme und andere Werke ein
+ + hedgewars + hedgewars-server + hwengine + - http://www.hedgewars.org/files/9rzprpb.png + + A classic Hedgewars match + Eine klassische Runde Hedgewars + http://hedgewars.org/images/screenshots/0_9_19-Snow_Dynamite.png + + + Throwing the dangerous hellish hand-grenade + Die gefährliche höllische Handgranate wird geworfen + http://hedgewars.org/images/screenshots/0_9_19-Hell_HellishHandgrenade.png + + + The awesome shoryuken attack + Der großartige Shoryuken-Angriff + http://hedgewars.org/images/screenshots/0_9_19-Trash_Shoryuken.png + + + Kamikaze attack + Kamikaze-Angriff + http://hedgewars.org/images/screenshots/0_9_19-Fruit_Kamikaze.png + + + Hedgehog using a sniper rifle + Igel, der ein Scharfschützengewehr benutzt + http://hedgewars.org/images/screenshots/0_9_19-EarthRise_Sniper.png + + + 2nd mission in the campaign “A Classic Fairytale” + 2. Mission in der Kampagne „A Classic Fairytale” + http://hedgewars.org/images/screenshots/0_9_19-AFT02.png + + + 9th mission in the campaign “A Classic Fairytale” + 9. Mission in der Kampagne „A Classic Fairytale” + http://hedgewars.org/images/screenshots/0_9_19-AFT09.png + http://hedgewars.org/ - hedgewars-dev@gna.org -
+ http://hedgewars.org/bugs + http://hedgewars.org/faq + http://hedgewars.org/wiki.html + Hedgewars Project + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/EvilChicken-icon@2x.png Binary file share/hedgewars/Data/Forts/EvilChicken-icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Lonely_Island-icon.png Binary file share/hedgewars/Data/Forts/Lonely_Island-icon.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Lonely_Island-icon@2x.png Binary file share/hedgewars/Data/Forts/Lonely_Island-icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Lonely_Island-preview.png Binary file share/hedgewars/Data/Forts/Lonely_Island-preview.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Lonely_Island-preview@2x.png Binary file share/hedgewars/Data/Forts/Lonely_Island-preview@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Lonely_IslandL.png Binary file share/hedgewars/Data/Forts/Lonely_IslandL.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Lonely_IslandL.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Forts/Lonely_IslandL.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,716 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Octopus-icon.png Binary file share/hedgewars/Data/Forts/Octopus-icon.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Octopus-icon@2x.png Binary file share/hedgewars/Data/Forts/Octopus-icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Octopus-preview.png Binary file share/hedgewars/Data/Forts/Octopus-preview.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Octopus-preview@2x.png Binary file share/hedgewars/Data/Forts/Octopus-preview@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/OctopusL.png Binary file share/hedgewars/Data/Forts/OctopusL.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/OlympicL-icon.png Binary file share/hedgewars/Data/Forts/OlympicL-icon.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/OlympicL-icon@2x.png Binary file share/hedgewars/Data/Forts/OlympicL-icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/OlympicL-preview.png Binary file share/hedgewars/Data/Forts/OlympicL-preview.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/OlympicL-preview@2x.png Binary file share/hedgewars/Data/Forts/OlympicL-preview@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/OlympicL.png Binary file share/hedgewars/Data/Forts/OlympicL.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Snail-icon.png Binary file share/hedgewars/Data/Forts/Snail-icon.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Snail-icon@2x.png Binary file share/hedgewars/Data/Forts/Snail-icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Snail-preview.png Binary file share/hedgewars/Data/Forts/Snail-preview.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Snail-preview@2x.png Binary file share/hedgewars/Data/Forts/Snail-preview@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/SnailL.png Binary file share/hedgewars/Data/Forts/SnailL.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/SnailL.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Forts/SnailL.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,141 @@ + + + Snail + + + + + image/svg+xml + + Snail + + + Carlos Vives B. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Tank-icon@2x.png Binary file share/hedgewars/Data/Forts/Tank-icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Forts/Wood-icon@2x.png Binary file share/hedgewars/Data/Forts/Wood-icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/AmmoMenu/Ammos_base.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_base.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw_base.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw_base.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/BigDigitsGray.png Binary file share/hedgewars/Data/Graphics/BigDigitsGray.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/BigDigitsGreen.png Binary file share/hedgewars/Data/Graphics/BigDigitsGreen.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/BigDigitsRed.png Binary file share/hedgewars/Data/Graphics/BigDigitsRed.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Duck.png Binary file share/hedgewars/Data/Graphics/Duck.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Egg@2x.png Binary file share/hedgewars/Data/Graphics/Egg@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Flags/armenia.png Binary file share/hedgewars/Data/Graphics/Flags/armenia.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Flags/cm_pentagram.png Binary file share/hedgewars/Data/Graphics/Flags/cm_pentagram.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Flags/cm_soviet.png Binary file share/hedgewars/Data/Graphics/Flags/cm_soviet.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Flags/ireland.png Binary file share/hedgewars/Data/Graphics/Flags/ireland.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Flags/nepal.png Binary file share/hedgewars/Data/Graphics/Flags/nepal.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Flags/suisse.png Binary file share/hedgewars/Data/Graphics/Flags/suisse.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Flags/sweden.png Binary file share/hedgewars/Data/Graphics/Flags/sweden.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Flags/turkey.png Binary file share/hedgewars/Data/Graphics/Flags/turkey.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/Clover.png Binary file share/hedgewars/Data/Graphics/Graves/Clover.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/Clover.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Graves/Clover.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,106 @@ + + + + + + + + image/svg+xml + + + + + Openclipart + + + + 2012-02-07T20:19:10 + + https://openclipart.org/detail/167946/clover-ns-by-rduris + + + rduris + + + + + clover + shamrock + Irish + culture + Saint + Patrick's + Day + + + + + + + + + + + + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/Old_Apple.png Binary file share/hedgewars/Data/Graphics/Graves/Old_Apple.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/Simple_reversed.png Binary file share/hedgewars/Data/Graphics/Graves/Simple_reversed.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/TV.png Binary file share/hedgewars/Data/Graphics/Graves/TV.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/TV.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Graves/TV.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + + 2010-04-08T16:06:09 + my second attempt to make a comic style television + https://openclipart.org/detail/39703/television-comic-style-by-rg1024 + + + rg1024 + + + + + cartoon + comic + home + seeing + television + tv + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/Whisky.png Binary file share/hedgewars/Data/Graphics/Graves/Whisky.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/Yin_and_Yang.png Binary file share/hedgewars/Data/Graphics/Graves/Yin_and_Yang.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/dragonball.png Binary file share/hedgewars/Data/Graphics/Graves/dragonball.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/dragonball.svg --- a/share/hedgewars/Data/Graphics/Graves/dragonball.svg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Graphics/Graves/dragonball.svg Sun Dec 17 00:09:24 2017 +0100 @@ -1,24 +1,14 @@ - - + id="svg2"> @@ -32,575 +22,257 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="defs6" /> + + + + + + - - - - + id="g3100-1-8-8" + transform="matrix(0.93736253,0,0,0.9365761,8.8221671,190.59287)"> + + + + + + - - + transform="translate(0,-0.12845148)" + id="g1029"> + + + + + + + style="opacity:0.41999996;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99943388" + d="M 5.6836552,53.146289 C 4.2589432,48.480078 5.5046229,45.056821 7.4091211,42.661326 9.4647968,40.07568 12.471852,38.296861 15.81428,38.384353 c 2.450138,-0.110946 5.479515,1.37327 5.479515,1.37327 -0.07867,0.785156 -6.131461,2.599917 -8.918199,5.650044 -2.282883,2.498653 -5.0634031,7.07438 -4.7376467,11.085477 -0.6808243,-0.873908 -1.46449,-2.10873 -1.9542941,-3.346855 z" + id="path4121-4" /> + + + + + + + + + style="opacity:0.41999996;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99943388" + d="m 5.9600395,85.426476 c -0.534346,-1.604711 -1.4829652,-6.081122 -0.4473416,-7.843575 1.0284618,-1.750264 1.8865283,-3.411022 2.8059905,-4.329713 1.0789052,-1.077999 3.8380566,-3.176387 9.4608276,-2.841141 1.806548,0.204334 4.4569,1.742382 4.4569,1.742382 -0.07867,0.785155 -5.182448,3.528295 -7.969185,6.578421 -2.144676,2.347381 -4.7235804,7.975447 -6.5020602,9.550105 C 7.3958379,87.800519 6.632036,87.112629 5.9600395,85.426476 Z" + id="path4121-4-6" /> - - + transform="translate(0,0.18104391)" + id="g1013"> + + + + + + - + style="opacity:0.41999996;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99943388" + d="m 6.1010952,117.46357 c 3.5754678,-9.00459 6.7147348,-11.88528 11.9153408,-14.67919 1.806549,-0.27457 4.361035,1.40714 4.361035,1.40714 -0.07867,0.78516 -4.173289,3.91201 -6.960025,6.96214 -2.707774,2.9637 -6.4108822,14.09243 -9.3163508,6.30991 z" + id="path4121-4-6-5" /> - - - + transform="translate(0,-0.29497309)" + id="g1005"> + + + + + + - - - - - - + style="opacity:0.41999996;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99943388" + d="m 8.0367666,152.79866 c 8.9438994,-4.69429 12.8021524,-14.71091 12.7301914,-16.83434 1.758617,0.25224 4.334952,3.82698 4.334952,3.82698 -0.07867,0.78516 -1.834815,6.44209 -4.621555,9.49221 -1.982876,2.17029 -5.268159,6.41296 -8.883736,5.89611 -1.321777,-0.18895 -2.1540142,-0.80696 -3.5598524,-2.38096 z" + id="path4121-4-6-5-9" /> - - + transform="translate(0,-0.11252809)" + id="g997"> + + + + + + - + style="opacity:0.41999996;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99943388" + d="m 10.442075,186.49927 c 3.222234,-1.69122 5.890114,-4.08657 7.894749,-6.55848 3.559593,-4.38933 5.17389,-9.02003 5.127855,-10.37845 1.423088,1.21008 2.906613,4.79844 2.906613,4.79844 0.395839,2.9525 0.53772,6.98391 -2.24902,10.03404 -2.059971,2.25467 -5.592096,3.90273 -9.357955,3.58328 -1.248785,-0.10594 -4.171059,-1.08482 -4.322242,-1.47883 z" + id="path4121-4-6-5-9-2" /> - - - - - - + transform="translate(0,-0.27570809)" + id="g989"> - + id="g3100-5-3" + transform="matrix(0.93736253,0,0,0.9365761,0.00260295,160.40083)"> + + - + id="path4077-4-0" + d="m 20.357801,63.084889 c -0.384246,-0.149014 -0.628345,-0.537251 -0.7029,-1.117962 -0.168234,-1.310416 2.780697,-2.53126 3.990331,-4.355189 1.190618,-1.795252 0.628821,-4.198295 2.121851,-4.923645 0.748779,-0.363777 1.165189,-0.445724 1.62067,-0.318935 0.57503,0.160058 0.811796,0.525331 0.861134,1.328523 0.153323,2.495884 -2.820646,7.116527 -5.694933,8.84819 -0.767586,0.462446 -1.763384,0.706854 -2.196151,0.539024 z" + style="fill:#ed8306;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.06666672" /> + id="path4071-5-7" + style="opacity:0.55;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none" /> + - - - - - - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Graves/pi.png Binary file share/hedgewars/Data/Graphics/Graves/pi.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/RamboClean.png Binary file share/hedgewars/Data/Graphics/Hats/RamboClean.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/barrelhider.png Binary file share/hedgewars/Data/Graphics/Hats/barrelhider.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/beefeaterhat.png Binary file share/hedgewars/Data/Graphics/Hats/beefeaterhat.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/bishop.png Binary file share/hedgewars/Data/Graphics/Hats/bishop.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/jester.png Binary file share/hedgewars/Data/Graphics/Hats/jester.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/lambdahat.png Binary file share/hedgewars/Data/Graphics/Hats/lambdahat.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/leprechaun.png Binary file share/hedgewars/Data/Graphics/Hats/leprechaun.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/nursehat.png Binary file share/hedgewars/Data/Graphics/Hats/nursehat.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/pirate_bandana.png Binary file share/hedgewars/Data/Graphics/Hats/pirate_bandana.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/pirate_eyepatch.png Binary file share/hedgewars/Data/Graphics/Hats/pirate_eyepatch.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/pirate_hat.png Binary file share/hedgewars/Data/Graphics/Hats/pirate_hat.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/poke_ash_hat.png Binary file share/hedgewars/Data/Graphics/Hats/poke_ash_hat.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/sf_guile_hat.png Binary file share/hedgewars/Data/Graphics/Hats/sf_guile_hat.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/sf_vega_hat.png Binary file share/hedgewars/Data/Graphics/Hats/sf_vega_hat.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/simple_green.png Binary file share/hedgewars/Data/Graphics/Hats/simple_green.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/simple_red.png Binary file share/hedgewars/Data/Graphics/Hats/simple_red.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/simple_yellow.png Binary file share/hedgewars/Data/Graphics/Hats/simple_yellow.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/thugclean.png Binary file share/hedgewars/Data/Graphics/Hats/thugclean.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hats/zoo_octopus.png Binary file share/hedgewars/Data/Graphics/Hats/zoo_octopus.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hedgehog.png Binary file share/hedgewars/Data/Graphics/Hedgehog.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hedgehog/amBaseball.png Binary file share/hedgewars/Data/Graphics/Hedgehog/amBaseball.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hedgehog/amBaseball.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Hedgehog/amBaseball.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Hedgehog/amDuck.png Binary file share/hedgewars/Data/Graphics/Hedgehog/amDuck.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Lag.png Binary file share/hedgewars/Data/Graphics/Lag.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/CMakeLists.txt --- a/share/hedgewars/Data/Graphics/Missions/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Graphics/Missions/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,3 @@ add_subdirectory(Training) +add_subdirectory(Challenge) +add_subdirectory(Scenario) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Basic_Training_-_Sniper_Rifle.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Basic_Training_-_Sniper_Rifle.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Basic_Training_-_Sniper_Rifle@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Basic_Training_-_Sniper_Rifle@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Missions/Challenge/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,5 @@ +file(GLOB MissionPics *@2x.png) + +install(FILES + ${MissionPics} + DESTINATION ${SHAREPATH}Data/Graphics/Missions/Challenge) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Hedgelove@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Hedgelove@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Ropes@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Ropes@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Challenge_-_Speed_Shoppa_-_ShoppaKing@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Challenge_-_Speed_Shoppa_-_ShoppaKing@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/ClimbHome.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/ClimbHome.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/ClimbHome@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/ClimbHome@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Bazooka_easy@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Bazooka_easy@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Bazooka_hard@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Bazooka_hard@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Cluster_Bomb@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Cluster_Bomb@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Grenade_easy@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Grenade_easy@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Grenade_hard@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Grenade_hard@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Homing_Bee@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Homing_Bee@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Shotgun@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/Target_Practice_-_Shotgun@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_RCPlane_Challenge.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_RCPlane_Challenge.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_RCPlane_Challenge@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_RCPlane_Challenge@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_That_Sinking_Feeling@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Challenge/User_Mission_-_That_Sinking_Feeling@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/Big_Armory@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/Big_Armory@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Missions/Scenario/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,5 @@ +file(GLOB MissionPics *@2x.png) + +install(FILES + ${MissionPics} + DESTINATION ${SHAREPATH}Data/Graphics/Missions/Scenario) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Bamboo_Thicket.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Bamboo_Thicket.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Bamboo_Thicket@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Bamboo_Thicket@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Dangerous_Ducklings@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Dangerous_Ducklings@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Diver.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Diver.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Diver@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Diver@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Nobody_Laugh.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Nobody_Laugh.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Nobody_Laugh@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Nobody_Laugh@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Spooky_Tree.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Spooky_Tree.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Spooky_Tree@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Spooky_Tree@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Teamwork.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Teamwork.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Teamwork@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Teamwork@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Teamwork_2@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_Teamwork_2@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_The_Great_Escape.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_The_Great_Escape.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_The_Great_Escape@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/User_Mission_-_The_Great_Escape@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Scenario/portal@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Scenario/portal@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Sniper_Rifle.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Sniper_Rifle.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Sniper_Rifle@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Sniper_Rifle@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Challenge_-_Speed_Shoppa_-_Hedgelove@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Challenge_-_Speed_Shoppa_-_Hedgelove@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Challenge_-_Speed_Shoppa_-_Ropes@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Challenge_-_Speed_Shoppa_-_Ropes@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/ClimbHome.png Binary file share/hedgewars/Data/Graphics/Missions/Training/ClimbHome.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/ClimbHome@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/ClimbHome@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Bazooka_easy@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Bazooka_easy@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Bazooka_hard@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Bazooka_hard@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Cluster_Bomb@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Cluster_Bomb@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Grenade_easy@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Grenade_easy@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Grenade_hard@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Grenade_hard@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Homing_Bee@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Homing_Bee@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Shotgun@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Target_Practice_-_Shotgun@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Bamboo_Thicket.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Bamboo_Thicket.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Bamboo_Thicket@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Bamboo_Thicket@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Dangerous_Ducklings.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Dangerous_Ducklings.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Dangerous_Ducklings@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Dangerous_Ducklings@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Diver.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Diver.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Diver@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Diver@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Newton_and_the_Hammock.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Newton_and_the_Hammock.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Newton_and_the_Hammock@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Newton_and_the_Hammock@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Nobody_Laugh.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Nobody_Laugh.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Nobody_Laugh@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Nobody_Laugh@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_RCPlane_Challenge.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_RCPlane_Challenge.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_RCPlane_Challenge@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_RCPlane_Challenge@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Rope_Knock_Challenge.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Rope_Knock_Challenge.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Rope_Knock_Challenge@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Rope_Knock_Challenge@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Spooky_Tree.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Spooky_Tree.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Spooky_Tree@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Spooky_Tree@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Teamwork.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Teamwork.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Teamwork@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Teamwork@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_That_Sinking_Feeling.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_That_Sinking_Feeling.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_That_Sinking_Feeling@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_That_Sinking_Feeling@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_The_Great_Escape.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_The_Great_Escape.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_The_Great_Escape@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_The_Great_Escape@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Missions/Training/portal@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/portal@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/Progress.png Binary file share/hedgewars/Data/Graphics/Progress.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/TargetBee@2x.png Binary file share/hedgewars/Data/Graphics/TargetBee@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/custom3.png Binary file share/hedgewars/Data/Graphics/custom3.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/custom4.png Binary file share/hedgewars/Data/Graphics/custom4.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/custom5.png Binary file share/hedgewars/Data/Graphics/custom5.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/custom6.png Binary file share/hedgewars/Data/Graphics/custom6.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/custom7.png Binary file share/hedgewars/Data/Graphics/custom7.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/custom8.png Binary file share/hedgewars/Data/Graphics/custom8.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Graphics/missions.png Binary file share/hedgewars/Data/Graphics/missions.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/CMakeLists.txt --- a/share/hedgewars/Data/Locale/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,5 +1,4 @@ -find_package(Qt4 REQUIRED) -include(${QT_USE_FILE}) +find_package(Qt5 COMPONENTS LinguistTools) file(GLOB txttrans2 ??.txt) file(GLOB txttrans5 ?????.txt) @@ -9,7 +8,7 @@ file(GLOB campaignfiles campaigns_*.txt) file(GLOB tipfiles tips_*.xml) -QT4_ADD_TRANSLATION(QM ${tsfiles}) +QT5_ADD_TRANSLATION(QM ${tsfiles}) add_custom_target (release-translation ALL DEPENDS ${QM} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/ar.txt --- a/share/hedgewars/Data/Locale/ar.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/ar.txt Sun Dec 17 00:09:24 2017 +0100 @@ -43,7 +43,7 @@ 00:40=زجاجة حارقة 00:41=طير -01:00=لنتحارب +; 01:00=Loading … 01:01=تعادل 01:02=%1 يفوز 01:03=جزء %1% @@ -220,11 +220,11 @@ 02:02=Have no fear! 02:02=Be brave and conquer -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 يفوز -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=تعادل ; New health crate 02:05=Incoming aid! @@ -452,12 +452,12 @@ ; Game goal strings 05:00=Game Modes 05:01=The following rules apply -05:02=Forts: Defend your fortress; vanquish your enemies! +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!|Place the King: Pick a protected starting point for your King +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 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/bg.txt --- a/share/hedgewars/Data/Locale/bg.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/bg.txt Sun Dec 17 00:09:24 2017 +0100 @@ -38,7 +38,7 @@ 00:35=Допълнително Време 00:36=Лазерен Мерник -01:00=Бой! +; 01:00=Loading … 01:01=Равен рунд 01:02=Отборът %1 победи! 01:03=Звук %1% diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/campaigns_de.txt --- a/share/hedgewars/Data/Locale/campaigns_de.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/campaigns_de.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,43 +1,75 @@ +A_Classic_Fairytale.name="Ein klassisches Märchen" + +A_Classic_Fairytale-first_blood.name="1. Mission: Der erste Zusammenstoß" A_Classic_Fairytale-first_blood.desc="Hilf Undichte Stelle dabei, sein Training zu absolvieren und zu einem richtigen Igelkrieger zu werden. Du wirst in der Kunst des Seils, Fallschirms, Shoryukens und der Desert Eagle trainiert." +A_Classic_Fairytale-shadow.name="2. Mission: Die Schattenfälle" A_Classic_Fairytale-shadow.desc="Undichte Stelle und Dichte Wolke gehen für die Jagd raus. Sei auf Gefahren im Wald gefasst. Denk dran, bedenke deine Entscheidungen gut." +A_Classic_Fairytale-journey.name="3. Mission: Die Rückreise" A_Classic_Fairytale-journey.desc="Undichte Stelle muss zur anderen Seite der Insel gehen. Sei schnell und vorsichtig." +A_Classic_Fairytale-united.name="4. Mission: Gemeinsam sind wir stark" A_Classic_Fairytale-united.desc="Nach seiner langen Reise kehrte Undichte Stelle endlich wieder zum Dorf zurück. Allerdings gibt es keine Zeit zum Ausruhen. Du musst das Dorf von der Rage der Kannibalen verteidigen." +A_Classic_Fairytale-backstab.name="5. Mission: Verrat" A_Classic_Fairytale-backstab.desc="Die monströsen Kannibalen jagen Undichte Stelle und seine Freunde. Besiege sie erneut und beschütze deine Freunde. Benutze deine Ressourcen entsprechend, um die eintreffenden Feinde zu besiegen!" +A_Classic_Fairytale-dragon.name="6. Mission: Die Höhle des Löwen" A_Classic_Fairytale-dragon.desc="Undichte Stelle 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="Undichte Stelle muss erneut seine Freunde 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.desc="Undichte Stelle muss noch einmal kämpfen. Um zu gewinnen, muss er den Veräräter bekämpfen und alle verfügbaren Ressourcen benutzen. Besieg den Feind!" +A_Classic_Fairytale-queen.name="8. Mission: Lang lebe die Königin" +A_Classic_Fairytale-queen.desc="Undichte Stelle muss noch einmal kämpfen. Um zu gewinnen, muss er 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!" -A_Classic_Fairytale-epil.desc="Gratulation! Undichte Stelle kann endlich in Frieden gehen und von seinen neuen Freunden und seinem Stamm angepriesen werden. Sei stolz auf das, was du erreicht hast! Du kannst vorherige Missionen wieder spielen und andere mögliche Enden sehen." +A_Classic_Fairytale-epil.name="10. Mission: Epilog" +A_Classic_Fairytale-epil.desc="Gratulation! Undichte Stelle kann endlich in Frieden leben und von seinen neuen Freunden und seinem Stamm angepriesen werden. Sei stolz auf das, was du erreicht hast! Du kannst vorherige Missionen wieder spielen und andere mögliche Enden sehen." + +A_Space_Adventure.name="Ein Weltraumabenteuer" -A_Space_Adventure-cosmos.desc="Hogera, der Igelplanet, wird bald von einem riesigen Meteroid getroffen. In diesem Wettlauf ums Überleben musst du PAdIs besten Piloten, Igel Einsam, in einer Weltraumreise um die Nachbarplaneten führen, um alle 4 Teil des lang verschollenem Antigravitationsgeräts zu finden!" +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-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-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-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-ice02.desc="Igel Einsam konnt 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.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-desert01.desc="Du must auf dem Planeten aus Sand gelandet! Igel Einsam muss das fehlende Teil in den Berkwerksstollen finden. Sei vorsichtig, weil bösartige Schmuggler nur darauf warten, dich anzugreifen und auszurauben!" +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 Berkwerksstollen 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-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-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-fruit03.name="Nebenmission: Präzisionsschießen" A_Space_Adventure-fruit03.desc="Igel Einsam has sich verlaufen und ist in den 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 Überraschnug." +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-final.desc="Igel Einsam muss ein paar Sprengkörper, die auf dem Meteriot platziert wurden, detonieren. Hilf ihm, diese Mission zu beenden, ohne verletzt zu werden!" + +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!" diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/campaigns_en.txt --- a/share/hedgewars/Data/Locale/campaigns_en.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/campaigns_en.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,34 +1,61 @@ +A_Classic_Fairytale.name="A Classic Fairytale" + +A_Classic_Fairytale-first_blood.name="Mission 1: First Blood" A_Classic_Fairytale-first_blood.desc="Help Leaks a lot to complete his training and become a proper hedgehog warrior. You will be trained in the art of rope, parachute, shoryuken and desert eagle." +A_Classic_Fairytale-shadow.name="Mission 2: The Shadow Falls" A_Classic_Fairytale-shadow.desc="Leaks a lot and Dense Cloud are going for hunting. Be prepared for the dangers awaiting you at the forest. Remember, make your choices wisely." +A_Classic_Fairytale-journey.name="Mission 3: The Journey Back" A_Classic_Fairytale-journey.desc="Leaks a lot has to go to the other side of the island. Be fast and cautious." +A_Classic_Fairytale-united.name="Mission 4: United We Stand" A_Classic_Fairytale-united.desc="After his long journey Leaks a lot is finally back to the village. However, there isn't time to rest. You have to defend the village from the rage of the cannibals." +A_Classic_Fairytale-backstab.name="Mission 5: Backstab" A_Classic_Fairytale-backstab.desc="The monstrous cannibals are hunting Leaks a lot and his friends. Defeat them once again and protect your allies. Use your resources accordingly to defeat the incoming enemies!" +A_Classic_Fairytale-dragon.name="Mission 6: Dragon's Lair" A_Classic_Fairytale-dragon.desc="Leaks a lot has to get to the other side of the lake. Become a rope master and avoid get hit by the enemy shots." +A_Classic_Fairytale-family.name="Mission 7: Family Reunion" A_Classic_Fairytale-family.desc="Leaks a lot has to save once more his allies. Eliminate the enemy hogs and free your comrades. Use your resources carefully as they are limited. Drill some holes in the right spot and go close to the princess." +A_Classic_Fairytale-queen.name="Mission 8: Long Live The Queen" A_Classic_Fairytale-queen.desc="Leaks a lot has to fight once again. In order to win he'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!" +A_Classic_Fairytale-epil.name="Mission 10: Epilogue" A_Classic_Fairytale-epil.desc="Congratulations! Leaks a lot can finally leave in peace and get praised by his new friends and his tribe. Be proud for what you succeed! You can play again previous missions and see the other possible endings." +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-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-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-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-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-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-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-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-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-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-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-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-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-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!" diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/campaigns_pl.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Locale/campaigns_pl.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,61 @@ +A_Classic_Fairytale.name="Klasyczna Bajka" + +A_Classic_Fairytale-first_blood.name="Misja 1: Pierwsza krew" +A_Classic_Fairytale-first_blood.desc="Pomóż Sporemu Przeciekowi w ukończeniu jego treningu i zostaniu prawdziwym jeżowym wojownikiem. Zostaniesz wytrenowany w sztuce liny, spadochronu, ognistej pięści i desert eagle." + +A_Classic_Fairytale-shadow.name="Misja 2: Zapada cień" +A_Classic_Fairytale-shadow.desc="Spory Przeciek i Gęsta Chmura udają się na polowanie. Bądź przygotowanym na niebezpieczeństwa czekające na ciebie w lesie. Pamiętaj, mądrze podejmuj swoje decyzje." + +A_Classic_Fairytale-journey.name="Misja 3: Podróż z powrotem" +A_Classic_Fairytale-journey.desc="Spory Przeciek musi udać się na drugą stronę wyspy. Bądź szybki i ostrożny." + +A_Classic_Fairytale-united.name="Misja 4: Zgoda buduje" +A_Classic_Fairytale-united.desc="Po swojej długiej podróży, Spory Przeciek nareszcie wrócił do wioski. Jednakże, nie ma czasu na odpoczynek. Musisz bronić wioski przed gniewem kanibali." + +A_Classic_Fairytale-backstab.name="Misja 5: Zdrada" +A_Classic_Fairytale-backstab.desc="Potworne kanibale polują na Sporego Przecieka i jego przyjaciół. Pokonaj ich jeszcze raz i obroń swoich sprzymierzeńców. Użyj odpowiednio swoich zasobów, by pokonać nadchodzących wrogów!" + +A_Classic_Fairytale-dragon.name="Misja 6: Gniazdo smoka" +A_Classic_Fairytale-dragon.desc="Spory Przeciek musi dostać się na drugą stronę jeziora. Stań się mistrzem liny i uniknij oberwania od wrogich pocisków." + +A_Classic_Fairytale-family.name="Misja 7: Spotkanie rodzinne" +A_Classic_Fairytale-family.desc="Spory Przeciek musi znów uratować swoich sprzymierzeńców. Wyeliminuj wrogie jeże i uwolnij swoich kamratów. Używaj swoich zasobów ostrożnie, ponieważ są ograniczone. Wywierć parę dziur w odpowiednim miejscu i podejdź blisko do księżniczki." + +A_Classic_Fairytale-queen.name="Misja 8: Niech żyje królowa" +A_Classic_Fairytale-queen.desc="Spory Przeciek musi walczyć po raz kolejny. By wygrać, będzie musiał walczyć ze zdrajcą i użyć wszelkich dostępnych środków. Pokonaj wroga!" + +A_Classic_Fairytale-enemy.name="Misja 9: Wróg mojego wroga" +A_Classic_Fairytale-enemy.desc="Co za zwrot akcji! Spory Przeciek musi walczyć ramię w ramię z... "kanibalami" przeciw wspólnemu wrogowi. Złym cyborgom!" + +A_Classic_Fairytale-epil.name="Misja 10: Epilog" +A_Classic_Fairytale-epil.desc="Gratulacje! Spory Przeciek może w końcu odejść w pokoju i zostać pochwalonym przez swoich nowych przyjaciół i jego plemię. Bądź dumny z tego co osiągnąłeś! Możesz jeszcze raz zagrać w poprzednie misje i zobaczyć inne możliwe zakończenia." + +A_Space_Adventure.name="Kosmiczna Przygoda" +A_Space_Adventure-cosmos.name="Menu: Kosmiczna wycieczka" +A_Space_Adventure-cosmos.desc="Jeżera, planeta jeży, niedługo ma zostać uderzona przez gigantyczny metoryt. W tym wyścigu o przetrwanie musisz poprowadzić najlepszego pilota PSJ, Hoga Solo, w kosmiczną wycieczkę po sąsiednich planetach, by zebrać wszystkie 4 kawałki dawno zaginionego urządzenia antygrawitacyjnego!" +A_Space_Adventure-moon01.name="Misja główna: Pierwszy przystanek" +A_Space_Adventure-moon01.desc="Hog Solo wylądował na księżycu, by uzupełnić paliwo w swoim spodku, ale profesor Jeżozło udał się tam pierwszy i przygotował zasadzkę! Uratuj porwanych badaczy PSJ i wykurz stamtąd profesora Jeżozło!" +A_Space_Adventure-moon02.name="Misja poboczna: Ścigając niebieskego jeża" +A_Space_Adventure-moon02.desc="Hog Solo odwiedza pustelnika, starego weterana PSJ, który mieszka na księżycu, by zebrać trochę informacji o prof. Jeżozło. Jednakże, musi on najpierw pokonać pustelnika, Soneeka Szalonego Biegacza, w ganianego!" +A_Space_Adventure-ice01.name="Główna misja: Zamrożona przygoda" +A_Space_Adventure-ice01.desc="Witamy na planecie lodu. Tutaj jest tak zimno, że większość broni Hoga Solo nie będzie działać. Musisz zdobyć zaginioną część od lidera bandytów, Tanty, używając broni, które tam znajdziesz!" +A_Space_Adventure-ice02.name="Misja poboczna: Twarde latanie" +A_Space_Adventure-ice02.desc="Hog Solo nie mógł odwiedzić Lodowej Planety bez odwiedzania Stadionu Olimpijskiego Latania Spodkiem! W tej misji możesz dowieść swoich zdolności latania i zająć swoje miejsce wśród najlepszych!" +A_Space_Adventure-desert01.name="Główna misja: Poszukiwanie w kurzu" +A_Space_Adventure-desert01.desc="Wylądowałeś na planecie piasku! Hog Solo musi znaleźć brakującą część w podziemnych tunelach. Musisz uważać, gdyż występni przemytnicy tylko czekają, by cię zaatakować i okraść!" +A_Space_Adventure-desert02.name="Misja poboczna: Bieg o przetrwanie" +A_Space_Adventure-desert02.desc="Hog Solo szukał części w tym tunelu, kiedy niespodziewanie zaczął się zalewać! Wydostań się na powierzchnię tak szybko, jak to możliwe i uważaj, by nie uruchomić miny." +A_Space_Adventure-desert03.name="Misja poboczna: Precyzyjne latanie" +A_Space_Adventure-desert03.desc="Hog Solo ma trochę czasu, by polatać swoim radiowym samolocikem i trochę się pobawić. Poleć radiowym samolotem i uderz wszystkie cele!" +A_Space_Adventure-fruit01.name="Misja główna: Złe wyczucie czasu" +A_Space_Adventure-fruit01.desc="Na planecie owoców sprawy nie mają się tak dobrze. Jeże nie zbierają owoców, tylko przygotowują się do bitwy. Będziesz musiał wybrać, czy będziesz walczyć, czy uciekniesz." +A_Space_Adventure-fruit02.name="Misja główna: Dojście do urządzenia" +A_Space_Adventure-fruit02.desc="Hog Solo zbliża się do zaginionej części na Planecie Owoców. Czy kapitan Limonka pomoże mu zdobyć tę część, czy nie?" +A_Space_Adventure-fruit03.name="Misja poboczna: Precyzyjne strzelanie" +A_Space_Adventure-fruit03.desc="Hog Solo zgubił się i został otoczony przez Czerwone Truskawki. Pomóż mu wyeliminować je i wygraj trochę dodatkowej amunicji do misji “Dojście do urządzenia”." +A_Space_Adventure-death01.name="Misja główna: Ostateczne spotkanie" +A_Space_Adventure-death01.desc="Na Planecie Śmierci, najbardziej nieurodzajnej planecie w okolicy, Hog Solo jest bardzo blisko zdobycia ostatniej części urządzenia! Jednakże, czeka go niemiła niespodzianka..." +A_Space_Adventure-death02.name="Misja poboczna: Zabijanie specjalistów" +A_Space_Adventure-death02.desc="Hog Solo ponownie wpakował się w trudną sytuację. Pomóż mu pokonać “5 Zabójczych Jeży” w ich własnej grze!" +A_Space_Adventure-final.name="Misja główna: Wielki wybuch" +A_Space_Adventure-final.desc="Hog Solo musi zdetonować ładunki wybuchowe, które zostały umieszczone na meteorycie. Pomóż mu ukończyć jego misję, bez zostania rannym!" diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/cs.lua --- a/share/hedgewars/Data/Locale/cs.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/cs.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { - [":("] = ":(", ["!!!"] = "!!!", ["..."] = "...", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Bonus za přesnost!", +-- ["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 Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["A Hedgewars minigame"] = "", -- Capture_the_Flag ["a Hedgewars mini-game"] = "Hedgewars mini-hra", -- Space_Invasion, The_Specialists --- ["a Hedgewars tag game"] = "", -- Mutant --- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["Aiming practice"] = "", -- TargetPractice ["Aiming Practice"] = "Trénink přesnosti", --Bazooka, Shotgun, SniperRifle -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW - ["Ammo Depleted!"] = "Munice vyčerpána!", --- ["ammo extended!"] = "", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler -- ["Ammo is reset at the end of your turn."] = "", - ["Ammo Maniac!"] = "Muniční maniak!", - ["Ammo"] = "Munice", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies ["Available points remaining: "] = "Zbývá bodů:", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Odpal míčky na své nepřátele|a odstrč je do vody!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Odpal protivníky skrz|koše a pryč z mapy!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Trénink s bazukou", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Nejlepší kola dle týmů:", - ["Best Team Times: "] = "Nejlepší týmový čas:", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "BUM!", +-- ["Bones"] = "", -- +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion ["Boom!"] = "Bum!", - ["Boss defeated!"] = "Velitel poražen!", - ["Boss Slayer!"] = "Velitel zabit!", +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer -- ["Build a track and race."] = "", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "ZAJMI VLAJKU", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Neopatrný", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Change Weapon"] = "", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "Nešikovný", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Krycí jméno: Týmová práce", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Dokonči trasu tak rychle, jak můžeš!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope ["Congratulations!"] = "Gratuluji!", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratuluji! Eliminoval jsi všechny cíle|během stanoveného limitu", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Obsaď všechny sloupy, abys dostal body.", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Kybernetická říše", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ZATRACENĚ, ZELENÁČI! VYPADNI Z MOJI HLAVY!", ["DAMMIT, ROOKIE!"] = "ZATRACENĚ, ZELENÁČI!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Nebezpečná káčátka", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Mrtvá váha", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor -- ["Demolition is fun!"] = "", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow - ["Depleted Kamikaze!"] = "Vyčerpaný sebevrah!", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Znič nájezdníky k získání bodů.", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode - ["Drone Hunter!"] = "Lovec trubců!", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Utopenec", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy ["Each turn you get 1-3 random weapons"] = "Každý tah dostaneš 1-3 náhodné zbraně", ["Each turn you get one random weapon"] = "Každý tah dostaneš jednu náhodnou zbraň", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Znič všechny nepřátele", ["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 enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "Odstraň Otravu, než vyprší čas.", - ["Eliminate the Blue Team"] = "Znič modrý tým", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Znič Jednotku 3378 |- Slabý odpor musí přežít", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Užij si plavání...", - ["[Enter]"] = "[Enter]", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Nejrychlejší kolo: ", ["Feeble Resistance"] = "Slabý odpor", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 - - ["Fire"] = "Oheň", +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Vlajka zabrána!", ["Flag respawned!"] = "Vlajka obnovena!", ["Flag returned!"] = "Vlajka navrácena!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Vlajky a domovské základny budou umístěny tam, kde každý tým skončí svůj první tah.", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", --- ["fuel extended!"] = "", - ["GAME BEGUN!!!"] = "HRA ZAČALA!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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 +-- ["Gangsters"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Cíl", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Hodně štěstí tam venku!", -- ["Good so far!"] = "", @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "Mám tě!", --- ["Grab Mines/Explosives"] = "", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["Hahahaha!"] = "Hahahaha!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Haha, tak TOHLE bude něco!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil [" Hapless Hogs left!"] = "Nešťastný ježek odešel!", ["Hapless Hogs"] = "Nešťastný ježek", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode --- ["Health crates extend your time."] = "", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "Těžký", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Basketbal", - ["Hedgewars-Knockball"] = "Hedgewars=Vybíjená", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Heh, to není tak špatné.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood - ["Hit Combo!"] = "Opakovaný zásah!", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy ["Hmmm..."] = "Hmmm...", --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Lovec", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Instruktor", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "nájezdník zničen", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,539 +1040,1291 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "To je dobře, že NÁHLÁ SMRT je 99 tahů vzdálená...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Skákání je vypnuto", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "Expert na sebevraždy!", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion -- ["Keep it up!"] = "", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood - ["KILLS"] = "ÚLOVKY", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "[Levý shift]", --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Poslouchej, bídný červe!!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Časovač min:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "MISE ÚSPĚŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "MISE ÚSPĚŠNÁ", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Pohyb: [nahoru], [dolu], [vlevo], [vpravo]", --- ["Mudball"] = "", -- Construction_Mode - ["Multi-shot!"] = "Vícenásobná rána!", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 --- ["New Barrels Per Turn"] = "", - ["NEW CLAN RECORD: "] = "NOVÝ KLANOVÝ REKORD: ", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "NOVÉ nejrychlejší kolo: ", --- ["New Mines Per Turn"] = "", - ["NEW RACE RECORD: "] = "NOVÝ TRAŤOVÝ REKORD: ", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "NEDOSTATEK NAVIGAČNÍCH BODŮ", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Ne moc přátelský zápas", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Operace potápěč", ["Opposing Team: "] = "Protivníkův tým: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Žalostný ježek #%d", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["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"] = "", -- Mutant +-- ["point(s)"] = "", -- TargetPractice, Mutant ["Poison"] = "Otrava", +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "Zbývající energie", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos -- ["Prepare yourself"] = "", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow - ["Race complexity limit reached."] = "Dosažen limit složitosti závodu.", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", - ["Round Limit"] = "Limit kol", --- ["Rounds Complete: "] = "", - ["Rounds Complete"] = "Dokončených kol", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "PRAVIDLA HRY [Stiskni ESC pro prohlédnutí]", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["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š!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["Score"] = "", -- Mutant - ["SCORE"] = "SKÓRE", - - ["sec"] = "vt.", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Uvidíme se!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "Štít posílen! +30 energie", - ["Shield Depleted"] = "Štít vyčerpán", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Štít je plně dobit", - ["Shield Master!"] = "Štítový odborník!", - ["Shield Miser!"] = "Štítový škrt!", - ["Shield OFF:"] = "Štít VYPNUT:", - ["Shield ON:"] = "Štít ZAPNUT:", - ["Shield Seeker!"] = "Hledač štítů!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Brokovnicový tým", - ["Shotgun Training"] = "Trénink s brokovnicí", -- ["shots remaining."] = "", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Hloupý", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Propadlý", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s je venku a tým %d|má penaltu!| |Skóre:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s je venku a tým %d|skóruje!| |Skóre:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united ["Sponge"] = "Mycí houba", ["Spooky Tree"] = "Strašidelný strom", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["s|"] = "s|", - ["s"] = "s", -- GaudyRacer, Space_Invasion - ["STATUS UPDATE"] = "AKTUALIZACE STAVU", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies ["Switched to "] = "Přepnut na ", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Tým %d: ", - ["Team Scores"] = "Týmové skóre", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow ["That Sinking Feeling"] = "Potopené pocity", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "To bylo bezúčelné.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Nepřítel se skrývá na tamté kachničce!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Vlajka se obnoví příští kolo.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Tenhle déšť je opravdu něco...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["TIME: "] = "ČAS: ", - ["Timed Kamikaze!"] = "Časovaná sebevražda!", - ["Time Extended!"] = "Čas prodloužen!", --- ["Time Extension"] = "", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Přepnout štít", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "TRASA KOMPLETNÍ", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "Závod o trofej", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Čas kola", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit"] = "", -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Jednotka 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- -- ["Unit 835"] = "", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united +-- ["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 --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood ["User Challenge"] = "Výzva", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Použij lano a dostaň se ze startu do cíle, jak nejrychleji umíš!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Navigační bod umístěn.", --- ["Way-Points Remaining"] = "", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies --- ["Weapons reset."] = "", -- Highlander +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion +-- ["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 -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos -- ["Well done."] = "", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1035,13 +2332,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1055,31 +2361,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant - ["WINNING TIME: "] = "VÍTĚZNÝ ČAS: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1087,68 +2401,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "SKÓROVAL jsi!!", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "Uložil jsi", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "Bazukáři", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/cs.txt --- a/share/hedgewars/Data/Locale/cs.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/cs.txt Sun Dec 17 00:09:24 2017 +0100 @@ -57,7 +57,7 @@ ; 00:54=Struktura 00:54=Pozemek s rozprašovačem -01:00=Do boje! +; 01:00=Loading … 01:01=Kolo nerozhodně 01:02=%1 vyhráli! 01:03=Hlasitost %1% @@ -243,11 +243,11 @@ 02:02=Neměj strach! 02:02=Buď statečný a dobývej -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 vyhráli! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Kolo nerozhodně ; New health crate 02:05=Přichází pomoc! @@ -511,12 +511,12 @@ ; Game goal strings 05:00=Herní módy 05:01=Platí následující pravidla -05:02=Pevnosti: Braň svou pevnost; znič nepřátele! +05:02=Umísti krále: Umísti chráněný bod pro svého krále 05:03=Nízká gravitace: Koukej, kam šlapeš 05:04=Nesmrtelnost: Ježci jsou (skoro) nesmrtelní 05:05=Vampyrismus: Ježci budou oživeni poškozením, které způsobí 05:06=Karma: Ježci trpí stejně jako jejich oběť -05:07=Chraň krále: Nenech svého krále zemřít.|Umísti krále: Umísti chráněný bod pro svého krále +05:07=Chraň krále: Nenech svého krále zemřít. 05:08=Umísti ježky: Umísti ježky před začátkem hry 05:09=Dělostřelectvo: Ježci nemohou změnit polohu chůzí 05:10=Nezničitelný terén: Většina zbraní neničí terén diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/da.lua --- a/share/hedgewars/Data/Locale/da.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/da.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { - [":("] = ":(", ["!!!"] = "!!!", ["..."] = "...", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Præcisionsbonus", +-- ["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 Unlocked"] = "Bedrift Fuldført", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["A Hedgewars minigame"] = "", -- Capture_the_Flag ["a Hedgewars mini-game"] = "et Hedgewars-minispil", -- Space_Invasion, The_Specialists --- ["a Hedgewars tag game"] = "", -- Mutant --- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Sigtetræning", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW - ["Ammo"] = "Ammunition", - ["Ammo Depleted!"] = "Ammunition Udtømt", - ["ammo extended!"] = "ammunition udstrakt", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler ["Ammo is reset at the end of your turn."] = "Ammunition nulstilles i slutningen af turen", - ["Ammo Maniac!"] = "Ammunitionsgalskab", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies ["Available points remaining: "] = "Tilgængeligt point tilbage: ", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 - ["[Backspace]"] = "[Tilbage]", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- ["Bamboo Thicket"] = "Bambusbuskads", - ["Barrel Eater!"] = "Tøndeæder!", +-- ["Barrel Eater"] = "", -- Tumbler +-- ["Barrel Launcher selected!"] = "", -- Tumbler ["Barrel Launcher"] = "Tøndekaster", -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Slå bolde på dine fjender og|skub dem i havet!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Slå dine modstandere gennem|kurvene og ud af banen!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Træning med 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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Bedste omgang per hold: ", - ["Best Team Times: "] = "Bedste Holdtid: ", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "BUM!", +-- ["Bones"] = "", -- +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion ["Boom!"] = "Bum!", - ["Boss defeated!"] = "Boss besejret!", - ["Boss Slayer!"] = "Boss-morder!", +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer ["Build a track and race."] = "Byg en bane og ræs.", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "EROBR FLAGET", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Sløset", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge - ["Change Weapon"] = "Skift Våben", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "Kluntet", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Kodeord: Samarbejde", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Gennemfør banen så hurtigt som muligt!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope ["Congratulations!"] = "Tillykke!", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Tillykke! Du har elimineret alle målene|inden for den tilladte tidsramme.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Kontroller søjler for at score point.", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Kybernetisk Imperium", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE!"] = "FOR HELVEDE, REKRUT!", ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "FOR HELVEDE, REKRUT! KOM NED DERFRA!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Farlige Ællinger", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Dødvægt", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor ["Demolition is fun!"] = "Nedrivning er sjovt!", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow - ["Depleted Kamikaze!"] = "Udtømt Kamikaze!", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Tilintetgør indtrængere for at score point.", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen ["Double Kill!"] = "Dobbeltdrab!", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode - ["Drone Hunter!"] = "Dronjæger!", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Drukner", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy ["Each turn you get 1-3 random weapons"] = "Hver tur får du 1-3 tilfældige våben", ["Each turn you get one random weapon"] = "Hver tur får du ét tilfældigt våben", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Eliminer alle fjender", ["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 enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "Eliminer Giften før tiden løber ud", - ["Eliminate the Blue Team"] = "Eliminer det Blå Hold", - ["Eliminate the enemy before the time runs out"] = "Eliminer fjenden før tiden løber ud", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Eliminer Enhed 3378 |- Sølle Modstandere skal overleve", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion ["Energetic Engineer"] = "Energisk Ingeniør", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Nyd svømmeturen...", - ["[Enter]"] = "[Enter]", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Hurtigste omgang: ", ["Feeble Resistance"] = "Sølle Modstand", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 - - ["Fire"] = "Skyd", +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Flag erobred!", ["Flag respawned!"] = "Flag gendannet!", ["Flag returned!"] = "Flag returneret!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Flag og deres hjemmebase bliver placeret der hvor hvert hold afslutter sin første tur.", ["Flamer"] = "Hetzer", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy ["Friendly Fire!"] = "Egenbeskydning!", - ["fuel extended!"] = "brændstof udstrakt!", - ["GAME BEGUN!!!"] = "SPILLET ER STARTET!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Mål", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Held og lykke derude!", ["Good so far!"] = "Godt indtil videre!", @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "FIK DIG!", - ["Grab Mines/Explosives"] = "Snup Miner/Sprængstof", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["Hahahaha!"] = "Hahahaha!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Haha, ja DET ville være noget!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil [" Hapless Hogs left!"] = " Uheldige Pindsvin gik!", ["Hapless Hogs"] = "Uheldige Pindsvin", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode - ["Health crates extend your time."] = "Kasse med helbredelse forlænger din tid.", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "Tung", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Basketball", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Heh, det er ikke så slemt.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood - ["Hit Combo!"] = "Slagkombi!", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy ["Hmmm..."] = "Hmmm...", --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Jæger", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Instruktør", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "indtrængere tilintetgjorte", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,539 +1040,1291 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Det er heldigt at PLUDSELIG DØD er 99 ture væk...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Hop er deaktiveret", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "Kamikaze-ekspert!", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion ["Keep it up!"] = "Hold gejsten!", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab ["Killing spree!"] = "Drabsorgie!", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood - ["KILLS"] = "DRAB", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion ["Last Target!"] = "Sidste Mål!", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "[Venstre Shift]", --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Lyt efter, maddike!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow ["Lively Lifeguard"] = "Livlig Livredder", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy ["Mine Deployer"] = "Mineudsætter", - ["Mine Eater!"] = "Mineæder", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Tid til Miner:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "MISSION VAR SUCCESFULD", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "MISSION LYKKEDES", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Bevægelse: [Op], [Ned], [Venstre], [Højre]", --- ["Mudball"] = "", -- Construction_Mode - ["Multi-shot!"] = "Flerskud!", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 - ["New Barrels Per Turn"] = "Nye Tønder Per Tur", - ["NEW CLAN RECORD: "] = "NY KLANREKORD: ", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "NY hurtigste omgang: ", - ["New Mines Per Turn"] = "Nyt Antal Miner Per Tur", - ["NEW RACE RECORD: "] = "NY RÆSREKORD: ", - ["Newton's Hammock"] = "Newtons Hængekøje", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "IKKE NOK RUTEPUNKTER", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Ikke Så Venlig Kamp", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Operation Dykker", ["Opposing Team: "] = "Modstander: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Patetisk Pindsvin #%d", +-- ["Patches"] = "", -- ["Pathetic Resistance"] = "Patetisk Modstand", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor ["Place more waypoints using the 'Air Attack' weapon."] = "Placer flere rutepunkter med 'Luftangreb'-våbnet", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["POINTS"] = "", -- Mutant +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- 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 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "Kraft Tilbage", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["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", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow - ["Race complexity limit reached."] = "Kompleksitetsgrænsen for ræset er nået.", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer +-- ["Racer"] = "", -- Racer ["RACER"] = "RACER", +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow - ["Round Limit:"] = "Rundebegrænsning: ", - ["Round Limit"] = "Rundebegrænsning", - ["Rounds Complete: "] = "Runder Færdiggjort: ", - ["Rounds Complete"] = "Runder Færdiggjort", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "SPILLETS REGLER [Tryk på ESC for at se]", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 ["Save as many hapless hogs as possible!"] = "Red så mange uheldige pindsvin som muligt!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["Score"] = "", -- Mutant - ["SCORE"] = "SCORE", - - ["sec"] = "sek.", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Ses!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood ["selected!"] = "valgt", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "Skjold forstærket! +30 kraft", - ["Shield Depleted"] = "Skjold Udtømt", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Skjold er fuldt genopladt!", - ["Shield Master!"] = "Skjoldmester!", - ["Shield Miser!"] = "Skjoldgnier!", - ["Shield OFF:"] = "Skjold SLÅET FRA:", - ["Shield ON:"] = "Skjold SLÅET TIL:", - ["Shield Seeker!"] = "Skjoldsøger!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Haglgeværdshold", - ["Shotgun Training"] = "Træning med Haglgevær", ["shots remaining."] = "skud tilbage.", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Fjollet", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Synkende", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s er ude og Hold %d|scored en straf!| |Score:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s er ude og Hold %d|scored et point!| |Score:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united ["Sponge"] = "Svamp", ["Spooky Tree"] = "Uhyggeligt Træ", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["s|"] = "s|", - ["s"] = "s", -- GaudyRacer, Space_Invasion - ["STATUS UPDATE"] = "STATUSOPDATERING", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies ["Switched to "] = "Skiftede til ", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Hold %d: ", - ["Team Scores"] = "Holdscore", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow ["That Sinking Feeling"] = "Følelsen af at Synke", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "Det var meningsløst.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Fjenden gemmer sig på rapanden derover!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Flaget gendannes næste runde.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab ["This one's tricky."] = "Den her er drilagtig.", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Det her regnvejr er virkelig noget...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["Timed Kamikaze!"] = "Tidsindstillet Kamikaze!", - ["Time Extended!"] = "Tid Forlænget!", - ["Time Extension"] = "Tidsforlængelse", - ["TIME: "] = "TID: ", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Slå Skjold Til/Fra", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "BANE FULDFØRT", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "TrofæRæs", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", - ["Tumbling Time Extended!"] = "Tumlende Tid Forlænget", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Tid til Tur", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Enhed 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- ["Unit 835"] = "Enhed 835", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united ["Unit"] = "Enhed", +-- ["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 --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood ["User Challenge"] = "Brugerudfordring", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Brug dit reb til at komme fra start til slut så hurtigt som muligt!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Rutepunkt placeret.", - ["Way-Points Remaining"] = "Rutepunkter Tilbage", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies --- ["Weapons reset."] = "", -- Highlander +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion +-- ["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 -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos ["Well done."] = "Godt klaret.", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1035,13 +2332,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1055,31 +2361,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - ["Will this ever end?"] = "Slutter det her nogensinde?", --- ["WINNER IS "] = "", -- Mutant - ["WINNING TIME: "] = "VINDENDE TID: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1087,68 +2401,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "Du har SCORET!!", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "Du reddede", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "'Zooka-hold", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/da.txt --- a/share/hedgewars/Data/Locale/da.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/da.txt Sun Dec 17 00:09:24 2017 +0100 @@ -57,7 +57,7 @@ ; 00:54=Struktur 00:54=Jordspray -01:00=Kæmp! +; 01:00=Loading … 01:01=Runde uafgjort 01:02=%1 vinder! 01:03=Lydstyrke %1% @@ -243,11 +243,11 @@ 02:02=Frygt intet! 02:02=Vær modig og tapper -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 vinder! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Runde uafgjort ; New health crate 02:05=Så er der hjælp at hente! @@ -510,12 +510,12 @@ ; Game goal strings 05:00=Spilsystemer 05:01=De følgende regler gælder -05:02=Forter: Forsvar din fæstning; knus dine modstandere! +05:02=Placer din Konge: Vælg et beskyttet sted din konge kan starte 05:03=Svag Tyngdekraft: Gå forsigtigt 05:04=Udødelighed: Pindsvin er (næsten) udødelige 05:05=Vampyr: Pindsvin bliver helbredt når de giver skade 05:06=Karma: Pindsvin tager skade når de giver skade -05:07=Forsvar Kongen: Undgå at gå skakmat!|Placer din Konge: Vælg et beskyttet sted din konge kan starte +05:07=Forsvar Kongen: Undgå at gå skakmat! 05:08=Placer Pindsvin: Placer dine pindsvin før spillet starter 05:09=Artilleri: Pindsvin kan ikke gå for at flytte sig rundt 05:10=Uforgængeligt Terræn: De fleste våben kan ikke ændre på banen diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/de.lua --- a/share/hedgewars/Data/Locale/de.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/de.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,1824 +1,2808 @@ locale = { -[""]="", -["Bat your opponents through the|baskets and out of the map!"]="Schlage deine Widersacher durch|die Körbe und aus der Karte hinaus!", -["Hedgewars-Basketball"]="Hedgewars-Basketball", -["Not So Friendly Match"]="Kein-so-Freundschaftsspiel", -["%s is out and Team %d|scored a point!| |Score:"]="%s ist draußen und Team %d|erhält einen Punkt!| |Punktestand:", -["%s is out and Team %d|scored a penalty!| |Score:"]="%s ist draußen und Team %d|erhält eine Strafe!| |Punktestand:", -["GAME OVER!"]="SPIEL ZU ENDE!", -["Hooray!"]="Hurra!", -["Victory for the "]="Sieg für ", -["Flag respawned!"]="Fahne wieder erschienen!", -["Opposing Team: "]="Gegnerisches Team: ", -["You have SCORED!!"]="Du hast GEPUNKTET!", -["Flag returned!"]="Fahne zurückgebracht!", -["That was pointless."]="Das war sinnlos.", -["The flag will respawn next round."]="Die Fahne wird nächste Runde wieder auftauchen.", -["Flag captured!"]="Flagge genommen!", -["Boom!"]="Bumm!", -[" - 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", -["Climb Home"]="Nach Hause klettern", -["Rope to safety"]="Schwing dich in Sicherheit", -["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."]="Du bist weit weg von Zuhause, und das Wasser steigt, klettere so hoch, wie du kannst!|Deine Punktzahl wird von deiner Höhe abhängen.", -["Victory!"]="Sieg!", -["Made it!"]="Geschafft!", +["!!!"]="!!!", +["..."]="…", +["011101000"]="011101000", +["011101001"]="011101001", +["+1 barrel!"] = "+1 Fass!", -- Tumbler +["%.1fs"] = "%.1fs", -- Racer, TechRacer +["%.1f seconds were remaining."]="Es verblieben %.1f.", +["+1 Grenade"] = "+1 Granate", -- Basic_Training_-_Flying_Saucer +["+1 mine!"] = "+1 Mine", -- Tumbler +["1 - Normal Girder"]="1 – Normaler Bauträger", +["1 - Normal Land"]="1 – Normales Gelände", +["1 - Normal Rubber"]="1 – Normales Gummi", +["-1 point"] = "-1 Punkt", -- Mutant +["+1 point"] = "+1 Punkt", -- Mutant +["-1 to anyone for a suicide"]="-1 für Selbstmord", +["+1 to the Bottom Feeder for killing anyone"] = "+1 für den Versager für jeden Abschuss", -- Mutant +["+1 to the Mutant for killing anyone"] = "+1 für den Mutanten für jeden Abschuss", -- Mutant +["+2 for becoming the Mutant"] = "+2, wenn man Mutant wird", -- Mutant +["2 - Indestructible Girder"]="2 – Unzerstörbarer Bauträger", +["2 - Indestructible Land"]="2 – Unzerstörbares Gelände", +["30 minutes later..."]="30 Minuten später …", +["3 - Icy Girder"]="3 – Eisiger Bauträger", +["3 - Icy Land"]="3 – Eisiges Gelände", +["4 - Bouncy Girder"]="4 – Sprunghafter Bauträger", +["4 - Bouncy Land"]="4 – Sprunghaftes Gelände", +["5 additional enemies will be spawned during the game"]="5 weitere Gegner werden während des Spiels auftauchen", +["5 additional enemies will be spawned during the game."] = "In diesem Spiel werden 5 zusätzliche Gegner auftauchen.", -- A_Space_Adventure:fruit01 +["5 deadly hogs"]="5 tödliche Igel", +["5 Deadly Hogs"] = "5 Tödliche Igel", -- A_Space_Adventure:death02 +["6 more seconds added to the clock"]="6 Bonussekunden auf die Uhr", +["About a month ago, a cyborg came and told us that you're the cannibals!"]="Vor etwa einem Monat kam ein Cyborg und erzählte uns, dass ihr die Kannibalen seid.", +["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 typisches Märchen", +["Actually, you aren't worthy of life! Take this..."]="Eigentlich hast du nicht das Recht, zu leben! Nimm das!", +["A cy-what?"]="Ein Cy-was?", +["Add %d"] = "%d addieren", -- HedgeEditor +["Admit what?"] = "Was zugeben?", -- A_Classic_Fairytale:queen +["ADVANCED REPOSITIONING MODE"]="FORTGESCHRITTENER VERLEGUNGSMODUS", +["Adventurous"]="Abenteuerlich", +["A frenetic Hedgewars mini-game"] = "Ein hektisches Hedgewars-Minispiel", -- Frenzy +["Africa"]="Afrika", +["A frozen adventure"]="Ein frostiges Abenteuer", +["After Leaks A Lot betrayed his tribe, he joined the cannibals..."]="Nachdem Undichte Stelle seinen Stamm betrogen hatte, trat er den Kannibalen bei.", +["After that incident he went underground and started working on his plan to steal the device."]="Nach dem Unfall ging er in den Untergrund und arbeitete an seinem Plan, um das Gerät zu stehlen.", -- A_Space_Adventure:moon02 +["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."]="Nach dem Schock, der vom feindlichen Spion ausgelöst wurde, gingen Undichte Stelle und Dichte Wolke zur Entspannung auf die Jagd.", +["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 ["Ahhh, home, sweet home. Made it in %d seconds."]="Ah, trautes Heim, Glück allein! Geschafft in %d Sekunden.", -["You have beaten the challenge!"]="Du hast die Herausforderung gemeistert!", -["Your height over time"]="Deine Höhe über die Zeit", -["%s reached home in %.3f seconds. Congratulations!"]="%s has das Zuhause in %.3f Sekunden erreicht. Gratulation!", -["%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.", -["seconds"]="Sekunden", -["%s has passed the best height of %s!"]="%s hat die beste Höhe von %s überschritten!", -["%s never got the ninja diploma."]="%s ist bei der Ninjaprüfung durchgefallen.", -["You have to move upwards, not downwards, %s!"]="Du musst nach oben, nicht nach unten, %s!", -["%s never wanted to reach for the sky in the first place."]="%s wollte nie nach den Sternen greifen.", -["%s should try the rope training mission first."]="%s sollte wohl zuerst das Seiltraining absolvieren.", -["%s skipped ninja classes."]="%s hat den Ninjaunterricht geschwänzt.", -["%s doesn’t really know how to handle a rope properly."]="%s weiß nicht, wie man mit einem Seil umgeht.", +["Aiming practice"] = "Zielübung", -- +["Aiming Practice"] = "Zielübung", -- Basic_Training_-_Sniper_Rifle, Basic_Training_-_Bazooka, Basic_Training_-_Grenade, Basic_Training_-_Sniper_Rifle, Basic_Training_-_Bazooka, Basic_Training_-_Grenade +["Air Attack"]="Luftangriff", +["Air General"]="Luftkommandant", +["Air Mine"]="Luftmine", +["Air Mine Placement Mode"]="Luftminenplatzierungsmodus", +["AIR MINE PLACEMENT MODE"]="LUFTMINENPLATZIERUNGSMODUS", +["A leap in a leap"]="Ein Sprung in einem Sprung", +["Alex"] = "Alex", -- +["Alien! I wish to be moved!"] = "Außerirdischer! Ich wünsche, bewegt zu werden!", -- A_Classic_Fairytale:queen +["A little gift from the cyborgs"]="Ein kleines Geschenk von den Cyborgs", +["Al.Kaholic"] = "Al. Koholik", -- +["All But Last"] = "Nicht Den Letzten", -- WxW +["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, 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 +["All the other places are protected by our flight-inhibiting weapons"]="Alle anderen Orte sind von unseren flugverhindernden Waffen geschützt.", +["All the saucer pilots dream to come here one day in order to compete with the best!"]="Alle Untertassenpiloten träumen davon, hier eines Tages herzukommen, um gegen die Besten um die Wette zu fliegen!", +["All they do is sit around and judge us!"] = "Alles, was sie tun, ist herumsitzen und uns beurteilen!", -- A_Classic_Fairytale:queen +["All this to please our beloved “elders” … hick …"] = "All das, um unseren geliebten »Ältesten« zu schmeicheln … hick …", -- A_Classic_Fairytale:queen +["All walls touched!"]="Alle Wände berührt!", +["All you do is take long walks when everyone else works."] = "Alles, was du tust, sind lange Spaziergänge, während jeder andere schuftet.", -- A_Classic_Fairytale:queen +["Also, you should know that the only place where you can fly is the left-most part of this area."] = "Außerdem solltest du wissen, dass der einzige Ort, in dem du fliegen kannst, der Platz ganz links in diesem Gebiet ist.", -- A_Space_Adventure:fruit01 +["Also, you should know that the only place where you can fly is the left-most part of this area"]="Außerdem solltest du wissen, dass der einzige Ort, wo du fliegen kannst, ganz links in diesem Gebiet ist.", +["Always being considered weak and fragile."] = "Immer für schwach und fragil gehalten.", -- A_Classic_Fairytale:queen +["Amazing! I was never beaten in a race before!"]="Großartig! Ich wurde zuvor noch nie in einem Wettlauf geschlagen!", +["Ammo depleted!"] = "Munition aufgebraucht!", -- Space_Invasion +["Ammo: %d"] = "Munition: %d", -- Tumbler +["Ammo is reset at the end of your turn."]="Munition wird am Ende des Spielzuges zurückgesetzt.", +["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "Munitionslimit: Igel können nicht mehr als 1 Munition pro Typ besitzen", -- Highlander +["Ammo Maniac! +5 points!"] = "Munitionsverrückter! +5 Punkte!", -- Space_Invasion +[" and 8 more seconds added to the clock"]=" und 8 Bonussekunden auf die Uhr", +["...and got ambushed by the Red Strawberries"]="… und von den Roten Erdbeeren überfallen wurdest.", +["... and got ambushed by the Red Strawberries"] = "… und wurde von den Roten Erdbeeren in einen Hinterhalt gelockt", -- A_Space_Adventure:fruit03 +["And how am I alive?!"]="Und wie kann es sein, dass ich am Leben bin?", +["And I just forgot the checkpoint of my main mission. Great, just great!"] = "Und ich hab soeben den Kontrollpunkt meiner Hauptmission vergessen. Na super!", -- A_Space_Adventure:cosmos +["… and I think they are up to something. Something bad!"] = "… und ich glaube, sie haben etwas vor. Etwas Böses!", -- A_Classic_Fairytale:epil +["Andrey"] = "Andreas", -- +["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "Und so geschah es, dass Undichte Stelle bei der Herausforderung versagte. Er landete voller Scham …", -- A_Classic_Fairytale:first_blood +["And so it began..."]="Und so fing es an …", +["And so the cyborgs took over the island."] = "Und so eroberten die Cyborgs die Insel.", -- A_Classic_Fairytale:queen +["...and so the cyborgs took over the world..."]="Und so eroberten die Cyborgs die Welt …", +["And so they discovered that cyborgs weren't invulnerable..."]="Und so fanden sie heraus, dass die Cyborgs nicht unverwundbar sind.", +["… and then I took a stroll …"] = "… und dann ging ich spazieren …", -- A_Classic_Fairytale:epil +["And what do they do in the meantime? Nothing!"] = "Und was tun sie währenddessen? Nichts!", -- A_Classic_Fairytale:queen +["And where's all the weed?"]="Und wo ist all das Gras?", +["And you believed me? Oh, god, that's cute!"]="Und du hast mir geglaubt? Ach Gottchen, das ist so süß!", +["An experimental (and buggy!) editing tool for missions and more"] = "Ein experimentelles (und verbuggtes!) Tool für Missionen und mehr", -- HedgeEditor +["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"]="Anno 1032: (Die Explosion wird stark schubsen – Große Reichweite, betrifft Igel in der Nähe des Ziels nicht)", +["Antarctica"]="Antarktika", +["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."]="Antarktischer Sommer: – Wird dir einen Träger/Schlammball und zwei Sinuskanonen/Portalgeräte jeden 4. Zug geben", +["Anti-Gravity Device Part (+1)"] = "Teil des Antischwerkraftgeräts (+1)", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +["Anton"] = "Anton", -- +["An unexpected event!"]="Ein unerwartetes Ereignis!", +["Anyway, the aliens accept me for who I am."] = "Jedenfalls akzeptieren die Außerirdischen mich für den, der ich bin!", -- A_Classic_Fairytale:queen +["A random hedgehog will inherit the weapons of his deceased team-mates."]="Ein zufälliger Igel wird die Waffen seiner verstorbenen Teamkollegen erben.", -- A_Space_Adventure:death02 +["A random hedgehog will inherit the weapons of his deceased team-mates"]="Ein zufälliger Igel wird die Waffen seiner verstorbenen Teamkollegen erben", -- A_Space_Adventure:death02 +["Arashi"] = "Arashi", -- +["Area"]="Gebiet", +["Are we there yet?"]="Sind wir schon da?", +["Are you accusing me of something?"]="Beschuldigst du mich?", +["Are you helping the aliens?"] = "Hilfst du den Außerirdischen?", -- A_Classic_Fairytale:queen +["Are you saying that many of us have died for your entertainment?"]="Willst du damit sagen, dass viele von uns nur für eure Unterhaltung gestorben sind?", +["Argh, the boredom!"] = "Argh, diese Langeweile!", -- A_Classic_Fairytale:queen +["Artur Detour"]="Artus Rück", +["As a reward for your performance, here's some new technology!"]="Als Belohnung für deine Leistung gebe ich dir eine neue Technologie!", +["Ash"] = "Ash", -- +["A Shoppa minigame"] = "Ein Shoppa-Minispiel", -- WxW +["Asia"]="Asien", +["A smuggler! Prepare for battle"]="Ein Schmuggler! Bereitmachen zum Kämpfen!", +["A Space Adventure"]="Ein Weltraumabenteuer", +["Assault Team"]="Sturmtruppe", +["Asteroid"] = "Asteroid", -- Big_Armory +["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "Da die Munition knapp ist, solltest du Seile in der Luft wiederverwenden.", -- A_Classic_Fairytale:dragon +["As the challenge was completed, Leaks A Lot set foot on the ground..."]="Nachdem die Herausforderung abgeschlossen war, setzte Undichte Stelle einen Fuß auf den Boden.", +["As you are more experienced, I want you to lead them to battle."] = "Da du kampferprobt bist, will ich, dass du sie in die Schlacht führst.", -- A_Space_Adventure:fruit01 +["As you are more experienced, I want you to lead them to the battle"]="Da du erfahrener bist, will ich, dass du sie in der Schlacht anführst.", +["As you can see I have survived our last encounter and I had time to plot my master plan!"]="Wie du sehen kannst, habe ich unser letztes Zusammentreffen überlebt und ich hatte Zeit, meinen Masterplan auszuhecken.", +["As you can see, there is no way to get on the other side!"]="Wie du siehst, gibt es keinen Weg, um auf die andere Seite zu kommen.", +["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 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", -- WxW +["Attack the assassins before they attack back"]="Greif die Assassinen an, bevor sie angreifen.", +["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 +["At the start of the game each enemy hog has only the weapon that he is named after."]="Am Anfang des Spiels hat jeder feindliche Igel nur die Waffe, nach der er benannt wurde.", -- A_Space_Adventure:death02 +["At the start of the game each enemy hog has only the weapon that he is named after"]="Am Anfang des Spiels hat jeder feindliche Igel nur die Waffe, nach der er benannt wurde", -- A_Space_Adventure:death02 +["Australia"]="Australien", +["Available points remaining: "]="Verfügbare Punkte verbleibend:", +["Average pilot"]="Durchschnittlicher Pilot", +["Avoid bazookas, red and blue invaders."] = "Weiche Bazookas und den roten und blauen Invasoren aus.", -- Space_Invasion +["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 +["Backstab"]="Verrat", +["Bacon"] = "Speck", -- +["Bad Guy"] = "Böser Junge", -- User_Mission_-_The_Great_Escape +["Badmad"] = "Fies und böse", -- portal +["Bad Team"]="Böses Team", +["Bad timing"]="Schlechtes Timing", +["Baggy"] = "Schlabber", -- +["Balrog"] = "Balrog", -- +["Bamboo Thicket"]="Bambusdickicht", +["Barrel Eater"] = "Fassfresser", -- Tumbler +["Barrel Launcher"]="Fasswerfer", +["Barrel Launcher selected!"] = "Fasswerfer ausgewählt!", -- Tumbler +["Barrel Placement Mode"]="Fassplatzierungsmodus", +["BARREL PLACEMENT MODE"]="FASSPLATZIERUNGSMODUS", +["Baseballbat"]="Baseballschläger", +["Baseball Bat with Ball"] = "Baseballschläger mit Ball", -- Knockball +["Base damage has been modified to 12 per shot."] = "Der Grundschaden wurde auf 12 pro Schuss geändert.", -- Battalion +["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "Zeig, was du gelernt hast und zerstör die Zielscheibe auf dem Träger|und lande, wie immer, sicher!", -- Basic_Training_-_Flying_Saucer +["Basically this is a combination of diving and launching."] = "Im Grunde genommen ist das eine Kombination aus Tauchen und Schießen.", -- Basic_Training_-_Flying_Saucer +["Basketball"] = "Basketball", -- Basketball +["Bat balls at your enemies and|push them into the sea!"]="Schlage Bälle auf deine Widersacher|und lass sie ins Meer fallen!", +["Battalion"] = "Battalion", -- Battalion +["Battle Starts Now!"]="Jetzt beginnt die Schlacht!", +["Batty"] = "Plemplem", -- +["Bat your opponents through the|baskets and out of the map!"]="Schlage deine Widersacher durch|die Körbe und aus der Karte hinaus!", +["Bazooka Training"]="Bazooka-Training", +["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 +["Be careful, your gadgets won't work in the bandit area. You should get an ice gun"]="Sei vorsichtig, deine Apparate werden im Banditenland nicht funktionieren. Du solltest eine Eiskanone holen.", +["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "Sei vorsichtig, deine Apparete werden im Banditenland nicht funktionieren. Du solltest dir eine Eiskanone besorgen.", -- A_Space_Adventure:ice01 +["Beep Loopers"]="Piepskreisler", +["Beginner"]="Anfänger", +["Behind these trees on the east side there is Secret Base 17."] = "Hinter diesen Bäumen auf der Ostseite ist Geheimbasis 17.", -- A_Space_Adventure:cosmos +["Below-average pilot"]="Unterdurchschnittlicher Pilot", +["Besides, why would I choose certain death?"] = "Außerdem, warum sollte ich den sicheren Tod wählen?", -- A_Classic_Fairytale:queen +["Best laps per team: "]="Beste Rundenzeiten pro Team: ", +["Best team times: "] = "Team-Bestzeiten: ", -- Racer, TechRacer ["Better luck next time!"]="Vielleicht klappt's beim nächsten Mal!", -["It was all just bad luck!"]="So ein Pech!", -["Well, that escalated quickly!"]="Das ging aber schnell in die Hose!", -["What? Is it over already?"]="Wie? Ist es schon vorbei?", -["You lose!"]="Du verlierst!", -["%s was damn close to home."]="%s war verdammt nah an Zuhause.", -["%s was close to home."]="%s war nah an Zuhause.", -["%s was good, but not good enough."]="%s war gut, aber nicht gut genug.", -["%s managed to pass half of the distance towards home."]="%s hat die Hälfte des Weges nach Hause absolviert.", -["%s went over a quarter of the way towards home."]="%s hat über die Hälfte des Weges nach Hause absolviert.", -["%s still had a long way to go."]="%s hatte noch einen langen Weg.", -["%s made it past the hogosphere."]="%s hat es über die Igelspähre geschafft.", -["%s barely made it past the hogosphere."]="%s hat es so gerade noch über die Igelsphäre geschafft.", -["points"]="Punkte", -["%s wins!"]="%s gewinnt!", -["Team’s best heights per round"]="Die Besthöhen der Teams pro Runde", -["This round’s award for ultimate disappointment goes to: Everyone!"]="Der ultimative Enttäuschungspreis geht in dieser Runde an: alle!", -["%s (%s) reached for the sky and beyond with a height of %d!"]="%s (%s) griff nach den Sternen mit einer Höhe von %d!", -["%s (%s) was certainly not afraid of heights: Peak height of %d!"]="%s (%s) hatte ganz bestimmt keine Höhenangst: Besthöhe von %d!", -["%s (%s) does not have to feel ashamed for their best height of %d."]="%s (%s) braucht sich für die Besthöhe von %d nicht zu schämen.", -["%s (%s) reached a decent peak height of %d."]="%s (%s) erreichte eine gute Besthöhe von %d.", -["%s (%s) reached a peak height of %d."]="%s (%s) erreichte eine Besthöhe von %d.", -["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!", -["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!", -["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."]="Dein Igel hatte panische Angst vorm Wasser und hatte einen Sicherheitsabstand von %d erreicht.", -["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."]="%s (%s) hatte panische Angst vorm Wasser und hatte einen Sicherheitsabstand von %d erreicht.", -["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."]="Autsch! Das muss wehgetan haben. Du hast deinen armen Igel mit %d verstümmelt.", -["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."]="Autsch! Das muss wehgetan haben. %s (%s) ist mit %d auf den Boden aufgeschlagen.", +["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 +["Beware of mines: They explode after 5 seconds."] = "Vorsicht vor Minen: Sie explodieren nach 5 Sekunden.", -- A_Classic_Fairytale:journey +["Beware, though! If you are slow, you die!"]="Aber Vorsicht! Wenn du langsam bist, wirst du sterben!", +["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."]="Aber Vorsicht! Viele Schmuggler kommen oft hier her, um diese Tunnel zu durchsuchen und alles mögliche, was sie finden, zu sammeln.", -- A_Space_Adventure:desert01 +["Beware, though, you will only be able to move slowly through the water."] = "Aber gib acht, du kannst dich nur langsam durchs Wasser bewegen.", -- Basic_Training_-_Flying_Saucer +["Big Armory"] = "Großes Arsenal", -- Big_Armory +["Billy Frost"]="Bernd Frost", +["Bingo"] = "Bingo", -- +["Bio-Filter: Aggressively removes enemies."] = "Biofilter: Hält Feinde aggressiv fern.", -- Construction_Mode +["Bio-Filter"]="Biofilter", +["Biomechanic Team"]="Biomechanisches Team", +["Bitter"] = "Bitter", -- +["Blanka"] = "Blanka", -- +["Blender"]="Blender", +["Bloodpie"]="Blutkuchen", +["Bloodrocutor"]="Blutfrierer", +["Bloodsucker"]="Blutsauger", +["Bloody Rookies"]="Blutige Anfänger", +["BlowTorch"]="Schweißbrenner", +["Blue"] = "Blau", -- +["Blue Team"]="Blaues Team", +["Bob"]="Bert", +["Bobo"] = "Bobo", -- User_Mission_-_Nobody_Laugh +["Bone Jackson"]="Knochen-Ede", +["Bonely"]="Knochi", +["Bones"] = "Knochen", -- +["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "BUMM! BUMM! BUMM! %s sind die Meister der Zerstörung mit %d zerstörten Invasoren.", -- Space_Invasion +["Boom!"]="Bumm!", +["Boom! %s has destroyed %d invaders."] = "Bumm! %s hat %d Invasoren zerstört.", -- Space_Invasion +["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "BUMM! %s mochte die Invasoren gar nicht gern und entschlossen sich, ganze %d von ihnen zu vernichten.", -- Space_Invasion +["Boris"]="Boris", +["Boss defeated! +30 points!"] = "Boss besiegt! +30 Punkte!", -- Space_Invasion +["Boss Slayer! +25 points!"] = "Bosstöter! +25 Punkte!", -- Space_Invasion +["Both Barrels"] = "Zweischießer", -- +["Both your hedgehogs must survive."] = "Deine beiden Igel müssen überleben.", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +["Bottom Feeder"] = "Versager", -- Mutant +["Bouncy Girder: [4]"] = "Sprunghafter Träger: [4]", -- HedgeEditor +["Bouncy Land: [4]"] = "Sprunghaftes Gelände: [4]", -- HedgeEditor +["Bouncy Land"]="Sprunghaftes Gelände", +["Bozo"] = "August", -- +["Brain Blower"]="Hirnpuster", +["Brainiac"]="Hirni", +["Brainila"]="Hirnilia", +["Brain Stu"]="Hirntopf", +["Brain Teaser"]="Hirnreiz", +["Brigadier Briggs"] = "Brigadier Brecht", -- +["Bruce"]="Brutus", +["Brutal Lily"]="Brutalo-Lilie", +["Brutus"]="Brutus", +["Build a fortress and destroy your enemy."]="Baue ein Fort und zerstöre deinen Feind.", +["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "Baue eine Rennstrecke, indem du Wegpunkte platzierst,|die die Igel in beliebiger Reihenfolge berühren müssen,|um eine Runde zu absolvieren.", -- Racer +["Build a track and race."]="Konstruiere eine Strecke und mach ein Wettrennen.", +["Builder"]="Baumeister", +["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "Baue eines aus mehreren verschiedenen Gebäuden,|um dir beim Sieg zu helfen, auf Kosten von Energie.", -- Construction_Mode +["Bullseye"]="Volltreffer!", +["Bunny"] = "Hasi", -- +["burp"] = "burp", -- +["Bushi"] = "Bushi", -- +["Buster"] = "Freundchen", -- +["But it proved to be no easy task!"]="Aber es war keine einfache Aufgabe!", +["But I want my sandals!"] = "Aber ich will meine Sandalen!", -- A_Classic_Fairytale:queen +["But one thing's for sure:"] = "Aber eins ist mal sicher:", -- A_Space_Adventure:final +["But that's impossible!"]="Aber das ist unmöglich!", +["But the ones alive are stronger in their heart!"]="Aber die Lebendigen sind in ihrem Herzen stärker.", +["But … they kidnapped you!"] = "Aber … sie haben dich entführt!", -- A_Classic_Fairytale:queen +["But...we died!"]="Aber … wir sind gestorben!", +["But where can we go?"]="Aber wohin können wir gehen?", +["But why did you betray us?!"] = "Aber warum hast du uns verraten?!", -- A_Classic_Fairytale:queen +["But why would they help us?"]="Aber warum würden sie uns helfen?", +["But you're cannibals. It's what you do."]="Aber ihr seid Kannibalen. Das ist, was ihr tut.", +["But you said you'd let her go!"]="Aber du sagtest, dass du sie freilässt!", +["But you saved me!"] = "Aber du hast mich gerettet!", -- A_Classic_Fairytale:queen +["C-1"] = "C-1", -- portal +["C-2"] = "C-2", -- portal +["Callahan"] = "Callahan", -- +["Call me Beep! Well, 'cause I'm such a nice...person!"]="Nenn mich »Pieps«! Weil ich so eine nette … Person bin!", +["Cannibal Sentry"]="Kannibalenwache", +["Cannibals"]="Kannibalen", +["Cannibals?! You're the cannibals!"]="Kannibalen?! Ihr seid die Kannibalen!", +["... can you do it?"]="Kannst du es schaffen?", +["Can you do it?"] = "Kannst du es schaffen?", -- A_Space_Adventure:ice02 +["Captain Lime"]="Leutnant Limone", +["Captain Lime offered his help if you assist him in battle."] = "Leutnant Limone bietet dir seine Hilfe an, wenn du ihm im Kampf zur Seite stehst.", -- A_Space_Adventure:fruit01 +["Capture The Flag"] = "Capture The Flag", -- CTF_Blizzard, Capture_the_Flag +["Careless"]="Achtlos", +["Carol"]="Karol", +["Challenge completed!"]="Herausforderung bewältigt!", +["Challenge complete!"] = "Herausforderung abgeschlossen!", +["CHALLENGE COMPLETE"]="HERAUSFORDERUNG ABGESCHLOSSEN", +["Challenge failed!"] = "Herausforderung gescheitert!", -- +["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 +["Change Content: [Left], [Right]"]="Inhalt ändern: [Links], [Rechts]", +["Change Health Boost: [Left], [Right]"]="Gesundheitsschub ändern: [Links], [Rechts]", +["Change Health: [Left], [Right]"]="Gesundheit ändern: [Links], [Rechts]", +["Change LandFlag: [1], [2], [3], [4]"]="LandFlag ändern: [1], [2], [3], [4]", +["Change modification mode: [Left], [Right]"] = "Modifikationsmodus ändern: [Links], [Rechts]", -- HedgeEditor +["Change Placement Mode: [Up], [Down]"]="Platzierungsmodus ändern: [Hoch], [Runter]", +["Change Rotation: [Left], [Right]"]="Rotieren: [Links], [Rechts]", +["Change Selection: [Up], [Down], [Left], [Right]"]="Auswahl ändern: [Hoch], [Runter], [Links], [Rechts]", +["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "Nächstes Sprite-Frame: [Genaues Zielen]+[Rechts]|Vorheriges Sprite-Frame: [Genaues Zielen]+[Links]", -- HedgeEditor +["Change Sprite: [Left], [Right]"] = "Sprite wählen: [Links], [Rechts]", -- HedgeEditor +["Change Timer (in milliseconds): [Left], [Right]"]="Zeitzünder (in Millisekunden) ändern: [Links], [Rechts]", +["Change Timer: [Left], [Right]"] = "Zeitzünder wählen: [Links], [Rechts]", -- HedgeEditor +["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "Waffe wechseln: [Weiter Sprung] oder [Slot 1]-[Slot 3]", -- Tumbler +["Charmander"] = "Glumanda", -- +["Chasing the blue hog"]="Jag den blauen Igel", +["Cheater"]="Cheater", +["Checkpoint reached!"]="Kontrollpunkt erreicht!", +["CheckPoint reached!"]="Kontrollpunkt erreicht!", +["Chef"]="Chefkoch", +["Chester"] = "Fifi", -- +["Chicken"] = "Hühnchen", -- +["Chief Sandologist"]="Haupt-Sandologe", +["Chikorita"] = "Endivie", -- +["Choose Selection/Placement/Deletion: [Left], [Right]"] = "Auswahl-/Platzierungs-/Löschmodus wählen: [Links], [Rechts]", -- HedgeEditor +["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!", +["Chunli"] = "Chunli", -- +["Clark Kent"] = "Clark Kent", -- +["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", +["Clowns"]="Clowns", +["Cluck-cluck time: [Fire an egg ~ Sabotages and cures poison ~ Cannot be fired close to another hog]"]="Gackerzeit: (Schieß ein Ei – Sabotiert und kuriert Gift – kann nicht in der Nähe anderer Igel gefeuert werden)", +["Clumsy"]="Hoppla", +["Cluster Bomb Training"] = "Splittergranatentraining", -- Target_Practice_-_Cluster_Bomb +["Collateral Damage II"]="Kollateralschaden II", +["Collateral Damage"]="Kollateralschaden", +["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 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 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.", +["Collect the first crate to begin!"] = "Sammle die erste Kiste ein, um anzufangen!", -- Basic_Training_-_Flying_Saucer +["Collect the freezer and get the device part from Thanta."] = "Sammle die Eiskanone ein und hol dir das Geräteteil von Thanta.", -- A_Space_Adventure:ice01 +["Collect the green and purple invaders."] = "Sammle die grünen und violetten Invasoren auf.", -- Space_Invasion +["Collect the icegun and get the device part from Thanta"]="Sammle die Eiskanone ein und besorge das Bauteil von Thanta", +["Collect the weapon crate at the left coast!"] = "Sammle die Waffenkiste an der linken Küste auf!", -- A_Classic_Fairytale:journey +["Color Squad"] = "Farbentrupp", -- +["Come back to this mission after collecting all the device parts"]="Kehre zu dieser Mission zurück, nachdem du alle Bauteile eingesammelt hast.", +["Come back to this mission and visit the other planets to collect the crates"]="Kehre zu dieser Mission zurück und besuche die anderen Planeten, um die Kisten einzusammeln.", +["Come closer and die! … burp …"] = "Kommt näher und sterbt! … rülps …", -- A_Classic_Fairytale:queen +["Come closer, so that your training may continue!"]="Komm näher, damit deine Übungen fortfahren können!", +["Comet"] = "Komet", -- Big_Armory +["Commander"]="Kommandant", +["COMMANDS: (Use while no weapon is selected)"]="BEFEHLE: (Benutzen, wenn keine Waffe gewählt ist)", +["Compete to use as few planes as possible!"]="Verwende so wenige Flugzeuge wie möglich!", +["Complete all main and side missions to complete the spacetrip mission."] = "Schließe alle Haupt- und Nebenmissionen ab, um die Weltraumreise-Mission abzuschließen.", -- A_Space_Adventure:cosmos +["Complete the remaining side missions to complete this mission."] = "Beende die verbleibenden Nebenmissionen, um die Weltraumreise abzuschließen.", -- A_Space_Adventure:cosmos +["Complete the track as fast as you can!"]="Durchlaufe die Strecke so schnell du kannst!", +["Completion time: %.2fs"] = "Benötigte Zeit: %.2fs", -- User_Mission_-_Rope_Knock_Challenge +["Comrades! Sail me away!"] = "Kameraden! Setzt die Segel!", -- A_Classic_Fairytale:queen +["Configuration accepted."]="Konfiguration akzeptiert.", +["Configuration phase"] = "Konfigurationsphase", -- WxW +["Congrats! You made them run away!"]="Gratulation! Du hast sie in die Flucht geschlagen!", +["Congrats! You won!"]="Gratulation! Du hast gewonnen!", +["Congratulations!"]="Gratulation!", +["Congratulations"]="Gratulation", +["Congratulations, now you can take Thanta's device part!"] = "Gratulation, du kannst dir nun Thantas Bauteil nehmen!", -- A_Space_Adventure:ice01 +["Congratulations, now you can take Thanta's device part..."]="Gratulation, nun kannst du dir Thantas Bauteil nehmen …", +["Congratulations, you acquired the device part!"]="Gratulation, du hast das Bauteil erhalten!", +["Congratulations, you are the best!"]="Gratulation, du bist der Beste!", +["Congratulations, you are the fastest!"]="Gratulation, du bist der Schnellste!", +["Congratulations, you collected the device part!"]="Gratulation, du hast das Bauteil eingesammelt!", +["Congratulations! You have destroyed all targets within the time."] = "Du hast alle Zielscheiben innerhalb der Zeit zerstört.", -- +["Congratulations, you have saved Hogera!"]="Gratulation, du hast Hogera gerettet!", +["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."]="Gratulation! Du hast diese Herausforderung wahrhaft gemeistert! Vergiss nicht, die Wiederholung zu speichern.", +["Congratulations! You've completed the Basic Rope Training!"] = "Gratulation! Du hast die Seilübung abgeschlossen!", -- Basic_Training_-_Rope +["Congratulations! You've eliminated all targets|within the allowed time frame."]="Gratulation! Du hast alle Zielscheiben innerhalb der|verfügbaren Zeit ausgeschaltet.", +["Congratulations! You win."] = "Gratulation! Du hast gewonnen.", -- Big_Armory +["Congratulations, you won!"]="Gratulation, du hast gewonnen!", +["Conquering the galaxy"] = "Eroberung der Galaxis", -- A_Space_Adventure:cosmos +["CONSTRUCTION MODE"]="BAUMODUS", +["Construction Mode tool"] = "Baumoduswerkzeug", -- Construction_Mode +["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "Baustation: Ermöglicht Platzierung von Trägern,| Gummis, Minen, Haftminen und Fässern.", -- Construction_Mode +["Construction Station"]="Baustation", +["Continental supplies"]="Kontinentallieferungen", +["Control"] = "Kontrolle", -- Control ["Control pillars to score points."]="Behalte die Kontrolle über die Säulen, um Punkte zu erhalten.", -["Goal"]="Ziel", -["Team Scores"]="Teampunktestand", -["Bat balls at your enemies and|push them into the sea!"]="Schlage Bälle auf deine Widersacher|und lass sie ins Meer fallen!", -["Hedgewars-Knockball"]="Hedgewars-Schlagball", -["TrophyRace"]="TrophyRace", -["Use your rope to get from start to finish as fast as you can!"]="Nutze das Seil um von Start zu Ziel zu gelangen - so schnell du kannst!", -["NEW fastest lap: "]="NEUE schnellste Runde: ", -["Fastest lap: "]="Schnellste Runde: ", -["Best laps per team: "]="Beste Rundenzeiten pro Team: ", -["Team %d: "]="Team %d: ", -["You've reached the goal!| |Time: "]="Ziel erreicht!| |Zeit: ", +["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "Steuerung: Halte die Angriffstaste (standardmäßig die Leertaste)|gedrückt, um das Seil abzufeuern.|Sobald du am Seil hängst, benutze:|Links und rechts zum Schwingen;|Hoch und runter zum Verkürzen oder Verlängern des Seiles.", -- Basic_Training_-_Rope +["Copper"] = "Kupfer", -- User_Mission_-_Nobody_Laugh +["Corn"]="Mais", +["Corporal Calvin"] = "Unteroffizier Utrecht", -- +["Corporationals"]="Kapitalista", +["Corpsemonger"]="Leichenschänder", +["Corpse Thrower"]="Leichenschmeißer", +["Cost"]="Kosten", +["Count Hogula"] = "Graf Igula", -- +["Coward"] = "Feigling", -- A_Classic_Fairytale:queen +["Crate Before Attack: %s"] = "Kiste Vorm Angriff: %s", -- WxW +["Crate Before Attack: You must collect a crate before you can attack."] = "Kiste Vorm Angriff: Du musst eine Kiste aufsammeln, bevor du angreifen kannst.", -- WxW +["Crate Placer"] = "Kistenplatzierer", -- Construction_Mode +["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 +["Crazy Runner"]="Verrückter Renner", +["Cricket time: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"]="Kricket: (Feuere eine 1-Sek.-Mine! – kann nicht in der Nähe anderer Igel gefeuert werden)", +["CTF_Blizzard"] = "CTF_Blizzard", -- CTF_Blizzard +["Cursor: Mode action"] = "Cursor: Modusaktion", -- HedgeEditor +["|Cursor: Place crate"] = "|Cursor: Kiste platzieren", -- Construction_Mode +["Cursor: Place waypoint"] = "Cursor: Wegpunkt platzieren", -- Racer +["Cutlass Cain"] = "Säbel-Sepp", -- +["Cybernetic Empire"]="Kybernetisches Imperium", +["Cyborg. It's what the aliens call themselves."]="Cyborg. So nennen sich die Außerirdischen selbst.", +["Dahmer"]="Dahmer", +["Daisy"] = "Daisy", -- +["DAMMIT, ROOKIE! GET OFF MY HEAD!"]="VERDAMMT, REKRUT! RUNTER VON MEINEM KOPF!", +["DAMMIT, ROOKIE!"]="VERDAMMT, REKRUT!", +["+%d ammo"] = "+%d Munition", -- Battalion +["+%d Ammo"] = "+%d Munition", -- Space_Invasion +["Dangerous Ducklings"]="Gefährliche Entchen", +["Dark Strawberry"]="Dunkle Erdbeere", +["%d crate(s) remaining"] = "Kisten verbleibend: %d", -- +["%d damage was dealt in this game."] = "In diesem Spiel wurde %d Schaden angerichtet.", -- Mutant +["+%d"] = "+%d", -- Battalion +["Deadly Grape"]="Traube des Todes", +["Deadweight"]="Gravitus", +["Deer"] = "Hirsch", -- +["Defeat all enemies!"] = "Besiege alle Feinde!", -- portal +["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 Timer mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer], um die Stärke zu setzen.", +["Defeat the cyborgs!"]="Besiege die Cyborgs!", +["Defeat the enemy!"] = "Besiege den Feind!", -- A_Classic_Fairytale:queen +["Delete Waypoint"] = "Wegpunkt löschen", -- HedgeEditor +["Deletion Mode: [5]"]="Löschmodus: [5]", +["Deletion Mode"]="Löschmodus", +["Deletition Mode"] = "Löschmodus", -- HedgeEditor +["Demolition is fun!"]="Zerstörung macht Spaß!", +["Demo"] = "Zerstörer", -- The_Specialists ["Dense Cloud"]="Dichte Wolke", -["Fiery Water"]="Feuerwasser", -["Leaks A Lot"]="Undichte Stelle", -["Fell From Grace"]="Fiel in Ungnade", -["Raging Buffalo"]="Wütender Büffel", -["Righteous Beard"]="Redlicher Bart", +["Dense Cloud must have already told them everything..."]="Dichte Wolke muss ihnen bereits alles gesagt haben.", +["Dense Cloud?! What are you doing?!"] = "Dichte Wolke?! Was tust du da?!", -- A_Classic_Fairytale:queen +["Depleted Kamikaze! +5 points!"] = "Munitionsloses Kamikaze! +5 Punkte!", -- Space_Invasion +["Derp"] = "Naja", -- User_Mission_-_Nobody_Laugh +["Desert Storm"] = "Wüstensturm", -- +["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", +["+%d flamer fuel!"] = "+%d Flammenwerfertreibstoff", -- Tumbler +["%d Hapless Hogs left"]="%d Glücklose Igel verbleibend", +["+%d health"] = "+%d Gesundheit", -- Mutant +["%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 +["Did not finish"] = "Wurde nicht fertig", -- Racer, TechRacer +["Did you really think I've changed?"] = "Habt ihr wirklich geglaubt, dass ich mich geändert habe?", -- A_Classic_Fairytale:queen +["Did you really think that I've changed?"] = "Habt ihr wirklich geglaubt, dass ich mich geändert habe?", -- A_Classic_Fairytale:queen +["Did you really think that we needed the help of one of you?"] = "Habt ihr wirklich geglaubt, dass wir die Hilfe von einen von euch gebraucht haben?", -- A_Classic_Fairytale:queen +["Did you see him coming?"]="Hast du ihn kommen sehen?", +["Did you warn the village?"]="Hast du das Dorf gewarnt?", +["Die, die, die!"]="Stirb, stirb, stirb!", +["Difficulty: Easy"] = "Schwierigkeitsgrad: Leicht", -- A_Classic_Fairytale:first_blood +["Difficulty: Hard"] = "Schwierigkeitsgrad: Schwer", -- A_Classic_Fairytale:first_blood +["Difficulty: "]="Schwierigkeitsgrad: ", +["Dimitry"] = "Dimitri", -- +["%d invaders have been destroyed in this game."] = "In diesem Spiel wurden %d Invasoren zerstört.", -- Space_Invasion +["Disabled"] = "Deaktiviert", -- WxW +["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"]="Als Felsenpinguin tarnen: (Vertausche die Plätze mit einem zufälligen Igel im Kreis)", +["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 +["Domination game"] = "Spiel um die Vorherrschaft", -- Control +["Donald"] = "Donald", -- +["Do not destroy the crates"]="Zerstöre nicht die Kisten.", +["Do not destroy the crates!"] = "Zerstör nicht die Kisten!", -- A_Space_Adventure:fruit02 +["Do not laugh, inexperienced one, for he speaks the truth!"]="Lach nicht, Unerfahrener, da er die Wahrheit spricht!", +["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"]="Lass dich nicht von seinen Worten einlullen, Jüngling! Er wird dich hinterrücks ermorden, sobald du ihm den Rücken zuwendest!", +["Don't be foolish son, there will be more"]="Sei kein Idiot, Sohn, es werden mehr kommen.", +["Don't be foolish, son, there will be more."] = "Sei kein Narr, Sohn, es werden bald mehr sein.", -- A_Space_Adventure:fruit01 +["Don't blow up the crate."] = "Jag die Kiste nicht in die Luft.", -- A_Classic_Fairytale:journey +["Don't destroy the device crate!"]="Zerstöre nicht das Bauteil!", +["Don't eliminate Captain Lime before collecting the last crate!"]="Eliminiere Leutnant Limone nicht, bevor du die letzte Kiste eingesammelt hast!", +["Don't hit me, you fools!"] = "Nicht auf mich, ihr Idioten!", -- A_Space_Adventure:moon01 +["Don't you dare harming our tribe!"] = "Wag es nicht, unserem Stamm wehzutun!", -- A_Classic_Fairytale:queen +["Double Kill!"]="Doppelmord!", +["Double kill!"] = "Zweierschlächter!", -- Mutant +["Do you have any idea how bad an exploding arrow hurts?"] = "Habt ihr die leiseste Ahnung, wie sehr ein explodierender Apfel wehtut?", -- A_Classic_Fairytale:queen +["Do you have any idea how valuable grass is?"]="Habt ihr überhaupt eine Ahnung darüber, wie wertvoll Gras ist?", +["Do you have any idea what it's like in the village for a woman?"] = "Habt ihr die leiseste Ahnung, wie es im Dorf für eine Frau so ist?", -- A_Classic_Fairytale:queen +["Do you know where they are?"] = "Weißt du, wo sie sind?", -- A_Classic_Fairytale:queen +["Do you think you're some kind of god?"]="Hältst du dich für eine Art Gott?", +["Dragon's Lair"]="Die Höhle des Löwen", +["Dr. Banting"] = "Dr. Keuch", -- +["Dr. Barnard"] = "Dr. Brand", -- +["Dr. Blackwell"] = "Dr. Schwarz", -- +["Dr.Cornelius"]="Dr. Cornelius", +["Dr. Cornelius"] = "Dr. Cornelius", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +["Dr. Crushing"] = "Dr. Knacks", -- +["Dr. Drew"] = "Dr. Horch", -- +["Dr. Harvey"] = "Dr. Lesch", -- +["Dr. Hollows"] = "Dr. Hohl", -- +["Dr. Horace"] = "Dr. Lauf", -- +["Drills"]="Kurzer Prozess", +["Drill Strike"]="Bohr-Luftangriff", +["Dr. Jenner"] = "Dr. Koch", -- +["Dr. Jung"] = "Dr. Jung", -- +["Drone Hunter! +10 points!"] = "Drohnenjäger! +10 Punkte!", -- Space_Invasion +["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"]="Bombe fallenlassen: (Lass einen heroischen Wind, der sich bei Einschlag in eine Bombe verwandelt, fallen)", +["- 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 +["Drove the minions away"]="Seine Lakaien vertrieben", +["Drove the Professor away"]="Den Professor vertrieben", +["Drowner"]="Absäufer", +["Dr. Parkinson"] = "Dr. Parkinson", -- +["Drunk greenhorn"]="Betrunkener Grünschnabel", +["Drunk with power, perhaps!"] = "Betrunken von Macht, vielleicht!", -- A_Classic_Fairytale:queen +["%d sec"] = "%d s", -- Construction_Mode +["+%d seconds!"] = "+%d Sekunden!", -- Tumbler +["Dubloon Devil"] = "Dublonenteufel", -- +["Dude, all the plants are gone!"]="Mann, all die Pflanzen sind fort!", +["Dude, can you see Ramon and Spiky?"]="He, kannst du Ramon und Stachli sehen?", +["Dude, it's unbearable!"] = "Mann, das ist unerträglich!", -- A_Classic_Fairytale:queen +["Dude, let me out!"] = "Mann, lass mich raus!", -- A_Classic_Fairytale:epil +["Dude, that outfit is so cool!"] = "Mann, dieses Outfit ist so cool!", -- A_Classic_Fairytale:epil +["Dude, that's so cool!"]="Junge, das ist so cool!", +["Dude, this is boring!"] = "Mann, das ist so langweilig!", -- A_Classic_Fairytale:queen +["Dude, we really need a new shaman..."]="Mann, wir brauchen wirklich einen neuen Schamanen.", +["Dude, what's this place?!"]="Junge, was ist das für ein Ort?!", +["Dude, where are we?"]="He, wo sind wir?", +["Dude, wow! I just had the weirdest high!"]="Junge, wow! Ich hatte gerade das seltsamste Erlebnis!", +["Dude, wow, you're so cute!"] = "Mann, wow, ihr seid so süß!", -- A_Classic_Fairytale:queen +["Dud Mine Placement Mode"] = "Blindgängerminenplatzierungsmodus", -- HedgeEditor +["DUD MINE PLACEMENT MODE"] = "BLINDGÄNGERMINENPLATZIERUNGSMODUS", -- HedgeEditor +["Duration"]="Dauer", +["During the final testing of the device an accident happened"]="Bei den letzten Tests des Gerätes ist ein Unfall passiert.", +["During the final testing of the device an accident happened."] = "Bei den letzten Tests des Geräts ist ein Unfall passiert.", -- A_Space_Adventure:moon02 +["During the game you can get new RC planes by collecting the weapon crates."]="Während des Spiels kannst du neue Funkflugzeuge erhalten, indem du die Waffenkisten sammelst.", +["During the game you can get new RC planes by collecting the weapon crates"]="Während des Spiels kannst du neue Funkflugzeuge erhalten, indem du die Waffenkisten sammelst", +["Dust storm: [Deals 15 damage to all enemies in the circle]"]="Staubsturm: (15 Schaden für alle Gegner im Kreis)", +["Each time you destroy all the targets on your current level you'll get teleported to the next level."]="Jedes Mal, wenn du alle Zielscheiben im aktuellen Level zerstörst, wirst du zum nächsten Level teleportiert.", +["Each time you destroy all the targets on your current level you'll get teleported to the next level"]="Jedes Mal, wenn du alle Zielscheiben im aktuellen Level zerstörst, wirst du zum nächsten Level teleportiert", +["Each time you play this missions enemy hogs will play in a random order."]="Jedes Mal, wenn du diese Mission spielst, werden die feindlichen Igel in einer zufälligen Reihenfolge spielen.", -- A_Space_Adventure:death02 +["Each time you play this missions enemy hogs will play in a random order"]="Jedes Mal, wenn du diese Mission spielst, werden die feindlichen Igel in einer zufälligen Reihenfolge spielen", -- A_Space_Adventure:death02 +["Each turn is only ONE SECOND!"]="Jeder Zug dauert nur EINE SEKUNDE!", +["Each turn you get 1-3 random weapons"]="Du bekommst jede Runde 1-3 zufällig gewählte Waffen", +["Each turn you get one random weapon"]="Du bekommst jede Runde eine zufällig gewählte Waffe", +["Each turn you'll have only one rope to use"]="In jedem Zug kannst du nur ein Seil benutzen", +["Each turn you'll have only one rope to use."] = "In jedem Zug kannst du nur ein Seil benutzen.", -- A_Space_Adventure:moon02 ["Eagle Eye"]="Adlerauge", -["Flaming Worm"]="Flammenwurm", -["Wise Oak"]="Weise Eiche", -["Bone Jackson"]="Knochen-Ede", -["Brain Teaser"]="Hirnreiz", -["Gimme Bones"]="Gib Knochen", -["Bloodpie"]="Blutkuchen", -["Hedgibal Lecter"]="Iglibal Lector", -["Scalp Muncher"]="Skalpknabberer", -["Back Breaker"]="Rückenbrecher", -["Dahmer"]="Dahmer", -["Meiwes"]="Meiwes", +["Eagle Eye: [Blink to the impact ~ One shot]"]="Adlerauge: (Teleportiere dich zum Einschlagspunkt – ein Schuss)", ["Ear Sniffer"]="Ohrenschnüffler", -["Muriel"]="Muriel", -["Regurgitator"]="Hochwürger", -["Let them have a taste of my fury!"]="Lasst sie von meinem Zorn kosten!", -["There's more of them? When did they become so hungry?"]="Es gibt mehr von ihnen? Seit wann wurden sie so hungrig?", -["We are indeed."]="Das sind wir in der Tat.", -["I think we are safe here."]="Ich glaub, hier sind wir in Sicherheit.", -["I'm...alive? How? Why?"]="Ich lebe? Wie? Warum?", -["But why would they help us?"]="Aber warum würden sie uns helfen?", -["It must be the aliens!"]="Es müssen diese Außerirdischen sein!", -["You just appeared out of thin air!"]="Du tauchtest aus dem Nichts auf!", -["But...we died!"]="Aber … wir sind gestorben!", -["This must be the caves!"]="Dies müssen die Höhlen sein!", -["Dude, where are we?"]="He, wo sind wir?", -["Why would they do this?"]="Warum würden sie das tun?", -["It must be the aliens' deed."]="Das muss die Tat der Außerirdischen sein.", -["Do not laugh, inexperienced one, for he speaks the truth!"]="Lach nicht, Unerfahrener, da er die Wahrheit spricht!", -["Yeah, sure! I died. Hillarious!"]="Ja, sicher! Ich starb. Urkomisch!", -["You're...alive!? But we saw you die!"]="Du … lebst? Aber wir sahen dich sterben!", -["???"]="???", -["Wow, what a dream!"]="Wow, was für ein Traum!", -["Dude, that's so cool!"]="Junge, das ist so cool!", -["But that's impossible!"]="Aber das ist unmöglich!", -["It was not a dream, unwise one!"]="Es war kein Traum, du Tor!", +["EASY"]="EINFACH", +["Eckles"] = "Kicher", -- User_Mission_-_Nobody_Laugh +["Eclipse"] = "Eklipse", -- Big_Armory +["Editing Commands: (Use while no weapon is selected)"] = "Bearbeitungsbefehle: (Benutzen, wenn keine Waffe gewählt)", -- HedgeEditor +["Ehm... ok..."]="Aha, okay …", +["Ehm, okay ..."] = "Ähem, okay …", -- A_Space_Adventure:moon01 +["Elderbot"]="Altbot", +["Elimate your captor."]="Eliminiere deinen Peiniger.", +["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 +["Elite pilot"]="Elitepilot", +["Elmo"]="Elmo", +["Enabled"] = "Aktiviert", -- WxW +["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "Feind töten: Erhalte Opferwaffen und +%d%% dessen Grundgesundheit", -- Battalion +["Energetic Engineer"]="Energetischer Ingenieur", +["Engineer"]="Ingenieur", +["Enjoy the swim..."]="Viel Spaß beim Schwimmen …", +["Entered boredom phase! Discrepancies detected …"] = "Langeweilephase eingeleitet! Diskrepanzen erfasst …", -- A_Classic_Fairytale:queen +["Epilogue"] = "Epilog", -- A_Classic_Fairytale:epil +["ERROR [getHogInfo]: Hog is nil!"] = "FEHLER [getHogInfo]: Igel ist nil!", -- Battalion +["Eugene"] = "Eugen", -- +["Europe"]="Europa", +["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."]="Alle 2 Ringe wird der Ring grün und du erhältst eine neue fliegende Untertasse.", +["Every 2 rings, the ring color will be green and you'll get an extra flying saucer"]="Alle 2 Ringe wird der Ring grün und du erhältst eine neue fliegende Untertasse", +["Every 2 rings you'll get extra flying saucers"]="Alle 2 Ringe erhälst du neue fliegende Untertassen", +["Every 2 rings you'll get extra flying saucers."] = "Alle 2 Ringe erhälst du zusätzliche fliegende Untertassen.", -- A_Space_Adventure:ice02 +["Everyone knows this."]="Das weiß jeder.", +["Every single time!"]="Jedes Mal!", +["Everything looks OK..."]="Alles sieht gut aus.", +["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 +["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.", -["Dude, wow! I just had the weirdest high!"]="Junge, wow! Ich hatte gerade das seltsamste Erlebnis!", -["The answer is...entertaintment. You'll see what I mean."]="Die Antwort lautet: Unterhaltung. Du wirst verstehen, was ich meine.", -["You're probably wondering why I bought you back..."]="Ihr fragt euch bestimmt, warum ich euch zurückgebracht habe.", -["What shall we do with the traitor?"]="Was sollen wir mit dem Verräter tun?", -["Here, let me help you!"]="Hier, lass mich dir helfen!", -["I forgot that she's the daughter of the chief, too..."]="Ich vergaß, dass sie auch die Tochter des Häuptlings ist.", -["You killed my father, you monster!"]="Du hast meinen Vater umgebracht, du Monster!", -["Look, I had no choice!"]="Versteh doch, ich hatte keine Wahl!", -["You have been giving us out to the enemy, haven't you!"]="Du hast uns an den Feind verkauft, nicht wahr?", -["You're a pathetic liar!"]="Du bist ein dreckiger Lügner!", -["Interesting! Last time you said you killed a cannibal!"]="Interessant. Das letzte mal sagtest du, dass du einen Kannibalen getötet hast.", -["I told you, I just found them."]="Ich sag's dir, ich habe sie gerade erst gefunden.", -["Where did you get the weapons in the forest, Dense Cloud?"]="Woher hast du die Waffen im Wald gefunden, Dichte Wolke?", -["Not now, Fiery Water!"]="Nicht jetzt, Feuerwasser!", +["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 +["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.", +["Exploring the tunnel"]="Höhlenforscher", +["Eye Chewer"]="Augenkauer", +["Fair Wind"] = "Steife Brise", -- +["Family Reunion"]="Familientreffen", +["Fastest lap: "]="Schnellste Runde: ", +["Feeble Resistance"]="Kraftloser Widerstand", +["Fell From Grace"]="Fiel in Ungnade", +["Fell From Heaven"]="Fiel Vom Himmel", +["Fell From Heaven is the best! Fell From Heaven is the greatest!"]="Fiel Vom Himmel ist die Beste! Fiel Vom Himmel ist die Größte!", +["Femur Lover"]="Schenkellieber", +["Fierce Competition! +8 points!"] = "Harter Wettkampf! +8 Punkte!", -- Space_Invasion +["Fiery Water?! Are you drunk again?"] = "Feuerwasser?! Bist du schon wieder betrunken?", -- A_Classic_Fairytale:queen +["Fiery Water"]="Feuerwasser", +["Fighting instead of cultivating a beautiful friendship."] = "Kämpfen, anstatt eine wunderschöne Freundschaft zu pflegen.", -- A_Classic_Fairytale:epil +["Fight: Press [Attack]"] = "Kämpfen: Drücke [Angreifen]", -- A_Space_Adventure:fruit01 +["Filthy Blue"]="Blödblau", +["Finally you are here..."]="Endlich bist du hier …", +["Finally you are here!"] = "Endlich bist du hier!", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +["Final result"] = "Endstand", -- Mutant +["Final team scores:"] = "Endstand:", -- Space_Invasion +["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.", +["Fire: [Precise]"] = "Feuern: [Genaues Zielen]", -- Space_Invasion, Tumbler +["First aid kits?!"]="Erste-Hilfe-Koffer?", +["First Blood"]="Der erste Zusammenstoß", +["First killer will mutate"] = "Erster Mörder wird mutieren", -- Mutant +["First Steps"]="Erste Schritte", +["- First team to capture the flag wins"] = "- Das erste Team, dass die Flagge erobert, gewinnt", -- Capture_the_Flag +["- First team to score %d captures wins"] = "- Das erste Team mit %d Eroberungen gewinnt", -- Capture_the_Flag +["Fishy"] = "Fischi", -- +["Flag captured!"]="Flagge genommen!", +["Flag respawned!"]="Flagge wieder erschienen!", +["Flag returned!"]="Flagge zurückgebracht!", +["Flamer"]="Flammenwerfer", +["Flamer selected!"] = "Flammenwerfer ausgewählt!", -- Tumbler +["Flaming Worm"]="Flammenwurm", +["Flawless victory!"]="Perfekter Sieg!", +["Flee: Press [Jump]"] = "Fliehen: Drücke [Springen]", -- A_Space_Adventure:fruit01 +["Flesh for Brainz"]="Fleisch gegen Hirn", +["Fly around and hurl explosives to your enemies."] = "Flieg herum und wirf Sprengkörper auf deine Gegner.", -- Tumbler +["Flying Saucer Training"] = "Grundlagentraining: Fliegende Untertasse", -- Basic_Training_-_Flying_Saucer +["Fly into space to fight off the invaders with barrels!"] = "Flieg in den Weltraum, um die Invasoren mit Fässern abzuwehren!", -- Space_Invasion +["Fly to the meteorite and detonate the explosives"]="Fliege zum Meteroiten und sprenge die Bomben.", +["Fly to the moon"]="Flieg zum Mond.", +["Fly to the moon."] = "Flieg zum Mond.", -- A_Space_Adventure:cosmos +["Four Eyes"] = "Vier Augen", -- +["Frank"] = "Frank", -- User_Mission_-_Nobody_Laugh +["Frankie"] = "Franki", -- +["Free Dense Cloud and continue the mission!"]="Befrei Dichte Wolke und setze die Mission fort!", +["FRENZY"]="WAHNSINN", +["Friendly Fire!"]="Eigenbeschuss!", +["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "Freund töten: Leert den Pool des Mörders; -%d%% seiner Grundgesundheit", -- Battalion +["From the second turn and beyond the water rises"]="Vom 2. Zug an wird das Wasser steigen.", +["From the second turn and beyond the water rises."] = "Vom zweiten Zug an wird das Wasser steigen.", -- A_Space_Adventure:desert02 +["Frozen Bandits"]="Frostbanditen", +["Fruit Assassins"]="Obstassassinen", +["Fruit"] = "Obst", -- +["Fruity"] = "Fruchtig", -- +["Fuel: %d"] = "Treibstoff: %d", -- Tumbler +["Fuzzy Beard"] = "Stoppelbart", -- +["“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", -- +["GasBomb"]="Gasbombe", +["Gas Gargler"]="Gasgurgler", +["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", +["General Lemon"]="General Limone", +["Generator: Generates energy."] = "Generator: Erzeugt Energie.", -- Construction_Mode +["Generator"]="Generator", +["Get Dense Cloud out of the pit!"]="Hol Dichte Wolke aus der Grube!", +["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 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!", +["Get the crate on the other side of the island!|"]="Hol dir die Kiste auf der anderen Seite der Insel!|", +["Get the highest score to win."] = "Hol dir die höchste Punktzahl, um zu gewinnen.", -- Space_Invasion +["Getting ready"]="Bereitmachen", +["Getting to the device"]="Zum Greifen nah", +["Get to the crate using your flying saucer!"] = "Gelange zur Kiste mit deiner fliegenden Untertasse!", -- Basic_Training_-_Flying_Saucer +["Get to the target using your rope!"] = "Gelange zur Zielscheibe mit deinem Seil!", -- Basic_Training_-_Rope +["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"]="Befrei deine Teamkollegen aus ihrem natürlichen Gefängnis und rette die Prinzessin!|Tipp: Löcher bohren sollte alle Probleme lösen.|Tipp: Es könnte eine gute Idee sein, vor dem Bohren einen Träger zu platzieren. Ich mein ja nur.|Tipp: All deine Igel müssen sich über der markierten Höhe befinden.|Tipp: Undichte Stelle muss sich sehr nahe an der Prinzessin befinden.", +["Giggles"] = "Kicher", -- +["Gimme Bones"]="Gib Knochen", +["Girder"]="Bauträger", +["Girder Placement Mode"]="Bauträgerplatzierungsmodus", +["GIRDER PLACEMENT MODE"]="BAUTRÄGERPLATZIERUNGSMODUS", +["Give a hog a preset identity and weapons"] = "Gib einem Igel eine voreingestellte Identität und Waffen", -- HedgeEditor +["Give an entire team themed hats and names"] = "Gib einem Team thematische Hüte und Namen", -- HedgeEditor +["Glark"]="Glark", +["Glasses"] = "Brille", -- +["Glassy"] = "Glasig", -- +["Goal Definition Mode"] = "Zieldefinierungsmodus", -- HedgeEditor +["GOAL DEFINITION MODE"] = "ZIELDEFINIERUNGSMODUS", -- HedgeEditor +["Go and collect the crate"]="Geh und sammle die Kiste auf.", +["Godai"] = "Godai", -- +["Go down and save these PAotH hogs!"]="Geh runter und rette diese PAdI-Igel!", +["Go, get him again!"] = "Los, fang ihn erneut!", -- A_Space_Adventure:moon02 +["Go get him again"]="Los, hol ihn dir wieder!", +["Goggles"] = "Luken", -- +["Goggs"] = "Goggs", -- +["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 +["Good luck...or else!"]="Viel Glück! Sonst …!", +["Good luck out there!"]="Viel Glück da draußen!", +["Good luck!"]="Viel Glück!", +["Good so far!"]="Gut soweit!", +["Good to go!"]="Startklar!", +["Go on top of the flower"]="Geh auf die Spitze der Blume", +["Go, quick!"]="Los, schnell!", +["Gorkij"]="Gorkidsch", +["Go surf!"]="Los, surfe!", +["Got 1 more saucer"]="1 neue Untertasse", +["Got 1 more saucer and 8 more seconds added to the clock"] = "1 neue Untertasse und 8 zusätzliche Sekunden auf die Uhr", -- A_Space_Adventure:ice02 +["GOTCHA!"]="ERWISCHT!", +["Go to go back"]="Ich muss umkehren.", +["Go to Thanta and get the device part!"]="Gehe zu Thanta und ergattere das Bauteil!", +["Go to the moon by using the flying saucer and complete the main mission"]="Komm zum Mond, indem du die fliegende Untertasse benutzt und die Hauptmission beendest.", +["Go to the surface!"]="Geh an die Oberfläche!", +["Go to the upper platform and get the weapons in the crates!"]="Geh zur oberen Plattform und nimm dir die Waffen in den Kisten!", +["Got the saucer!"]="Ich hab die Untertasse!", +["Got to go back."] = "Ich muss zurück.", -- A_Space_Adventure:cosmos +["Got you? You're acting weird."] = "Dich ertappt? Du bist ja komisch drauf.", -- A_Classic_Fairytale:queen +["Grab mines/barrels: [High jump]"] = "Minen/Fässer schnappen: [Hochsprung]", -- Tumbler +["Gravity: 100%"] = "Schwerkraft: 100%", -- Gravity +["Great choice, Steve! Mind if I call you that?"]="Großartige Entscheidung, Stefan! Stört es dich, wenn ich dich so nenne?", +["Great! Let’s kill all these enemies, using portals."] = "Großartig! Lasst uns diese Feinde vernichten, und zwar mit Portalen.", -- portal +["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"]="Gute Arbeit! Nun schlag sie mit deinem Baseballschläger! |Tipp: Du kannst die Waffe mit [Rechtsklick] wechseln!", +["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 areas are portal-proof and repel portals."] = "Grüne Bereiche sind portalabweisend.", -- A_Space_Adventure:final +["Green areas are portal-proof."] = "Grüne Bereiche sind portalabweisend.", -- A_Space_Adventure:final +["Green Bananas"]="Grüne Bananen", +["Green Bananas won!"]="Die Grünen Bananen haben gewonnen!", +["Green"] = "Grün", -- +["Green Hog Grape"]="Grünigeltraube", +["Green hogs won't intentionally hurt you"]="Grüne Igel werden dich nicht absichtlich verletzen.", +["Green hogs won't intentionally hurt you."] = "Grüne Igel werden dich nicht absichtlich verletzen.", -- A_Space_Adventure:fruit01 +["Greenhorn"]="Grünschnabel", +["Green lipstick bullet: [Poisonous, deals no damage]"]="Grüne Lippenstiftpatrone: (giftig, kein Schaden)", +["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", +["Grenade Training"]="Granatentraining", +["Grenadier"]="Grenadier", +["Grenadiers"]="Grenadiere", +["Grey"] = "Grau", -- +["Guards"]="Wächter", +["Guile"] = "Guile", -- +["Guys, do you think there's more of them?"]="Leute, glaubt ihr, dass es noch mehr von ihnen gibt?", +["Haha! Come!"] = "Haha! Kommt!", -- A_Classic_Fairytale:queen +["Haha!"]="Haha!", +["HAHA!"]="HAHA!", +["Hahahaha!"]="Hahahaha!", +["Haha, I love the look on your face!"] = "Haha, ich mag deinen Gesichtsausdruck!", -- A_Classic_Fairytale:queen +["Haha, now THAT would be something!"]="Haha, na DAS wär ja was!", +["Haha, that was just a coincidence!"] = "Haha, das war nur ein Zufall!", -- A_Classic_Fairytale:queen +["Hammer"]="Hammer", +["Hannibal"]="Hannibal", +["Hapless Hogs"]="Glücklose Igel", +["Happy with your race track?|Then stop building and start racing!"] = "Zufrieden mit deiner Rennstrecke?|Dann hör auf, zu bauen, und starte das Rennen!", -- Racer +["Hard flying"]="Schwerer Flug", +["HARD"]="SCHWER", +["Harris"] = "Harald", -- +["Harry"] = "Harry", -- User_Mission_-_Nobody_Laugh +["Harry Potter"] = "Harry Potter", -- +["Hatless Jerry"]="Hutloser Igor", +["Have no illusions, your tribe is dead, indifferent of your choice."]="Mach dir keine Hoffnungen, dein Stamm ist tot, unabhängig von deiner Entscheidung.", +["Haven't found it yet ..."] = "Hab's noch nicht gefunden …", -- A_Space_Adventure:desert01 +["Haven't found it yet..."]="Ich hab es noch nicht gefunden.", +["Have we ever attacked you first?"]="Haben wir euch jemals zuerst angegriffen?", +["H confirmed that there isn't such a PAotH activity logged"]="H bestätigte, dass eine solche PAdI-Aktivität nicht protokolliert ist.", +["H confirmed that there isn't such a PAotH activity logged."] = "H bestätigte, dass eine solche PAdI-Aktivität nicht protokolliert ist.", -- A_Space_Adventure:desert01 +["Healing Station: Heals nearby hogs."] = "Heilstation: Heilt Igel in der Nähe.", -- Construction_Mode +["Healing Station"]="Heilstation", +["Health Crate Placement Mode"]="Gesundheitskistenplatzierungsmodus", +["HEALTH CRATE PLACEMENT MODE"]="GESUNDHEITSKISTENPLATZIERUNGSMODUS", +["Health: %d"] = "Gesundheit: %d", -- HedgeEditor +["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", +["Heavy Cannfantry"]="Schwere Kannfantrie", +["Heavy"]="Schwierig", +["Heckles"] = "Jux", -- +["Heck, you even executed one of your own!"] = "Verdammt, ihr habt sogar einen von euch exekutiert!", -- A_Classic_Fairytale:queen +["Hedge-cogs"]="Stachelräder", +["HEDGE EDITOR"]="HEDGE EDITOR", +["HEDGEEDITOR"] = "HEDGEEDITOR", -- HedgeEditor +["HedgeEditor tool"] = "HedgeEditor-Werkzeug", -- HedgeEditor +["Hedgehog"] = "Igel", -- +["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"]="Igelprojektil: (Feuer deinen Igel wie eine Haftmine)", +["Hedgehogs can not be deleted."] = "Igel können nicht gelöscht werden.", -- HedgeEditor +["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", +["He doesn't know it but this device is a part of the anti-gravity device"]="Er weiß es nicht, aber dieses Bauteil ist ein Teil des Antischwerkraftgeräts.", +["He doesn't know it but this device is a part of the anti-gravity device."] = "Er weiß es nicht, aber dieses Gerät ist Teil des Antischwerkraftgeräts.", -- A_Space_Adventure:ice01 +["He has captured the rest of the PAotH team and awaits to capture you!"]="Er hat den Rest des PAdI-Teams gefangen und wartet auf deine Gefangennahme!", +["Heh, it's not that bad."]="Hehe, so schlimm ist er nicht.", +["Height over time"] = "Höhe über die Zeit", -- ClimbHome +["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "Er ist ein sehr hartnäckiger und sehr starrköpfiger Igel. Ich wäre extrem vorsichtig, wenn ich an deiner Stelle wäre.", -- A_Space_Adventure:moon02 +["He is a very tough and very determined hedgehog. I would be extremely careful if I were you"]="Er ist ein sehr starker und willensstarker Igel. An deiner Stelle wäre ich sehr vorsichtig.", +["Helena"]="Helena", +["Hell Army"] = "Höllenarmee", -- portal +["Hello again, %s!"] = "Hallo, mal wieder, %s!", -- A_Classic_Fairytale:family +["Help Disabled"] = "Hilfe deaktiviert", -- HedgeEditor +["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!!!"]="Hilfe! Zu Hilfe! Bitte!", +["Help me, please!"]="Hilf mir bitte!", +["He moves like an eagle in the sky."]="Er bewegt sich wie ein Adler in der Luft.", +["He must be in the village already."]="Er muss schon im Dorf sein.", +["HeneK"] = "HeneK", -- +["Here, let me help you!"]="Okay, lasst mich euch helfen!", +["Here, let me help you save her!"]="Hier, lass mich dir helfen, sie zu retten!", +["Here...pick your weapon!"]="Hier … wähl deine Waffe!", +["Here! Take it..."]="Hier, nimm es …", +["Here! Take it!"] = "Hier! Nimm es!", -- A_Space_Adventure:ice01 +["Here we go!"]="Auf geht's!", +["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 +["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 +["He won't be selling us out anymore!"]="Er wird uns nicht mehr verraten!", +["Hey guys!"]="Hey, Leute!", +["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! 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 +["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 ---"] = "--- Hochland ---", -- Battalion +["Highland: Hogs get %d random weapons from their pool"] = "Hochland: Igel erhalten %d zufällige Waffen aus ihrem Waffenpool", -- Battalion +["Hightime"]="Hoch hinaus", +["Hightower"] = "Hochturm", -- +["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: 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: Press [Esc] to review the mission texts."] = "Tipp: Drücke [Esc], um die Missionstexte wieder zu sehen.", -- 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 ---"] = "--- Tipp ---", -- Battalion +["Hint: you might want to stay out of sight and take all the crates...|"]="Tipp: Du solltest vielleicht aus der Schusslinie bleiben und alle Kisten nehmen.|", +["His arms are so strong!"]="Seine Arme sind so stark!", +["hits"]="Treffer", +["Hmm … it's going slower than expected."] = "Hmm … das dauert länger, als ich erwartet habe.", -- A_Classic_Fairytale:queen +["Hmmm...actually...I didn't either."]="Hmmm, ich … eigentlich auch nicht.", +["Hmmm..."]="Hmmm …", +["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "Hmmm, ich muss herausfinden, wie ich ihn von dieser Anti-Portal-Oberfläche wegbekomme.", -- portal +["Hmmm...it's a draw. How unfortunate!"]="Hmmm … Es ist unentschieden. Wie blöd!", +["Hmmm...perhaps a little more time will help."]="Hmmm. Vielleicht wird etwas mehr Zeit helfen.", +["Hm... Now I ran out of fuel..."]="Hmm … Jetzt ist mein Treibstoff alle.", +["Hm ... Now I ran out of fuel."] = "Hmm … nun hab ich keinen Treibstoff mehr.", -- A_Space_Adventure:cosmos +["Hog 100"]="Igel 100", +["Hog 1"]="Igel 1", +["Hog 3x5"]="Igel 3x5", +["Hog 7+7"]="Igel 7+7", +["Hog decar"]="Igel decar", +["Hog dertien"]="Igel dertien", +["Hog D"]="Igel D", +["Hog EOF"]="Igel EOF", +["Hogera is definitely the last planet I saved!"] = "Ich rette so bald keine Planeten mehr. Hogera reicht!", -- A_Space_Adventure:final +["Hogera is safe!"]="Hogera ist in Sicherheit!", +["Hog exi"]="Igel exi", +["Hog Hephaestus"]="Igel Hephaestus", +["Hog Identity Mode"]="Igelidentitätsmodus", +["HOG IDENTITY MODE"]="IGELIDENTITÄTSMODUS", +["Hog III"]="Igel III", +["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 Meterioten 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", +["Holy shit!"] = "Ach du dicker Vater!", -- Mutant +["Homing Bee"]="Zielsuchende Biene", +["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! 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 +["Horns"] = "Hörner", -- +["Hostage Situation"]="Geiselrettung", +["How can I ever repay you for saving my life?"]="Wie kann ich es jemals wieder gutmachen, dass du mein Leben gerettet hast?", +["How come in a village full of warriors, it's up to me to save it?"]="Wie kommt es, dass es immer an mir liegt, ein Dorf voller Krieger zu retten?", +["How could you betray us?"] = "Wie konntest du uns nur verraten?", -- A_Classic_Fairytale:queen +["How difficult would you like it to be?"]="Wie schwer möchtest du es haben?", +["HOW DO THEY KNOW WHERE WE ARE?"] = "WOHER WISSEN SIE, WO WIR SIND?", -- A_Classic_Fairytale:united +["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 +["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 +["Hunter"]="Jäger", +["I ain't gonna sit around no more!"] = "Jetzt werd ich nicht mehr herumsitzen!", -- A_Classic_Fairytale:queen +["I already said I'm sorry!"] = "Ich hab schon gesagt, dass es mir Leid tut!", -- A_Classic_Fairytale:epil +["I always suspected him!"] = "Ich hab ihn die ganze Zeit schon verdächtigt!", -- A_Classic_Fairytale:epil +["I am going to leave the kids play by themselves."] = "Ich werde die Kinder alleine spielen lassen.", -- A_Classic_Fairytale:queen +["I am not ready for this planet yet. I should visit it when I have found all the other device parts."]="Ich bin für diesen Planeten noch nicht bereit. Ich sollte ihn besuchen, sobald ich alle anderen Bauteile gefunden habe.", -- A_Space_Adventure:cosmos +["I am sorry but I was looking for a device that may be hidden somewhere around here."]="Tut mir Leid, aber ich suchte nach einem Gerät, das hier irgendwo versteckt sein könnte.", -- A_Space_Adventure:fruit02 +["I believe there's more of them."]="Ich glaube, es gibt noch mehr von ihnen.", +["I cannot let you go any further! … burp …"] = "Ich kann euch nicht weitergehen lassen! … rülps …", -- A_Classic_Fairytale:queen +["I can see you have been training diligently."]="Ich sehe, dass du fleißig geübt hast.", +["I can't believe how blind we were."] = "Ich kann nicht glauben, wie blind wir gewesen sind.", -- A_Classic_Fairytale:epil +["I can't believe it worked!"]="Ich kann nicht glauben, dass es funktioniert hat!", +["I can't believe this!"]="Ich kann es nicht glauben!", ["I can't believe what I'm hearing!"]="Ich kann nicht glauben, was ich höre!", -["You know what? I don't even regret anything!"]="Weißt du was? Ich bereue nichts!", -["In fact, you are the only one that's been acting strangely."]="Tatsächlich bist du der Einzige, der sich seltsam benahm.", -["Are you accusing me of something?"]="Beschuldigst du mich?", -["Seems like every time you take a \"walk\", the enemy find us!"]="Es scheint so, dass jedes Mal, wenn du »Spazieren gehst«, findet uns der Feind!", -["You know...taking a stroll."]="Du weißt schon … umherbummeln.", -["Where have you been?!"]="Wo warst du?!", -["You won't believe what happened to me!"]="Ihr glaubt nicht, was mir passiert ist!", -["Hey, guys!"]="Hey, Leute!", -["There must be a spy among us!"]="Es muss ein Spion unter uns sein!", -["We made sure noone followed us!"]="Wir hatten sichergestellt, dass uns niemand folgte!", -["What? Here? How did they find us?!"]="Was? Hier? Wie haben sie uns gefunden?", -["Look out! There's more of them!"]="Passt auf! Da sind noch mehr von ihnen!", -["What a strange feeling!"]="Was für ein seltsames Gefühl!", -["I need to warn the others."]="Ich muss die anderen warnen.", +["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 Jake"]="Eis-Jakob", +["I could just teleport myself there..."]="Ich könnte mich einfach dorthin teleportieren.", +["Icy Girder: [3]"] = "Eisiger Bauträger: [3]", -- HedgeEditor +["Icy Land: [3]"] = "Eisiges Gelände: [3]", -- HedgeEditor +["Icy Land"]="Eisiges Gelände", +["I'd better get going myself."]="Ich geh jetzt besser weiter.", +["I didn't until about a month ago."]="Ich wusste es nicht vor einem Monat.", +["I don't care. It's worth a fortune! Good bye, you idiot!"] = "Mir egal. Sie ist ein Vermögen wert. Tschüss, du Narr!", -- A_Space_Adventure:fruit02 +["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "Ich weiß nicht, wie du das gemacht hast, aber gute Arbeit!|Die nächste Zielscheibe sollte ein Kinderspiel für dich sein!", -- Basic_Training_-_Rope +["I don't know if I can forget what you've done!"] = "Ich weiß nicht, ob ich vergessen kann, was du getan hast!", -- A_Classic_Fairytale:epil +["I don't know who I can trust anymore."] = "Ich weiß nicht mehr, wem ich vertrauen kann.", -- A_Classic_Fairytale:epil +["I don't like your tone! You're hurting me!"] = "Deine Ausdrucksweise gefällt mir nicht! Du verletzt mich!", -- A_Classic_Fairytale:queen +["I feel something...a place! They will arrive near the circles!"]="Ich spüre etwas … einen Ort! Sie werden in der Nähe der Kreise auftauchen!", ["If only I had a way..."]="Wenn ich nur wüsste, wie.", -["Oh, silly me! I forgot that I'm the shaman."]="Ach, ich Dummkopf! Ich vergaß, dass ich der Schamane bin.", -["I sense another wave of cannibals heading our way!"]="Ich nehme eine Welle von Kannibalen, die auf uns zu gehen!", -["I feel something...a place! They will arrive near the circles!"]="Ich fühle etwas … einen Ort! Sie werden in der Nähe der Kreise auftauchen!", -["We need to prevent their arrival!"]="Wir müssen ihre Ankunft verhindern!", -["Go, quick!"]="Los, schnell!", -["I want to see how it handles this!"]="Ich will sehen, wie es damit klar kommt.", -["I sense another wave of cannibals heading my way!"]="Ich nehme eine weitere Welle in meine Richtung wahr!", -["I need to prevent their arrival!"]="Ich muss ihre Ankunft verhindern!", -["Oh, my! This is even more entertaining than I've expected!"]="Haha! Das ist sogar noch lustiger, als ich erwartet hatte!", -["You might want to find a way to instantly kill arriving cannibals!"]="Du könntest eine Möglichkeit finden, um die ankommenden Kannibalen sofort zu töten.", -["I believe there's more of them."]="Ich glaube, es gibt noch mehr von ihnen.", -["I marked the place of their arrival. You're welcome!"]="Ich habe ihren Ankunftsort markiert. Gern geschehen!", -["Why me?!"]="Warum ich?", -["He won't be selling us out anymore!"]="Er wird uns nicht mehr verraten!", -["That's for my father!"]="Das ist für meinen Vater!", -["Let's show those cannibals what we're made of!"]="Lass uns diesen Kannibalen zeigen, aus welchem Holz wir geschnitzt sind!", -["We'll spare your life for now!"]="Wir werden dein Leben verschonen. Noch.", -["May the spirits aid you in all your quests!"]="Mögen die Geiste dich in all deinen Aufgaben begleiten!", +["If only I were given a chance to explain my being here..."]="Wenn ich nur eine Gelegenheit hätte, um meine Anwesenheit zu erklären …", +["I forgot that she's the daughter of the chief, too..."]="Ich hab vergessen, dass sie auch die Tochter des Häuptlings ist.", +["I found it! Hooray!"] = "Ich hab's gefunden! Hurra!", -- A_Space_Adventure:desert01 +["If some good old explosives were enough to save Hogera …"] = "Wenn ein paar einfache Sprengkörper gereicht haben, um Hogera zu retten, …", -- A_Space_Adventure:final +["If they try coming here, they can have a taste of my delicious knuckles!"]="Wenn sie versuchen, hierher zukommen, können sie von meinen köstlichen Fäusten kosten!", +["If you agree to provide the information we need, you will be spared!"]="Wenn du einverstanden bist, uns die Information, die wir brauchen, zu geben, wirst du verschont!", +["If you can get that crate fast enough, your beloved \"princess\" may go free."]="Wenn du diese Kiste schnell genug einsammelst, darfst du deine geliebte »Prinzessin« befreien.", +["If you decide to help us, though, we will no longer need to find a new governor for the island."]="Wenn du uns helfen willst, brauchen wir für diese Insel keinen neuen Anführer zu suchen.", +["If you get stuck, use your Desert Eagle or restart the mission!|"]="Wenn du stecken bleibst, benutze deine Desert Eagle oder starte die Mission neu.|", +["If you help us you can keep the device if you find it but we'll keep everything else."]="Wenn du uns hilfst, darfst du das Gerät behalten, wenn du es findest, aber wir werden alles andere behalten.", -- A_Space_Adventure:fruit02 +["If you injure a hedgehog you'll get 35% of the damage dealt."] = "Wenn du einen Igel verletzt, wirst du 35% des angerichteten Schadens erhalten.", -- A_Space_Adventure:death02 +["If you injure a hedgehog you'll get 35% of the damage dealt"]="Wenn du einen Igel verletzt, wirst du 35% des angerichteten Schadens erhalten", -- A_Space_Adventure:death02 +["If you kill a hedgehog with the respective weapon your health points will be set to 100."]="Wenn du einen Igel mit der entsprechenden Waffe tötest, wird deine Gesundheit auf 100 gesetzt.", -- A_Space_Adventure:death02 +["If you kill a hedgehog with the respective weapon your health points will be set to 100"]="Wenn du einen Igel mit der entsprechenden Waffe tötest, wird deine Gesundheit auf 100 gesetzt", -- A_Space_Adventure:death02 +["If you know what I mean..."]="Wenn du verstehst, was ich meine.", +["If you say so..."]="Wenn du es sagst …", +["If you skip a turn then the turn time left will be added to your next turn."]="Wenn du einen Zug überspringst, wird die Zugzeit auf deinen nächsten Zug addiert.", -- A_Space_Adventure:fruit03 +["If you skip the game your time left will be added to your next turn"]="Wenn du das Spiel überspringst, wird deine verbleibende Zeit für deinen nächsten Zug addiert.", +["If you wish to replay, there are other possible endings, too!"] = "Wenn du erneut spielen möchtest, gibt es auch andere Enden!", -- A_Classic_Fairytale:epil +["If you wish to restart the course, hold [Precise] while your turn ends (e.g with Skip)!|"]="Wenn du den Hindernislauf neustarten willst, drücke [Genaues Zielen], während dein Zug endet (z.B. mit Überspringen)!|", +["Igmund"] = "Igmund", -- User_Mission_-_Nobody_Laugh +["I grew sick of the oppression! I broke free!"] = "Ich hatte genug von der Unterdrückung! Ich bin ausgebrochen!", -- A_Classic_Fairytale:queen +["I guess I can't go far without fuel!"] = "Ich fürchte, ohne Treibstoff komme ich nicht weit!", -- A_Space_Adventure:cosmos +["I guess we lost him!"]="Ich glaube, wir haben ihn verloren!", +["I guess you'll have to kill them."]="Ich fürchte, du musst sie töten.", +["I have come to make you an offering..."]="Ich bin gekommen, um dir ein Angebot zu machen.", +["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."]="Ich hörte, dass die örtlichen Stämme sagen, dass vor vielen Jahren einige PAdI-Wissenschaftler ihren Müll dort abgeliefert haben.", -- A_Space_Adventure:desert01 +["I have more important things to do!"] = "Ich hab wichtigere Dinge zu erledigen!", -- A_Classic_Fairytale:queen +["I have no idea where that mole disappeared...Can you see it?"]="Ich habe keine Ahnung, wohin dieser Maulwurf verschwunden ist. Kannst du ihn sehen?", +["I have only 3 hogs available and they are all cadets."]="Ich habe nur 3 Igel, und sie sind alle Kadetten.", -- A_Space_Adventure:fruit01 +["I have to follow that alien."]="Ich muss diesen Außerirdischen finden.", +["I have to get back to the village!"]="Ich muss ins Dorf zurückkehren!", +["I have to reach the surface as quickly as I can."]="Ich muss die Oberfläche so schnell wie möglich erreichen.", -- A_Space_Adventure:desert02 +["I hope you are prepared for a small challenge, young one."]="Ich hoffe, du bist für eine kleine Herausforderung gewappnet, Jüngling.", ["I just don't want to sink to your level."]="Ich will nicht auf dein Niveau herabsinken.", -["Let us help, too!"]="Lass uns auch helfen!", -["No. You and the rest of the tribe are safer there!"]="Nein. Du und der Rest deines Stammes sind hier sicherer!", -["! You bastards!"]="! Ihr Bastarde!", -["They killed "]="Sie töteten ", -["! Why?!"]="! Wieso?", -["That was just mean!"]="Das war einfach nur gemein!", -["Oh no, not "]="Oh nein, nicht ", -["? Why?"]="? Warum", -["Why "]="Warum, ", -[" ever done to you?!"]=" jemals angetan?!", -["What has "]="Was hat dir ", -["Backstab"]="Verrat", -["Defeat the cannibals"]="Besiege die Kannibalen", -["The food bites back"]="Das Essen beißt zurück", -["Drills"]="Bohrer", -["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, bis die nächste Welle ankommt.|Stell sicher, dass die ankommenden Kannibalen auf die passende Weise begrüßt werden.|Wenn der Igel stirbst, die die Mission verloren.|Tipp: Vielleicht solltest du ein paar Minen benutzen.", -["Judas"]="Judas", -["Kill the traitor...or spare his life!|Kill him or press [Precise]!"]="Töte den Verräter … oder verschone ihn!|Töte ihn oder drücke [Genaues Zielen]!", -["Brutus"]="Brutus", -["You have failed to save the tribe!"]="Du hast es nicht geschafft, den Stamm zu retten!", -["Natives"]="Eingeborene", -["Tribe"]="Stamm", -["011101001"]="011101001", -["You have killed an innocent hedgehog!"]="Du hast einen unschuldigen Igel getötet!", -["That ought to show them!"]="Das wird ihnen eine Lehre sein!", -["Guys, do you think there's more of them?"]="Leute, glaubt ihr, dass es noch mehr von ihnen gibt?", -["Where are they?!"]="Wo sind sie?!", -["These primitive people are so funny!"]="Diese primitiven Leute sind so lustig!", +["I just forgot all checkpoints of incomplete missions."] = "Ich hab soeben alle Kontrollpunkte in meinen halbfertigen Missionen vergessen.", -- A_Space_Adventure:cosmos +["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.", +["I … like being with you, too."] = "Ich … mag es auch, mit dir zusammen zu sein.", -- A_Classic_Fairytale:epil +["I'll get him!"]="Den schnapp ich mir!", +["I'll hold them off while you return to the village!"]="Ich halte sie zurück, während du zum Dorf zurückkehrst.", +["I'll let you know whatever I know about him if you manage to catch me 3 times."]="Ich lass dich wissen, was ich über ihn weiß, wenn du es schaffst, mich 3 mal zu fangen.", -- A_Space_Adventure:moon02 +["I'll make good use of it."]="Ich werde es klug anwenden.", -- A_Space_Adventure:cosmos +["I'll protect you!"] = "Ich werde dich beschützen!", -- A_Classic_Fairytale:epil +["I love Dense Cloud now!"] = "Ich liebe jetzt Dichte Wolke!", -- A_Classic_Fairytale:epil +["I love you."] = "Ich liebe dich.", -- A_Classic_Fairytale:epil +["I'm afraid I can't let you proceed!"] = "Ich fürchte, ich kann euch nicht weitergehen lassen.", -- A_Classic_Fairytale:queen +["I'm afraid we cannot afford that."] = "Ich fürchte, wir können uns das nicht leisten.", -- A_Classic_Fairytale:queen +["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"]="Stell dir vor, diese Zielscheiben sind die Wölfe, die eine Eltern getötet haben! Lass deine Wut an ihnen aus!", +["I'm...alive? How? Why?"]="Ich lebe? Wie? Warum?", +["I'm a ninja."]="Ich bin ein Ninja.", +["I marked the place of their arrival. You're welcome!"]="Ich habe ihren Ankunftsort markiert. Gern geschehen!", +["I may lost this battle, but I haven't lost the war yet!"]="Ich mag vielleicht diese Schlacht verloren haben, aber ich habe den Krieg noch nicht verloren!", +["I'm certain that this is a misunderstanding, fellow hedgehogs!"]="Ich bin mir sicher, dass das ein Missverständnis ist, liebe Igel.", +["I mean, none of you ceased to live."]="Ich meine, niemand von euch hat aufgehört, zu leben.", +["I'm getting old for this!"]="Ich werd zu alt dafür!", +["I'm getting thirsty..."]="Ich hab Durst.", +["I'm glad this is over!"] = "Ich bin froh, dass es vorbei ist!", -- A_Classic_Fairytale:epil +["I'm here to help you rescue her."]="Ich bin hier, um dir bei ihrer Rettung zu helfen.", +["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.", +["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 +["I'm so scared!"]="Ich hab solche Angst!", +["I'm still low on hogs. If you are not afraid I could use a set of extra hands."]="Ich habe immer noch wenige Igel. Wenn du keine Angst hast, könnte ich etwas Unterstützung gebrauchen.", -- A_Space_Adventure:fruit02 +["I'm still with the aliens."] = "Ich bin immer noch auf der Seite der Außerirdischen.", -- A_Classic_Fairytale:queen +["I'm terribly sorry!"] = "Es tut mir fürchterlich Leid!", -- A_Classic_Fairytale:queen +["I'm the spy! I've been giving you out!"] = "Ich bin der Spion! Ich hab euch verraten!", -- A_Classic_Fairytale:queen +["In am also entrusting you with some rope"]="Ich werde dir auch etwas Seil anvertrauen.", +["In am also entrusting you with some rope."] = "Ich werde dir außerdem etwas Seil anvertrauen.", -- A_Space_Adventure:cosmos +["In case you haven't noticed, I'm a woman, too!"] = "Falls du es noch nicht bemerkt hast, ich bin auch eine Frau!", -- A_Classic_Fairytale:queen +["Incredible..."]="Unglaublich.", +["Indestructible Girder: [2]"] = "Unzerstörbarer Bauträger: [2]", -- HedgeEditor +["Indestructible Land: [2]"] = "Unzerstörbares Land: [2]", -- HedgeEditor +["Indestructible Land"]="Unzerstörbares Gelände", +["In each round, the worst hedgehog of the round is eliminated."] = "In jeder Runde wird der schlechteste Igel der Runde eliminiert.", -- TrophyRace ["I need to find the others!"]="Ich muss die anderen finden!", -["I have to follow that alien."]="Ich muss diesem Außerirdischen finden.", -["Assault Team"]="Sturmtruppe", -["Reinforcements"]="Verstärkung", -["Unit 334a$7%;.*"]="Einheit 334a$7%;,*", +["I need to get to the other side of this island, fast!"]="Ich muss auf die andere Seite der Insel gelangen, und zwar schnell!", +["I need to move the tribe!"]="Ich muss den Stamm von hier fortführen.", +["I need to prevent their arrival!"]="Ich muss ihre Ankunft verhindern!", +["I need to warn the others."]="Ich muss die anderen warnen.", +["In fact, you are the only one that's been acting strangely."]="Tatsächlich bist du der Einzige, der sich seltsam benahm.", +["Initiate escape wish!"] = "Fluchtwunsch initiiert!", -- A_Classic_Fairytale:queen +["In order to get to the other side, you need to get rid of the crates first."] = "Um auf die andere Seite zu gelangen, musst du zuerst die Kisten los werden.", -- A_Classic_Fairytale:dragon +["Insanity!"] = "Wahnsinn!", -- Mutant +["Inside %d"] = "Innen %d", -- WxW +["Inside"] = "Innen", -- WxW +["Instructions"] = "Anleitung", -- Basic_Training_-_Flying_Saucer +["Instructor"]="Ausbilder", +["Insufficient Power"]="Unzureichende Energie", +["Interesting idea, haha!"]="Interessanter Gedanke, haha!", +["Interesting! Last time you said you killed a cannibal!"]="Interessant. Das letzte Mal sagtest du, dass du einen Kannibalen getötet hast.", +["In the Ice Planet Flying Saucer Stadium ..."]="Im Stadion der fliegenden Untertassen auf dem Eisplaneten …", +["In the meantime, take these and return to your \"friend\"!"]="In der Zwischenzeit, nimm diese und kehr zu deinem »Freund« zurück!", +["In this accident, Professor Hogevil lost all his spines on his head!"]="Bei diesem Unfall hat Professor Bösigel all seine Stacheln auf seinem Kopf verloren!", -- A_Space_Adventure:moon02 +["In this mission you get %d%% fuel."] = "In dieser Mission erhälst du %d%% Treibstoff.", -- User_Mission_-_Diver +["In this mission you have infinite time."] = "In dieser Mission hast du unendlich viel Zeit.", -- portal +["Invalid Placement"]="Ungültige Position", +["Invasion"]="Invasion", +["In your best (and only) flight you took out %d crates with one RC plane!"]="In deinem besten (und einzigem) Flug hast du %d Kisten mit einem Funkflugzeug zerstört!", +["In your best flight you took out %d crates with one RC plane."]="In deinem besten Flug hast du %d Kisten mit einem Funkflugzeug zerstört.", +["I of course will observe the battle and intervene if necessary"]="Ich werde natürlich die Schlacht beobachten und, wenn nötig, einschreiten.", +["I regret to end your little odyssey."] = "Ich bereue es, eure kleine Odyssee zu beenden.", -- A_Classic_Fairytale:queen +["I saw it with my own eyes!"]="Ich sah es mit meinen eigenen Augen!", +["I see..."]="Ich verstehe …", +["I see you already took care of your enemies."] = "Ich sehe, du hast dich bereits um deine Feinde gekümmert.", -- A_Classic_Fairytale:dragon +["I see you have already taken the leap of faith."]="Ich sehe, du hast bereits den Mutsprung absolviert.", +["I see you would like his punishment to be more...personal..."]="Ich sehe, du möchtest, dass seine Bestrafung etwas … persönlicher ausfällt.", +["I sense another wave of cannibals heading my way!"]="Ich nehme eine weitere Kannibalenwelle wahr, sie marschiert direkt auf mich zu!", +["I sense another wave of cannibals heading our way!"]="Ich nehme eine weitere Kannibalenwelle wahr, sie marschiert direkt auf uns zu!", +["I should get myself a portal device, maybe this crate has one."] = "Ich sollte mir ein Portalgerät holen, vielleicht hat diese Kiste ja eins.", -- portal +["I should go now, goodbye!"]="Ich sollte jetzt gehen. Tschüss!", +["I shouldn't have drunk that last pint."]="Ich sollte nicht die ganze Flasche ausgetrunken haben.", +["%i s"] = "%i s", -- Gravity +["Is this place in my head?"]="Ist dieser Ort in meinem Kopf?", +["I still can't believe he sold us out like that."] = "Ich kann immer noch nicht glauben, dass er uns so hintergangen hat.", -- A_Classic_Fairytale:epil +["I still can't believe you forgave her!"] = "Ich kann immer noch nicht glauben, dass du ihr vergeben hast!", -- A_Classic_Fairytale:epil +["I still have to collect the crates."] = "Ich muss immer noch die Kisten aufsammeln.", -- A_Classic_Fairytale:dragon +["I still have to get rid of the crates."] = "Ich muss immer noch die Kisten los werden.", -- A_Classic_Fairytale:dragon +["Itami"] = "Itami", -- +["It doesn't matter. I won't let that alien hurt my daughter!"]="Es ist egal. Ich werde diesen Außerirdischen nicht meine Tochter weh tun lassen!", +["I think I love you!"] = "Ich denke, ich liebe dich!", -- A_Classic_Fairytale:epil +["I think we are safe here."]="Ich glaub, hier sind wir in Sicherheit.", +["I thought their shaman died when he tried our medicine!"]="Ich dachte, ihr Schamane starb, als er unsere Medizin probierte.", +["It is called 'Hogs of Steel'."]="Sie heißt »Igel aus Stahl«.", +["It is time to practice your fighting skills."]="Es ist Zeit, dein Kämpfen zu üben.", +["It must be a childhood trauma..."]="Es muss ein Kindheitstrauma sein.", +["It must be the aliens' deed."]="Das muss die Tat der Außerirdischen sein.", +["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!", +["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 Karrotten an, weißt du?", -- A_Classic_Fairytale:epil +["It's always up to women to clear up the mess men created!"]="Es bleibt immer an Frauen hängen, das Chaos, das Männer hinterlassen haben, aufzuräumen!", +["It's amazing how quickly our lives can change."] = "Es ist erstaunlich, wie schnell sich unsere Leben ändern können.", -- A_Classic_Fairytale:epil +["It's an ancient ritual of theirs."] = "Das ist eines ihrer antiken Rituale.", -- A_Classic_Fairytale:queen +["IT'S A SERIOUS MEDICAL CONDITION!"] = "DAS IST EINE SEHR ERNSTE KRANKHEIT!", -- A_Classic_Fairytale:queen +["It's a shame, I forgot how to do that!"]="Zu dumm, ich habe vergessen, wie man das macht.", +["It's a shame, really!"] = "Das ist wirklich eine Schande!", -- A_Classic_Fairytale:queen +["It seems that Professor Hogevil has prepared for your arrival!"]="Es scheint, dass sich Professor Bösigel sich auf deine Ankunft vorbereitet hat!", +["It's empty!"] = "Leer!", -- Battalion +["It's impossible to communicate with the spirits without a shaman."]="Es ist unmöglich, ohne einen Schamanen mit den Geistern zu kommunizieren.", +["It's not that easy, so listen carefully:"] = "Ist nicht einfach, also pass auf:", -- Basic_Training_-_Flying_Saucer +["It's over..."]="Es ist vorbei.", +["It's precious to me!"] = "Es ist wertvoll für mich!", -- A_Classic_Fairytale:queen +["It's time you learned that your actions have consequences!"]="Es ist Zeit, dass du lernst, dass dein Handeln Konsequenzen haben wird!", +["It's worth more than wood!"]="Es ist wertvoller als Holz!", +["It's your fault you're there!"] = "Es ist deine Schuld, dass du dort bist!", -- A_Classic_Fairytale:epil +["It wants our brains!"]="Es will unsere Gehirne!", +["It was all a trick?!"] = "Es war alles ein Trick?", -- A_Classic_Fairytale:queen +["It was all just bad luck!"]="So ein Pech!", +["It was completely useless!"] = "Das war vollkommen nutzlos!", -- A_Space_Adventure:final +["It was fun to watch."] = "Es war lustig, zuzusehen.", -- A_Classic_Fairytale:queen +["It was fun to watch, though."] = "Aber es war lustig, zuzusehen.", -- A_Classic_Fairytale:queen +["It was not a dream, unwise one!"]="Es war kein Traum, du Tor!", +["It wasn't her fault!"] = "Es war nicht ihr Fehler!", -- A_Classic_Fairytale:epil +["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "Es wäre schlauer, das Raumschiff zu stehlen, während die PAdI-Wächter eine Pause machen!", -- A_Space_Adventure:cosmos +["Ivan"] = "Iwan", -- +["I've made it! Yeah!"] = "Ich hab's geschafft! Hurra!", -- A_Space_Adventure:moon01 +["I've seen this before. They just appear out of thin air."]="Ich hab das zuvor gesehen. Sie tauchen einfach aus dem Nichts auf.", +["I've thought that the best way to get the device is to let you collect most of the parts for me!"]="Ich dachte mir, dass es am einfachsten ist, wenn ich dich einfach die meisten Bauteile für mich sammeln lasse.", +["I want to play a game..."]="Ich möchte ein Spiel spielen.", +["I want to see how it handles this!"]="Ich will sehen, wie es damit klar kommt.", +["I was heading home, you see!"] = "Ich war auf dem Weg nach Hause, versteht ihr?", -- A_Classic_Fairytale:queen +["I was so scared."] = "Ich hatte solche Angst.", -- A_Classic_Fairytale:epil +["I was told that as the leader of the king's guard, no one knows this world better than you!"]="Mir wurde gesagt, dass, als der Führer der königlichen Garde, niemand diese Welt besser als du kennst!", +["I will never hand you the parts!"]="Niemals gebe ich dir die Teile!", +["I wish to help you, %s!"] = "Ich möchte dir helfen, %s!", -- A_Classic_Fairytale:dragon +["I wonder where Dense Cloud is..."]="Ich frag mich, wo Dichte Wolke ist.", +["I wonder why I'm so angry all the time..."]="Ich frag mich, warum ich die ganze Zeit so wütend bin.", +["I won't let you kill her!"]="Ich werde nicht zulassen, dass du sie umbringst!", +["I won't let you kill the tribe!"] = "Ich werde nicht zulassen, dass du den Stamm massakrierst!", -- A_Classic_Fairytale:queen +["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."]="Ich würde dir gerne helfen, wenn wir diese Schlacht gewinnen, aber unter diesen Bedingungen kann ich dir nur helfen, wenn du an unserer Seite kämpfst.", ["Jack"]="Jochen", -["Steve"]="Steffen", -["Zork"]="Zork", -["Elmo"]="Elmo", -["Lee"]="Leo", -["Rachel"]="Ramona", +["Jason"] = "Jason", -- ["Jeremiah"]="Jeremias", -["Segmentation Paul"]="Se Gmentf Ehler", -["Syntax Errol"]="Syntaxfehlel", -["Unexpected Igor"]="Ausnahmefelix", -["Bullseye"]="Volltreffer!", -["Die, die, die!"]="Stirb, stirb, stirb!", -["Yeah, take that!"]="Jawohl, nimm das!", -[" to save the village."]=" ab, um das Dorf zu retten.", -["With the rest of the tribe gone, it was up to "]="Ohne den Rest des Stammes, hing es von ", -["But it proved to be no easy task!"]="Aber es war keine einfache Aufgabe!", -["What a strange cave!"]="Was für eine seltsame Höhle!", +["Jetpack"] = "Jetpack", -- Big_Armory +["Jigglypuff"] = "Pummeluff", -- +["Jim Morgan"] = "Tim Morgen", -- +["Jimmy"] = "Jimmy", -- +["Jingo"] = "Dingo", -- +["Joe"]="Sepp", +["John"]="Jonas", +["John Snow"]="Jonas Schnee", +["Jolly Roger"] = "Totenkopf", -- +["Jones"] = "Jonas", -- +["Judas"]="Judas", +["Juicy"] = "Saft", -- +["Jumping is disabled"]="Sprünge sind deaktiviert!", +["Just kidding, none of you have died!"]="Nur ein Witz! Niemand von euch ist gestorben!", +["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!"] = "Kabumm!", -- Basic_Training_-_Flying_Saucer +["Kamikaze Expert! +15 points!"] = "Kamikazeexperte! +15 Punkte", -- Space_Invasion +["Kamikaze"]="Kamikaze", +["Keep it up!"]="Weiter so!", +["Ken"] = "Ken", -- +["Kenshi"] = "Kenshi", -- +["Kerguelen"]="Kerguelen", +["key."]="Taste.", +["Kill all enemy hedgehogs in a single turn."] = "Töte alle gegnerischen Igel in einem Zug.", -- Big_Armory +["Kill him or skip your turn."] = "Töte ihn oder überspringe deinen Zug.", -- A_Classic_Fairytale:backstab +["Killing spree!"]="Blutrausch!", +["Killing the specialists"]="Die Spezialisten töten", +["KILL IT!"]="TÖTE ES!", +["Kills: %d"] = "Getötet: %d", -- Space_Invasion +["Kill the aliens!"]="Töte die Außerirdischen!", +["Kill the cannibal!"]="Töte den Kannibalen!", +["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 ---"] = "--- König ---", -- Battalion +["Knight"]="Ritter", +["Knives"] = "Messer", -- +["Knockball"] = "Schlagball", -- Knockball +["Knockball weapon"] = "Schlagball-Waffe", -- Knockball +["Knock off the enemies from the left-most place of the map!"] = "Schubs die Feinde vom linken Kartenrand.", -- A_Space_Adventure:fruit01 +["koda"] = "koda", -- +["Kostya"] = "Kostya", -- +["Lady Mango"]="Frau Mango", +["LandFlag Modification Mode"]="LandFlag-Modifikationsmodus", +["Land mines explode instantly."] = "Landminen explodieren sofort.", -- User_Mission_-_Teamwork_2 +["Land Spray"]="Landkanone", +["Lassard"] = "Lampert", -- +["Last Resort: Having less than 25% base health gives kamikaze"] = "Letzte Wahl: Igel mit unter 25% Grundgesundheit erhalten Kamikaze", -- Battalion +["Last Target!"]="Letzte Zielscheibe!", +["Last wave in 3 turns"]="Letzte Welle in 3 Zügen", +["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 +["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!", +["Leaks A Lot"]="Undichte Stelle", +["Led Heart"]="Geführtes Herz", +["Lee"]="Leo", +["Left and right"] = "Links und rechts", -- WxW +["Left, right and roof"] = "Links, rechts und Decke", -- WxW +["[Left], [Right]: Change between identities."]="[Links], [Rechts]: Identitäten wechseln.", +["[Left], [Right]: Change between selection and placement mode."]="[Links], [Rechts]: Zwischen Auswahl- und Verlegungsmodus wechseln.", +["[Left], [Right]: Change between tagging modes."]="[Links], [Rechts]: Zwischen Markierungsmodi wechseln.", +["[Left], [Right]: Change health value."]="[Links], [Rechts]: Gesundheitswert auswählen", +["[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|Cursor: Build structure"] = "Links/rechts: Gebäudetyp wählen|Cursor: Gebäude bauen", -- Construction_Mode +["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 go home!"]="Lasst uns nach Hause gehen!", +["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!", +["Let them have a taste of my fury!"]="Lasst sie von meinem Zorn kosten!", +["Let us help, too!"]="Lasst uns auch helfen!", +["Level 1 clear!"]="Level 1 abgeschlossen!", +["Level 2 clear!"]="Level 2 abgeschlossen!", +["Level Data Saved!"]="Leveldaten gesichert!", +["Lightbender"] = "Leuchte", -- +["Light Cannfantry"]="Leichte Kannfantrie", +["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."]="Hör gut zu! Der Anführer der Banditen, Thanta, hat neulich ein sehr seltsames Gerät gefunden.", -- A_Space_Adventure:ice01 +["Listen up, maggot!!"]="Aufgepasst, du Made!", +["Little did they know that this hunt will mark them forever..."]="Sie ahnten nicht, dass diese Jagd sie für immer zusammenschweißen würde.", +["Lively Lifeguard"] = "Lebhafter Lebensretter", -- User_Mission_-_That_Sinking_Feeling +["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"]="Einsame Heuler: (Erhöhe das Wasser, wenn kein Igel im Kreis ist und richte 6 Schaden auf alle gegnerischen Igel an.)", +["Lonely Hog"]="Einsamer Igel", +["Long Live The Queen"] = "Lang lebe die Königin", -- A_Classic_Fairytale:queen +["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!", +["Loon"] = "Spinner", -- The_Specialists +["Loopy"] = "Gaga", -- +["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 +["Lt. Luke"] = "Lt. Lukas", -- +["Lucifer"] = "Luzifer", -- portal +["Luck: %d%% (modifier for crates)"] = "Glück: %d%% (Modifikator für Kisten)", -- Battalion +["Luckily, I've managed to snatch some of them."]="Glücklicherweise konnte ich mir ein paar davon ergattern.", +["Ludicrous kill!"] = "Verrückter Killer!", -- Mutant +["Lugia"] = "Lugia", -- +["Luigi"] = "Luigi", -- +["Made it!"]="Geschafft!", +["Mahoney"] = "Maha", -- +["Make fun of me when I fart …"] = "Macht euch über mich lustig, wenn ich furze …", -- A_Classic_Fairytale:queen +["Manual: https://hedgewars.org/hedgeeditor"] = "Anleitung (Englisch): https://hedgewars.org/hedgeeditor", -- HedgeEditor +["Many long forgotten things can be found in the same tunnels that we are about to explore!"]="Viele vergessene Dinge können in den selben Tunneln, die wir gleich erforschen werden, finden.", +["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 +["- Massive weapon bonus on first turn"]="- Großer Waffenbonus am ersten Zug", +["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 +["Maybe you should try an easier TechRacer map."] = "Vielleicht solltet ihr eine leichtere TechRacer-Karte ausprobieren.", -- TechRacer +["Maybe you should try easier waypoints next time."] = "Vielleicht solltet ihr beim nächsten Mal mit leichteren Wegpunkten spielen.", -- Racer +["May the spirits aid you in all your quests!"]="Mögen die Geister dich in all deinen Aufgaben begleiten!", +["Meals"] = "Mampf", -- +["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"]="Medizin: (Feuere eine explodierende Medizin, die alle Igel im Explosionsradius heilen wird)", +["Medic"]="Sanitäter", +["MEDIUM"]="MITTEL", +["Mega kill!"] = "Megakiller!", -- Mutant +["Meiwes"]="Meiwes", +["mikade"] = "mikade", -- +["milliseconds"]="Millisekunden", +["Mindy"]="Intellekta", +["Mine Deployer"]="Minenleger", +["Mine Deployer selected!"] = "Minenleger ausgewählt!", -- Tumbler +["Mine Eater"] = "Minenfresser", -- Tumbler +["Mine Placement Mode"]="Minenplatzierungsmodus", +["MINE PLACEMENT MODE"]="MINENPLATZIERUNGSMODUS", +["Mines explode after %d s."] = "Minen explodieren nach %d s.", -- Mutant +["Mines time: 0 seconds"] = "Minenzeitzünder: 0 Sekunden", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +["Mines time: 1.5 seconds"] = "Minenzeitzünder: 1,5 Sekunden", -- A_Space_Adventure:death01 +["Mines time: 1 second"] = "Minenzeitzünder: 1 Sekunde", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +["Mines time: 3 seconds"] = "Minenzeitzünder: 3 Sekunden", -- A_Classic_Fairytale:journey +["Mines time: 5 seconds"] = "Minenzeitzünder: 5 Sekunden", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:journey +["Mine Strike"]="Minen-Luftangriff", +["Minion"]="Lakai", +["Minions"]="Lakaien", +["Mission failed!"] = "Mission fehlgeschlagen!", -- Big_Armory +["MISSION FAILED"]="MISSION GESCHEITERT", +["Mission failure in %d s"] = "Niederlage in %d s", -- Big_Armory +["Mission lost!"] = "Mission fehlgeschlagen!", -- Basic_Training_-_Grenade +["MISSION SUCCESSFUL"]="MISSION ERFOLGREICH", +["Mission won!"] = "Mission erfolgreich!", -- Basic_Training_-_Grenade +["Mister Pear"]="Herr Birne", +["Mixed %d"] = "Gemischt %d", -- WxW +["Mixed"] = "Gemischt", -- WxW +["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "Modi: Aktiviere einen anderen Spielmodus, indem du|»highland«, »king« oder »points« als »mode=«|in den Skriptparameter einträgst", -- Battalion +["Modifiers: Unlimited ammo, per-hog ammo"] = "Modifikatoren: Unbegrenzte Munition, Igelwaffen", -- Battalion +["Modifiers: Unlimited ammo, shared clan ammo"] = "Modifikatoren: Unbegrenzte Munition, Klans teilen sich Waffen", -- Battalion +["Modify Sprite under Cursor: [Left Click]"] = "Sprite unter Cursor modifizieren: [Linksklick]", -- HedgeEditor +["Molly"] = "Molle", -- +["Molotov"]="Molotowcocktail", +["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 in marked with blue color"]="Der Großteil des zerstörbaren Geländes ist mit einer blauen Farbe markiert.", +["Most of the time you'll be able to use the freezer only."] = "Die meiste Zeit wirst du nur die Eiskanone benutzen können.", -- A_Space_Adventure:ice01 +["Most of the time you'll be able to use the icegun only."] = "Die meiste Zeit wirst du nur die Eiskanone benutzen können.", -- A_Space_Adventure:ice01 +["Movement: [Up], [Down], [Left], [Right]"]="Bewegen: [Hoch], [Runter], [Links], [Rechts]", +["Mr Mango"]="Mister Mango", +["Mudkip"] = "Hydropi", -- +["Multi-shot! +15 points!"] = "Multischuss! +15 Punkte!", -- Space_Invasion +["Muriel"]="Muriel", +["Muscle Dissolver"]="Muskellöser", +["Mushroom Kingdom"] = "Pilzkönigreich", -- +["Mutant"]="Mutant", +["My flying saucer stopped working!"] = "Meine fliegende Untertasse funktioniert nicht mehr!", -- A_Space_Adventure:ice01 +["Nade Boy"]="Granatenjunge", +["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"]="Napalm", +["Napalm rocket: [Fire a bomb with napalm!]"]="Napalmrakete: (Feuer eine Bombe mit Napalm ab!)", +["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 +["nemo"] = "nemo", -- +["Neutralize your enemies and be careful!"]="Neutralisiere deine Gegner und sei vorsichtig!", +["New barrels per turn: %d"] = "Neue Fässer pro Zug: %d", -- Tumbler +["New clan record: %.1fs"] = "Neuer Klanrekord: %.1fs", -- Racer, TechRacer +["NEW fastest lap: "]="NEUE schnellste Runde: ", +["New mines per turn: %d"] = "Neue Minen pro Zug: %d", -- Tumbler +["New race record: %.1fs"] = "Neuer Rennrekord: %.1fs", -- Racer, TechRacer +["Newton and the Hammock"] = "Newton und die Hängematte", -- User_Mission_-_Newton_and_the_Hammock +["Next target is ready!"] = "Das nächste Ziel ist bereit!", -- Basic_Training_-_Flying_Saucer +["Next time you play \"Searching in the dust\" you'll have an RC plane available."]="Das nächste Mal, wenn du die Mission »Suche im Staub« spielst, bekommst du ein Funkflugzeug.", +["Next wave in 3 turns"]="Nächste Welle in 3 Zügen", +["Nicely done, meatbags!"]="Gut gemacht, Fleischkugeln!", +["Nice!"]="Nett!", +["Nice! Now hurry and get down! You have to rescue my friends!"]="Nett! Nun beeil dich und komm runter! Du musst meine Freunde retten!", +["Nice, then I should get the part as soon as possible!"]="Interessant, dann sollte ich besser das Teil so früh wie möglich holen!", +["Nice work!"]="Gute Arbeit!", +["Nice work, meatbags!"] = "Gute Arbeit, Fleischklumpen!", -- A_Classic_Fairytale:queen +["Nice work, %s!"] = "Gute Arbeit, %s!", -- A_Classic_Fairytale:dragon +["Nilarian"]="Nilarian", +["Ninja"]="Ninja", +["Ninpo"] = "Ninpo", -- +["Nobody Laugh"]="Niemand darf lachen", +["Nobody managed to finish the race. What a shame!"] = "Niemand hat es geschafft, das Rennen abzuchließen. Welch ein Jammer!", -- Racer, TechRacer +["Nobody takes walks every day!"] = "Niemand geht den ganzen Tag lang spazieren!", -- A_Classic_Fairytale:epil +["No, I am afraid I had to travel light."]="Nein, ich fürchte, dass ich mit wenig Gepäck reisen musste.", -- A_Space_Adventure:moon01 +["No, I came back to help you out..."]="Nein, ich kam zurück, um dir zu helfen.", +["No...I wonder where they disappeared?!"]="Nein. Ich frage mich, wohin sie verschwunden sind?!", +["NomNom"]="Mjamjam", +["Nom-Nom"]="Mjam-Mjam", +["Noooo, Thanta has to stay alive!"]="Nein, Thanta muss am Leben bleiben!", +["Noo, Thanta has to stay alive!"] = "Nein, Thanta muss am Leben bleiben!", -- A_Space_Adventure:ice01 +["Nope. It was one fast mole, that's for sure."]="Nee. Es war ein schneller Maulwurf, das ist klar.", +["No! Please, help me!"]="Nein! Bitte hilf mir!", +["No problem, Captain!"] = "Kein Problem, Leutnant!", -- A_Space_Adventure:fruit01 +["No problem, I would do anything for H!"]="Kein Problem, ich würde alles für H tun!", +["No radar pings left!"] = "Keine Radarpings übrig!", -- Space_Invasion +["Normal Girder: [1]"] = "Normaler Bauträger: [1]", -- HedgeEditor +["Normal Land: [1]"] = "Normales Gelände: [1]", -- HedgeEditor +["Normal Land"]="Normales Gelände", +["NORMAL"]="NORMAL", +["Normal Rubber: [1]"] = "Normales Gummi: [1]", -- HedgeEditor +["Normal Sticky Mine"]="Normale Haftmine", +["North America"]="Nordamerika", +["Not being able to fight or hunt."] = "Nicht in der Lage, zu kämpfen oder zu jagen.", -- A_Classic_Fairytale:queen +["NOT ENOUGH WAYPOINTS"]="NICHT GENUG WEGPUNKTE", +["Note: Some weapons have a second option (See continent information). Find and use them with the \""]="Beachte: Einige Waffen haben eine Zweitoption (Siehe Kontinentinformationen). Finde und benutze sie mit \"", +["Note: We only give you grenades if you stay in your flying saucer."] = "Beachte: Wir geben dir nur Granaten, wenn du in der|fliegenden Untertasse bleibst.", -- Basic_Training_-_Flying_Saucer +["Nothing of interest has happened."] = "Es ist nichts nennenswertes passiert.", -- Space_Invasion +["Not now, Fiery Water!"]="Nicht jetzt, Feuerwasser!", +["Not So Friendly Match"]="Kein-so-Freundschaftsspiel", +["Not you again! My head still hurts from last time!"]="Nicht du schon wieder! Mein Kopf tut mir immer noch vom letzten Mal weh!", +["No waypoint to be removed!"] = "Es gibt keine Wegpunkte zum Entfernen!", -- Racer +["Now collect the 2 crates to the far left and right."] = "Nun sammle die 2 Kisten weit links und rechts auf.", -- Basic_Training_-_Flying_Saucer +["Now collect the next crate!"] = "Und jetzt sammle die nächste Kiste ein!", -- Basic_Training_-_Flying_Saucer +["Now dive just one more time and collect the next crate."] = "Jetzt tauch noch einmal ab und sammle die nächste Kiste ein.", -- +["No, we made sure of that!"]="Nein, wir hatten extra aufgepasst.", +["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"]="Nun finde das nächste Ziel! |Tipp: Normalerweise verlierst du Gesundheit, wenn du herunterfällst, also pass auf!", +["Now for the supreme discipline of saucer flying, the underwater attack."] = "Jetzt kommt die ultimative Disziplin der fliegenden Untertasse, der Unterwasserangriff.", -- Basic_Training_-_Flying_Saucer +["Now go and don't waste more of my time, you coward!"] = "Jetzt geh, und vergeude meine Zeit nicht noch weiter, du Feigling!", -- A_Space_Adventure:fruit01 +["Now go and play the menu mission to complete the campaign."] = "Geh jetzt und spiele die Menümission, um die Kampagne zu beenden.", -- A_Space_Adventure:death01 +["No! What have I done?! What have YOU done?!"]="Nein! Was habe ich getan?! Was hast DU getan?!", +["No. Where did he come from?"]="Nein. Woher kam er?", ["Now how do I get on the other side?!"]="Aber wie komme ich auf die andere Seite?!", -["Dude, what's this place?!"]="Junge, was ist das für ein Ort?!", -["And where's all the weed?"]="Und wo ist all das Gras?", -["Is this place in my head?"]="Ist dieser Ort in meinem Kopf?", -["I shouldn't have drunk that last pint."]="Ich sollte nicht die ganze Flasche ausgetrunken haben.", -["Where did that alien run?"]="Wohin ist dieser Außerirdische gelaufen?", -["When I find it..."]="Wenn ich ihn in die Finger kriege …", -["This is typical!"]="Typisch!", -["It's always up to women to clear up the mess men created!"]="Es bleibt immer an Frauen hängen, das Chaos, das Männer hinterlassen haben, aufzuräumen!", -["What is this place?"]="Was ist dieser Ort?", -["It doesn't matter. I won't let that alien hurt my daughter!"]="Es ist egal. Ich werde diesen Außerirdischen nicht meine Tochter weh tun lassen!", -["Every single time!"]="Jedes Mal!", -["How come in a village full of warriors, it's up to me to save it?"]="Wie kommt es, dass es immer an mir liegt, ein Dorf voller Krieger zu retten?", -["Greetings, "]="Grüße, ", -["As you can see, there is no way to get on the other side!"]="Wie du siehst, gibt es keinen Weg, um auf die andere Seite zu kommen.", -["I wish to help you, "]="Ich möchte dir helfen, ", -["Beware, though! If you are slow, you die!"]="Aber Vorsicht! Wenn du langsam bist, wirst du sterben!", -["Talk about mixed signals..."]="Zuckerbrot und Peitsche …", -["Well, that was a waste of time."]="Tja, das war wohl Zeitverschwendung.", -["You bear impressive skills, "]="Du hast großartige Fähigkeiten, ", -["However, my mates don't agree with me on letting you go..."]="Aber meine Freunde wollen dich nicht gehen lassen …", -["I guess you'll have to kill them."]="Ich fürchte, du musst sie töten.", -["Nice work, "]="Gute Arbeit, ", -["As a reward for your performance, here's some new technology!"]="Als Belohnung für deine Leistung gebe ich dir eine neue Technologie!", -["Use it wisely!"]="Benutze sie weise!", -["Dragon's Lair"]="Die Höhle des Löwen", -["In order to get to the other side, you need to collect the crates first.|"]="Um auf die andere Seite zu gelangen, musst du zuerst die Kisten einsammeln.|", +["Now I have to climb these trees"]="Jetzt muss ich diese Bäume hochklettern.", +["Now let's try to drop weapons while flying!"] = "Jetzt versuch mal, Waffen während des Flugs abzuwerfen!", -- Basic_Training_-_Flying_Saucer +["Now listen carefully! Below us there are tunnels that have been created naturally over the years"]="Jetzt hör gut zu! Unter uns sind Tunnel, welche über die Jahre natürlich entstanden sind.", +["Now use it and go to the moon PAotH station to get more fuel!"]="Benutze sie jetzt und komme zur PAdI-Mondbasis, um mehr Treibstoff zu holen!", +["Now you have the chance to try and claim the place that you deserve among the best."]="Jetzt hast du die Gelegenheit, es selbst zu versuchen, und dir einen Rang unter den Besten zu verdienen.", -- A_Space_Adventure:ice02 +["No. You and the rest of the tribe are safer there!"]="Nein. Du und der Rest deines Stammes sind hier sicherer!", +["Objective completed! Now land safely."] = "Aufgabe erledigt! Lande jetzt vorsichtig.", -- Basic_Training_-_Flying_Saucer +["Objectives"]="Ziele", +["Object Placer"] = "Objektplatzierer", -- Construction_Mode +["Obliterate them!|Hint: You might want to take cover..."]="Vernichte sie!|Tipp: Du solltest in Deckung gehen.", ["Obstacle course"]="Hindernislauf", -["As the ammo is sparse, you might want to reuse ropes while mid-air.|"]="Da die Munition knapp ist, solltest du vielleicht Seile in der Luft wiederverwenden.|", -["If you wish to restart the course, hold [Precise] while your turn ends (e.g with Skip)!|"]="Wenn du den Hindernislauf neustarten willst, drücke [Genaues Zielen], während dein Zug endet (z.B. mit Überspringen)!|", -["The enemy can't move but it might be a good idea to stay out of sight!|"]="Der Feind kann sich nicht bewegen, aber es wäre besser, aus seiner Schusslinie zu bleiben!|", -[" turns until Sudden Death! Better hurry!"]=" Züge bis zum Sudden Death! Beeilung!", -["You have "]="Du hast ", -["Kill the aliens!"]="Töte die Außerirdischen!", -["The Slaughter"]="Die Schlachtung", -["The what?!"]="Die was?!", -["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 Gewehr, um zum letzten Ziel zu kommen.|", +["Of course, but you're … special."] = "Natürlich, aber du bist … besonders.", -- A_Classic_Fairytale:epil +["Of course I am!"] = "Natürlich bin ich das!", -- A_Classic_Fairytale:queen +["Of course I have to save her. What did I expect?!"]="Natürlich muss ich sie retten. Was habe ich erwartet?", +["Of course! It's all obvious now!"] = "Natürlich! Jetzt ergibt alles einen Sinn!", -- A_Classic_Fairytale:epil +["Of course, I will observe the battle and intervene if necessary."] = "Natürlich werde ich dem Kampf zusehen und eingreifen, falls es nötig sein sollte.", -- A_Space_Adventure:fruit01 +["OH, COME ON!"]="ACH, KOMM!", +["Oh man! Learn how to fly!"]="Oh, Mann! Lern erstmal fliegen!", +["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! 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.", +["Oh, that. We were just having fun!"] = "Oh, das. Wir hatten nur Spaß!", -- A_Classic_Fairytale:queen +["Oh yes! I got the device part! Now it belongs to me alone."] = "Jawoll! Ich hab das Geräteteil! Nun gehört es mir ganz allein.", -- A_Space_Adventure:fruit02 +["Okay, I'll be extra careful!"] = "In Ordnung, ich werde besonders vorsichtig sein!", -- A_Space_Adventure:desert01 +["Okay then!"] = "Okay!", -- A_Space_Adventure:fruit02 +["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "Okay, dann musst du gehen und ein paar der Waffen, die wir für Notfälle versteckt haben, nehmen.", -- A_Space_Adventure:moon01 +["OK, I'll be extra careful!"]="Okay, ich werde besonders vorsichtig sein!", +["Ok then!"]="Alles klar!", +["Ok, then you have to go and take some of the weapons we have hidden in case of an emergency!"]="Okay, dann musst du gehen und ein paar der Waffen, die wir für den Notfall versteckt haben, nehmen.", +["Old One Eye"] = "Alter Einaug", -- +["Oleg"] = "Oleg", -- +["Olive"]="Olive", +["Omnivore"]="Allesfresser", +["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."]="Es waren einmal zwei Stämme, die lebten auf einer Insel mit vielen natürlichen Rohstoffen und waren in einem bitteren Konflikt …", +["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "Sobald du den Auslöser betätigst, ist Herr Mine nicht mehr dein Freund.", -- ClimbHome +["One does not simply rope to the moon!"] = "Niemand schwingt sich einfach so mit dem Seil zum Mond hinauf!", -- A_Space_Adventure:cosmos +["One flower: Incomplete side missions"] = "Eine Blume: Unfertige Nebenmissionen", -- A_Space_Adventure:cosmos +["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 the best pilots can master the following stunts."] = "Nur die besten Piloten können die folgenden Stunts meistern.", -- Basic_Training_-_Flying_Saucer +["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 +["On the Ice Planet, where ice rules ..."]="Auf dem Eisplaneten, wo das Eis herrscht …", -- A_Space_Adventure:ice01 +["On the other side of the moon ..."]="Auf der anderen Seite des Mondes …", -- A_Space_Adventure:moon02 +["On the Planet of Sand, you have to double check your moves ..."] = "Auf dem Planeten des Sandes musst du deine Züge doppelt überdenken …", -- A_Space_Adventure:desert01 +["On this map you get %d%% fuel."] = "Auf dieser Karte erhälst du %d%% Treibstoff.", -- TechRacer +["On this map you get infinite fuel."] = "Auf dieser Karte erhälst du unbegrenzten Treibstoff.", -- TechRacer +["Oops...I dropped them."]="Upps, ich habe sie fallen gelassen.", +["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!", +["Open that crate and we will continue!"]="Öffne diese Kiste und wir werden fortfahren!", +["Opposing Team: "]="Gegnerisches Team: ", +["Orange"] = "Orange", -- +["Orlando Boom!"]="Orlando Bumm!", +["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "Oder lass den nächsten Spieler Wegpunkte platzieren,|wenn weniger als 2 Wegpunkte platziert worden sind.", -- Racer +["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "Oder vielleicht war all das ein böser Plan, so böse, dass selbst Prof. Bösigel nicht drauf gekommen wäre.", -- A_Space_Adventure:final +["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "Oszillierende Schwerkraft: Schwerkraft ändert sich periodisch von %i%% bis %i%% mit einer Periode von %s", -- Gravity +["Other kills don't give you points."]="Andere Abschüsse bringen keine Punkte.", +["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."]="Autsch! Das muss wehgetan haben. %s (%s) ist mit %d auf den Boden aufgeschlagen.", +["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."]="Autsch! Das muss wehgetan haben. Du hast deinen armen Igel mit %d Schaden verstümmelt.", +["Our tribe, our beautiful island!"]="Unser Stamm, unsere schöne Insel!", +["Out of ammo!"] = "Munition ist alle!", -- Tumbler +["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", +["Parachute"]="Fallschirm", +["Patches"] = "Flick", -- +["Pathetic Resistance"]="Erbärmlicher Widerstand", +["Paul McHoggy"]="Paul McIgel", +["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: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"]="Pinguinröhren: (Richte 15 Schaden + 10% deiner Igelgesundheit auf alle Igel um dich herum und bekomme 2/3 zurück)", +["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 +["Per team weapons"]="Waffen pro Team", +["Pfew! That was close!"]="Puh! Das war knapp!", +["Phosphat"] = "Phosphat", -- portal +["Physicist"]="Physiker", +["Piano Strike"]="Piano-Angriff", +["PickHammer"]="Presslufthammer", +["Pikachu"] = "Pikachu", -- +["Pings left: %d"] = "Verbleibende Pings: %d", -- Space_Invasion +["Pink"] = "Rosa", -- +["Pirates"] = "Piraten", -- +["Place 2-%d waypoints using the waypoint placement tool."] = "Platziere 2-%d Wegpunkte mit dem Wegpunktplatzierungswerkzeug.", -- Racer +["Place 2 waypoints using the waypoint placement tool."] = "Platziere 2 Wegpunkte mit dem Wegpunktplatzierungswerkzeug.", -- Racer +["Place air mines"] = "Platziere Luftminen", -- HedgeEditor +["Place barrels"] = "Platziere Pulverfässer", -- HedgeEditor +["Place cleavers"] = "Platziere Hackebeile", -- HedgeEditor +["Place/Delete Waypoint: [Left Click]"] = "Wegpunkt platzieren/löschen: [Linksklick]", -- HedgeEditor +["Place dud mines"] = "Platizere Blindgängerminen", -- HedgeEditor +["Place Gear: Air Attack"]="Gear platzieren: Luftangriff", +["Place Gears (and more): Gear Placement Tool"] = "Gears (und mehr) platzieren: Gear-Platzierungswerkzeug", -- HedgeEditor +["Place Girder: Girder"]="Bauträger platzieren: Bauträger", +["Place Girder: [Left Click]"]="Bauträger platzieren: [Linksklick]", +["Place girders"] = "Platziere Bauträger", -- HedgeEditor +["Place health crates"] = "Platziere Gesundheitskisten", -- HedgeEditor +["Place hedgehogs: Place your hedgehogs at the start of the game."] = "Igel platzieren: Platziere deine Igel zu Spielbeginn.", -- WxW +["Placement Mode"]="Platzierungsmodus", +["Place mines"] = "Platziere Minen", -- HedgeEditor +["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "Platziere, ändere und lösche Gears (z.B. Objekte)|und Wegpunkte, ändere Igeleinstellungen, Werte,|Siegbedingungen und mehr.", -- HedgeEditor +["Place more waypoints using the 'Air Attack' weapon."]="Platziere mehr Wegpunkte durch Verwenden der »Luftangriff«-Waffe.", +["Place Object: [Left Click]"]="Objekt platzieren: [Linksklick]", +["Place or delete waypoints"] = "Platziere oder lösche Wegpunkte", -- HedgeEditor +["Place rubber"] = "Platziere Gummis", -- HedgeEditor +["Place Rubber: Rubber"]="Gummi platzieren: Gummi", +["Place Sprite: [Left Click]"] = "Sprite platzieren: [Linksklick]", -- HedgeEditor +["Place sprites to build land"] = "Platziere Sprites, um Land zu bauen", -- HedgeEditor +["Place sticky mines"] = "Platziere Haftminen", -- HedgeEditor +["Place targets"] = "Platziere Zielscheiben", -- HedgeEditor +["Place utility crates"] = "Platziere Werkzeugkisten", -- HedgeEditor +["Place Waypoint: [Left Click]"]="Wegpunkt platzieren: [Linksklick]", +["Place Waypoint"] = "Wegpunkt platzieren", -- HedgeEditor +["Place waypoint"] = "Wegpunkt platzieren", -- Racer +["Place weapon crates"] = "Platziere Waffenkisten", -- HedgeEditor +["- Place your team flag at the end of your first turn"] = "- Platziere deine Teamflagge am Ende deines ersten Zuges", -- Capture_the_Flag +["Planes used: %d"]="Verwendete Flugzeuge: %d", +["Planets with all missions completed will be marked with two flowers."] = "Planeten, bei denen alle Missionen erledigt wurden, werden mit zwei Blumen markiert.", -- A_Space_Adventure:cosmos +["Planets with completed main missions will be marked with a flower."]="Planeten, bei denen die Hauptmissionen erledigt wurden, werden mit einer Blume markiert.", -- A_Space_Adventure:cosmos +["Play with me!"]="Spiel mit mir!", +["Please click on a crate."]="Bitte klick auf eine Kiste.", +["Please click on a gear."] = "Bitte klicke ein Gear an.", -- HedgeEditor +["Please click on a hedgehog, barrel, health crate or dud mine."] = "Bitte klicke auf einen Igel, einem Fass, einer Gesundheitskiste oder Blindgängermine.", -- HedgeEditor +["Please click on a hedgehog."]="Bitte klick auf einen Igel.", +["Please place the waypoint further away from the waterline"] = "Bitte platziere den Wegpunkt weiter weg von der Wasseroberfläche", -- Racer, TechRacer +["Please place the waypoint in the air and within the map boundaries"] = "Bitte platziere den Wegpunkt in der Luft und innerhalb der Kartengrenzen", -- TechRacer +["Please place the waypoint in the air, within the map boundaries"] = "Bitte platziere den Wegpunkt in der Luft und innerhalb der Kartengrenzen", -- Racer +["Please place your hedgehog first!"] = "Bitte platziere zuerst deinen Igel!", -- WxW +["Please, stop releasing your \"smoke signals\"!"]="Bitte hör mit deinen »Rauchzeichen« auf!", +["Please wait …"] = "Bitte warten …", -- WxW +["Point Blank Combo! +5 points!"] = "Ganz-Schön-Dicht-Dran-Kombi! +5 Punkte!", -- Space_Invasion +["points"]="Punkte", +["--- Points ---"] = "--- Punkte ---", -- Battalion +["point(s)"] = "Punkt(e)", -- Mutant +["Poison"]="Gift", +["Poisonous Apple"]="Giftapfel", +["Pokémon"] = "Pokémon", +["Poor %s (%s) died %d times."] = "%s (%s) war arm dran und ist %d mal gestorben.", -- Mutant +["Population"]="Einwohnerzahl", +["Porkey"] = "Igelchen", -- ["Portal hint: one goes to the destination, and one is the entrance.|"]="Portaltipp: Eins geht zum Ziel, und das andere ist der Eingang.|", -["Teleport hint: just use the mouse to select the destination!"]="Teleportertipp: Benutze einfach die Maus, um das Ziel auszuwählen.", -["I'm a ninja."]="Ich bin ein Ninja.", +["Portal Mind Challenge"] = "Knifflige Portalherausforderung", -- portal +["Precise flying"]="Präzisionsfliegen", +["Precise: Remove previous waypoint"] = "Genaues Zielen: Vorherigen Wegpunkt entfernen", -- Racer +["Precise shooting"]="Präzisionsschießen", +["Predator"] = "Jäger", -- portal +["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", +["Press [Attack] (space bar by default) to start,|repeadedly tap the up, left and right movement keys to accelerate."] = "Drücke [Angriff] (standardmäßig die Leertaste) zum Starten,|drücke wiederholt die Beweungstasten 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 [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 [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 [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", -- +["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", +["Prof. Hogevil"]="Prof. Bösigel", +["Pro Killers"] = "Profikiller", -- Big_Armory +["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 Timer mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer], um die Stärke zu setzen.", +["Purple"] = "Violett", -- +["Pyromancer"]="Feuermacher", +["Pyro"]="Pyromane", +["Race complexity limit reached"] = "Rennkomplexitätslimit erreicht", -- Racer, TechRacer +["Racer tool"] = "Wettrennwerkzeug", -- Racer +["RACER"]="WETTRENNEN", +["Racer"] = "Wettrennen", -- Racer +["Race"] = "Wettrennen", -- TrophyRace +["Rachel"]="Ramona", +["Radar: Off"] = "Radar: Aus", -- WxW +["Radar: On"] = "Radar: Ein", -- WxW +["Radar Ping: [High jump]"] = "Radarping: [Hochsprung]", -- Space_Invasion +["Radar: Show after crate drop"] = "Radar: Nach Kistenabwurf zeigen", -- WxW +["Raging Buffalo"]="Wütender Büffel", +["Ramesses"] = "Ramesses", -- +["Ramon"]="Ramon", +["Rank: %s"]="Rang: %s", +["Razac"] = "Rasak", -- portal +["RC Plane Challenge"] = "Funkflugzeugsherausforderung", -- User_Mission_-_RCPlane_Challenge +["RC Plane"]="Funkflugzeug", +["Read the challenge objectives from within the mission for more details."]="Lies die Herausforderungsziele in der Mission für mehr Details.", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +["Ready for Battle?"]="Bereit für die Schlacht?", +["Really?! You thought you could harm me with your little toys?"]="Wirklich? Du dachtest, du könntest mich mit deinen kleinen Spielzeugen verletzen?", +["Red areas are indestructible."]="Rote Bereiche sind unzerstörbar.", -- A_Space_Adventure:final +["Red"] = "Rot", -- +["Reflector Shield: Reflects enemy projectiles."] = "Reflektorschild: Reflektiert Feindprojektile.", -- Construction_Mode +["Reflector Shield"]="Reflektorschild", +["Regurgitator"]="Hochwürger", +["Reinforcements"]="Verstärkung", +["Remember! Many will seek the anti-gravity device! Now go, hurry up!"]="Denk dran: Viele werden das Antischwerkraftgerät begehren! Geh jetzt! Beeilung!", +["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"]="Denk dran: Das Seil verbiegt sich nur um Objekte; |wenn es nichts trifft, wird es immer gerade sein.", +["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"]="Denk dran, du erbärmliches Tier: Wenn der Tag gekommen ist, wirst du deine blinde Loyalität bereuen!", +["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", +["Resurrector"]="Totenbeschwörung", +["- 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", +["Rider"] = "Reiter", -- portal +["Rifleman"]="Schütze", +["Righteous Beard"]="Redlicher Bart", +["Ripe"] = "Reif", -- +["Robert Yellow Apple"]="Robert Gelbapfel", +["Rocket"] = "Rakete", -- Big_Armory +["Ronald"] = "Ronald", -- portal +["Roof"] = "Decke", -- WxW +["Rope-knocking Challenge"] = "Seilschubsen", -- User_Mission_-_Rope_Knock_Challenge +["Rope Master"] = "Seilmeister", -- Basic_Training_-_Rope +["Roper"] = "Seiler", -- +["Ropes and Crates"]="Seile und Kisten", +["Rope Team"]="Seilteam", +["Rope Training"]="Seiltraining", +["Rope won't get reset"]="Seil wird nicht zurückgesetzt.", +["Roshi"] = "Roschi", -- +["Rot Molester"]="Rottiger Störenfried", +["Rotten"] = "Verdorben", -- +["Round draw"] = "Unentschieden", -- Racer, TechRacer +["Round %d (Sudden Death in round %d)"] = "%d. Runde (Sudden Death in der %d. Runde)", -- Battalion +["Round limit: %d"] = "Rundenbegrenzung: %d", -- Racer +["Round Limit: %d"] = "Rundenbegrenzung: %d", -- Space_Invasion +["Round limit:"] = "Rundenbegrenzung:", -- TechRacer +["Rounds complete: %d/%d"] = "Gespielte Runden: %d/%d", -- Racer, Space_Invasion, TechRacer +["Round score: %d"] = "Rundenpunktzahl: %d", -- Space_Invasion +["RS1"]="RE1", +["RS2"]="RE2", +["Rubber"]="Gummi", +["Rubber Placement Mode"]="Gummiplatzierungsmodus", +["RUBBER PLACEMENT MODE"]="GUMMIPLATZIERUNGSMODUS", +["Rules:"] = "Regeln:", -- Capture_the_Flag +["RULES:"] = "REGELN:", -- Frenzy +["Rules: "] = "Regeln: ", -- Mutant +["Run away, you coward!"]="Lauf weg, du Feigling!", -- A_Space_Adventure:desert01 +["Running displacement algorithm …"] = "Führe Deplatzierungsalgorithmus aus …", -- A_Classic_Fairytale:queen +["Running for survival"]="Lauf um dein Leben", +["Rusted Diego"] = "Rost-Diego", -- +["Rusty Joe"]="Rostjonas", +["Ryu"] = "Ryu", -- +["%s: %.1fs"] = "%s: %.1fs", -- Racer, TechRacer +["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"]="Sabotage/Fackel: (Sabotiere alle Igel im Kreis und richte ca. 1 Schaden an, ODER feuer ein Splitterfragment in die Luft)", +["Saint"]="Sankt", +["Salivaslurper"]="Speichelschlürfer", +["Salty Dog"] = "Versalzene Suppe", -- +["Salvation"]="Erlösung", ["Salvation was one step closer now..."]="Die Erlösung war nun einen Schritt näher.", -["011101000"]="011101000", -["Find your tribe!|Cross the lake!"]="Finde deinen Stamm!|Überquere den Fluss!", -["Y Chwiliad"]="Y Chwiliad", -["Turns until Sudden Death: "]="Züge bis zum Sudden Death: ", -["Ramon"]="Ramon", -["Spiky Cheese"]="Stachliger Käse", -["Honest Lee"]="Leo Ehrlich", +["Sam"]="Steffen", +["Sandals?! I thought you left your ring!"] = "Sandalen?! Ich dachte, du hattest deinen Ring vergessen!", -- A_Classic_Fairytale:queen +["Sandstorm"]="Sandsturm", +["Sandy"]="Sandi", +["Save as many hapless hogs as possible!"]="Rette so viele glücklose Igel wie möglich!", +["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", +["Save Level: [Precise]+[4]"] = "Level speichern: [Genaues Zielen]+[4]", -- HedgeEditor +["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"]="Rette die Prinzessin! All deine Igel müssen überleben!|Tipp: Töte die Cyborgs zuerst! Benutze die Munition sehr sparsam!|Tipp: Du solltest vielleicht einen Träger als Deckung behalten!", +["Save the princess by collecting the crate in under 12 turns!"]="Rette die Prinzessin, indem du die Kiste vor Ablauf von 12 Zügen einsammelst!", +["Saving Hogera"]="Hogera retten", +["%s barely made it past the hogosphere."]="%s hat es so gerade noch über die Igelsphäre geschafft.", +["%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"] = "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 +["Score: %d"] = "Punktzahl: %d", -- Space_Invasion +["Score goal: %d"] = "Punkteziel: %d", -- Control +["Score graph"] = "Punktegraph", -- Mutant +["Score points by killing other hedgehogs (see below)."] = "Hole Punkte, indem du andere Igel tötest (siehe unten).", -- Mutant +["Scores: "] = "Punktestand: ", -- Capture_the_Flag +["Scores:"] = "Punktestand:", -- Mutant +["Scores"] = "Punktestand", -- Mutant +["Scoring: "] = "Punktewertung: ", -- Mutant +["Script parameter examples:"] = "Skriptparameterbeispiele:", -- Gravity +["%s: %d (deaths: %d)"] = "%s: %d (Tode: %d)", -- Mutant +["%s: Did not finish"] = "%s: Wurde nicht fertig", -- Racer, TechRacer +["%s did not finish the race."] = "%s hat das Rennen nicht abgeschlossen.", -- Racer, TechRacer +["%s didn't expect that."] = "%s hat damit nicht gerechnet.", -- User_Mission_-_Rope_Knock_Challenge +["%s doesn’t really know how to handle a rope properly."]="%s weiß nicht, wie man mit einem Seil umgeht.", +["%s: %d"] = "%s: %d", -- Control, Capture_the_Flag +["Search for the device with the help of the other hedgehogs "]="Such nach dem Gerät mit der Hilfe der anderen Igel.", +["Searching in the dust"]="Suche im Staub", +["Searching the stars!"]="Suche in den Sternen", +["seconds"]="Sekunden", +["Seduction"]="Verführung", +["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!", +["Segmentation Paul"]="Se Gmentf Ehler", +["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "Wähle einen Platzierungsmodus und lies die Infos|im Missionsfeld, um zu erfahren, wie man ihn benutzt.", -- HedgeEditor +["Select continent!"]="Wähle einen Kontinent!", +["selected!"]="ausgewählt!", +["Selection Mode"]="Auswahlmodus", +["Select, modify, or delete girders, rubbers and sprites"] = "Wähle, modifiziere oder lösche Träger, Gummis und Sprites", -- HedgeEditor +["Select/Place/Delete Gear: [Left Click]"] = "Gear wählen/platzieren/löschen: [Linksklick]", -- HedgeEditor +["Select, reposition and delete gears"] = "Wähle, repositioniere und lösche Gears", -- HedgeEditor +["Select win/lose condition: [Left], [Right]"] = "Sieg-/Niederlagebedingung wählen: [Links], [Rechts]", -- HedgeEditor +["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."]="Wähle deinen Kontinent/Waffensatz mit den [Hoch]- oder [Runter]-Tasten. Du kannst ihn auch mit dem Waffenmenü auswählen.", +["Sergey"] = "Sergey", -- +["Set Health: [Left Click]"]="Gesundheit setzen: [Linksklick]", +["Set Identity: [Left Click]"]="Identität setzen: [Linksklick]", +["Set LandFlag: [1], [2], [3], [4]"]="LandFlag setzen: [1], [2], [3], [4]", +["Set period to negative value for random gravity."] = "Setze »period« auf negativen Wert für zufällige Schwerkraft.", -- Gravity +["Set the health of hogs, health crates, barrels and duds"] = "Setze die Gesundheit von Igeln und Objekten", -- HedgeEditor +["Set to %d"] = "Auf %d setzen", -- HedgeEditor +["%s exploded."] = "%s ist explodiert.", -- User_Mission_-_Rope_Knock_Challenge +["%s fell from a high cliff."] = "%s fiel von einer hohen Klippe.", -- User_Mission_-_Rope_Knock_Challenge +["%s fell too fast."] = "%s fiel zu schnell.", -- User_Mission_-_Rope_Knock_Challenge +["%s felt unstable."] = "%s war nicht ganz standfest.", -- User_Mission_-_Rope_Knock_Challenge +["%s felt victim to rope-knocking."] = "%s fiel dem Seilschubsen zum Opfer.", -- User_Mission_-_Rope_Knock_Challenge +["%s flew like a rock."] = "%s fiel wie ein Stein.", -- User_Mission_-_Rope_Knock_Challenge +["%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 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 knocked out."] = "%s wurde eliminiert.", -- User_Mission_-_Rope_Knock_Challenge +["%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 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", -- +["Sheepy"] = "Schafi", -- +["She's behind that tall thingy."]="Sie ist hinter diesem großen Dingsda.", +["Shield boosted! +%d power"] = "Schild aufgesammelt! +%d Energie", -- Space_Invasion +["Shield depleted"] = "Schild aufgebraucht", -- Space_Invasion +["Shield is fully recharged!"]="Schild vollständig aufgeladen!", +["Shield Master! +10 points!"] = "Schildmeister! +10 Punkte!", -- Space_Invasion +["Shield Miser! +%d points!"] = "Schildgeiz! +%d Punkte!", -- Space_Invasion +["Shield OFF: %d power remaining"] = "Schild AUS: %s Energie verbleibend", -- Space_Invasion +["Shield ON: %d power remaining"] = "Schild EIN: %s Energie verbleibend", -- Space_Invasion +["Shield Seeker! +10 points!"] = "Schildsucher! +10 Punkte!", -- Space_Invasion +["Shinobi"] = "Shinobi", -- +["%s hit the ground."] = "%s traf den Boden.", -- User_Mission_-_Rope_Knock_Challenge +["Shoppa Love"]="Seilliebe", +["Shoppa Union"]="Konsumentenunion", +["Shoppers"] = "Käufer", -- +["Shotgun"]="Schrotflinte", +["shots remaining."]="Schüsse übrig", +["Sigh."] = "Seufz.", -- A_Classic_Fairytale:epil +["Silly"]="Doofi", +["Silver"] = "Silber", -- +["Sine Gun"] = "Sinuskanone", -- Construction_Mode +["Sinky"]="Blubb", ["Sirius Lee"]="Leo Ernst", -["Vegan Jack"]="Veganer-Jochen", -["Brutal Lily"]="Brutalo-Lilie", +["%s is eliminated!"] = "%s wurde eliminiert!", -- User_Mission_-_Rope_Knock_Challenge +["Slimer"] = "Schleimer", -- +["Slippery"]="Rutschig", +["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", -- +["%s made it past the hogosphere."]="%s hat es über die Igelspähre geschafft.", +["%s managed to pass half of the distance towards home."]="%s hat die Hälfte des Weges nach Hause absolviert.", +["%s may choose the rules."] = "%s darf die Regeln bestimmmen.", -- WxW ["Smith 0.97"]="Smith 0.97", ["Smith 0.98"]="Smith 0.98", ["Smith 0.99a"]="Smith 0.99a", ["Smith 0.99b"]="Smith 0.99b", ["Smith 0.99f"]="Smith 0.99f", ["Smith 1.0"]="Smith 1.0", -["Everything looks OK..."]="Alles sieht gut aus.", -["This will be fun!"]="Das wird Spaß machen!", -["HAHA!"]="HAHA!", -["And how am I alive?!"]="Und wie kann es sein, dass ich am Leben bin?", -["It must be the cyborgs again!"]="Das müssen wohl wieder diese Cyborgs sein!", -["Looks like the whole world is falling apart!"]="Es scheint, als würde die ganze Welt auseinanderfallen!", -["Look out! We're surrounded by cannibals!"]="Passt auf! Wir sind von Kannibalen umzingelt!", -["Cannibals?! You're the cannibals!"]="Kannibalen?! Ihr seid die Kannibalen!", -["WHAT?! You're the ones attacking us!"]="WAS?! Ihr seid diejenigen, die uns angreifen!", -["You have kidnapped our whole tribe!"]="Ihr habt unseren ganzen Stamm entführt!", -["You've been assaulting us, we have been just defending ourselves!"]="Ihr habt uns überfallen, wir haben uns nur verteidigt!", -["I can't believe this!"]="Ich kann es nicht glauben!", -["Have we ever attacked you first?"]="Haben wir euch jemals zuerst angegriffen?", -["Yes!"]="Ja!", -["When?"]="Wann?", -["Uhmm...ok no."]="Ähm, okay, nein.", -["But you're cannibals. It's what you do."]="Aber ihr seid Kannibalen. Das ist, was ihr tut.", -["Again with the 'cannibals' thing!"]="Nicht schon wieder dieser »Kannibalen«-Unfug!", -["Where do you get that?!"]="Wo habt ihr das her?", -["Everyone knows this."]="Das weiß jeder.", -["I didn't until about a month ago."]="Ich wusste es nicht vor einem Monat.", -["Hmmm...actually...I didn't either."]="Hmmm, ich … eigentlich auch nicht.", -["About a month ago, a cyborg came and told us that you're the cannibals!"]="Vor etwa einem Monat kam ein Cyborg und erzählte uns, dass ihr die Kannibalen seid.", -["A cy-what?"]="Ein Cy-was?", -["Cyborg. It's what the aliens call themselves."]="Cyborg. So nennen sich die Außerirdischen selbst.", -["They told us to wear these clothes. They said that this is the newest trend."]="Sie sagten uns, dass wir diese Kleidung tragen sollten. Sie sagten, dass es der neueste Trend sei.", -["They've been manipulating us all this time!"]="Sie haben uns die ganze Zeit manipuliert!", -["They must be trying to weaken us!"]="Sie müssen versuchen, uns zu schwächen!", -["We have to unite and defeat those cylergs!"]="Wir müssen uns zusammentun, und diese Cylergs besiegen!", -["We can't let them take over our little island!"]="Wir können sie nicht unsere kleine Insel erobern lassen!", -["You have finally figured it out!"]="Ihr habt es endlich gemerkt!", -["You meatbags are pretty slow, you know!"]="Ihr Fleischklumpen seid ziemlich langsam, wisst ihr?", -["Why do you want to take over our island?"]="Warum wollt ihr unsere Insel erobern?", -["Do you have any idea how valuable grass is?"]="Habt ihr überhaupt eine Ahnung darüber, wie wertvoll Gras ist?", -["This island is the only place left on Earth with grass on it!"]="Diese Insel ist der einzige Ort auf der Welt, der noch Gras hat.", -["It's worth more than wood!"]="Es ist wertvoller als Holz!", -["That makes it almost invaluable!"]="Das macht es fast unbezahlbar!", -["We have nowhere else to live!"]="Wir haben sonst keinen Ort zu leben!", -["That's not our problem!"]="Das ist nicht unser Problem!", -["We'll give you a problem then!"]="Dann geben wir euch ein Problem!", -["Nicely done, meatbags!"]="Gut gemacht, Fleischkugeln!", -["You have won the game by proving true cooperative skills!"]="Ihr hab das Spiel gewonnen, indem ihr wahre kooperative Fähigkeiten gezeigt habt!", -["You have proven yourselves worthy!"]="Ihr habt euch bewährt.", -["Game? Was this a game to you?!"]="Spiel? War das ein Spiel für dich?!", -["Well, yes. This was a cyborg television show."]="Ähm, ja. Es war eine Cyborg-Fernsehsendung.", -["It is called 'Hogs of Steel'."]="Sie heißt »Igel aus Stahl«.", -["Are you saying that many of us have died for your entertainment?"]="Willst du damit sagen, dass viele von uns nur für eure Unterhaltung gestorben sind?", -["Our tribe, our beautiful island!"]="Unser Stamm, unsere schöne Insel!", -["All gone...everything!"]="Alles fort, alles!", -["But the ones alive are stronger in their heart!"]="Aber die Lebendigen sind in ihrem Herzen stärker.", -["Just kidding, none of you have died!"]="Nur ein Witz! Niemand von euch ist gestorben!", -["I mean, none of you ceased to live."]="Ich meine, niemand von euch hat aufgehört, zu leben.", -["You'll see what I mean!"]="Du wirst verstehen, was ich meine.", -["They are all waiting back in the village, haha."]="Sie warten alle im Dorf, haha.", -["You are playing with our lives here!"]="Du spielst mit unseren Leben!", -["Do you think you're some kind of god?"]="Hältst du dich für eine Art Gott?", -["Interesting idea, haha!"]="Interessanter Gedanke, haha!", -["What a douche!"]="Was für ein Blödian!", -["Defeat the cyborgs!"]="Besiege die Cyborgs!", -["The Enemy Of My Enemy"]="Der Feind meines Feindes", -["The Union"]="Die Einheit", -["Hmmm...it's a draw. How unfortunate!"]="Hmmm … Es ist unentschieden. Wie blöd!", -["Yay, we won!"]="Hurra, wir haben gewonnen!", -["Nice work!"]="Gute Arbeit!", -["Cannibals"]="Kannibalen", -["Fell From Heaven"]="Fiel Vom Himmel", -["Hedge-cogs"]="Stachelräder", -["Leader"]="Führer", -["Nancy Screw"]="Lockere Schraube", -["Your deaths will be avenged, cannibals!"]="Eure Tode werden gerächt sein, Kannibalen!", -["Brainiac"]="Hirni", -["Corpse Thrower"]="Leichenschmeißer", -["Hannibal"]="Hannibal", -["More Natives"]="Mehr Ureinwohner", -["Traitors"]="Verräter", -["Carol"]="Karol", -["Hogminator"]="Iglinator", -["Unit 0x0007"]="Einheit 0x0007", -["Blender"]="Blender", -["Elderbot"]="Altbot", -["Those aliens are destroying the island!"]="Diese Außerirdischen zerstören die Insel!", -["Dude, all the plants are gone!"]="Mann, all die Pflanzen sind fort!", -["What am I gonna...eat, yo?"]="Was werde ich … essen?", -["Fell From Heaven is the best! Fell From Heaven is the greatest!"]="Fiel Vom Himmel ist die Beste! Fiel Vom Himmel ist die Größte!", -["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.", -["I'm getting old for this!"]="Ich werd zu alt dafür!", -["I'm getting thirsty..."]="Ich hab Durst.", -["I wonder why I'm so angry all the time..."]="Ich frag mich, warum ich die ganze Zeit so wütend bin.", -["It must be a childhood trauma..."]="Es muss ein Kindheitstrauma sein.", -["Just wait till I get my hands on that trauma! ARGH!"]="Warte nur, bis ich mein Trauma in die Finger kriege! ARGH!", -["I could just teleport myself there..."]="Ich könnte mich einfach dorthin teleportieren.", -["It's a shame, I forgot how to do that!"]="Zu dumm, ich habe vergessen, wie man das macht.", -["Hello again, "]="Hallo, ", -["I just found out that they have captured your princess!"]="Ich habe gerade herausgefunden, dass sie deine Prinzessin gefangen haben!", -["Of course I have to save her. What did I expect?!"]="Natürlich muss ich sie retten. Was habe ich erwartet?", -["She's behind that tall thingy."]="Sie ist hinter diesem großen Dingsda.", -["I'm here to help you rescue her."]="Ich bin hier, um dir bei ihrer Rettung zu helfen.", -["Yo, dude, we're here, too!"]="Heda, wir sind auch da!", -["We were trying to save her and we got lost."]="Wir versuchten, sie zu retten, aber haben uns verlaufen.", -["That's typical of you!"]="Das ist so typisch für dich!", -["Why are you helping us, uhm...?"]="Warum hilfst du uns, äh, …?", -["Call me Beep! Well, 'cause I'm such a nice...person!"]="Nenn mich »Pieps«! Weil ich so eine nette … Person bin!", -["Here, let me help you save her!"]="Hier, lass mich dir helfen, sie zu retten!", -["Thanks!"]="Danke!", -["Why can't he just let her go?!"]="Warum kann er sie nicht einfach freilassen?", -["Family Reunion"]="Familientreffen", -["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"]="Befrei deine Teamkollegen aus ihrem natürlichen Gefängnis und rette die Prinzessin!|Tipp: Löcher bohren sollte alle Probleme lösen.|Tipp: Es könnte eine gute Idee sein, vor dem Bohren einen Träger zu platzieren. Ich mein ja nur.|Tipp: All deine Igel müssen sich über der markierten Höhe befinden.|Tipp: Undichte Stelle muss sich sehr nahe an der Prinzessin befinden.", -["Salvation"]="Erlösung", -["Hostage Situation"]="Geiselrettung", -["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"]="Rette die Prinzessin! All deine Igel müssen überleben!|Tipp: Töte die Cyborgs zuerst! Benutze die Munition sehr vorsichtig!|Tipp: Du solltest vielleicht einen Träger als Deckung behalten!", -["Thank you, my hero!"]="Danke dir, mein Held!", -["Biomechanic Team"]="Biomechanisches Team", -["First Blood"]="Der erste Zusammenstoß", -["First Steps"]="Erste Schritte", -["Press [Left] or [Right] to move around, [Enter] to jump"]="Drücke [Links] oder [Rechts] zum Bewegen, [Eingabe] zum Springen.", -["A leap in a leap"]="Ein Sprung in einem Sprung", -["Go on top of the flower"]="Geh auf die Spitze der Blume", -["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.", -["Hightime"]="Hoch hinaus", -["Get on the head of the mole"]="Geh auf den Kopf des Maulwurfs", -["Omnivore"]="Allesfresser", -["The Leap of Faith"]="Der Mutsprung", -["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.", -["Do the deed"]="Tu deine Pflicht", -["The Rising"]="Der Aufstieg", -["Destroy the targets!|Hint: Select the Shoryuken and hit [Space]|P.S. You can use it mid-air."]="Zerstör die Ziele!|Tipp: Wähle das Shoryuken und drücke [Leertaste]|PS: Du kannst es in der Luft benutzen.", -["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.", -["The Crate Frenzy"]="Der Kistenrausch", -["Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"]="Zerstöre die Ziele!|Tipp: [Hoch], [Runter] zum Zielen, [Leer] zum Schießen", -["The Ultimate Weapon"]="Die Ultimative Waffe", -["Kill the cannibal!"]="Töte den Kannibalen!", -["The First Blood"]="Der erste Zusammenstoß", -["KILL IT!"]="TÖTE ES!", -["Watch your steps, young one!"]="Pass auf deine Schritte auf, Jüngling!", -["Why do men keep hurting me?"]="Warum tun mir Männer ständig weh?", -["Violence is not the answer to your problems!"]="Gewalt ist nicht die Antwort auf deine Probleme!", -["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."]="Es waren einmal zwei Stämme, die lebten auf einer Insel mit vielen natürlichen Rohstoffen und waren in einem bitteren Konflikt …", -["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."]="Unser Stamm war friedlich und verbrachte die Zeit mit der Jagd, Übungen und den kleinen Freuden des Lebens.", -["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.", -["And so it began..."]="Und so fing es an …", -["What are you doing at a distance so great, young one?"]="Was tut du hier in so großer Entfernung, Jüngling?", -["Come closer, so that your training may continue!"]="Komm näher, damit deine Übungen fortfahren können!", -["This is it! It's time to make Fell From Heaven fall for me..."]="Das ist es! Es ist Zeit, um Fiel Vom Himmel in mich verfallen zu lassen …", -["I can see you have been training diligently."]="Ich sehe, dass du fleißig geübt hast.", -["The wind whispers that you are ready to become familiar with tools, now..."]="Der Wind flüstert, dass du jetzt bereit bist, mit den Werkzeugen vertraut zu werden.", -["Open that crate and we will continue!"]="Öffne diese Kiste und wir werden fortfahren!", -["He moves like an eagle in the sky."]="Er bewegt sich wie ein Adler in der Luft.", -["See that crate farther on the right?"]="Siehst du die Kiste weiter rechts?", +["Smugglers"]="Schmuggler", +["%s must skip this turn for rule violation."] = "%s muss wegen einer Regelverletzung aussetzen.", -- WxW +["%s never got the ninja diploma."]="%s ist bei der Ninjaprüfung durchgefallen.", +["%s never wanted to reach for the sky in the first place."]="%s wollte nie nach den Sternen greifen.", +["Sniper! +8 points!"] = "Scharfschütze! +8 Punkte!", -- Space_Invasion +["Sniper"]="Heckenschütze", +["Sniper Rifle"]="Scharfschützengewehr", +["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 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.", +["So I shook my fist in the air!"] = "Und so schlug ich die Faust gen Himmel!", -- A_Classic_Fairytale:epil +["Soldier"]="Soldat", +["So, let me tell you what I know about Professor Hogevil."]="Also, lass mich erzählen, was ich über Professor Bösigel weiß.", +["Some parts of the land are indestructible."]="Einige Teile des Landes sind unzerstörbar.", +["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 +["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 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, 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", +["So? What will it be?"]="Also? Was ist deine Entscheidung?", +["So you are able to launch projectiles into your aiming direction, always at full power."] = "Somit bist du in der Lage, Projektile in Zielrichtung zu feuern, immer mit voller Kraft.", -- Basic_Training_-_Flying_Saucer +["So you are interested in Professor Hogevil, huh?"]="Also bist du an Professor Bösigel interessiert, nicht wahr?", -- A_Space_Adventure:moon02 +["So you basically did the dirty work for us."] = "Also hast du praktisch unsere Drecksarbeit erledigt.", -- A_Classic_Fairytale:dragon +["Space Invasion"] = "Weltrauminvasion", -- Space_Invasion +["SPACE INVASION"] = "WELTRAUMINVASION", -- Space_Invasion +["Spacetrip"]="Weltraumreise", +["Spawn the crate and attack!"] = "Lass die Kiste auftauchen und greif an!", -- WxW +["Specials: Kings and air generals drop helpers, not weapons"] = "Besonderheiten: Könige und Luftgeneräle lassen Helfer statt Waffen fallen", -- Battalion +["Special Weapons:"]="Sonderwaffen:", +["Speckles"] = "Flecken", -- +["Specs Appeal"] = "Doppelpunkt", -- +["Specs"] = "Punkte", -- +["Spectator"] = "Zuschauer", -- +["Speed Shoppa"] = "Rasender Kistensammler", -- +["Spikes"] = "Stacheln", -- +["Spike"]="Stachel", +["Spiky Cheese"]="Stachliger Käse", +["%s, place the first hedgehog!"] = "%s, platziere den ersten Igel!", -- WxW +["Spleenlover"]="Milzlieber", +["Sponge"]="Schwamm", +["Spooky Tree"]="Spukiger Baum", +["Sprite Erasure Mode"]="Sprite-Löschmodus", +["Sprite Modification Mode"]="Sprite-Modifikationsmodus", +["SPRITE MODIFICATION MODE"]="SPRITE-MODIFIKATIONSMODUS", +["Sprite Placement Mode"]="Sprite-Platzierungsmodus", +["SPRITE PLACEMENT MODE"]="SPRITE-PLATZIERUNGSMODUS", +["Sprite Testing Mode"]="Sprite-Testmodus", +["Squirtle"] = "Schiggy", -- +["Squishy"] = "Matschig", -- +["%s reached home in %.3f seconds. Congratulations!"]="%s has das Zuhause in %.3f Sekunden erreicht. Gratulation!", +["%s (%s) destroyed %d invaders in one round."] = "%s (%s) hat %d Invasoren in einer Runde zerstört.", -- Space_Invasion +["%s (%s) does not have to feel ashamed for their best height of %d."]="%s (%s) braucht sich für die Besthöhe von %d nicht zu schämen.", +["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "%s (%s) machte kurzen Prozess mit den Invasoren: Beste Kombi von %d!", -- Space_Invasion +["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "%s (%s) wurde in die Planetare Assoziation der Igel eingeladen für die Zerstörung von erstaunlichen %d Invasoren in nur einer Runde!", -- Space_Invasion +["%s (%s) hate life and suicided %d times."] = "%s (%s) hasst das Leben und begang gleich %d mal Suizid.", -- Mutant +["%s should try the rope training mission first."]="%s sollte wohl zuerst das Seiltraining absolvieren.", +["%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 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 +["%s splatted."] = "%s wurde zerschmettert.", -- User_Mission_-_Rope_Knock_Challenge +["%s (%s) reached a decent peak height of %d."]="%s (%s) erreichte eine gute Besthöhe von %d.", +["%s (%s) reached a peak height of %d."]="%s (%s) erreichte eine Besthöhe von %d.", +["%s (%s) reached for the sky and beyond with a height of %d!"]="%s (%s) griff nach den Sternen mit einer Höhe von %d!", +["%s (%s) reached home in %.3f seconds."] = "%s (%s) erreichte das Zuhause in %.3f Sekunden.", -- ClimbHome +["%s (%s) shot %d invaders and never missed in the best round!"] = "%s (%s) hat in der besten Runde %d Invasoren abgeschossen, ohne einmal daneben zu schießen!", -- Space_Invasion +["%s (%s) struck like a meteor: %d points in only one round!"] = "%s (%s) schlug ein wie ein Meteor: %d Punkte in nur einer Runde!", -- Space_Invasion +["%s still had a long way to go."]="%s hatte noch einen langen Weg.", +["%s (%s) tumbles like no other: %d points in one round."] = "%s (%s) kämpft wie kein Anderer: %d Punkte in einer Runde.", -- Space_Invasion +["%s stumpled."] = "%s ist gestolpert.", -- User_Mission_-_Rope_Knock_Challenge +["%s (%s) was certainly not afraid of heights: Peak height of %d!"]="%s (%s) hatte ganz bestimmt keine Höhenangst: Besthöhe von %d!", +["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "%s (%s) ist blitzschnell! Längste Kombi von %d, absolut verrückt!", -- Space_Invasion +["%s (%s) was on fire: Longest combo of %d."] = "%s (%s) hatte Hummeln im Hintern: Längste Kombi von %d.", -- Space_Invasion +["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."]="%s (%s) hatte panische Angst vorm Wasser und hatte einen Sicherheitsabstand von %d erreicht.", +["%s (%s) was the best baby tumbler: %d points in one round."] = "%s (%s) war der beste Nachwuchspurzler: %d Punkte in einer Runde.", -- Space_Invasion +["%s (%s) was the greediest hedgehog and collected %d crates."] = "%s (%s) war der gierigste Igel und sammelte %d Kisten auf.", -- Mutant +["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "%s (%s) war zweifelsfrei der beste Profipurzler im ganzen Spiel: %d Punkte in einer Runde!", -- Space_Invasion +["Standard Cleaver"]="Standardhackebeil", +["Standard Target"]="Standardziel", +["Standard Waypoint"]="Standard-Wegpunkt", +["Star"] = "Stern", -- Big_Armory +["Status update"] = "Statusaktualisierung", -- Racer, TechRacer +["Status Update"] = "Statusaktualisierung", -- Space_Invasion +["Stay away from our weapons!"] = "Bleibt weg von unseren Waffen!", -- A_Classic_Fairytale:queen +["Stay there, comrades!"] = "Keinen Schritt weiter, Kameraden!", -- A_Classic_Fairytale:queen +["Stay there to flee!"] = "Bleib hier, um zu fliehen!", -- A_Space_Adventure:fruit01 +["Steel Eye"]="Stahlauge", +["Step 1: Activate your flying saucer but do NOT move yet!"] = "1.: Aktiviere deine fliegende Untertasse, aber beweg dich noch NICHT.", -- Basic_Training_-_Flying_Saucer +["Step 2: Select your grenade."] = "2.: Wähl eine Granate aus.", -- Basic_Training_-_Flying_Saucer +["Step 3: Start flying and get yourself right above the target."] = "3.: Flieg los und flieg direkt über der Zielscheibe.", -- Basic_Training_-_Flying_Saucer +["Step 4: Drop your grenade by pressing the [Long jump] key."] = "4.: Lass deine Granate fallen, indem du [Weitsprung] drückst.", -- Basic_Training_-_Flying_Saucer +["Step 5: Get away quickly and land safely anywhere."] = "5.: Flieh schnell und lande an einem sicheren Ort.", -- +["Step By Step"]="Schritt für Schritt", +["Steve"]="Steffen", +["Sticky Mine"]="Haftmine", +["Sticky Mine Placement Mode"]="Haftminenplatzierungsmodus", +["STiCKY MINE PLACEMENT MODE"]="HAFTMINENPLATZIERUNGSMODUS", +["STICKY MINE PLACEMENT MODE"] = "HAFTMINENPLATZIERUNGSMODUS", -- HedgeEditor +["Stop, comrades!"] = "Anhalten, Kameraden!", -- A_Classic_Fairytale:queen +["Stop right there, puny worms!"] = "Schluss jetzt, ihr mickrigen Würmer!", -- A_Classic_Fairytale:queen +["Street Fighters"] = "Straßenboxer", -- +["Strength: %d (multiplier for ammo)"] = "Stärke: %d (Faktor für Munition)", -- Battalion +["Stronglings"]="Stärklinge", +["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", +["Sundaland"]="Sunda", +["Sunflame"] = "Sonnenflamme", -- Big_Armory +["Super weapons: A few crates contain very powerful weapons."] = "Superwaffen: Ein paar Kisten enthalten sehr starke Waffen.", -- WxW +["Super weapons: %s"] = "Superwaffen: %s", -- WxW +["Support Station: Allows placement of crates."] = "Waffenstation: Ermöglicht Kistenplatzierung.", -- Construction_Mode +["Support Station"]="Waffenstation", +["Sure!"] = "Sicher!", -- A_Classic_Fairytale:epil +["Surf Before Crate: %s"] = "Surfen Vor Kiste: %s", -- WxW +["Surf Before Crate: You must bounce off the water once before you can get crates."] = "Surfen Vor Kiste: Du musst vom Wasser einmal abprallen, bevor du Kisten bekommst.", -- WxW +["Surfer! +15 points!"]="Surfer! +15 Punkte", +["Surfer!"]="Surfer!", +["Survive!|Hint: Cinematics can be skipped with the [Precise] key."]="Überlebe!|Tipp: Zwischensequenzen können mit der [Genaues Zielen]-Taste übersprungen werden.", +["%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 +["%s was a good target."] = "%s war ein gutes Zielobjekt.", -- User_Mission_-_Rope_Knock_Challenge +["%s was close to home."]="%s war nah an Zuhause.", +["%s was damn close to home."]="%s war verdammt nah an Zuhause.", +["%s was doomed from the beginning."] = "%s war von Anfang an dem Untergang geweiht.", -- User_Mission_-_Rope_Knock_Challenge +["%s was good, but not good enough."]="%s war gut, aber nicht gut genug.", +["%s was knocked away."] = "%s wurde weggeschubst.", -- User_Mission_-_Rope_Knock_Challenge +["%s was really unlucky."] = "%s hatte großes Pech.", -- User_Mission_-_Rope_Knock_Challenge +["%s was shoved away."] = "%s wurde hinweggefegt.", -- User_Mission_-_Rope_Knock_Challenge +["%s was smashed."] = "%s wurde zerschmettert.", -- User_Mission_-_Rope_Knock_Challenge +["Sweet"] = "Süß", -- +["%s went over a quarter of the way towards home."]="%s hat mehr als ein Viertel des Weges nach Hause absolviert.", +["%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!", -["His arms are so strong!"]="Seine Arme sind so stark!", -["Use the rope to get on the head of the mole, young one!"]="Benutze das Seil, um auf den Kopf des Maulwurfst zu gelangen, Jüngling!", -["Worry not, for it is a peaceful animal! There is no reason to be afraid..."]="Hab keine Angst, da es ein friedliebendes Tier ist. Es gibt keinen Grund, Angst zu haben.", -["We all know what happens when you get frightened..."]="Wir wissen alle, was passiert, wenn du Angst kriegst.", -["So humiliating..."]="Welch Demütigung!", -["Perfect! Now try to get the next crate without hurting yourself!"]="Perfekt! Jetzt versuch, zur nächsten Kiste zu gelangen, ohne dich zu verletzen!", -["The giant umbrella from the last crate should help break the fall."]="Der Riesenschirm von der letzten Kiste sollte helfen, den Sturz abzubremsen.", -["He's so brave..."]="Er ist so mutig.", -["I see you have already taken the leap of faith."]="Ich sehe, du hast bereits den Mutsprung absolviert.", -["Get that crate!"]="Hol dir die Kiste!", -["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.", -["You probably know what to do next..."]="Du weißt vermutlich, was als nächstes zu tun ist.", -["It is time to practice your fighting skills."]="Es ist Zeit, dein Kämpfen zu üben.", -["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"]="Stell dir vor, diese Zielscheiben sind die Wölfe, die eine Eltern getötet haben! Lass deine Wut an ihnen aus!", -["I hope you are prepared for a small challenge, young one."]="Ich hoffe, du bist für eine kleine Herausforderung gewappnet, Jüngling.", -["Your movement skills will be evaluated now."]="Deine Fortbewegungsfähigkeiten werden nun getestet.", -["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!", -["How difficult would you like it to be?"]="Wie schwer möchtest du es haben?", -["Hmmm...perhaps a little more time will help."]="Hmmm. Vielleicht wird etwas mehr Zeit helfen.", -["The spirits of the ancerstors are surely pleased, Leaks A Lot."]="Die Geister der Ahnen sind sicherlich erfreut, Undichte Stelle.", -["You have proven yourself worthy to see our most ancient secret!"]="Du hast dich bewährt, um unser ältestes Geheimnis zu sehen.", -["The weapon in that last crate was bestowed upon us by the ancients!"]="Die Waffe in der letzten Kiste wurde uns von den Urahnen übergeben!", -["Use it with precaution!"]="Benutze sie weise.", -["What do my faulty eyes observe? A spy!"]="Was sehen meine alten Augen? Einen Spion!", -["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!", -["Oh, my!"]="Ohje!", -["I see you would like his punishment to be more...personal..."]="Ich sehe, du möchtest, dass seine Bestrafung etwas … persönlicher ausfällt.", -["I'm certain that this is a misunderstanding, fellow hedgehogs!"]="Ich bin mir sicher, dass das ein Missverständnis ist, liebe Igel.", -["If only I were given a chance to explain my being here..."]="Wenn ich nur eine Gelegenheit hätte, um meine Anwesenheit zu erklären …", -["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"]="Lass dich nicht von seinen Worten einlullen, Jüngling! Er wird dich hinterrücks ermorden, sobald du ihm den Rücken zuwendest!", -["Here...pick your weapon!"]="Hier … wähl deine Waffe!", -["Yes, yeees! You are now ready to enter the real world!"]="Ja, Jaaa! Jetzt bist du bereit, die wirkliche Welt zu betreten!", -["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."]="Was?! Ein Kannibale? Hier? Es gibt keine Zeit zu verlieren! Komm, du bist vorbereitet.", -["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!", -["The wasted youth"]="Die vergeudete Jugend", -["After Leaks A Lot betrayed his tribe, he joined the cannibals..."]="Nachdem Undichte Stelle seinen Stamm betrogen hatte, trat er den Kannibalen bei.", -["Hint: Double Jump - Press [Backspace] twice"]="Tipp: Doppelsprung – Drück [Rücktaste] 2 Mal", -["Step By Step"]="Schritt für Schritt", -["As the challenge was completed, Leaks A Lot set foot on the ground..."]="Nachdem die Herausforderung abgeschlossen war, setzte Undichte Stelle einen Fuß auf den Boden.", -["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."]="Und somit versagte Undichte Stelle dabei, die Herausforderung abzuschließen. Unter Schande landete er.", +["%s wins!"]="%s gewinnt!", +["%s wins with a best time of %.1fs."] = "%s gewinnt mit einer Bestzeit von %.1fs.", -- Racer, TechRacer +["Switched to "]="Gewechselt zu ", +["Switch Hog"]="Igel wechseln", +["Switch: Toggle crate radar"] = "Wechseln: Kistenradar umschalten", -- WxW +["switch"]="Wechseln", +["Syntax Errol"]="Syntaxfehlel", +["%s, you may choose the rules."] = "%s, du darfst die Regeln bestimmen", -- WxW +["szczur"] = "szczur", -- +["Tackleberry"] = "Terrorbeere", -- +["Tag Collection Mode"]="Markiermodus: Einsammeln", +["Tag Failure Mode"]="Markiermodus: Niederlage", +["Tag Gear: [Left Click]"]="Gear markieren: [Linksklick]", +["TAGGING MODE"]="MARKIERUNGSMODUS", +["Tag Victory Mode"]="Markiermodus: Sieg", +["Tails"] = "Fuß", -- +["Talk about mixed signals..."]="Zuckerbrot und Peitsche …", +["Tall Potato"]="Großkartoffel", +["Target Placement Mode"]="Zielscheibenplatzierungsmodus", +["TARGET PLACEMENT MODE"] = "ZIELSCHEIBENPLATZIERUNGSMODUS", -- HedgeEditor +["Target Practice: Bazooka (easy)"] = "Zielübung: Bazooka (einfach)", -- Target_Practice_-_Bazooka_easy +["Target Practice: Bazooka (hard)"] = "Zielübung: Bazooka (schwer)", -- Target_Practice_-_Bazooka_hard +["Target Practice: Grenade (easy)"] = "Zielübung: Granate (einfach)", -- Target_Practice_-_Grenade_easy +["Target Practice: Grenade (hard)"] = "Zielübung: Granate (schwer)", -- Target_Practice_-_Grenade_hard +["Target Practice: Homing Bee"] = "Zielübung: Zielsuchende Biene", -- Target_Practice_-_Homing_Bee +["Target Practice: Shotgun"] = "Zielübung: Schrotflinte", -- Target_Practice_-_Shotgun +["Targets left: %d"] = "Verbleibende Ziele: %d", -- +["Target"] = "Zielscheibe", -- HedgeEditor +["Tatsujin"] = "Tatsujin", -- +["Tatters"] = "Lumpen", -- +["Team %d: "]="Team %d: ", +["Team Identity Mode"]="Team-Identitätsmodus", +["TEAM IDENTITY MODE"]="TEAMIDENTITÄTSMODUS", +["Team of Hearts"]="Team der Herzen", +["Team’s best heights per round"]="Die Besthöhen der Teams pro Runde", +["Team Scores:"] = "Teampunktestand:", -- Control +["Team scores:"] = "Teampunktestand:", -- Space_Invasion +["Teamwork 2"] = "Teamwork 2", -- User_Mission_-_Teamwork_2 +["Teamwork"] = "Teamwork", -- User_Mission_-_Teamwork +["Team Zook"]="Team Zook", +["TechRacer"] = "TechRacer", -- TechRacer +["Teleporation Node"]="Teleporterstation", +["Teleportation Mode"]="Teleportationsmodus", +["Teleportation Node: Allows teleportation| between other nodes."] = "Teleportationsstation: Ermöglicht Teleportation| zwischen anderen Stationen.", -- Construction_Mode +["Teleportation Node"]="Teleportationsstation", +["Teleport hint: just use the mouse to select the destination!"]="Teleportertipp: Benutze einfach die Maus, um das Ziel auszuwählen.", +["Teleport"]="Teleporter", +["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."]="Teleportation fehlgeschlagen. Bitte teleportiere nur innerhalb des Einzugsgebiets deiner Klanteleporter.", +["Thanks!"]="Danke!", +["Thanks, dude! It really means a lot to me."] = "Danke, Mann! Das bedeutet mir wirklich sehr viel.", -- A_Classic_Fairytale:epil +["Thanks, man! It really means a lot to me."] = "Danke, Mann! Das bedeutet mir wirklich sehr viel.", -- A_Classic_Fairytale:epil +["Thank you, Dr. Cornelius."]="Danke, Dr. Cornelius!", -- A_Space_Adventure:cosmos +["Thank you for meeting me on such a short notice!"]="Danke, dass du mich so kurzfristig getroffen hast!", +["Thank you, my hero!"]="Danke dir, mein Held!", +["Thank you, oh, thank you, Leaks A Lot!"]="Danke, oh, danke, Undichte Stelle!", +["Thank you, oh, thank you, my heroes!"]="Habt Dank, oh, habt Dank, meine Helden!", +["Thanta"]="Thanta", +["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 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 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!", +["That was pointless. The flag will respawn next round."] = "Das war sinnlos. Die Flagge wird nächste Runde wieder auftauchen.", -- CTF_Blizzard, CTF_Blizzard +["The adventure begins!"]="Das Abenteuer beginnt!", +["The air bombs are weaker than usual."] = "Die Luftbomben sind schwächer als normal.", -- Battalion +["The aliens respect me, even worship me!"] = "Die Außerirdischen respektieren mich, ja sie beten mich sogar an!", -- A_Classic_Fairytale:queen +["The ally units share their ammo."]="Die verbündeten Einheiten teilen sich ihre Munition.", +["The answer is...entertaintment. You'll see what I mean."]="Die Antwort lautet: Unterhaltung. Du wirst verstehen, was ich meine.", +["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "Die Anti-Portal-Oberfläche ist auf dem ganzen Boden verteilt und ich habe nichts, um ihn zu töten. Wenn ich etwas auf ihn fallen lassen könnte, könnte es ihn genug verletzen, um ihn zu töten.", -- portal +["The big bang"]="Der große Knall", +["The Boss"] = "Der Boss", -- +["The boss has fallen! Retreat!"]="Der Anführer ist gefallen! Rückzug!", ["The Bull's Eye"]="Ins Schwarze", -["[Up], [Down] to aim, [Space] to shoot!"]="[Hoch], [Runter] zum Zielen, [Leer] zum Schießen.", -["Select difficulty: [Left] - easier or [Right] - harder"]="Wähl einen Schwierigkeitsgrad: [Links] – leichter oder [Rechts] – schwerer", -["The Torment"]="Die Pein", -["A Classic Fairytale"]="Ein typisches Märchen", -["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.", -["Eye Chewer"]="Augenkauer", -["Flesh for Brainz"]="Fleisch gegen Hirn", -["John"]="Jonas", -["Torn Muscle"]="Loser Muskel", -["Brain Blower"]="Hirnpuster", -["Gorkij"]="Gorkidsch", -["Nom-Nom"]="Mjam-Mjam", -["Vedgies"]="Früchties", -["Collateral Damage"]="Kollateralschaden", -["Save the princess by collecting the crate in under 12 turns!"]="Rette die Prinzessin, indem du die Kiste vor Ablauf von 12 Zügen einsammelst!", +["The caves are well hidden, they won't find us there!"]="Die Höhlen sind gut versteckt, sie werden uns hier nicht finden!", +["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."]="Der Klan der Roten Erdbeere will die Herrschaft an sich reißen und König Ananas stürzen.", +["The Crate Frenzy"]="Der Kistenrausch", +["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 Devs"] = "Die Proggers", -- +["The Dilemma"]="Das Dilemma", +["The editor weapons and tools have been added!"]="Die Editorwaffen und -werkzeuge wurden hinzugefügt!", +["The editor weapons and tools have been removed!"]="Die Editorwaffen und -werkzeuge wurden entfernt!", +["The enemies aren't many anyway, it is going to be easy!"]="Es sind eh nicht so viele Feinde, es wird einfach sein!", +["The enemy can't move but it might be a good idea to stay out of sight!"] = "Der Feind kann sich nicht bewegen, aber du solltest besser aus der Schusslinie bleiben!", -- A_Classic_Fairytale:dragon +["The enemy is hiding out on yonder ducky!"]="Der Feind versteckt sich auf dem Entlein dort drüben!", +["The Enemy Of My Enemy"]="Der Feind meines Feindes", +["The explosion is weaker than usual."] = "Die Explosion ist schwächer als gewöhnlich.", -- Battalion +["The fight begins!"]="Die Schlacht beginnt!", +["The final part"]="Das letzte Bauteil", +["The First Blood"]="Der erste Zusammenstoß", +["The First Encounter"]="Das erste Zusammentreffen", +["The first hedgehog to kill someone becomes the Mutant."] = "Der erste Igel, der einen anderen tötet, mutiert.", -- Mutant +["The first hedgehog which scores %d or more wins the game."] = "Der erste Igel, der %d oder mehr Punkte hat, gewinnt.", -- Mutant +["The first stop"]="Der erste Halt", +["The first turn will last 25 sec and every other turn 15 sec."]="Der 1. Zug wird 25 Sek., jeder andere Zug 15 Sek. dauern.", +["The first turn will last 25 sec and every other turn 15 sec"]="Der 1. Zug wird 25 Sek., jeder andere Zug 15 Sek. dauern", +["The flag will respawn next round."]="Die Flagge wird nächste Runde wieder auftauchen.", +["The flood has stopped! Challenge over."] = "Die Flut ist vorbei! Herausforderung beendet.", -- User_Mission_-_That_Sinking_Feeling +["The food bites back"]="Das Essen beißt zurück", +["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 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 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", +["Their buildings were very primitive back then, even for an uncivilised island."]="Ihre Gebäude waren damals sehr primitiv, selbst für eine unzivilisierte Insel.", +["The Iron Curtain"] = "Der eiserne Vorhang", -- ["The Journey Back"]="Die Rückreise", -["Collateral Damage II"]="Kollateralschaden II", -["Save Fell From Heaven!"]="Rette Fiel Vom Himmel!", -["Get the crate on the other side of the island!|"]="Hol dir die Kiste auf der anderen Seite der Insel!|", -["Hint: you might want to stay out of sight and take all the crates...|"]="Tipp: Du solltest vielleicht aus der Schusslinie bleiben und alle Kisten nehmen.|", -["If you get stuck, use your Desert Eagle or restart the mission!|"]="Wenn du stecken bleibst, benutze deine Desert Eagle oder starte die Mission neu.|", -["Leaks A Lot must survive!"]="Undichte Stelle muss überleben!", -["Your hogs must survive!"]="Deine Igel müssen überleben.", -["Adventurous"]="Abenteuerlich", -["Get Dense Cloud out of the pit!"]="Hol Dichte Wolke aus der Grube!", +["The king of %s has died!"] = "Der König von %s ist gestorben!", -- Battalion +["The last encounter"]="Das letzte Gefecht", +["The last surviving clan wins."] = "Der letzte überlebende Klan gewinnt.", -- TrophyRace +["The leader escaped. Defeat the rest of the aliens!"] = "Der Anführer floh. Besieg den Rest der Außerirdischen.", -- A_Classic_Fairytale:queen +["The leader seems scared, he will probably flee."] = "Der Anführer scheint verängstigt zu sein, er wird wahrscheinlich fliehen.", -- A_Classic_Fairytale:queen +["The Leap of Faith"]="Der Mutsprung", +["the meteorite"]="der Meteorit", +["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."]="Der Meteorit kam zu nah und das Antischwerkraftgerät ist zu schwach, um ihn jetzt zu stoppen.", +["the moon"]="der Mond", +["The Moonwalk"]="Der Mondspaziergang", +["The Mutant has super-weapons and a lot of health."]="Der Mutant hat Superwaffen und eine hohe Gesundheit.", +["The Mutant loses health quickly if he doesn't keep scoring kills."]="Der Mutant verliert schnell an Gesundheit, wenn er nicht schnell andere Igel tötet.", +["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 one is pretty hard! |Tip: You have to do multiple swings!"]="Die Nächste ist ziemlich schwer! |Tipp: Du musst mehrmals schwingen!", +["Then how do they keep appearing?"]="Also woher kommen sie?", +["The Ninja-Samurai Alliance"] = "Die Ninja-Samurai-Allianz", -- +["Then prepare for battle!"]="Dann mach dich bereit für die Schlacht!", +["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 opression of the elders, of course!"] = "Die Unterdrückung der Ältesten, natürlich!", -- A_Classic_Fairytale:queen +["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", +["The Police"] = "Die Polizei", -- +["The power of love! No, wait, the power of the aliens!"] = "Die Macht der Liebe! Ach, Quatsch, die Macht der Aliens!", -- A_Classic_Fairytale:queen +["The RC plane only carries 2 weak bombs."] = "Das Funkflugzeug trägt nur 2 schwache Bomben.", -- Battalion +["There are a variety of structures available to aid you."]="Es gibt verschiedene Gebäude, um dich zu unterstützen.", +["There are no snarky comments this time."] = "Diesmal gibt es keine hämischen Kommentare.", -- Space_Invasion +["There is one below us!"]="Da ist eine unter uns!", +["There is the tunnel entrance"]="Hier ist der Tunneleingang.", +["There must be a spy among us!"]="Es muss ein Spion unter uns sein!", +["There's more of them? When did they become so hungry?"]="Es gibt mehr von ihnen? Seit wann wurden sie so hungrig?", +["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"]="Es gibt nichts befriedigenderes für mich, als dich jeden Morgen zu sehen, wie du deine Schönheit mit dem Rest der Welt teilst, meine Prinzessin!", +["There's nothing more satisfying to us than seeing you share your beauty..."]="Es gibt nichts befriedigenderes für uns, als dich jeden Morgen zu sehen, wie du deine Schönheit …", +["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"]="Es gibt nichts befriedigenderes für uns, als dich jeden Morgen zu sehen, wie du deine Schönheit mit dem Rest der Welt teilst, meine Prinzessin!", +["The Rising"]="Der Aufstieg", +["The rope won't get reset."] = "Das Seil wird nicht zurückgesetzt.", -- A_Space_Adventure:death02 ["The Savior"]="Der Erlöser", -["Free Dense Cloud and continue the mission!"]="Befrei Dichte Wolke und setze die Mission fort!", -["They never learn"]="Sie lernen es nie.", -["I just wonder where Ramon and Spiky disappeared..."]="Ich frage mich lediglich, wohin Ramon und Stachli verschwunden sind.", -["I wonder where Dense Cloud is..."]="Ich frag mich, wo Dichte Wolke ist.", -["He must be in the village already."]="Er muss schon im Dorf sein.", -["I'd better get going myself."]="Ich geh jetzt besser weiter.", -["Welcome, Leaks A Lot!"]="Willkommen, Undichte Stelle!", -["I want to play a game..."]="Ich möchte ein Spiel spielen.", -["Help me, please!!!"]="Hilfe! Zu Hilfe! Bitte!", -["If you can get that crate fast enough, your beloved \"princess\" may go free."]="Wenn du diese Kiste schnell genug einsammelst, darfst du deine geliebte »Prinzessin« befreien.", -["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!", -["Good luck...or else!"]="Viel Glück! Sonst …!", -["Hey! This is cheating!"]="Hey, das ist geschummelt!", -["I need to get to the other side of this island, fast!"]="Ich muss auf die andere Seite der Insel gelangen, und zwar schnell!", -["With Dense Cloud on the land of shadows, I'm the village's only hope..."]="Jetzt, wo Dichte Wolke im Land der Schatten ist, bin ich des Dorfs einzige Hoffnung.", -["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!", -["You have failed to complete your task, young one!"]="Du hast versagt, Jüngling!", -["It's time you learned that your actions have consequences!"]="Es ist Zeit, dass du lernst, dass dein Handeln Konsequenzen haben wird!", -["No! Please, help me!"]="Nein! Bitte hilf mir!", -["No! What have I done?! What have YOU done?!"]="Nein! Was habe ich getan?! Was hast DU getan?!", -["Help me, Leaks!"]="Hilf mir, Undichte!", -["But you said you'd let her go!"]="Aber du sagtest, dass du sie freilässt!", -["And you believed me? Oh, god, that's cute!"]="Und du hast mir geglaubt? Ach Gottchen, das ist so süß!", -["I won't let you kill her!"]="Ich werde nicht zulassen, dass du sie umbringst!", -["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.", -["Thank you, oh, thank you, Leaks A Lot!"]="Danke, oh, danke, Undichte Stelle!", -["How can I ever repay you for saving my life?"]="Wie kann ich es jemals wieder gutmachen, dass du mein Leben gerettet hast?", -["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"]="Es gibt nichts befriedigenderes für mich, als dich jeden Morgen zu sehen, wie du deine Schönheit mit dem Rest der Welt teilst, meine Prinzessin!", -["Let's go home!"]="Lasst uns nach Hause gehen!", -["And so they discovered that cyborgs weren't invulnerable..."]="Und so fanden sie heraus, dass die Cyborgs nicht unverwundbar sind.", -["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!", -["We have no time to waste..."]="Wir haben keine Zeit zu verlieren.", -["Well, well! Isn't that the cutest thing you've ever seen?"]="Sieh mal einer an! Ist das nicht das süßeste Ding, dass du jemals gesehen hast?", -["Two little hogs cooperating, getting past obstacles..."]="Zwei Igelchen, sie arbeiten zusammen, bewältigen Hindernisse gemeinsam …", -["Let me test your skills a little, will you?"]="Lass mich deine Fertigkeiten ein wenig testen, okay?", -["Why are you doing this?"]="Warum tust du das?", -["To help you, of course!"]="Natürlich um dir zu helfen!", -["OH, COME ON!"]="ACH, KOMM!", -["Let's see what your comrade does now!"]="Sehen wir mal, was dein Kamerad jetzt anstellt.", -["Help me, please!"]="Hilf mir bitte!", -["What are you doing? Let her go!"]="Was tust du? Lass sie gehen!", -["Yeah? Watcha gonna do? Cry?"]="Ja und? Was willst du schon tun? Heulen?", -["We won't let you hurt her!"]="Wir werden nicht zulassen, dass du ihr wehtust!", -["Thank you, oh, thank you, my heroes!"]="Habt Dank, oh, habt Dank, meine Helden!", -["There's nothing more satisfying to us than seeing you share your beauty..."]="Es gibt nichts befriedigenderes für uns, als dich jeden Morgen zu sehen, wie du deine Schönheit …", -["... share your beauty with the world every morning, my princess!"]="…, ja, wie du deine Schönheit mit dem Rest der Welt teilst, meine Prinzessin!", -["Dude, can you see Ramon and Spiky?"]="He, kannst du Ramon und Stachli sehen?", -["No...I wonder where they disappeared?!"]="Nein. Ich frage mich, wohin sie verschwunden sind?!", -["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 lassen, nachdem du mein Angebot ablehnst!", -["You're funny!"]="Du bist lustig!", -["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"]="Es gibt nichts befriedigenderes für uns, als dich jeden Morgen zu sehen, wie du deine Schönheit mit dem Rest der Welt teilst, meine Prinzessin!", -["Cannibal Sentry"]="Kannibalenwache", -["The village, unprepared, was destroyed by the cyborgs..."]="Das unvorbereitete Dorf wurde von den Cyborgs zerstört.", -["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."]="Tipp: Wähle den Schweißbrenner, ziele und drücke [Feuern]. Drücke [Feuern] erneut, um aufzuhören.|Spreng nicht die Kiste.", -["The Tunnel Maker"]="Der Tunnelbauer", -["Hint: Select the LowGravity and press [Fire]."]="Tipp: Wähle die niedrige Schwerkraft und drücke [Feuern].", -["The Moonwalk"]="Der Mondspaziergang", -["Slippery"]="Rutschig", -["You'd better watch your steps..."]="Pass besser auf, wohin du trittst.", -["Y3K1337"]="Y3K1337", -["Artur Detour"]="Artus Rück", -["Led Heart"]="Geführtes Herz", -["Nilarian"]="Nilarian", -["Orlando Boom!"]="Orlando Bumm!", -["Gas Gargler"]="Gasgurgler", -["Hatless Jerry"]="Hutloser Igor", -["Rusty Joe"]="Rostjonas", -["Steel Eye"]="Stahlauge", -["Leaderbot"]="Führboter", -["Beep Loopers"]="Piepskreisler", -["Corporationals"]="Kapitalista", -["Name"]="Name", -["Bloodrocutor"]="Blutfrierer", -["Bloodsucker"]="Blutsauger", -["Bonely"]="Knochi", -["Corpsemonger"]="Leichenschänder", -["Femur Lover"]="Schenkellieber", -["Glark"]="Glark", -["Muscle Dissolver"]="Muskellöser", -["Rot Molester"]="Rottiger Störenfried", -["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."]="Rette Undichte Stelle!|Tipp: Die Igelwahl könnte behilflich sein.", +["These primitive people are so funny!"]="Diese primitiven Leute sind so lustig!", ["The Shadow Falls"]="Die Schattenfälle", ["The Showdown"]="Das Showdown", -["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"]="Verteidige dich!|Tipp: Du kannst Tipps über die Benutzung der Waffen erhalten, indem du im Waffenauswahlmenü mit dem Mauszeiger auf sie zeigst.", -["Play with me!"]="Spiel mit mir!", -["Obliterate them!|Hint: You might want to take cover..."]="Vernichte sie!|Tipp: Du solltest in Deckung gehen.", -["Why do you not like me?"]="Warum magst du mich nicht?", -["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!", -["The Dilemma"]="Das Dilemma", -["Return to Leaks A Lot! If you get stuck, press [Precise] to try again!"]="Kehr zu Undichte Stelle zurück! Wenn du steckenbleibst, drücke [Genaues Zielen], um es erneut zu versuchen!", +["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 spirits of the ancerstors are surely pleased, Leaks A Lot."]="Die Geister der Ahnen sind sicherlich erfreut, Undichte Stelle.", +["The team continued their quest of finding the rest of the tribe."] = "Das Team setzte die Suche nach dem Rest ihres Stammes fort.", -- A_Classic_Fairytale:queen +["The time that you have left when you reach the blue hedgehog will be added to the next turn."]="Deine verbleibende Zeit wird zu deinem nächsten Zug addiert, sobald du den blauen Igel erreichst.", +["The Torment"]="Die Qual", +["The truth about Professor Hogevil"]="Die Wahrheit über Professor Bösigel", +["The tunnel entrance is over there."] = "Der Eingang zum Tunnel ist dort drüben!", -- A_Space_Adventure:desert01 +["The tunnel is about to get flooded!"]="Der Tunnel wird gleich geflutet!", +["The Tunnel Maker"]="Der Tunnelbauer", +["The Ultimate Weapon"]="Die Ultimative Waffe", +["The Union"]="Die Einheit", +["The village, unprepared, was destroyed by the cyborgs..."]="Das unvorbereitete Dorf wurde von den Cyborgs zerstört.", ["The walk of Fame"]="Die Ruhmesmeile", -["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 Timer mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer], um die Stärke zu setzen.", -["The Individualist"]="Der Individualist", -["Pfew! That was close!"]="Puh! Das war knapp!", -["Where did you get the exploding apples and the magic bow that shoots many arrows?"]="Woher hast du die explodierenden Äpfel und den magischen Bogen, der so viele Pfeile verschießt?", -["Where did you get the exploding apples?"]="Woher hast du den explodierenden Apfel?", -["Where did you get the magic bow that shoots many arrows?"]="Woher hast du den magischen Bogen, der so viele Pfeile verschießt?", -["Did you warn the village?"]="Hast du das Dorf gewarnt?", -["No, I came back to help you out..."]="Nein, ich kam zurück, um dir zu helfen.", -["Uhm...I met one of them and took his weapons."]="Ähm, ich hab einen von ihnen getroffen und nahm seine Waffen.", -["We should head back to the village now."]="Wir sollten zum Dorf zurückkehren.", -["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."]="Nach dem Schock, der vom feindlichen Spion ausgelöst wurde, gingen Undichte Stelle und Dichte Wolke zur Entspannung auf die Jagd.", -["Little did they know that this hunt will mark them forever..."]="Sie ahnten nicht, dass diese Jagd sie für immer zusammenschweißen würde.", -["I have no idea where that mole disappeared...Can you see it?"]="Ich habe keine Ahnung, wohin dieser Maulwurf verschwand. Kannst du ihn sehen?", -["Nope. It was one fast mole, that's for sure."]="Nee. Es war ein schneller Maulwurf, das ist klar.", -["Please, stop releasing your \"smoke signals\"!"]="Bitte hör mit deinen »Rauchzeichen« auf!", -["You're terrorizing the forest...We won't catch anything like this!"]="Du terrorisierst den Wald. Wir werden auf diese Weise nichts fangen!", -["..."]="…", -["I can't believe it worked!"]="Ich kann nicht glauben, dass es funktioniert hat!", -["That shaman sure knows what he's doing!"]="Dieser Schamane weiß genau, was er tut!", -["Yeah...I think it's a 'he', lol."]="Ja, ich glaube, dass es ein »er« ist. (lach)", -["It wants our brains!"]="Es will unsere Gehirne!", -["Not you again! My head still hurts from last time!"]="Nicht du schon wieder! Mein Kopf tut mir immer noch vom letzten Mal weh!", -["Did you see him coming?"]="Hast du ihn kommen sehen?", -["No. Where did he come from?"]="Nein. Woher kam er?", -["Are we there yet?"]="Sind wir schon da?", +["The wasted youth"]="Die vergeudete Jugend", +["The way you handled your little internal conflicts …"] = "Wie ihr euren kleinen internen Konflikte gehandhabt habt …", -- A_Classic_Fairytale:queen +["The weapon in that last crate was bestowed upon us by the ancients!"]="Die Waffe in der letzten Kiste wurde uns von den Urahnen übergeben!", +["The what?!"]="Das was?!", +["The wind whispers that you are ready to become familiar with tools, now..."]="Der Wind flüstert, dass du jetzt bereit bist, mit den Werkzeugen vertraut zu werden.", +["They are all waiting back in the village, haha."]="Sie warten alle im Dorf, haha.", +["They are up there! Take this rope and hurry!"]="Sie sind da oben! Nimm dieses Seil und beeil dich!", +["They Call Me Bullseye! +16 points!"] = "Sie nennen mich »Adlerauge«! +16 Punkte!", -- Space_Invasion +["They have weapons we've never seen before!"]="Sie haben Waffen, die wir noch nie zuvor gesehen haben!", +["They keep appearing like this. It's weird!"]="Sie tauchen einfach so auf. Es ist seltsam!", +["They killed %s! You bastards!"] = "Sie haben %s getötet! Ihr Schweine!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +["They must be trying to weaken us!"]="Sie müssen versuchen, uns zu schwächen!", +["They never learn"]="Sie lernen es nie", +["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "Sie stolperten über einen Stapel voller Waffen und schienen näher zu kommen.", -- A_Classic_Fairytale:queen +["They told us to wear these clothes. They said that this is the newest trend."]="Sie sagten uns, dass wir diese Kleidung tragen sollten. Sie sagten, dass es der neueste Trend sei.", +["They've been manipulating us all this time!"]="Sie haben uns die ganze Zeit manipuliert!", +["They won't hesitate to attack you in order to rob you!"]="Sie werden nicht zögern, dich anzugreifen, um dich auszurauben!", +["The Zoo"] = "Der Zoo", -- +["Thighlicker"]="Schenkelschlecker", +["Things are going to get messy around here."]="Es wird hier gleich richtig hässlich werden.", -- A_Space_Adventure:fruit01 +["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "Hiermit erzeugst du eine Kiste an einem|beliebigen Ort im Einflussgebiet deines Klans,|auf Kosten von Energie.", -- Construction_Mode +["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "Hiermit kannst du Minen, Haftminen und Fässer|an einer beliebigen Stelle innerhalb des|Einflussgebiets deines Klans platzieren,|auf Kosten von Energie.|Hoch/Runter: Objekttyp wählen|Links/Rechts: Zeitzünder wählen (für Minen)|Cursor: Objekt platzieren", -- Construction_Mode +["This almost concludes our tutorial."] = "Damit ist unsere Übung fast abgeschlossen.", -- Basic_Training_-_Flying_Saucer +["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 it! It's time to make Fell From Heaven fall for me..."]="Das ist es! Es ist an der Zeit, Fiel Vom Himmel in mich verfallen zu lassen …", +["This island is the only place left on Earth with grass on it!"]="Diese Insel ist der einzige Ort auf der Welt, der noch Gras hat!", +["This is seems like a wealthy hedgehog, nice ..."]="Das sieht wie ein reicher Igel aus, nett.", +["This is the Olympic stadium of saucer flying."]="Dies ist das olympische Stadion des Untertassenflugs.", +["This is the wrong way!"]="Das ist die falsche Richtung!", +["This is typical!"]="Typisch!", ["This must be some kind of sorcery!"]="Das muss wohl eine Art Zauberei sein!", -["I thought their shaman died when he tried our medicine!"]="Ich dachte, ihr Schamane starb, als er unsere Medizin probierte.", -["I saw it with my own eyes!"]="Ich sah es mit meinen eigenen Augen!", -["Then how do they keep appearing?"]="Also woher kommen sie?", -["It's impossible to communicate with the spirits without a shaman."]="Es ist unmöglich, ohne einen Schamanen mit den Geistern zu kommunizieren.", -["We need to warn the village."]="Ich muss das Dorf warnen.", -["What a ride!"]="Was für eine Reise!", -["We can't defeat them!"]="Wir können sie nicht besiegen!", -["I'll hold them off while you return to the village!"]="Ich halte sie zurück, während du zum Dorf zurückkehrst.", -["30 minutes later..."]="30 Minuten später …", -["Greetings, cloudy one!"]="Grüße, du Wolkiger!", -["I have come to make you an offering..."]="Ich kam, um dir ein Angebot zu machen.", -["You are given the chance to turn your life around..."]="Ich gebe dir die Chance, dein Leben auf den Kopf zu stellen.", -["If you agree to provide the information we need, you will be spared!"]="Wenn du einverstanden bist, uns die Information, die wir brauchen, zu geben, wirst du verschont!", -["Have no illusions, your tribe is dead, indifferent of your choice."]="Mach dir keine Hoffnungen, dein Stamm ist tot, unabhängig von deiner Entscheidung.", -["If you decide to help us, though, we will no longer need to find a new governor for the island."]="Wenn du uns helfen willst, brauchen wir für diese Insel keinen neuen Anführer zu suchen.", -["If you know what I mean..."]="Wenn du verstehst, was ich meine.", -["So? What will it be?"]="Also? Was ist deine Entscheidung?", -["Great choice, Steve! Mind if I call you that?"]="Großartige Entscheidung, Stefan! Stört es dich, wenn ich dich so nenne?", -["Whatever floats your boat..."]="Worauf immer du Lust hast.", -["Great! You will be contacted soon for assistance."]="Gut! Du wirst schon bald für Unterstützung benachrichtigt.", -["In the meantime, take these and return to your \"friend\"!"]="In der Zwischenzeit, nimm diese und kehre zu deinem »Freund« zurück!", -["Your death will not be in vain, Dense Cloud!"]="Dein Tod wird nicht ungesühnt bleiben, Dichte Wolke!", -["You will be avenged!"]="Du wirst gerächt!", -["I see..."]="Ich verstehe …", -["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"]="Denk dran, du erbärmliches Tier: Wenn der Tag gekommen ist, wirst du deine blinde Loyalität bereuen!", -["You just committed suicide..."]="Du hast gerade Selbstmord begangen.", -["If you say so..."]="Wenn du es sagst …", -["Dude, we really need a new shaman..."]="Mann, wir brauchen wirklich einen neuen Schamanen.", -["It's over..."]="Es ist vorbei.", -["Let's head back to the village!"]="Lass uns zurück zum Dorf gehen!", -["Really?! You thought you could harm me with your little toys?"]="Wirklich? Du dachtest, du könntest mich mit deinen kleinen Spielzeugen verletzen?", -["You're pathetic! You are not worthy of my attention..."]="Du bist erbärmlich! Du hast meine Aufmerksamkeit nicht verdient.", -["Actually, you aren't worthy of life! Take this..."]="Eigentlich hast du nicht das Recht, zu leben! Nimm das!", -["Incredible..."]="Unglaublich.", -["I can't wait any more, I have to save myself!"]="Ich kann nicht länger waren, ich muss selber zur Hilfe eilen!", -["Where are all these crates coming from?!"]="Woher kommen all die Kisten?!", -["I have to get back to the village!"]="Ich muss zum Dorf zurückkehren!", -["Dense Cloud must have already told them everything..."]="Dichte Wolke muss ihnen bereits alles gesagt haben.", -["Weaklings"]="Schwächlinge", -["Stronglings"]="Stärklinge", +["This must be the caves!"]="Dies müssen die Höhlen sein!", +["This one's tricky."]="Die hier ist knifflig.", +["This planet seems dangerous!"]="Dieser Planet scheint gefährlich zu sein!", +["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 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 +["This will certianly come in handy."] = "Das wird bestimmt nützlich sein.", -- User_Mission_-_Teamwork_2 +["Thompson"] = "Thomas", -- +["Those aliens are destroying the island!"]="Diese Außerirdischen zerstören die Insel!", +["Those were scheduled for disposal anyway."] = "Sie waren eh für den Schrottplatz bestimmt.", -- A_Classic_Fairytale:dragon +["Throw a baseball at your foes|and send them flying!"] = "Wirf einen Baseball auf deine|Gegner und lass sie fliegen!", -- Knockball +["Thug #%d"] = "Rowdy %d", -- A_Space_Adventure:death01 +["thug"]="Rowdy", +["Timbers"] = "Holz", -- +["Time: %.1fs"] = "Zeit: %.1fs", -- Racer, TechRacer +["Time Box"] = "Zeitkasten", -- Construction_Mode +["Timed Kamikaze! +10 points!"] = "Rechtzeitiges Kamikaze: +10 Punkte!", -- Space_Invasion +["Time extended! +%dsec"] = "Zeitbonus! +%ds", -- Space_Invasion +["Time extension: %ds"] = "Zeitbonus: %ds", -- Tumbler +["Time for a more interesting stunt, but first just collect the next crate!"] = "Zeit für einen interessanteren Stunt, aber sammle zuerst die nächste Kiste auf!", -- Basic_Training_-_Flying_Saucer +["Time's up!"]="Die Zeit ist um!", +["Time’s up!"]="Die Zeit ist um!", +["Time to run!"]="Zeit, zu fliehen!", +["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "Tipp: Es ist sehr schwer, beim Fliegen die Zielrichtung zu ändern,|also pass sie an, bevor du abhebst.", -- Basic_Training_-_Flying_Saucer +["Tip: Don't remain for too long in the water, or you won't make it."] = "Tipp: Bleib nicht zu lang im Wasser, sonst schaffst du es nicht.", -- Basic_Training_-_Flying_Saucer +["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "Tipp: Wenn du hängenbleibst, benutze »Zug überspringen«,|um das aktuelle Ziel erneut zu versuchen.", -- Basic_Training_-_Flying_Saucer +["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."]="Tipp: Benutze die [Esc]-Taste (dieses Menü), wenn du den Kontinent des aktuellen Teams sehen willst, oder die Besonderheiten dieses Kontinents sehen willst.", +["Tip: The rope physics are different than in the real world, |use it to your advantage!"]="Tipp: Die Seilphysik ist anders als in der realen Welt, |nutze das zu deinem Vorteil aus!", +["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "Tipp: Du kannst die fliegende Untertasse|im Flug wechseln, drücke einfach [Angriff] zwei mal.", -- Basic_Training_-_Flying_Saucer +["Tiyuri"] = "Tiyuri", -- +["Toad"] = "Toad", -- +["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)", +["Toggle Placement/Deletion: [Left], [Right]"] = "Platzierungs-/Löschmodus umschalten: [Links], [Rechts]", -- HedgeEditor +["Toggle Shield: [Long jump]"] = "Schild umschalten: [Weitsprung]", -- Space_Invasion +["To help you, of course!"]="Natürlich, um dir zu helfen!", +["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "Um ein Projektil im Flug zu starten, halte [Genaues Zielen] gedrückt|und drücke [Weitsprung].", -- Basic_Training_-_Flying_Saucer +["Tony"] = "Toni", -- +["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].", -["Under Construction"]="Baustelle", -["A little gift from the cyborgs"]="Ein kleines Geschenk von den Cyborgs", -["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 Timer mit [1-5], ziele mit [Hoch]/[Runter] und halte [Leer], um die Stärke zu setzen.", -["The guardian"]="Der Wächter", -["...and so the cyborgs took over the world..."]="Und so eroberten die Cyborgs die Welt …", -["Survive!|Hint: Cinematics can be skipped with the [Precise] key."]="Überlebe!|Tipp: Zwischensequenzen können mit der [Genaues Zielen]-Taste übersprungen werden.", -["The First Encounter"]="Das erste Zusammentreffen", -["Brain Stu"]="Hirntopf", -["Brainila"]="Hirnilia", -["Olive"]="Olive", -["Salivaslurper"]="Speichelschlürfer", -["Mindy"]="Intellekta", -["NomNom"]="Mjamjam", -["Spleenlover"]="Milzlieber", -["Thighlicker"]="Schenkelschlecker", -["Defeat the cannibals!|"]="Besiege die Kannibalen!|", -["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.", -["Invasion"]="Invasion", -["United We Stand"]="Gemeinsam sind wir stark", -["I'm so scared!"]="Ich hab solche Angst!", -["Back in the village, after telling the villagers about the threat..."]="Zurück im Dorf, nachdem die Dorfbewohner vor der Gefahr gewarnt worden sind …", -["Their buildings were very primitive back then, even for an uncivilised island."]="Ihre Gebäude waren damals sehr primitiv, selbst für eine unzivilisierte Insel.", -["Young one, you are telling us that they can instantly change location without a shaman?"]="Jüngling, willst du uns etwa weiß machen, dass sie ihre Position sofort ändern können, ohne einen Schamanen?", -["That is, indeed, very weird..."]="Das ist tatsächlich sehr merkwürdig.", -["If they try coming here, they can have a taste of my delicious knuckles!"]="Wenn sie versuchen, hierher zukommen, können sie von meinen köstlichen Fäusten kosten!", -["Haha!"]="Haha!", -["I'm not sure about that!"]="Ich bin mir darüber nicht so sicher.", -["They have weapons we've never seen before!"]="Sie haben Waffen, die wir noch nie zuvor gesehen haben!", -["Luckily, I've managed to snatch some of them."]="Glücklicherweise konnte ich mir ein paar davon ergattern.", -["Oops...I dropped them."]="Upps, ich habe sie fallen gelassen.", -["They keep appearing like this. It's weird!"]="Sie tauchen einfach so auf. Es ist seltsam!", -["Did anyone follow you?"]="Ist dir irgendjemand gefolgt?", -["No, we made sure of that!"]="Nein, wir hatten extra aufgepasst.", -["First aid kits?!"]="Erste-Hilfe-Koffer?", -["I've seen this before. They just appear out of thin air."]="Ich hab das zuvor gesehen. Sie tauchen einfach aus dem Nichts auf.", -["Hey guys!"]="Hey, Leute!", -["Where have you been?"]="Wo warst du?", -["Just on a walk."]="Nur spazieren.", -["You have chosen the perfect moment to leave."]="Du hast den perfekten Augenblick ausgesucht, um zu gehen.", -["HOW DO THEY KNOW WHERE WE ARE???"]="WOHER WISSEN SIE, WO WIR SIND?", -["We have to protect the village!"]="Wir müssen das Dorf schützen!", -["We can't hold them up much longer!"]="Wir können sie nicht länger aufhalten!", -["We need to move!"]="Wir müssen weiter!", -["But where can we go?"]="Aber wohin können wir gehen?", +["Torn Muscle"]="Loser Muskel", ["To the caves..."]="Zu den Höhlen …", -["Good idea, they'll never find us there!"]="Gute Idee, hier werden sie uns niemals finden!", -["I need to move the tribe!"]="Ich muss den Stamm von hier fortführen.", -["The caves are well hidden, they won't find us there!"]="Die Höhlen sind gut versteckt, sie werden uns hier nicht finden!", -["Light Cannfantry"]="Leichte Kannfantrie", -["Heavy Cannfantry"]="Schwere Kannfantrie", -["Spacetrip"]="Weltraumreise", -["Go to the moon by using the flying saucer and complete the main mission"]="Komm zum Mond, indem du die fliegende Untertasse benutzt und die Hauptmission beendest.", -["Come back to this mission and visit the other planets to collect the crates"]="Kehre zu dieser Mission zurück und besuche die anderen Planeten, um die Kisten einzusammeln.", -["Visit the Death Planet after completing all the other planets' main missions"]="Besuche den Todesplaneten, nachdem du die Hauptmissionen aller anderen Planeten fertiggestellt hast.", -["Come back to this mission after collecting all the device parts"]="Kehre zu dieser Mission zurück, nachdem du alle Bauteile eingesammelt hast.", -["Getting ready"]="Bereitmachen", -["Go and collect the crate"]="Geh und sammle die Kiste.", -["Try not to get spotted by the guards!"]="Versuch, nicht von den Wächtern entdeckt zu werden!", -["The adventure begins!"]="Das Abenteuer beginnt!", +["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.", +["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 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.", +["To win the game you have to pass into the rings in time."]="Um das Spiel zu gewinnen, musst du rechtzeitig durch die Ringe fliegen.", +["To win the game you have to pass into the rings in time"]="Um das Spiel zu gewinnen, musst du rechtzeitig durch die Ringe fliegen", +["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", +["Trapper"]="Trapper", ["Travel carefully as your fuel is limited"]="Reise vorsichtig, da dein Treibstoff begrenzt ist.", -["Use the saucer and fly to the moon"]="Benutze die Untertasse und flieg zum Mond.", -["An unexpected event!"]="Ein unerwartetes Ereignis!", -["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.", -["Use the saucer and fly away"]="Benutze die Untertasse und flieg davon!", -["Objectives"]="Ziele", -["Searching the stars!"]="Suche in den Sternen", -["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"]="Besuche den Eis-, Wüsten- und Fruchtplaneten, bevor du mit dem Todesplaneten fortfährst.", -["Fly to the meteorite and detonate the explosives"]="Fliege zum Meteroiten und sprenge die Bomben.", -["Saving Hogera"]="Hogera retten", -["Hog Solo"]="Igel Einsam", -["H"]="H", -["Dr.Cornelius"]="Dr. Cornelius", -["Bob"]="Bert", -["Sam"]="Steffen", -["PAotH"]="PAdI", -["Guards"]="Wächter", -["Help Hog Solo to find all the parts of the anti-gravity device."]="Hilf Igel Einsam, alle Bauteile des Antischwerkraftgerätes zu finden.", ["Travel to all the neighbor planets and collect all the pieces"]="Reise zu allen Nachbarplaneten und sammle alle Bauteile ein.", -["Now I have to climb these trees"]="Jetzt muss ich diese Bäume hochklettern.", +["Tribe"]="Stamm", +["TrophyRace"]="TrophyRace", +["Trunks"] = "Rüssel", -- +["Try again!"] = "Versuch es noch mal!", -- Basic_Training_-_Flying_Saucer +["Try it now and dive here to collect the crate on the right girder."] = "Versuch es jetzt und tauch hier ab, um die Kiste auf dem rechten Träger aufzusammeln.", -- Basic_Training_-_Flying_Saucer +["Try not to get spotted by the guards!"]="Versuch, von den Wächtern unentdeckt zu bleiben!", +["Try to be smart and eliminate them quickly. This way you might scare off the rest!"]="Versuch, schlau zu sein und sie schnell zu erledigen. Auf diese Weise könntest du den Rest abschrecken!", +["Try to keep as many allies alive as possible."]="Versuch, so viele Verbündete wie möglich am Leben zu erhalten.", +["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.", +["T_T"]="T_T", +["Tumbler"] = "Purzler", -- Tumbler +["Turns: Hogs get %d random weapon(s) from their pool"] = "Züge: Igel erhalten %d zufällige Waffe(n) aus ihrem Waffenpool", -- Battalion +["Turns: King's health is set to %d%% of the team health"] = "Züge: Königgesundheit ist %d%% der Teamgesundheit", -- Battalion +["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "Züge: Füllen %d Waffen- und %d Helferpunkte auf und verteilen|Waffen zufällig, basierend auf den vorhandenen Teampunkten", -- Battalion +["Turns until arrival: %d"] = "Züge bis zur Ankunft: %d", -- A_Classic_Fairytale:backstab +["Turns until Sudden Death: %d"] = "Züge bis Sudden Death: %d", -- A_Classic_Fairytale:dragon +["Turn Time: %dsec"] = "Zugzeit: %ds", -- Space_Invasion +["Twenty-Twenty"] = "Zwanzig-Zwanzig", -- +["Two flowers: All missions complete"] = "Zwei Blumen: Alle Missionen abgeschlossen", -- A_Space_Adventure:cosmos +["Two little hogs cooperating, getting past obstacles..."]="Zwei Igelchen, sie arbeiten zusammen, bewältigen Hindernisse gemeinsam …", +["Ugly Mug"] = "Schmutzkrug", -- +["Uhm...I met one of them and took his weapons."]="Ähm, ich hab einen von ihnen getroffen und nahm seine Waffen.", +["Uhmm, it's … uhm … my ring!"] = "Ähm, es ist … ähm … mein Ring!", -- A_Classic_Fairytale:queen +["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.", +["Under the meteorites shadow ..."]="Unter dem Schatten des Meteoriten …", +["Unexpected Igor"]="Ausnahmefelix", +["Unique new weapons"]="Einzigartige neue Waffen", +["Unit 0x0007"]="Einheit 0x0007", +["Unit 189"] = "Einheit 189", -- +["Unit 234"] = "Einheit 234", -- +["Unit 333"] = "Einheit 333", -- +["Unit 334a$7%;.*"]="Einheit 334a$7%;,*", +["Unit 3378"]="Einheit 3378", +["Unit 485"] = "Einheit 485", -- +["Unit 527"] = "Einheit 527", -- +["Unit 638"] = "Einheit 638", -- +["Unit 709"] = "Einheit 709", -- +["Unit 835"]="Einheit 835", +["Unit 883"] = "Einheit 883", -- +["United We Stand"]="Gemeinsam sind wir stark", +["Unit"]="Einheit", +["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", +["Up/Down: Change placement mode"] = "Hoch/Runter: Platzierungsmodus wechseln", -- HedgeEditor +["Up/down: Choose crate type"] = "Hoch/Runter: Kistentyp wählen", -- Construction_Mode +["Upper-class elite pilot"]="Elitepilot der Oberklasse", +["Use it wisely!"]="Benutze sie weise!", +["Use it with precaution!"]="Benutze sie weise.", +["User Challenge"]="Benutzerherausforderung", +["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 +["Use the attack key twice to change the flying saucer while floating in mid-air."] = "Benutze die Angriffstaste 2 mal, um die Fliegende Untertasse während des Fluges zu wechseln.", -- A_Space_Adventure:ice02 +["Use the attack key twice to change the flying saucer while floating in mid-air"] = "Benutze die Angriffstaste 2 mal, um die Fliegende Untertasse während des Fluges zu wechseln", -- A_Space_Adventure:ice02 +["Use the bazooka and the flying saucer to get the freezer."] = "Benutze die Bazooka und die fliegende Untertasse, um die Eiskanone zu ergattern.", -- A_Space_Adventure:ice01 +["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 the other planets."] = "Benutze die fliegende Untertasse, um zu den anderen Planeten 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 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", +["Use the rope in order to catch the blue hedgehog"]="Benutze das Seil, um den blauen Igel zu fangen.", +["Use the rope to get on the head of the mole, young one!"]="Benutze das Seil, um auf den Kopf des Maulwurfs zu gelangen, Jüngling!", ["Use the rope to get to the crate"]="Benutze das Seil, um zur Kiste zu gelangen.", -["One cannot simply walk in moon with rope!"]="Man kann nicht einfach so im Mond mit dem Seil spazieren!", -["This is the wrong way!"]="Das ist die falsche Richtung!", -["Collect the crate with the flying saucer"]="Sammle die Kiste mit der fliegenden Untertasse ein.", -["Fly to the moon"]="Flieg zum Mond.", -["Welcome to the moon!"]="Willkommen auf dem Mond!", -["the moon"]="der Mond", -["Welcome to the Fruit Planet!"]="Willkommen auf dem Fruchtplaneten!", -["the Fruit Planet"]="der Fruchtplanet", -["Welcome to the Desert Planet!"]="Willkommen auf dem Wüstenplaneten!", -["the Desert Planet"]="der Wüstenplanet", -["Welcome to the Planet of Ice!"]="Willkommen auf dem Eisplaneten!", -["the Ice Planet"]="der Eisplanet", -["Welcome to the Death Planet!"]="Willkommen auf dem Todesplaneten!", -["the Planet of Death"]="der Todesplanet!", -["Welcome to the meteorite!"]="Willkommen auf dem Meteorit!", -["the meteorite"]="der Meteorit", -["Near secret base 17 of PAotH in the rural Hogland..."]="In der Nähe der geheimen Basis 17 der PAdI im ländlichen Igelland …", -["So Hog Solo, here we are..."]="Also, Igel Einsam, da wären wir!", -["Behind these trees on the east side there is secret base 17"]="Hinter diesen Bäumen auf der Ostseite liegt die geheime Basis 17.", -["You have to continue alone from now on."]="Von hier an musst du alleine fortfahren.", -["Be careful, the future of Hogera is in your hands!"]="Sei vorsichtig, die Zukunft von Hogera liegt in deinen Händen!", -["We'll use our communicators to contact you"]="Wir werden unsere Kommunikatoren benutzen, um dich zu kontaktieren.", -["In am also entrusting you with some rope"]="Ich werde dir auch etwas Seil anvertrauen.", -["You may find it handy"]="Du könntest es gebrauchen.", -["Thank you Dr.Cornelius"]="Danke, Dr. Cornelius!", -["I'll make good use of it"]="Ich werde es klug anwenden.", -["It would be wiser to steal the space ship while PAotH guards are taking a brake!"]="Es wäre schlauer, das Raumschiff zu stehlen, während die PAdI-Wächter eine Pause machen!", -["Remember! Many will seek the anti-gravity device! Now go, hurry up!"]="Denk dran: Viele werden das Antischwerkraftgerät begehren! Geh jetzt! Beeilung!", -["CheckPoint reached!"]="Kontrollpunkt erreicht!", -["Got the saucer!"]="Ich hab die Untertasse!", -["Nice!"]="Nett!", -["Now use it and go to the moon PAotH station to get more fuel!"]="Benutze es jetzt und komme zur PAdI-Mondbasis, um mehr Treibstoff zu holen!", -["Prepare to flee!"]="Bereitmachen zum Fliehen!", -["Hey"]="Hey", -["Look, someone is stealing the saucer!"]="Sieh, jemand stiehlt die Untertasse!", -["I'll get him!"]="Den schnapp ich mir!", -["You are out of danger, time to go to the moon!"]="Du bist in Sicherheit. Zeit, zum Mond zu gelangen!", -["I guess we lost him!"]="Ich glaube, wir haben ihn verloren!", -["We should better report this and continue our watch!"]="Wir sollten dies besser melden und unsere Wache fortsetzen.", -["I guess I can't go far without fuels!"]="Ich fürchte, ohne Treibstoff komme ich nicht weit.", -["Go to go back"]="Ich muss umkehren.", -["You have to try again!"]="Du muss es nochmal versuchen!", -["Hm... Now I ran out of fuel..."]="Hmm … Jetzt ist mein Treibstoff alle.", -["This planet seems dangerous!"]="Dieser Planet scheint gefährlich zu sein!", -["I am not ready for this planet yet. I should visit it when I have found all the other device parts"]="Ich bin für diesen Planeten noch nicht bereit. Ich sollte ihn besuchen, sobald ich alle anderen Bauteile gefunden habe.", -["Under the meteorite shadow..."]="Unter dem Schatten des Meteorits …", -["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.", -["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now"]="Der Meteorit kam zu nah und das Antischwerkraftgerät ist zu schwach, um ihn jetzt zu stoppen.", -["We need it to get split into at least two parts"]="Wir müssen ihn in mindestens zwei Teile zerbrechen.", -["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.", -["We need you to go there and detonate them yourself! Good luck!"]="Du musst dorthin gehen und sie selbst detonieren. Viel Glück!", -["Hog Solo arrived at "]="Igel Einsam ist angekommen an ", -["Return to the mission menu by pressing the \"Go back\" button"]="Kehre zum Missionsmenü zurück, indem du den »Zurück«-Knopf drückst.", -["You can choose another planet by replaying this mission"]="Du kannst einen anderen Planeten auswählen, indem du diese Mission erneut spielst.", -["Planets with completed main missions will be marked with a flower"]="Planeten, bei denen die Hauptmissionen erledigt wurden, werden mit einer Blume markiert.", -["You have to travel again"]="Du musst erneut reisen.", -["Your first destination is the moon in order to get more fuel"]="Dein erstes Ziel ist der Mond, um mehr Treibstoff zu erhalten.", -["You have to complete the main mission on moon in order to travel to other planets"]="Du musst die Hauptmission auf dem Mond erledigen, damit du zu den anderen Planeten reisen kannst.", -["You have to be careful and not die!"]="Du musst vorsichtig sein und darfst nicht sterben!", -["The last encounter"]="Das letzte Gefecht", -["Defeat Professor Hogevil!"]="Besiege Professor Bösigel!", -["The final part"]="Das letzte Bauteil", -["Professor"]="Professor", -["thug"]="Rowdy", -["Hog Solo lost, try again!"]="Igel Einsam hat verloren, versuch es nochmal!", -["To win the game you have to eliminate all your enemies"]="Um das Spiel zu gewinnen, musst du all deine Gegner eliminieren", -["Congratulations, you won!"]="Gratulation, du hast gewonnen!", -["You have successfully eliminated Professor Hogevil"]="Du hast Professor Bösigel erfolgreich eliminiert!", -["You have rescued H and Dr.Cornelius"]="Du hast H und Dr. Cornelius gerettet.", -["You have acquired the last device part"]="Du hast das letzte Bauteil erhalten.", -["Now go and play the menu mission to complete the campaign"]="Geh jetzt und spiele die Menümission, um die Kampagne zu beenden.", -["Somewhere in the uninhabitable Death Planet..."]="Irgendwo auf dem unbewohnbaren Todesplaneten …", -["Welcome Hog Solo, surprised to see me?"]="Hallo, Igel Einsam! Bist du überrascht, mich zu sehen?", -["As you can see I have survived our last encounter and I had time to plot my master plan!"]="Wie du sehen kannst, habe ich unser letztes Zusammentreffen überlebt und ich hatte Zeit, meinen Masterplan auszuhecken.", -["I've thought that the best way to get the device is to let you collect most of the parts for me!"]="Ich dachte mir, dass es am einfachsten ist, wenn ich dich einfach die meisten Bauteile für mich sammeln lasse.", -["So, now I got the last part and I have your friends captured..."]="Und jetzt habe ich das letzte Teil und deine Freunde gefangengenommen.", -["Will you give me the other parts?"]="Wirst du mir die anderen Teile geben?", -["I will never hand you the parts!"]="Niemals gebe ich dir die Teile!", -["Then prepare for battle!"]="Dann mach dich bereit für die Schlacht!", -["Killing the specialists"]="Die Spezialisten töten", -["Use your available weapons in order to eliminate the enemies"]="Benutze deine verfügbaren Waffen, um die Gegner zu eliminieren.", -["Each time you play this missions enemy hogs will play in a random order"]="Jedes mal, wenn du diese Mission spielst, werden die feindlichen Igel in einer zufälligen Reihenfolge spielen.", -["At the start of the game each enemy hog has only the weapon that he is named after"]="Am Anfang des Spiels hat jeder feindliche Igel nur die Waffe, nachdem er benannt wurde.", -["A random hedgehog will inherit the weapons of his deceased team-mates"]="Ein zufälliger Igel wird die Waffen seiner verstorbenen Teamkollegen erben.", -["If you kill a hedgehog with the respective weapon your health points will be set to 100"]="Wenn du einen Igel mit der entsprechenden Waffe tötest, wird deine Gesundheit auf 100 gesetzt.", -["If you injure a hedgehog you'll get 35% of the damage dealt"]="Wenn du einen Igel verletzt, wirst du 35% des angerichteten Schadens erhalten.", -["Every time you kill an enemy hog your ammo will get reset"]="Bei jedem Mal, in dem du einen feindlichen Igel tötest, wird deine Munition zurückgesetzt.", -["Rope won't get reset"]="Seil wird nicht zurückgesetzt.", -["Challenge Objectives"]="Herausforderungsziele", -["Mortar"]="Mörser", -["Desert Eagle"]="Desert Eagle", -["Grenade"]="Granate", -["Shoryuken"]="Shoryuken", -["Bazooka"]="Bazooka", -["5 deadly hogs"]="5 tödliche Igel", -["You have to eliminate all the enemies"]="Du musst alle Gegner eliminieren.", -["Read the Challenge Objectives from within the mission for more details"]="Lies die Herausforderungsziele in der Mission für mehr Details.", -["You complete the mission in "]="Du hast die Mission abgeschlossen in ", -["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.", -["Somewhere in the Planet of Death..."]="Irgendwo auf dem Todesplaneten …", -["...Hog Solo fights for his life"]="… kämpft Igel Einsam ums Überleben.", -["A Space Adventure"]="Ein Weltraumabenteuer", -["Searching in the dust"]="Suche im Staub", -["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!", -["Most of the destructible terrain in marked with blue color"]="Das meiste des zerstörbaren Geländes ist mit einer blauen Farbe markiert.", -["Chief Sandologist"]="Haupt-Sandologe", -["Sandy"]="Sandi", -["Spike"]="Stachel", -["Sandstorm"]="Sandsturm", -["Smugglers"]="Schmuggler", -["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!", -["A smuggler! Prepare for battle"]="Ein Schmuggler! Bereitmachen zum Kämpfen!", -["Run away you coward!"]="Lauf weg, du Feigling!", -["Who's there?! I'll get you..."]="Wer ist da? Ich krieg dich …", -["In the Planet of Sand, you have to double check your moves..."]="Auf dem Sandplaneten musst du deine Züge gut überlegen …", -["Finally you are here..."]="Endlich bist du hier …", -["Thank you for meeting me on such a short notice!"]="Danke, dass du mich so kurzfristig getroffen hast!", -["No problem, I would do anything for H!"]="Kein Problem, ich würde alles für H tun!", -["Now listen carefully! Below us there are tunnels that have been created naturally over the years"]="Jetzt hör gut zu! Unter uns sind Tunnel, welche über die Jahre natürlich entstanden sind.", -["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here"]="Ich hörte, dass die örtlichen Stämme sagen, dass vor vielen Jahren einige PAdI-Wissenschaftler ihren Müll dort abgeliefert haben.", -["H confirmed that there isn't such a PAotH activity logged"]="H bestätigte, dass eine solche PAdI-Aktivität nicht protokolliert ist.", -["So, I believe that it's a good place to start"]="Also glaube ich, dass es ein guter Ort zum Anfangen ist.", -["Beware though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find"]="Aber Vorsicht! Viele Schmuggler kommen oft hier her, um diese Tunnel zu durchsuchen und alles mögliche, was sie finden, zu sammeln.", -["They won't hesitate to attack you in order to rob you!"]="Sie werden nicht zögern, dich anzugreifen, um dich auszurauben!", -["OK, I'll be extra careful!"]="Okay, ich werde besonders vorsichtig sein!", -["There is the tunnel entrance"]="Hier ist der Tunneleingang.", -["Good luck!"]="Viel Glück!", -["Get him Spike!"]="Hol ihn, Stachel!", -["This is seems like a wealthy hedgehog, nice..."]="Das sieht wie ein reicher Igel aus, nett.", -["Checkpoint reached!"]="Kontrollpunkt erreicht!", -["Haven't found it yet..."]="Ich hab es noch nicht gefunden.", -["Hoorah!!!"]="Hurra!", -["To win the game you had to collect the 2 crates with no specific order"]="Um das Spiel zu gewinnen, musst du die 2 Kisten in beliebiger Reihenfolge einsammeln.", -["To win the game you have to find the right crate"]="Um das Spiel zu gewinnen, musst du die richtige Kiste finden.", -["You can avoid some battles"]="Du kannst einige Kämpfe vermeiden.", -["Use your ammo wisely"]="Benutze deine Munition weise.", -["Don't destroy the device crate!"]="Zerstöre nicht die Kiste mit dem Bauteil!", -["Running for survival"]="Ums Überleben laufen", +["Use the rope to knock your enemies to their doom."]="Benutze das Seil, um deine Gegner in ihr Verderben zu stürzen!", ["Use the rope to quickly get to the surface!"]="Benutze das Seil, um schnell zur Oberfläche zu gelangen!", -["To win the game you have to go to the surface"]="Um zu gewinnen, musst du zur Oberfläche gehen.", -["Most mines are not active"]="Die meisten Minen sind Blindgänger.", -["From the second turn and beyond the water rises"]="Vom 2. Zug an wird das Wasser steigen.", -["You have escaped successfully"]="Du bist erfolgreich geflohen.", -["Your escape took you "]="Deine Flucht dauerte ", -["Many meters below the surface..."]="Viele Meter unter der Oberfläche …", -["The tunnel is about to get flooded..."]="Der Tunnel wird gleich geflutet!", -["I have to reach the surface as quickly as I can..."]="Du muss die Oberfläche so schnell wie möglich erreichen.", -["Precise flying"]="Präzisionsfliegen", -["Use the RC plane and destroy the all the targets"]="Benutze das Funkflugzeug und zerstöre alle Ziele.", -["Each time you destroy all the targets on your current level you'll get teleported to the next level"]="Jedes mal, wenn du alle Ziele im aktuellen Level zerstörst, wirst du zum nächsten Level teleportiert", -["You'll have only one RC plane at the start of the mission"]="Am Anfang der Mission hast du nur ein Funkflugzeug.", -["During the game you can get new RC planes by collecting the weapon crates"]="Während des Spiels kannst du neue Funkflugzeuge erhalten, indem du die Waffenkisten sammest.", -["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.", -["Level 1 clear!"]="Level 1 abgeschlossen!", -["Level 2 clear!"]="Level 2 abgeschlossen!", -["Congratulations, you are the best!"]="Gratulation, du bist der Beste!", -["You have destroyed all the targets"]="Du hast alle Ziele zerstört.", -["You are indeed the best PAotH pilot"]="Du bist wirklich der beste PAdI-Pilot.", -["Next time you play \"Searching in the dust\" you'll have an RC plane available"]="Das nächste Mal, wenn du die Mission »Suche im Staub« spielst, bekommst du ein Funkflugzeug.", -["You have to destroy all the targets"]="Du musst alle Ziele zerstören.", -["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 Ziele übrigbleiben.", -["The big bang"]="Der Urknall", -["Find a way to detonate all the explosives and stay alive!"]="Finde einen Weg, alle Sprengstoffe zu detonieren und bleib am Leben!", -["Red areas are indestructible"]="Rote Bereiche sind unzerstörbar.", -["Green areas aren't portal enabled"]="Grüne Bereiche sind portalabweisend.", -["You have to destroy all the explosives without dying!"]="Du musst alle Sprengstoffe zerstören, ohne zu sterben!", -["Congratulations, you have saved Hogera!"]="Gratulation, du hast Hogera gerettet!", -["Hogera is safe!"]="Hogera ist in Sicherheit!", -["Bad timing"]="Schlechtes Timing", -["Ready for Battle?"]="Bereit für die Schlacht?", -["Walk left if you want to join Captain Lime or right if you want to decline his offer"]="Geh nach links, wenn du Leutnant Limone beitreten willst, oder nach rechts, wenn du sein Angebot ablehnen möchtest.", -["Battle Starts Now!"]="Jetzt beginnt die Schlacht!", -["You have chosen to fight! Lead the Green Bananas to battle and eliminate all the enemies"]="Du hast dich für die Schlacht entschieden! Führe die Grünen Bananen in die Schlacht und eliminiere alle Feinde.", -["Time to run!"]="Zeit, zu fliehen!", -["You have chosen to flee... Unfortunately the only place where you can launch your saucer is the left-most place on the map"]="Du hast dich für die Flucht entschieden. Leider ist der einzige Ort, wo du deine Untertasse starten kannst, ganz links auf der Karte.", -["Captain Lime"]="Leutnant Limone", -["Mister Pear"]="Herr Birne", -["Lady Mango"]="Frau Mango", -["Green Hog Grape"]="Grünigeltraube", -["Mr Mango"]="Mister Mango", -["General Lemon"]="General Limone", -["Robert Yellow Apple"]="Robert Gelbapfel", -["Summer Squash"]="Sommerkürbis", -["Tall Potato"]="Großkartoffel", -["Yellow Pepper"]="Gelbpaprika", -["Corn"]="Mais", -["Max Citrus"]="Max Zitron", -["Naranja Jed"]="Orangus Otus", -["Green Bananas"]="Grüne Bananen", -["Yellow Watermelons"]="Gelbe Wassermelonen", -["Green Bananas won!"]="Die Grünen Bananen haben gewonnen!", -["You have eliminated all visible enemy hedgehogs!"]="Du hast alle sichtbaren feindlichen Igel besiegt!", -["Hog Solo escaped successfully!"]="Igel Einsam ist erfolgreich geflohen!", -["You have reached the take-off area successfully!"]="Du hast das Startfeld erfolgreich erreicht!", -["Somewhere on the Planet of Fruits a terrible war is about to begin..."]="Irgendwo auf dem Planeten der Früchte steht ein fürchterlicher Krieg bevor.", -["I was told that as the leader of the king's guard, no one knows this world better than you!"]="Mir wurde gesagt, dass, als der Führer der königlichen Garde, niemand diese Welt besser als du kennst!", -["So, I kindly ask for your help"]="Also bitte ich dich ergebenst um Hilfe.", -["You couldn't have come to a worse time Hog Solo!"]="Du könntest du einer kaum schlechteren Zeit ankommen, Igel Einsam!", -["The clan of the Red Strawberry wants to take over the dominion and overthrone king Pineapple."]="Der Klan der Roten Erdbeere will die Herrschaft an sich reißen und König Ananas stürzen.", -["Under normal circumstances we could easily defeat them but we have kindly sent most of our men to the kingdom of Sand to help to 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.", -["However the army of Yellow Watermelons is about to attack any moment now."]="Aber die Armee der Gelben Wassermelonen wird jeden Moment angreifen.", -["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."]="Ich würde dir gerne helfen, wenn wir diese Schlacht gewinnen, aber unter diesen Bedingungen kann ich dir nur helfen, wenn du an unserer Seite kämpfst.", +["Use the saucer and fly away"]="Benutze die Untertasse und flieg davon!", +["Use the saucer and fly to the moon"]="Benutze die Untertasse und flieg zum Mond.", +["Use the saucer and pass through the rings."]="Benutze die Untertasse und passiere die Ringe.", +["Use the shield to protect yourself from bazookas."] = "Benutze das Schild, um dich vor Bazookas zu schützen.", -- Space_Invasion +["Use the structure placer to place structures."] = "Benutze den Gebäudeplatzierer, um Gebäude zu platzieren.", -- Construction_Mode +["Use this mode to give a hog a preset identity and weapons."]="Benutze diesen Modus, um einem Igel ein voreingestelle Idendität sowie Waffen zu geben.", +["Use this mode to give an entire team themed hats and names."]="Benutze diesen Modus, um einem Team einen Satz Hüte und Namen zu geben.", +["Use this mode to place air mines"]="Benutze diesen Modus, um Luftminen zu platzieren", +["Use this mode to place barrels"]="Benutze diesen Modus, um Pulverfässer zu platzieren", +["Use this mode to place cleavers"]="Benutze diesen Modus, um Hackebeile zu platzieren", +["Use this mode to place custom sprites."]="Benutze diesen Modus, um benutzerdefinierte Sprites zu platzieren.", +["Use this mode to place girders"]="Benutze diesen Modus, um Bauträger zu platzieren", +["Use this mode to place mines"]="Benutze diesen Modus, um Minen zu platzieren", +["Use this mode to place rubberbands"]="Benutze diesen Modus, um Gummibalken zu platzieren", +["Use this mode to place sticky mines"]="Benutze diesen Modus, um Haftminen zu platzieren", +["Use this mode to place targets"]="Benutze diesen Modus, um Zielscheiben zu platzieren", +["Use this mode to place utility crates"]="Benutze diesen Modus, um Werkzeugkisten zu platzieren", +["Use this mode to place weapon crates"]="Benutze diesen Modus, um Waffenkisten zu platzieren", +["Use this mode to select and reposition gears"]="Benutze diesen Modus, um Gears auszuwählen und zu verlegen", +["Use this mode to set the health of hogs."]="Benutze diesen Modus, um die Igelgesundheit einzustellen.", +["Use this mode to tag gears for win/lose conditions."]="Benutze diesen Modus, um Gears für Sieg-/Niederlagebedingungen zu markieren.", +["Use this mode to waypoints"]="Benutze diesen Modus, um Wegpunkte zu platzieren", +["Use your ammo wisely."]="Benutze deine Munition weise.", +["Use your available weapons in order to eliminate the enemies."]="Benutze deine verfügbaren Waffen, um die Gegner zu eliminieren.", +["Use your available weapons in order to eliminate the enemies"]="Benutze deine verfügbaren Waffen, um die Gegner zu eliminieren", +["Use your ready time to think."]="Benutze deine Vorbereitungszeit zum Denken.", +["Use your rope to collect all crates as fast as possible."] = "Benutze dein Seil, um alle Kisten so schnell wie möglich einzusammeln.", -- +["Use your rope to get from start to finish as fast as you can!"]="Nutze das Seil, um von Start zu Ziel zu gelangen – so schnell du kannst!", +["Utility Crate Placement Mode"]="Werkzeugkistenplatzierungsmodus", +["UTILITY CRATE PLACEMENT MODE"]="WERKZEUGKISTENPLATZIERUNGSMODUS", +["Utility crates extend your time."] = "Werkzeugkisten erhöhen deine Zeit.", -- Tumbler +["Variants: Hogs will be randomized from 12 different variants"] = "Varianten: Igel werden aus 12 verschiedenen Varianten zufällig ausgewählt", -- Battalion +["Variants: Kings and air generals are disabled"] = "Varianten: Könige und Luftgeneräle sind deaktiviert", -- Battalion +["Variants: The last hog of each team will be a king"] = "Varianten: Der letzte Igel jedes Teams wird zum König", -- Battalion +["Vedgies"]="Früchties", +["Vegan Jack"]="Veganer-Jochen", +["Vega"] = "Vega", -- +["Very valuable, haha!"] = "Sehr wertvoll, haha!", -- A_Classic_Fairytale:queen +["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.", +["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"]="Besuche den Eis-, Wüsten- und Obstplaneten, bevor du mit dem Todesplaneten fortfährst.", +["Vladimir"] = "Vladimir", -- +["Void"] = "Leere", -- Big_Armory +["Voldemort"] = "Voldemort", -- portal +["Voltorb"] = "Voltobal", -- +["Wait a moment …"] = "Moment mal …", -- A_Space_Adventure:final +["Walk left if you want to join Captain Lime or right if you want to decline his offer."]="Geh nach links, wenn du Leutnant Limone beitreten willst, oder nach rechts, wenn du sein Angebot ablehnen möchtest.", +["Wall Before Crate: You must touch the marked wall before you can get crates."] = "Wand Vor Kiste: Du musst die markierte Wand berühren, bevor die Kisten erhälst.", -- WxW +["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "Wände Vor Kiste: Du musst die %d markierten Wände berühren, bevor du Kisten erhälst.", -- WxW +["Wall set: No walls"] = "Wandgruppe: Keine Wände", -- WxW +["Wall set: %s (%d walls)"] = "Wandgruppe: %s (%d Wände)", -- WxW +["Wall set: %s"] = "Wandgruppe: %s", -- WxW +["Walls left: %d"] = "Verbleibende Wände: %d", -- WxW +["Wall to wall"] = "Wand zu Wand", -- WxW +["Waluigi"]="Waluigi", +["Wannabe Flyboys"]="Möchtegernflieger", +["Wannabe Shoppsta"]="Möchtegernkäufer", +["Wario"] = "Wario", -- +["Warning: Deletition Mode Active"]="Achtung: Löschmodus aktiv", +["Warning: Never ever leave the flying saucer while in water!"] = "Achtung: Verlasse niemals die fliegende Untertasse im Wasser!", -- Basic_Training_-_Flying_Saucer +["WARNING: Sabotage detected!"]="ACHTUNG: Sabotage erkannt!", +["Warrior"]="Krieger", +[" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"]=" wurde vom Schema extahiert|– Dieser Kontinent wird alle Besonderheiten von den anderen Kontinenten benutzen können!", +["WatchBot 4000"] = "Wachboter 4000", -- User_Mission_-_Teamwork_2 +["Watch your steps, young one!"]="Pass auf deine Schritte auf, Jüngling!", +["Watermelon Heart"]="Wassermelonenherz", +["Water: Rises by 37 per turn"] = "Wasser: Steigt um 37 pro Zug", -- Battalion +["Waypoint Deletion Mode"]="Wegpunktlöschmodus", +["Waypoint Editing Mode"] = "Wegpunktbearbeitungsmodus", -- HedgeEditor +["WAYPOINT EDITING MODE"] = "WEGPUNKTBEARBEITUNGSMODUS", -- HedgeEditor +["Waypoint placed. Available points remaining: %d"] = "Wegpunkt platziert. Verbleibende verfügbare Wegpunkte: %d", -- Racer +["Waypoint placed."]="Wegpunkt gesetzt", +["Waypoint Placement Mode"]="Wegpunktplatzierungsmodus", +["WAYPOINT PLACEMENT MODE"]="WEGPUNKTPLATZIERUNGSMODUS", +["Waypoint placement phase"] = "Wegpunktplatzierungsphase", -- Racer +["Waypoint removed. Available points: %d"] = "Wegpunkt entfernt. Verfügbare Wegpunkte: %d", -- Racer +["Waypoints remaining: %d"] = "Verbleibende Wegpunkte: %d", -- Racer, TechRacer +["Weaklings"]="Schwächlinge", +["We all know what happens when you get frightened..."]="Wir wissen alle, was passiert, wenn du Angst kriegst.", +["Weapon Crate Placement Mode"]="Waffenkistenplatzierungsmodus", +["WEAPON CRATE PLACEMENT MODE"] = "WAFFENKISTENPLATZIERUNGSMODUS", -- HedgeEditor +["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "Waffenfilter: Dematerialisiert sämtliche Munition,| die Gegner in seinem Einflussbereich tragen.", -- Construction_Mode +["Weapon Filter"]="Waffenfilter", +["weaponschemes"]="Waffenschemata", +["Weapons: Each team starts with %d weapon points"] = "Waffen: Jedes Team beginnt mit %d Waffenpunkten", -- Battalion +["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "Waffen: Igel erhalten zufällig 1 aus 3 Waffen pro Zug", -- Battalion +["Weapons: Nearly every hog variant gets 1 kamikaze"] = "Waffen: Fast jede Igelvariante erhält 1 Kamikaze", -- Battalion +["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!", +["We can't let them take over our little island!"]="Wir können sie nicht unsere kleine Insel erobern lassen!", +["We come in peace! Just let our friends go!"] = "Wir kommen in Frieden! Lass einfach nur unsere Freunde gehen!", -- A_Classic_Fairytale:queen +["We could just have blown up the meteorite from the the beginning!"] = "Wir hätten doch gleich den Meteoriten in die Luft jagen können!", -- A_Space_Adventure:final +["We don't have time for that now!"] = "Wir haben jetzt keine Zeit dafür!", -- A_Classic_Fairytale:queen +["We have no time to waste..."]="Wir haben keine Zeit zu verlieren.", +["We have nowhere else to live!"]="Wir haben sonst keinen Ort zu leben!", +["We have spotted the enemy! We'll attack when the enemies start gathering!"]="Wir haben den Feind gesichtet! Wir werden angreifen, sobald sich die Feinde versammeln.", +["We have to find our folk!"] = "Wir müssen unsere Leute finden!", -- A_Classic_Fairytale:queen +["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, Leaks A Lot!"]="Willkommen, Undichte Stelle!", +["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!", +["Welcome to the meteorite!"]="Willkommen auf dem Meteorit!", +["Welcome to the moon!"]="Willkommen auf dem Mond!", +["Welcome to the Planet of Ice!"]="Willkommen auf dem Eisplaneten!", +["Well done."]="Gut gemacht.", +["We'll give you a problem then!"]="Dann geben wir euch ein Problem!", +["(well... kind of...)"]="(naja, sozusagen …)", +["We'll play a game first."]="Wir werden zuerst ein Spiel spielen.", +["We'll spare your life for now!"]="Wir werden dein Leben verschonen. Noch.", +["Well, that escalated quickly!"]="Das ging aber schnell in die Hose!", +["Well that was an unnecessary act of violence."] = "Naja, das war ein unnötiger Gewaltakt.", -- A_Classic_Fairytale:epil +["Well, that was a waste of time."]="Tja, das war wohl Zeitverschwendung.", +["We'll use our communicators to contact you."]="Wir werden unsere Kommunikatoren benutzen, um dich zu kontaktieren.", +["Well, well! Isn't that the cutest thing you've ever seen?"]="Sieh mal einer an! So was putziges hab ich ja schon lange nicht mehr gesehen.", +["Well, yes. This was a cyborg television show."]="Ähm, ja. Es war eine Cyborg-Fernsehsendung.", +["Well, you're about to wake up!"] = "Tja, du bist gerade im Begriff, aufzuwachen.", -- A_Classic_Fairytale:queen +["We made sure noone followed us!"]="Wir waren uns sicher, dass uns niemand gefolgt ist!", +["We need it to get split into at least two parts."]="Wir müssen ihn in mindestens zwei Teile zerbrechen.", +["We need to go back!"] = "Wir müssen zurück gehen!", -- A_Classic_Fairytale:queen +["We need to hurry!"] = "Wir müssen uns beeilen!", -- A_Classic_Fairytale:queen +["We need to move!"]="Wir müssen weiter!", +["We need to prevent their arrival!"]="Wir müssen ihre Ankunft verhindern!", +["We need to warn the village."]="Ich muss das Dorf warnen.", +["We need you to go there and detonate them yourself! Good luck!"]="Du musst dorthin gehen und sie selbst detonieren. Viel Glück!", +["We oppressed her, the only woman in the tribe!"] = "Wir haben sie unterdrückt, die einzige Frau im Stamm!", -- A_Classic_Fairytale:epil +["We're terribly sorry!"] = "Es tut uns fürchterlich Leid!", -- A_Classic_Fairytale:epil +["We risk our lives going through challenges."] = "Wir riskieren unsere Leben und bewältigen Herausforderungen.", -- A_Classic_Fairytale:queen +["We should better report this and continue our watch!"]="Wir sollten dies besser melden und unsere Wache fortsetzen.", +["We should head back to the village now."]="Wir sollten zum Dorf zurückkehren.", +["We, the youth, have to constantly prove our value."] = "Wir, die Jugend, müssen ständig unseren Wert beweisen.", -- A_Classic_Fairytale:queen +["We trusted you, you fool!"] = "Wir haben dir vertraut, du Narr!", -- A_Classic_Fairytale:queen +["We were trying to save her and we got lost."]="Wir versuchten, sie zu retten, aber haben uns verlaufen.", +["We were your home! Your family!"] = "Wir waren dein Zuhause! Deine Familie!", -- A_Classic_Fairytale:queen +["We won't accept you destroying our village!"] = "Wir werden es nicht hinnehmen, dass du unser Dorf zerstörst!", -- A_Classic_Fairytale:queen +["We won't let you hurt any more of us!"] = "Wir werden dich nicht noch mehr von uns schaden lassen!", -- A_Classic_Fairytale:queen +["We won't let you hurt her!"]="Wir werden nicht zulassen, dass du ihr wehtust!", +["We work and work until we sweat blood."] = "Wir arbeiten hart, bis wir Blut und Wasser schwitzen.", -- A_Classic_Fairytale:queen +["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."]="Was?! Ein Kannibale? Hier? Es gibt keine Zeit zu verlieren! Komm, du bist vorbereitet.", +["What a douche!"]="Was für ein Blödian!", +["What am I gonna...eat, yo?"]="Was werde ich … essen?", +["What are you doing at a distance so great, young one?"]="Was tut du hier in so großer Entfernung, Jüngling?", +["What are you doing? Let her go!"]="Was tust du? Lass sie gehen!", +["What a ride!"]="Was für eine Reise!", +["What a strange cave!"]="Was für eine seltsame Höhle!", +["What a strange feeling!"]="Was für ein seltsames Gefühl!", +["What could you possibly forget in that cage?"] = "Was könntest du bloß im Käfig vergessen haben?", -- A_Classic_Fairytale:queen +["What does it look like?"] = "Wonach sieht es aus?", -- A_Classic_Fairytale:queen +["What do my faulty eyes observe? A spy!"]="Was sehen meine alten Augen? Einen Spion!", +["What do you say? Are you in?"]="Was sagst du? Bist du dabei?", ["What do you say? Will you fight for us?"]="Was sagst du? Wirst du für uns kämpfen?", -["You choose well Hog Solo!"]="Gute Wahl, Igel Einsam!", -["I have only 3 hogs available and they are all cadets"]="Ich habe nur 3 Igel, uns sie sind alle Kadetten.", -["As you are more experienced, I want you to lead them to the battle"]="Da du erfahrener bist, will ich, dass du sie in der Schlacht anführst.", -["I of course will observe the battle and intervene if necessary"]="Ich werde natürlich die Schlacht beobachten und, wenn nötig, einschreiten.", -["No problem Captain!"]="Kein Problem, Leutnant!", -["The enemies aren't many anyway, it is going to be easy!"]="Es sind eh nicht so viele Feinde, es wird einfach sein!", -["Don't be foolish son, there will be more"]="Sei kein Idiot, Sohn, es werden mehr kommen.", -["Try to be smart and eliminate them quickly. This way you might scare off the rest!"]="Versuch, schlau zu sein und sie schnell zu erledigen. Auf diese Weise könntest du den Rest abschrecken!", -["Too bad... Then you should really leave!"]="Schade. Dann solltest du wirklich gehen!", -["Things are going to get messy around here"]="Es wird hier gleich richtig hässlich werden.", -["Also, you should know that the only place where you can fly is the left-most part of this area"]="Außerdem solltest du wissen, dass der einzige Ort, wo du fliegen kannst, ganz links in diesem Gebiet ist.", -["All the other places are protected by our flight-inhibiting weapons"]="Alle anderen Orte sind von unseren flugverhindernden Waffen geschützt.", -["Now go and don't waste more of my time you coward..."]="Jetzt geh, und vergeude meine Zeit nicht noch weiter, du Feigling!", -["The Green Bananas lost, try again!"]="Die Grünen Bananen haben verloren, versuche es nochmal!", -["You have to eliminate all the visible enemies"]="Du musst alle sichtbaren Gegner eliminieren.", -["5 additional enemies will be spawned during the game"]="5 weitere Gegner werden während des Spiels auftauchen.", -["You are in control of all the active ally units"]="Du hast die Kontrolle über alle aktive verbündete Einheiten.", -["The ally units share their ammo"]="Die verbündeten Einheiten teilen ihre Munition.", -["Try to keep as many allies alive as possible"]="Versuch, so viele Verbündete wie möglich am Leben zu erhalten.", -["Hog Solo couldn't escape, try again!"]="Igel Einsam konnte nicht fliehen, versuch es nochmal!", -["You have to get to the left-most land and remove any enemy hog from there"]="Du musst zum linken Rand gelangen und von dort alle feindlichen Igel beseitigen.", -["You will play every 3 turns"]="Du wirst alle 3 Züge spielen.", -["Green hogs won't intentionally hurt you"]="Grüne Igel werden dich nicht absichtlich verletzen.", -["Next wave in 3 turns"]="Nächte Welle in 3 Zügen", -["Last wave in 3 turns"]="Letzte Welle in 3 Zügen", -["Getting to the device"]="Zum Greifen nah", -["Exploring the tunnel"]="Höhlenforscher", -["Hog Solo has to reach the last crates"]="Igel Einsam muss die letzten Kisten erreichen.", -["Search for the device with the help of the other hedgehogs "]="Such nach dem Gerät mit der Hilfe der anderen Igel.", -["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.", -["Attack Captain Lime before he attacks back"]="Greif Leutnant Limone an, bevor er angreift.", -["Go to the surface!"]="Geh an die Oberfläche!", -["Return to the Surface"]="Zurück an die Oberfläche", -["Attack the assassins before they attack back"]="Greif die Assassinen an, bevor sie angreifen.", -["Poisonous Apple"]="Giftapfel", -["Dark Strawberry"]="Dunkle Erdbeere", -["Watermelon Heart"]="Wassermelonenherz", -["Deadly Grape"]="Traube des Todes", -["Hog Solo and GB"]="Igel Einsam und GB", -["Fruit Assassins"]="Fruchtassassinen", -["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.", -["You can use the other 2 hogs to assist you"]="Du kannst die anderen beiden Igel benutzen, um dich zu unterstützen.", -["Do not destroy the crates"]="Zerstöre nicht die Kisten.", -["You'll have to eliminate the Strawberry Assassins at the end"]="Am Ende musst du die Erdbeerassassinen eliminieren.", -["You'll have to eliminate Captain Lime at the end"]="Am Ende musst du Leutnant Limone eliminieren.", -["Don't eliminate Captain Lime before collecting the last crate!"]="Eliminiere Leutnant Limone nicht, bevor du die letzte Kiste eingesammelt hast!", -["You retrieved the lost part"]="Du hast das verlorene Teil ergattert", -["You defended yourself against Captain Lime"]="Du hast dich gegen Leutnant Limone gewehrt", -["You defended yourself against Strawberry Assassins"]="Du hast dich gegen die Erdbeerassassinen gewehrt", -["Somewhere else on the planet of fruits Captain Lime helps Hog Solo..."]="Irgendwo anders auf dem Planeten der Früchte hilft Leutnant Limone Igel Einsam.", -["You fought bravely and you helped us win this battle!"]="Du hast mutig gekämpft und uns geholfen, diese Schlacht zu gewinnen!", -["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.", -["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 die zu helfen.", -["Somewhere else on the planet of fruits Hog Solo gets closer to the device..."]="Anderswo auf dem Planeten der Früchte kommt Igel Einsam näher an das Gerät.", -["You are the one who fled! So, you are alive..."]="Du bist der, der floh! Du lebst also …", -["I'm still low on hogs. If you are not afraid I could use a set of extra hands"]="Ich habe immer noch wenige Igel. Wenn du keine Angst hast, könnte ich etwas Unterstützung gebrauchen.", -["I am sorry but I was looking for a device that may be hidden somewhere around here"]="Tut mir Leid, aber ich suchte nach einem Gerät, das hier irgendwo versteckt sein könnte.", -["Many long forgotten things can be found in the same tunnels that we are about to explore!"]="Viele vergessene Dinge können in denselben Tunneln, die wir gleich erforschen werden, finden.", -["If you help us you can keep the device if you find it but we'll keep everything else"]="Wenn du uns hilfst, darfst du das Gerät behalten, wenn du es findest, aber wir werden alles andere behalten.", -["What do you say? Are you in?"]="Was sagst du? Bist du dabei?", -["Ok then!"]="Alles klar!", -["Hoorah! I've found it, now I have to get back to Captain Lime!"]="Hurra! Ich habe es gefunden, nun muss ich zurück zu Leutnant Limone!", -["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!", -["We have spotted the enemy! We'll attack when the enemies start gathering!"]="Wir haben den Feind gesichtet! Wir werden angreifen, sobald sich die Feinde versammeln.", -["Precise shooting"]="Präzisionsschießen", -["You can only use the Sniper Rifle or the Watermelon bomb"]="Du kannst nur das Scharfschützengewehr oder die Wassermelonenbombe benutzen.", -["You'll have only 2 watermelon bombs during the game"]="Du hast nur 2 Wassermelonenbomben während des Spiels.", -["You'll get an extra Sniper Rifle every time you kill an enemy hog with a limit of max 4 rifles"]="Du erhältst ein zusätzliches Scharfschützengewehr für jeden Igel, den du tötest (max. 4 Gewehre).", -["You'll get an extra Teleport every time you kill an enemy hog with a limit of max 2 teleports"]="Du erhältst einen zusätzlichen Teleporter für jeden Igel (max. 2 Teleporter).", -["The first turn will last 25 sec and every other turn 15 sec"]="Der 1. Zug wird 25 Sek., jeder andere Zug 15 Sek. dauern.", -["If you skip a turn then the turn time left will be added to your next turn"]="Wenn du einen Zug überspringst, wird die Zugzeit auf deinen nächsten Zug addiert.", -["Some parts of the land are indestructible"]="Einige Teile des Landes sind unzerstörbar.", -["Hog 1"]="Igel 1", -["Hog III"]="Igel III", -["Hog 100"]="Igel 100", -["Hog Saturn"]="Igel Saturn", -["Hog nueve"]="Igel nueve", -["Hog onze"]="Igel onze", -["Hog dertien"]="Igel dertien", -["Hog 3x5"]="Igel 3x5", -["Hog two"]="Igel zwei", -["Hog D"]="Igel D", -["Hog exi"]="Igel exi", -["Hog octo"]="Igel octo", -["Hog decar"]="Igel decar", -["Hog Hephaestus"]="Igel Hephaestus", -["Hog 7+7"]="Igel 7+7", -["Hog EOF"]="Igel EOF", -["RS1"]="RS1", -["RS2"]="RS2", -["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", -["Somewhere in the Fruit Planet Hog Solo got lost..."]="Irgendwo im Fruchtplaneten hat sich Igel Einsam verlaufen.", -["...and got ambushed by the Red Strawberries"]="… und von den Roten Erdbeeren überfallen wurdest.", -["If you skip the game your time left will be added to your next turn"]="Wenn du das Spiel überspringst, wird deine verbleibende Zeit für deinen nächsten Zug addiert.", -["A frozen adventure"]="Ein frostiges Abenteuer", -["Collect the icegun and get the device part from Thanta"]="Sammle die Eiskanone ein und besorge das Bauteil von Thanta", -["Congratulations, you collected the device part!"]="Gratulation, du hast das Bauteil eingesammelt!", +["What do you want to do?"] = "Was willst du tun?", -- A_Space_Adventure:fruit01 +["Whatever floats your boat..."]="Worauf immer du Lust hast.", +["What?! For all this struggle I just win some ... time? Oh dear!"] = "Was?! Für all diese Mühen gewinne ich nur etwas … Zeit? Oh, Mann!", -- portal +["What has %s ever done to you?"] = "Was hat %s euch jemals angetan?", -- A_Classic_Fairytale:backstab +["What? Here? How did they find us?!"]="Was? Hier? Wie haben sie uns gefunden?", +["What? Is it over already?"]="Wie? Ist es schon vorbei?", +["What is it that you forgot?"] = "Was hast du vergessen?", -- A_Classic_Fairytale:queen +["What is this place?"]="Was ist dieser Ort?", +["What oppression? You were the most unoppressed member of the tribe!"] = "Welche Unterdrückung? Der Stamm hat dich überhaupt nicht unterdrückt!", -- A_Classic_Fairytale:queen +["What shall we do with the traitor?"]="Was sollen wir mit dem Verräter tun?", +["What the?"] = "Was zum?", -- A_Classic_Fairytale:queen +["What?!"] = "Was?!", -- A_Classic_Fairytale:queen +["WHAT?! You're the ones attacking us!"]="WAS?! Ihr seid diejenigen, die uns angreifen!", +["When I find it..."]="Wenn ich ihn in die Finger kriege …", +["When?"]="Wann?", +["Where are all these crates coming from?!"]="Woher kommen all die Kisten?!", +["Where are they?!"]="Wo sind sie?!", +["Where did that alien run?"]="Wohin ist dieser Außerirdische gelaufen?", +["Where did you get the exploding apples and the magic bow that shoots many arrows?"]="Woher hast du die explodierenden Äpfel und den magischen Bogen, der so viele Pfeile verschießt?", +["Where did you get the exploding apples?"]="Woher hast du die explodierenden Äpfel?", +["Where did you get the magic bow that shoots many arrows?"]="Woher hast du den magischen Bogen, der so viele Pfeile verschießt?", +["Where did you get the weapons in the forest, Dense Cloud?"]="Woher hast du die Waffen im Wald gefunden, Dichte Wolke?", +["Where do you get that?!"]="Wo habt ihr das her?", +["Where have you been?!"]="Wo warst du?!", +["Where have you been?"]="Wo warst du?", +["While in modification mode, you can change|the LandFlag by clicking on an object."] = "Im Modifikationsmodus kannst du das LandFlag|ändern, indem du auf ein Objekt klickst.", -- HedgeEditor +["White Tee"]="Schneeweiß", +["Who's there?! I'll get you!"]="Wer ist da? Ich krieg dich …", +["Why are you doing this?"]="Warum tust du das?", +["Why are you helping us, uhm...?"]="Warum hilfst du uns, äh, …?", +["Why can't he just let her go?!"]="Warum kann er sie nicht einfach freilassen?", +["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "… warum hab ich dann mein Leben riskiert, um all die Teile des Antischwerkraftgeräts aufzusammeln?", -- A_Space_Adventure:final +["Why did you do this?"] = "Warum hast du das getan?", -- A_Classic_Fairytale:queen +["Why did you kill your father?"] = "Warum hast du deinen Vater getötet?", -- A_Classic_Fairytale:queen +["Why do men keep hurting me?"]="Warum tun mir Männer ständig weh?", +["Why do you always have to call me names?"] = "Warum müsst ihr mich immer ausschimpfen?", -- A_Classic_Fairytale:queen +["Why do you keep betraying us?"] = "Warum betrügst du uns andauernd?", -- A_Classic_Fairytale:queen +["Why do you not like me?"]="Warum magst du mich nicht?", +["Why do you want to take over our island?"]="Warum wollt ihr unsere Insel erobern?", +["Why me?!"]="Warum ich?", +["Why %s? Why?"] = "Warum %s? Warum?", -- A_Classic_Fairytale:backstab +["Why?"] = "Warum?", -- A_Classic_Fairytale:queen +["Why, why, why, why!"] = "Warum, warum, warum, warum!", -- A_Classic_Fairytale:queen +["Why would they do this?"]="Warum würden sie das tun?", +["- Will Get 1-3 random weapons"]="- Wird 1–3 zufällige Waffen erhalten", +["- Will give you a parachute every second turn."]="- Wird dir jeden 2. Zug einen Fallschirm geben", +["Will this ever end?"]="Wird dies je enden?", +["Will you give me the other parts?"]="Wirst du mir die anderen Teile geben?", +["Winner: %s"] = "Sieger: %s", -- Mutant +["Winning time: %s"] = "Bestzeit: %s", -- Racer, TechRacer ["Win"]="Sieg", -["Paul McHoggy"]="Paul McIgel", -["Thanta"]="Thanta", -["Billy Frost"]="Bernd Frost", -["Ice Jake"]="Eis-Jakob", -["John Snow"]="Jonas Schnee", -["White Tee"]="Schneeweiß", -["Allies"]="Verbündete", -["Frozen Bandits"]="Frostbanditen", -["Go to Thanta and get the device part!"]="Gehe zu Thanta und ergattere das Bauteil!", -["To win the game you have to go next to Thanta"]="Um das Spiel zu gewinnen, muss du neben Thanta stehen", -["Most of the time you'll be able to use only the icegun"]="Die meiste Zeit wirst du nur die Eiskanone benutzen können", -["Use the bazooka and the flying saucer to get the icegun"]="Benutze die Bazooka und die fliegende Untertasse, um die Eiskanone zu ergattern", -["Noooo, Thanta has to stay alive!"]="Nein, Thanta muss am Leben bleiben!", -["On the Ice Planet, where ice rules..."]="Auf dem Eisplaneten, wo das Eis herrscht …", -["Hi! Nice to meet you"]="Hi! Schön, dich zu sehen.", -["Listen carefully! The bandit leader, Thanta, has recently found a very strange device"]="Hör gut zu! Der Anführer der Banditen, Thanta, hat neulich ein sehr seltsames Gerät gefunden.", -["He doesn't know it but this device is a part of the anti-gravity device"]="Er weiß es nicht, aber dieses Bauteil ist ein Teil des Antischwerkraftgeräts.", -["Nice, then I should get the part as soon as possible!"]="Interessant, dann sollte ich besser das Teil so früh wie möglich holen!", -["Be careful, your gadgets won't work in the bandit area. You should get an ice gun"]="Sei vorsichtig, deine Apparate werden im Banditenland nicht funktionieren. Du solltest eine Eiskanone holen.", -["There is one below us!"]="Da ist eine unter uns!", -["Congratulations, now you can take Thanta's device part..."]="Gratulation, nun kannst du dir Thantas Bauteil nehmen …", -["Oh! Please spare me. You can take all my treasures!"]="Oh, bitte verschone mich! Du kannst all meine Schätze nehmen.", -["I just want the strange device you found!"]="Ich will nur das seltsame Teil, das du gefunden hast.", -["Here! Take it..."]="Hier, nimm es …", -["Congratulations, you acquired the device part!"]="Gratulation, du hast das Bauteil erhalten!", -["At the end of the game your health was "]="Am Ende des Spiels war deine Gesundheit ", -["Hard flying"]="Schwerer Flug", -["To win the game you have to pass into the rings in time"]="Um dieses Spiel zu gewinnen, musst du rechtzeitig durch die Ringe fliegen.", -["You'll get extra time in case you need it when you pass a ring"]="Du erhältst Bonuszeit, wenn du sie brauchst, sobald du einen Ring passierst.", -["Every 2 rings, the ring color will be green and you'll get an extra flying saucer"]="Alle 2 Ringe wird der Ring grün und du erhältst eine neue fliegende Untertasse", -["Use space button twice to change flying saucer while floating in mid-air"]="Drücke die Leertaste 2 mal, um die fliegende Untertasse im Flug zu wechseln.", -["Hoorah! You are a champion!"]="Hurra! Du bist ein Champion!", +["Wise Oak"]="Weise Eiche", +["With Dense Cloud on the land of shadows, I'm the village's only hope..."]="Jetzt, wo Dichte Wolke im Land der Schatten ist, bin ich die einzige Hoffnung des Dorfs.", +["With the rest of the tribe gone, it was up to %s to save the village."] = "Da der Rest des Stammes fort war, lag es alleine an %s, das Dorf zu retten.", -- A_Classic_Fairytale:dragon +["Worry not, for it is a peaceful animal! There is no reason to be afraid..."]="Sei ganz beruhigt, da es ein friedliebendes Tier ist. Es gibt keinen Grund, Angst zu haben.", +["Wow, what a dream!"]="Wow, was für ein Traum!", +["Xeli"] = "Xeli", -- +["Xerxes"] = "Xerxes", -- +["Y3K1337"]="Y3K1337", +["Yay, we won!"]="Hurra, wir haben gewonnen!", +["Y Chwiliad"]="Y Chwiliad", +["Yeah...I think it's a 'he', lol."]="Ja, ich glaube, dass es ein »er« ist. (lach)", +["Yeah, sure! I died. Hillarious!"]="Ja, sicher! Ich starb. Urkomisch!", +["Yeah, take that!"]="Jawohl, nimm das!", +["Yeah? Watcha gonna do? Cry?"]="Ja und? Was willst du schon tun? Heulen?", +["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "Tja, naja, damit ein Typ glücklich sein kann, muss ein anderer Typ leiden.", -- A_Classic_Fairytale:queen +["Yellow"] = "Gelb", -- +["Yellow Pepper"]="Gelbpaprika", +["Yellow Watermelons"]="Gelbe Wassermelonen", +["Yes, but you're … different!"] = "Ja, aber du bist … anders!", -- A_Classic_Fairytale:queen +["Yes!"]="Ja!", +["Yes, yeees! You are now ready to enter the real world!"]="Ja, Jaaa! Jetzt bist du bereit, die wirkliche Welt zu betreten!", +["Yeti"] = "Yeti", -- +["Yikes!"] = "Oh Schreck!", -- A_Space_Adventure:desert01 +["Yo, dude! Get away from our weapons!"] = "He, Leute! Weg von unseren Waffen!", -- A_Classic_Fairytale:queen +["Yo, dude, we're here, too!"]="Heda, wir sind auch da!", +["Yo, escort my buttocks!"] = "Yo, geleitet meinen Hintern hinfort!", -- A_Classic_Fairytale:queen +["Yoshi"]="Yoshi", +["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "Yo, die Aliens gaben mir Pflanzen. Medizinische Pflanzen. Viele von ihnen.", -- A_Classic_Fairytale:queen +["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."]="Du bist weit weg von Zuhause, und das Wasser steigt, klettere so hoch, wie du kannst!|Deine Punktzahl wird von deiner Höhe abhängen.", +["You are given the chance to turn your life around..."]="Ich gebe dir die Chance, dein Leben auf den Kopf zu stellen.", +["You are in control of all the active ally units."]="Du hast die Kontrolle über alle aktive verbündete Einheiten.", +["You are indeed the best PAotH pilot."]="Du bist wirklich der beste PAdI-Pilot.", +["You are out of danger, time to go to the moon!"]="Du bist in Sicherheit. Zeit, zum Mond zu gelangen!", +["You are playing with our lives here!"]="Du spielst mit unseren Leben!", +["You are sabotaged, RUN!"]="Du wurdest sabotiert, LAUF!", +["You are the one who fled! So, you are alive."]="Du bist der, der floh! Du lebst also.", +["You bear impressive skills, %s!"] = "Du hast erstaunliche Fähigkeiten, %s!", -- A_Classic_Fairytale:dragon +["You can always trust me!"] = "Du kannst mir immer vertrauen!", -- A_Classic_Fairytale:epil +["You can always trust me! I love you!"] = "Du kannst mir immer vertrauen! Ich liebe dich!", -- A_Classic_Fairytale:epil +["You can avoid some battles."]="Du kannst einige Kämpfe vermeiden.", +["You can choose another planet by replaying this mission."]="Du kannst einen anderen Planeten auswählen, indem du diese Mission erneut spielst.", +["You can dive with your flying saucer!"] = "Mit deiner fliegenden Untertasse kannst du abtauchen!", -- Basic_Training_-_Flying_Saucer +["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "Du kannst sogar deine Zielrichtung im Flug ändern, wenn du|zuerst [Genaues Zielen] gedrückt hälst, und dann [Hoch] oder [Runter] drückst.", -- Basic_Training_-_Flying_Saucer +["You can further customize the race by changing the scheme script paramater."]="Du kannst das Rennen ferner bearbeiten, indem du den Skriptparameter im Schema änderst.", +["You can only use the sniper rifle or the watermelon bomb."]="Du kannst nur das Scharfschützengewehr oder die Wassermelonenbombe benutzen.", +["You can only use the sniper rifle or the watermelon bomb"]="Du kannst nur das Scharfschützengewehr oder die Wassermelonenbombe benutzen", +["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "In dieser Mission kannst du üben, dich herumbewegen|und Werkzeuge benutzen.|Aber sie wird niemals enden!", -- A_Classic_Fairytale:epil +["- You can switch between hogs at the start of your turns. (Not first one)"]="- Du kannst deinen Igel am Zugbeginn aussuchen (aber nicht im 1. Zug).", +["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 choose well, Hog Solo!"]="Gute Wahl, Igel Einsam!", +["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 have used "]="Du hast benutzt ", -["You had "]="Du hattest ", -["In the Ice Planet flying saucer stadium..."]="Im Stadion der fliegenden Untertassen auf dem Eisplaneten …", -["This is the Olympic stadium of saucer flying..."]="Das ist das olympische Stadion des Untertassenflugs.", -["All the saucer pilots dream to come here one day in order to compete with the best!"]="Alle Untertassenpiloten träumen davon, hier eines Tages herzukommen, um gegen die Besten um die Wette zu fliegen!", -["Now you have the chance to try and claim the place that you deserve among the best..."]="Jetzt hast du die Gelegenheit, es selbst zu versuchen, und dir einen Rang unter den Besten zu verdienen.", -["Use the saucer and pass through the rings..."]="Benutze die Untertasse und passiere die Ringe.", -["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.", -["... can you do it?"]="Kannst du es schaffen?", -["Got 1 more saucer"]="1 neue Untertasse", -[" and 8 more seconds added to the clock"]=" und 8 Bonussekunden auf die Uhr", -["6 more seconds added to the clock"]="6 Bonussekunden auf die Uhr", -["Oh man! Learn how to fly!"]="Oh, Mann! Lern erstmal fliegen!", -["Every 2 rings you'll get extra flying saucers"]="Alle 2 Ringe erhälst du neue fliegende Untertassen", -["Use space button twice to change flying saucer while being on air"]="Drücke die Leertaste 2 mal, um die fliegende Untertasse im Flug zu wechseln", -["The first stop"]="Der erste Halt", -["Go to the upper platform and get the weapons in the crates!"]="Geh zur oberen Plattform und nimm dir die Waffen in den Kisten!", -["Go down and save these PAotH hogs!"]="Geh runter und rette diese PAdI-Igel!", -["Prepare to fight"]="Bereitmachen zum Kämpfen", -["Neutralize your enemies and be careful!"]="Neutralisiere deine Gegner und sei vorsichtig!", -["The fight begins!"]="Die Schlacht beginnt!", -["Joe"]="Sepp", -["Bruce"]="Brutus", -["Helena"]="Helena", -["Boris"]="Boris", -["Prof. Hogevil"]="Prof. Bösigel", -["Minion"]="Lakai", -["Minions"]="Lakaien", -["Hog Solo has to refuel his saucer."]="Igel Einsam muss seine Untertasse auftanken.", -["Rescue the imprisoned PAotH team and get the fuel!"]="Rette das gefangene PAdI-Team und hol dir den Treibstoff!", -["You have to get the weapons and rescue the PAotH researchers"]="Wir müssen die Waffen besorgen und die PAdI-Forscher retten.", -["Don't hit me you fools!"]="Trefft mich nicht, ihr Idioten!", -["The boss has fallen! Retreat!"]="Der Anführer ist gefallen! Rückzug!", -["Congrats! You made them run away!"]="Gratulation! Du hast sie in die Flucht geschlagen!", -["Hog Solo wins, congratulations!"]="Igel Einsam gewinnt, Gratulation!", -["Eliminated the Professor Hogevil"]="Professor Bösigel eliminiert", -["Drove the minions away"]="Seine Lakaien vertrieben", -["I may lost this battle, but I haven't lost the war yet!"]="Ich mag vielleicht diese Schlacht verloren haben, aber ich habe den Krieg noch nicht verloren!", -["Congrats! You won!"]="Gratulation! Du hast gewonnen!", -["Eliminated the evil minions"]="Die bösen Lakaien eliminiert", -["Drove the Professor away"]="Den Professor vertrieben", -["Near PAotH base at moon..."]="In der Nähe der PAdI-Basis am Mond …", -["Hey Hog Solo! Finally you have come..."]="Hey, Igel Einsam! Endlich bist du angekommen …", -["It seems that Professor Hogevil has prepared for your arrival!"]="Es scheint, dass sich Professor Bösigel sich auf deine Ankunft vorbereitet hat!", -["He has captured the rest of the PAotH team and awaits to capture you!"]="Er hat den Rest des PAdI-Teams gefangen und wartet auf deine Gefangennahme!", -["We have to hurry! Are you armed?"]="Wir müssen uns beeilen! Bist du bewaffnet?", -["No, I am afraid I had to travel light"]="Nein, ich fürchte, dass ich mit wenig Gepäck reisen musste.", -["Ok, then you have to go and take some of the weapons we have hidden in case of an emergency!"]="Okay, dann musst du gehen und ein paar der Waffen, die wir für den Notfall versteckt haben, nehmen.", -["They are up there! Take this rope and hurry!"]="Sie sind da oben! Nimm dieses Seil und beeil dich!", -["Ehm... ok..."]="Aha, okay …", -["I've made it! YEAAAAAH!"]="Ich hab's geschafft! HURRA!", -["Nice! Now hurry and get down! You have to rescue my friends!"]="Nett! Nun beeil dich und komm runter! Du musst meine Freunde retten!", -["Get ready to fight!"]="Bereitmachen zum Kämpfen!", -["Look boss! There is the target!"]="Sieh, Boss! Hier ist das Ziel!", -["Prepare for battle!"]="Bereitmachen zum Kämpfen!", -["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!", -["Here we go!"]="Auf geht's!", -["Chasing the blue hog"]="Jag' den blauen Igel", -["Use the rope in order to catch the blue hedgehog"]="Benutze das Seil, um den blauen Igel zu fangen.", -["You have to stand very close to him"]="Du musst sehr nahe an ihm stehen.", -["Crazy Runner"]="Verrückter Renner", -["On the other side of the moon..."]="Auf der anderen Seite des Mondes …", -["So you are interested in Professor Hogevil"]="Also bist du in Professor Bösigel interessiert.", -["We'll play a game first"]="Wir spielen zuerst ein Spiel.", -["I'll let you know whatever I know about him if you manage to catch me 3 times"]="Ich lass dich wissen, was ich über ihn weiß, wenn du es schaffst, mich 3 mal zu fangen.", -["Let's go!"]="Los geht's!", -["The truth about Professor Hogevil"]="Die Wahrheit über Professor Bösigel", -["Amazing! I was never beaten in a race before!"]="Großartig! Ich wurde zuvor noch nie in einem Wettlauf geschlagen!", -["So, let me tell you what I know about Professor Hogevil..."]="Also, lass mich erzählen, was ich über Professor Bösigel weiß.", -["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.", -["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.", -["During the final testing of the device an accident happened"]="Während des letzten Tests des Gerätes ist ein Unfall passiert.", -["In this accident Professor Hogevil lost all his spines on his head!"]="Bei diesem Unfall hat Professor Bösigel all seine Stacheln auf seinem Kopf verloren!", -["That's why he always wears a hat since then"]="Deshalb trägt er seit dem immer einen Hut.", -["After that incident he went underground and started working on his plan to steal the device"]="Nach dem Unfall ging er in den Untergrund und arbeitete an seinem Plan, um das Gerät zu stehlen.", -["He is a very tough and very determined hedgehog. I would be extremely careful if I were you"]="Er ist ein sehr starker und willensstarker Igel. An deiner Stelle wäre ich sehr vorsichtig.", -["I should go now, goodbye!"]="Ich sollte jetzt gehen. Tschüss!", -["Go get him again"]="Los, hol ihn dir wieder!", +["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 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 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 not make it in time, try again!"]="Du hast es nicht rechtzeitig geschafft, versuch es nochmal!", +["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 +["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "Für die Beendigung der Übung in weniger als 50 Sekunden hast du die »Seilmeister«-Auszeichnung erhalten.", -- Basic_Training_-_Rope +["You endangered your whole tribe, you bastard!"] = "Du hast deinen ganzen Stamm gefährdet, du Schwein!", -- A_Classic_Fairytale:queen +["You failed!"] = "Du hast versagt!", -- Basic_Training_-_Rope +["You failed to kill all enemies in a single turn."] = "Du hast es nicht geschafft, alle Gegner in einem Zug zu töten.", -- Big_Armory +["You failed to kill all enemies in this turn."] = "Du hast es nicht geschafft, alle Gegner in diesem Zug zu töten.", -- Big_Armory +["You fought bravely and you helped us win this battle!"]="Du hast mutig gekämpft und uns geholfen, diese Schlacht zu gewinnen!", +["You give me no choice!"] = "Ihr habt mir keine andere Wahl gelassen!", -- A_Classic_Fairytale:queen +["You got a killer mask there, amigo!"] = "Du hast eine Killermaske, Amigo!", -- A_Classic_Fairytale:epil ["You got me"]="Du hast mich.", -["Too slow! Try again..."]="Zu langsam! Versuch es nochmal.", -["You have to catch the other hog 3 times"]="Du musst den anderen Igel 3 mal fangen.", -["The time that you have left when you reach the blue hedgehog will be added to the next turn"]="Deine Verbleibende Zeit wird zu deinem nächsten Zug addiert, sobald du den blauen Igel erreichst.", -["Each turn you'll have only one rope to use"]="In jedem Zug kannst du nur ein Seil benutzen.", -["You'll lose if you die or if your time is up"]="Du verlierst, wenn du stirbst oder deine Zeit abläuft.", -["Congratulations, you are the fastest!"]="Gratulation, du bist der Schnellste!", -["You have managed to catch the blue hedgehog in time"]="Du hast es geschafft, den blauen Igel rechtzeitig zu fangen.", -["'Zooka Team"]="Die Knalltüten", -["Hunter"]="Jäger", -["Aiming Practice"]="Zielübung", -["Bazooka Training"]="Bazooka-Training", -["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."]="Eliminiere alle Ziele, bevor die Zeit ausläuft.|Du hast in dieser Mission unbegrenzte Munition.", -["Oh no! Time's up! Just try again."]="Oh nein! Die Zeit ist um! Versuche es nochmal.", -["Aiming practice"]="Zielübung", -["Oh no! You failed! Just try again."]="Oh nein! Du hast versagt! Versuch es nochmal.", -["hits"]="Treffer", -["You have destroyed %d of %d targets."]="Du hast %d von %d Zielen zerstört.", -["You have launched %d bazookas."]="Du hast %d Bazookas abgefeuert.", -["Your accuracy was %.1f%%."]="Deine Treffgenauigkeit betrug %.1f%%.", -["%.1f seconds were remaining."]="Es verblieben %.1f.", -["Congratulations! You've eliminated all targets|within the allowed time frame."]="Gratulation! Du hast alle Ziele innerhalb der|verfügbaren Zeit ausgeschaltet.", -["Grenadiers"]="Grenadiere", -["Nade Boy"]="Granatenjunge", -["Grenade Training"]="Granatentraining", -["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"]="Nun finde das nächste Ziel! |Tipp: Normalerweise verlierst du Gesundheit, wenn du herunterfällst, also pass auf!", -["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"]="Du wirst ziemlich gut! |Tipp: Wenn du dein Seil verkürzt, bewegst du dich schneller! |Und wenn du es verlängerst, wirst du langsamer.", -["The next one is pretty hard! |Tip: You have to do multiple swings!"]="Die Nächste ist ziemlich schwer! |Tipp: Du musst mehrmals schwingen!", -["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"]="Ich weiß nicht, wie du das getan hast. Aber gute Arbeit! |Die Nächste solle idiotensicher für dich sein!", -["Congratulations"]="Gratulation", -["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"]="Gratulation! Du hast die Seil-Einführung abgeschlossen! |- Die Einführung wird in 10 Sekunden beendet.", -["Achievement Unlocked"]="Neue Errungenschaft", -["Rope Master!"]="Seilmeister!", -["Rope Training"]="Seiltraining", -["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"]="Gute Arbeit! Nun triff es mit deinem Baseballschläger! |Tipp: Du kannst die Waffe mit [Rechtsklick] wechseln!", -["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"]="Denk dran: Das Seil verbiegt sich nur um Objekte, |wenn es nichts trifft, wird es immer gerade sein.", -["Rope Team"]="Seilteam", -["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"]="Gelange zum Ziel mit deinem Seil! |Steuerung: Links/Rechts zum Schwingen – Hoch/Runter zum Ein- und Ausfahren!", -["Tip: The rope physics are different than in the real world, |use it to your advantage!"]="Tipp: Die Seilphysik ist anders als in der realen Welt, |nutze das zu deinem Vorteil aus!", -["You did not make it in time, try again!"]="Du hast es nicht rechtzeitig geschafft, versuch es nochmal!", -["You have been respawned, at your last checkpoint!"]="Du wurdest zum letzten Kontrollpunkt zurückgesetzt!", -["You have been respawned, be more carefull next time!"]="Du wurdest wiederbelebt, sei beim nächsten Mal vorsichtiger!", -["Sniperz"]="Heckenschützen", -["Sniper Training"]="Scharfschützen-Training", -["Time's up!"]="Die Zeit ist um!", -["Good so far!"]="Gut soweit!", -["Keep it up!"]="Weiter so!", -["This one's tricky."]="Der hier ist knifflig.", -["Well done."]="Gut gemacht.", -["Demolition is fun!"]="Zerstörung macht Spaß!", -["Will this ever end?"]="Wird dies je enden?", -["Last Target!"]="Letzte Zielscheibe!", -["You have successfully finished the sniper rifle training!"]="Du hast das Scharfschützentraining abgeschlossen!", -["You have destroyed %d of %d targets (+%d points)."]="Du hast %d von %d Zielen zerstört (+%d Punkte).", -["You have made %d shots."]="Du hast %d Schüsse abgegeben.", -["Accuracy bonus: +%d points"]="Präzisions-Bonus: +%d Punkte", +["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).", -["Shoppa Love"]="Seilliebe", -["Team of Hearts"]="Team der Herzen", -["Heartful"]="Herzlich", -["Ropes and Crates"]="Seile und Kisten", -["Shoppa Union"]="Konsumentenunion", -["Hook"]="Haken", -["The Customor is King"]="Der Kunde ist König", -["King Customer"]="König Kunde", -["Lonely Hog"]="Einsamer Igel", -["Climber"]="Kletterer", -["Zook"]="Zook", -["Team Zook"]="Team Zook", -["Private Nolak"]="Gefreiter Nolak", -["The Hogies"]="Die Igelinge", -["You have thrown %d cluster bombs."]="Du hast %d Splitterbomben geworfen.", -["Grenadier"]="Grenadier", -["Grenade Group"]="Granatengruppe", -["You have thrown %d grenades."]="Du hast %d Granaten geworfen.", +["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, bis die nächste Welle ankommt.|Stell sicher, dass die ankommenden Kannibalen auf die passende Weise begrüßt werden.|Wenn der Igel stirbt, ist die Mission verloren.|Tipp: Vielleicht solltest du ein paar Minen benutzen.", +["You have acquired the last device part."]="Du hast das letzte Bauteil erhalten.", +["You have beaten the challenge!"]="Du hast die Herausforderung gemeistert!", +["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 +["You have chosen to fight! Lead the Green Bananas to battle and eliminate all the enemies!"]="Du hast dich für die Schlacht entschieden! Führe die Grünen Bananen in die Schlacht und eliminiere alle Feinde.", +["You have chosen to flee."] = "Du hast dich für die Flucht entschieden.", -- A_Space_Adventure:fruit01 +["You have chosen to flee ... Unfortunately, the only place where you can launch your saucer is the left-most place on the map."]="Du hast dich für die Flucht entschieden. Leider ist der einzige Ort, wo du deine Untertasse starten kannst, ganz links auf der Karte.", +["You have collected %d out of %d crate(s)."] = "Du hast %d von %d Kiste(n) eingesammelt.", -- +["You have completed this challenge in %.2f s (+%d points)."] = "Du hast diese Herausforderung in %.2f s gemeistert (+%d Punkte).", -- User_Mission_-_Rope_Knock_Challenge +["You have destroyed all targets!"]="Du hast alle Zielscheiben zerstört!", +["You have destroyed all the targets."]="Du hast alle Zielscheiben zerstört.", +["You have destroyed %d of %d targets (+%d points)."]="Du hast %d von %d Zielscheiben zerstört (+%d Punkte).", +["You have destroyed %d of %d targets."]="Du hast %d von %d Zielscheiben zerstört.", +["You have dropped %d missiles."]="Du hast %d Bomben abgeworfen.", +["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!", +["You have finally figured it out!"]="Ihr habt es endlich kapiert!", +["You have finished the Basic Rope Training!"] = "Du hast die Seilübung abgeschlossen!", -- Basic_Training_-_Rope +["You have finished the bazooka training!"] = "Du hast die Bazookaübung abgeschlossen!", -- Basic_Training_-_Bazooka +["You have finished the challenge!"]="Du hast die Herausforderung gemeistert!", +["You have finished the challenge in %.3f s."] = "Du hast die Herausforderung in %.3f s bewältigt.", -- +["You have finished the Flying Saucer Training!"] = "Du hast die Übungen mit der fliegenden Untertasse abgeschlossen!", -- Basic_Training_-_Flying_Saucer +["You have finished the target practice!"] = "Du hast die Zielübung abgeschlossen!", -- +["You have kidnapped our whole tribe!"]="Ihr habt unseren ganzen Stamm entführt!", +["You have killed all enemies."] = "Du hast alle Gegner umgebracht.", -- Big_Armory +["You have killed an innocent hedgehog!"]="Du hast einen unschuldigen Igel getötet!", +["You have killed %d of 16 hedgehogs (+%d points)."] = "Du hast %d von 16 Igeln getötet (+%d Punkte).", -- User_Mission_-_Rope_Knock_Challenge +["You have launched %d bazookas."]="Du hast %d Bazookas abgefeuert.", ["You have launched %d homing bees."]="Du hast %d zielsuchende Bienen abgefeuert.", -["Pathetic Resistance"]="Erbärmlicher Widerstand", -["Cybernetic Empire"]="Kybernetisches Imperium", -["Unit 835"]="Einheit 835", -["Bamboo Thicket"]="Bambusdickicht", -["Eliminate the enemy before the time runs out"]="Vernichte den Feind, bevor die Zeit abgelaufen ist", -["User Challenge"]="Benutzerherausforderung", -["Congratulations!"]="Gratulation!", -["MISSION SUCCESSFUL"]="MISSION ERFOLGREICH", -["Energetic Engineer"]="Energetischer Ingenieur", -["MISSION FAILED"]="MISSION GESCHEITERT", -["Oh no! Just try again!"]="Oh nein! Versuch's nochmal!", -["Bloody Rookies"]="Blutige Anfänger", -["Instructor"]="Ausbilder", -["Blue Team"]="Blaues Team", -["Filthy Blue"]="Blödblau", -["Dangerous Ducklings"]="Gefährliche Entchen", -["Eliminate the Blue Team"]="Lösche das Blaue Team aus", -["Listen up, maggot!!"]="Aufgepasst, du Made!!", -["!!!"]="!!!", -["The enemy is hiding out on yonder ducky!"]="Der Feind versteckt sich auf dem Entlein dort drüben!", -["Get on over there and take him out!"]="Mach, dass du hinüber kommst und schalte ihn aus!", -["GO! GO! GO!"]="Los, los, los!", -["DAMMIT, ROOKIE!"]="VERDAMMT, REKRUT!", -["DAMMIT, ROOKIE! GET OFF MY HEAD!"]="VERDAMMT, REKRUT! RUNTER VON MEINEM KOPF!", -[":("]=":(", -["You've failed. Try again."]="Du bist gescheitert. Versuche es nochmal.", -["See ya!"]="Mach's gut!", -["Naughty Ninja"]="Böser Ninja", -["Enjoy the swim..."]="Viel Spaß beim Schwimmen …", -["Toxic Team"]="Giftige Gegner", -["Poison"]="Gift", -["Eliminate Poison before the time runs out"]="Neutralisiere das Gift, bevor die Zeit abgelaufen ist.", -["Operation Diver"]="Taucher", -["sec"]="s", -["|- Mines Time:"]="|- Minenzündzeit:", -["Unit"]="Einheit", -["Newton's Hammock"]="Newtons Hängematte", -["Nameless Heroes"]="Namenlose Helden", -["Drowner"]="Absäufer", -["Clowns"]="Clowns", -["Nobody Laugh"]="Niemand darf lachen", -["Wannabe Flyboys"]="Möchtegernflieger", -["Ace"]="Ass", -["RC PLANE TRAINING"]="FUNKFLUGZEUGSTRAINING", -["a Hedgewars challenge"]="eine Hedgewars-Herausforderung", -["Collect or destroy all the health crates."]="Sammle oder zerstöre alle Gesundheitskisten.", -["Compete to use as few planes as possible!"]="Verwende so wenige Flugzeuge wie möglich!", -["Planes used: %d"]="Verwendete Flugzeuge: %d", -["Crates left: %d"]="Verbleibende Kisten: %d", -["Destroyer of planes"]="Flugzeug-Zerstörer", -["Hopeless case"]="Hoffnungsloser Fall", -["Drunk greenhorn"]="Betrunkener Grünschnabel", -["Greenhorn"]="Grünschnabel", -["Beginner"]="Anfänger", -["Experienced beginner"]="Erfahrener Anfänger", -["Below-average pilot"]="Unterdurchschnittlicher Pilot", -["Average pilot"]="Durchschnittlicher Pilot", -["Above-average pilot"]="Überdurchschnittlicher Pilot", -["Professional pilot"]="Profipilot", -["Professional stunt pilot"]="Profi-Stuntpilot", -["Elite pilot"]="Elitepilot", -["Upper-class elite pilot"]="Elitepilot der Oberklasse", -["Top-class elite pilot"]="Elitepilot der Spitzenklasse", -["Cheater"]="Cheater", -["Rank: %s"]="Rang: %s", -["Your rank: %s"]="Dein Rang: %s", -["Flawless victory!"]="Perfekter Sieg!", +["You have made %d shots."]="Du hast %d Schüsse abgegeben.", +["You have managed to catch the blue hedgehog in %.3f seconds."] = "Du hast es geschafft, den blauen Igel in %.3f Sekunden zu fangen.", -- A_Space_Adventure:moon02 +["You have managed to catch the blue hedgehog in time"]="Du hast es geschafft, den blauen Igel rechtzeitig zu fangen.", +["You have never worked a bit in your life!"] = "Du hast in deinem gesamten Leben noch nicht gearbeitet!", -- A_Classic_Fairytale:queen +["You have nothing to be afraid of now."] = "Jetzt hast du nichts mehr zu beführchten.", -- A_Classic_Fairytale:epil +["You haven't rescued anyone."]="Du hast niemanden gerettet.", +["You have obtained an achievement: Lively Lifeguard"]="Du hast eine Auszeichnung erhalten: Lebhafter Lebensretter", ["You have perfectly beaten the challenge!"]="Du hast die Herausforderung gemeistert!", -["You have used only 1 RC plane. Outstanding!"]="Du hast nur ein Funkflugzeug gebraucht. Ausgezeichnet!", -["You have finished the challenge!"]="Du hast die Herausforderung gemeistert!", +["You have proven yourself worthy to see our most ancient secret!"]="Du hast dich bewährt, um unser ältestes Geheimnis zu sehen.", +["You have proven yourselves worthy!"]="Ihr habt euch bewährt.", +["You have reached the take-off area successfully!"]="Du hast das Startfeld erfolgreich erreicht!", +["You have rescued H and Dr. Cornelius."]="Du hast H und Dr. Cornelius gerettet.", +["You have SCORED!!"]="Du hast GEPUNKTET!", +["You have shot %d times."] = "Du hast %d Schüsse abgegeben.", -- +["You have successfully eliminated Professor Hogevil."]="Du hast Professor Bösigel erfolgreich eliminiert!", +["You have successfully finished the campaign!"] = "Du hast die Kampagne erfolgreich abgeschlossen!", -- A_Classic_Fairytale:epil +["You have successfully finished the sniper rifle training!"]="Du hast das Scharfschützentraining abgeschlossen!", +["You have thrown %d cluster bombs."]="Du hast %d Splittergranaten geworfen.", +["You have thrown %d grenades."]="Du hast %d Granaten geworfen.", +["You have to be careful and must not die!"] = "Du musst vorsichtig sein und darfst nicht sterben!", -- A_Space_Adventure:cosmos +["You have to catch the other hog 3 times."]="Du musst den anderen Igel 3 mal fangen.", +["You have to complete the main mission on moon in order to travel to other planets."]="Du musst die Hauptmission auf dem Mond erledigen, damit du zu den anderen Planeten reisen kannst.", +["You have to continue alone from now on."]="Von hier an musst du alleine fortfahren.", +["You have to destroy all the explosives without dying!"]="Du musst alle Sprengstoffe zerstören, ohne zu sterben!", +["You have to destroy all the targets."]="Du musst alle Zielscheiben zerstören.", +["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "Du musst das obige Ziel zerstören, indem du eine Granate|aus deiner fliegenen Untertasse darauf abwirfst.", -- Basic_Training_-_Flying_Saucer +["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "Du musst 2 Zielscheiben zerstören, aber die vorherige Methode wäre hier sehr schwer oder gefährlich.", -- Basic_Training_-_Flying_Saucer +["You have to eliminate all the enemies."]="Du musst alle Gegner eliminieren.", +["You have to eliminate all the visible enemies."]="Du musst alle sichtbaren Gegner eliminieren.", +["You have to get the weapons and rescue the PAotH researchers."]="Wir müssen die Waffen besorgen und die PAdI-Forscher retten.", +["You have to get to the left-most land and remove any enemy hog from there."]="Du musst zum linken Rand gelangen und von dort alle feindlichen Igel beseitigen.", +["You have to go back to the moon!"] = "Du musst zum Mond zurück!", -- A_Space_Adventure:cosmos +["You have to move upwards, not downwards, %s!"]="Du musst nach oben, nicht nach unten, %s!", +["You have to reach the left-most place on the map."] = "Du musst den linken Kartenrand erreichen.", -- A_Space_Adventure:fruit01 +["You have to stand very close to him"]="Du musst sehr nahe an ihm stehen.", +["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 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 dropped %d missiles."]="Du hast %d Bomben abgeworfen.", -["In your best (and only) flight you took out %d crates with one RC plane!"]="In deinem besten (und einzigem) Flug hast du %d Kisten mit einem Funkflugzeug zerstört!", -["In your best flight you took out %d crates with one RC plane."]="In deinem besten Flug hast du %d Kisten mit einem Funkflugzeug zerstört.", -["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?", -["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."]="Gratulation! Du hast diese Herausforderung wahrhaft gemeistert! Vergiss nicht, die Wiederholung zu speichern.", -["Prestigious Pilot"]="Prestigeträchtiger Pilot", -["You have gained an achievement: %s"]="Du hast eine Errungenschaft erhalten: %s", -["CHALLENGE COMPLETE"]="HERAUSFORDERUNG ABGESCHLOSSEN", -["Wannabe Shoppsta"]="Möchtegernkäufer", -["Unsuspecting Louts"]="Nichtsahnende Lümmel", -["Unlucky Sods"]="Arme Schweine", -["ROPE-KNOCKING"]="SEILSCHUBSEN", -["COMPLETION TIME"]="ZEIT", -["MISSION SUCCESS"]="MISSIONSERFOLG", -["Use the rope to knock your enemies to their doom."]="Benutze das Seil, um deine Gegner in ihr Verderben zu stürzen!", -["GG!"]="Gut gemacht!", -["Ouch!"]="Autsch!", -["Eliminate all enemies"]="Vernichte alle Gegner", -["Spooky Tree"]="Spukiger Baum", -["Good birdy......"]="Braver Vogel …", -["Feeble Resistance"]="Kraftloser Widerstand", -["Pathetic Hog #%d"]="Erbärmlicher Igel #%d", -["Unit 3378"]="Einheit 3378", -["- Eliminate Unit 3378 |- Feeble Resistance must survive"]="- Vernichte Einheit 3378 |- Kraftloser Widerstand muss überleben", -["Codename: Teamwork"]="Code-Name: Teamwork", -["T_T"]="T_T", -["Hmmm..."]="Hmmm …", -["Good luck out there!"]="Viel Glück da draußen!", -["Challenge"]="Herausforderung", -["Save as many hapless hogs as possible!"]="Rette so viele glücklose Igel wie möglich!", -["That Sinking Feeling"]="Land unter", -["Hapless Hogs"]="Glücklose Igel", -["Sinky"]="Blubb", -["Heavy"]="Schwierig", -["Clumsy"]="Hoppla", -["Silly"]="Doofi", -["Careless"]="Achtlos", -["Sponge"]="Schwamm", -["Deadweight"]="Gravitus", -["The Nameless One"]="Der Namenlose", -["Press [Precise] to skip intro"]="Drücke [Genaues Zielen], um das Intro zu überspringen", -["This rain is really something..."]="Das nenne ich mal einen Regenschauer...", -["Heh, it's not that bad."]="Hehe, so schlimm ist es nicht.", -["You'd almost swear the water was rising!"]="Man könnte fast schwören das Wasser würde steigen!", -["Haha, now THAT would be something!"]="Haha, na DAS wär ja was!", -["Hahahaha!"]="Hahahaha!", -["It's a good thing SUDDEN DEATH is 99 turns away..."]="Gut, dass SUDDEN DEATH in 99 Runden ist …", -["Challenge completed!"]="Herausforderung bewältigt!", -["You saved %d of 8 Hapless Hogs."]="Du hast %d von 8 Glücklosen Igeln gerettet.", -["Achievement obtained: Lively Lifeguard"]="Errungenschaft erhalten: Lebhafter Lebensretter", -["You have obtained an achievement: Lively Lifeguard"]="Du hast eine Errungenschaft erhalten: Lebhafter Lebensretter", -["%d Hapless Hogs left"]="%d Glücklose Igel verbleibend", -["Disqualified!"]="Disqualifiziert!", +["You have used "]="Du hast benutzt ", +["You have used only 1 RC plane. Outstanding!"]="Du hast nur ein Funkflugzeug gebraucht. Ausgezeichnet!", +["You have violated PAotH regulations!"] = "Du hast gegen die PAdI-Vorschriften verstoßen!", -- A_Space_Adventure:cosmos +["You have won the game by proving true cooperative skills!"]="Ihr hab das Spiel gewonnen, indem ihr wahre kooperative Fähigkeiten gezeigt habt!", +["You just appeared out of thin air!"]="Du bist einfach aus dem Nichts aufgetaucht!", +["You just can't let it go, can you!"] = "Du kannst einfach nicht loslassen, oder?", -- A_Classic_Fairytale:queen +["You just committed suicide..."]="Du hast gerade Selbstmord begangen.", +["You killed my father, you monster!"]="Du hast meinen Vater umgebracht, du Monster!", +["You know...taking a stroll."]="Du weißt schon … umherbummeln.", +["You know what? I don't even regret anything!"]="Weißt du was? Ich bereue nichts!", +["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "Du erhältst ein zusätzliches Scharfschützengewehr für jeden Igel, den du tötest (max. 4 Gewehre).", -- A_Space_Adventure:fruit03 +["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles"] = "Du erhältst ein zusätzliches Scharfschützengewehr für jeden Igel, den du tötest (max. 4 Gewehre)", -- A_Space_Adventure:fruit03 +["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."]="Du erhältst einen zusätzlichen Teleporter für jeden getöteten Igel (max. 2 Teleporter).", -- A_Space_Adventure:fruit03 +["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports"]="Du erhältst einen zusätzlichen Teleporter für jeden getöteten Igel (max. 2 Teleporter)", -- A_Space_Adventure:fruit03 +["You'll get extra time in case you need it when you pass a ring."]="Du erhältst Bonuszeit, wenn du sie brauchst, sobald du einen Ring passierst.", -- A_Space_Adventure:ice02 +["You'll get extra time in case you need it when you pass a ring"]="Du erhältst Bonuszeit, wenn du sie brauchst, sobald du einen Ring passierst", -- A_Space_Adventure:ice02 +["You'll have only 2 watermelon bombs during the game."]="Du hast nur 2 Wassermelonenbomben während des Spiels.", -- A_Space_Adventure:fruit03 +["You'll have only 2 watermelon bombs during the game"]="Du hast nur 2 Wassermelonenbomben während des Spiels", -- A_Space_Adventure:fruit03 +["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 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!", +["You may only place 1 Extra Time crate per turn."] = "Du darfst nur 1 Extrazeit-Kiste pro Zug platzieren.", -- Construction_Mode +["You may only place %d crates per round."] = "Du darfst nur %d Kisten pro Runde platzieren.", -- Construction_Mode +["- You may only score when your flag is in your base"] = "- Du kannst nur punkten, wenn deine Flagge in deiner Basis ist", -- Capture_the_Flag +["You meatbags are pretty slow, you know!"]="Ihr Fleischklumpen seid ziemlich schwer von Begriff, wisst ihr?", +["You might want to find a way to instantly kill arriving cannibals!"]="Du könntest eine Möglichkeit finden, um die ankommenden Kannibalen sofort zu töten.", +["You must attack from a rope, after you collected a crate!"] = "Du musst vom Seil angreifen, nachdem du eine Kiste aufgesammelt hast!", -- WxW +["You must first collect a crate before you attack!"] = "Du musst zuerst eine Kiste aufsammeln, bevor du angreifen kannst!", -- WxW +["You must survive the flood in order to score."]="Du musst das Hochwasser überleben, um zu punkten.", +["You never give me plants!"] = "Ihr gebt mir niemals Pflanzen!", -- A_Classic_Fairytale:queen +["Young one, you are telling us that they can instantly change location without a shaman?"]="Jüngling, willst du uns etwa weiß machen, dass sie ihre Position sofort ändern können, ohne einen Schamanen?", +["You now have infinite fuel, grenades and bazookas for fun."] = "Du hast jetzt unbegrenzten Treibstoff, Granaten und Bazookas nur so zum Spaß.", -- Basic_Training_-_Flying_Saucer +["You only have 2 flying saucers this time."] = "Diesmal hast du nur 2 fliegende Untertassen.", -- Basic_Training_-_Flying_Saucer +["You only have one flying saucer this time."] = "Diesmal hast du nur eine fliegende Untertasse.", -- Basic_Training_-_Flying_Saucer +["You probably know what to do next..."]="Du weißt vermutlich, was als nächstes zu tun ist.", +["Your accuracy was %.1f%%."]="Deine Treffgenauigkeit betrug %.1f%%.", +["Your accuracy was %.1f%% (+%d points)."] = "Deine Treffgenauigkeit betrug %.1f%% (+%d Punkte).", -- +["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 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!", +["You're a pathetic liar!"]="Du bist ein dreckiger Lügner!", +["You're funny!"]="Du bist lustig!", +["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "Du wirst ziemlich gut! |Tipp: Wenn du dein Seil verkürzt, bewegst du dich schneller!|Und wenn du es verlängerst, wirst du langsamer.", -- Basic_Training_-_Rope +["You're on your way to freeing your tribe!"] = "Ihr seid dabei, euren Stamm zu befreien!", -- A_Classic_Fairytale:queen +["You're pathetic! You are not worthy of my attention..."]="Du bist erbärmlich! Du hast meine Aufmerksamkeit nicht verdient.", +["You're probably wondering why I bought you back..."]="Ihr fragt euch bestimmt, warum ich euch zurückgebracht habe.", +["Your escape took you %d turns."] = "Deine Flucht dauerte %d Züge.", -- A_Space_Adventure:desert02 +["You're so brave! I feel safe with you."] = "Du bist so mutig! In deinen Händen fühle ich mich sicher.", -- A_Classic_Fairytale:epil +["You're some piece of hypocrite junkie!"] = "Du bist sowas von ein heuchlerischer Junkie!", -- A_Classic_Fairytale:queen +["You're terrorizing the forest...We won't catch anything like this!"]="Du terrorisierst den Wald. Wir werden auf diese Weise nichts fangen!", +["You retrieved the lost part."]="Du hast das verlorene Teil ergattert.", -- A_Space_Adventure:fruit02 +["Your fastest escape so far: %d turns"] = "Deine schnelltse Flucht bis jetzt: %d Züge", -- A_Space_Adventure:desert02 +["Your fastest victory so far: %d rounds"] = "Dein schnellster Sieg bis jetzt: %d Runden", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +["Your first destination is the moon in order to get more fuel."]="Dein erstes Ziel ist der Mond, um mehr Treibstoff zu erhalten.", ["Your hedgehog died!"]="Dein Igel ist gestorben!", -["You must survive the flood in order to score."]="Du musst das Hochwasser überleben um zu punkten.", -["You haven't rescued anyone."]="Du hast niemanden gerettet.", -["Hero Team"]="Heldenteam", -["Good Dude"]="Guter Junge", -["Bad Team"]="Böses Team", -["Elimate your captor."]="Eliminiere deinen", -["Get out of there!"]="Geh weg!", -["The Great Escape"]="Gesprengte Ketten", -["Portal mission"]="Portalmission", -["training"]="Training", -["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."]="Hmmm, ich muss einen Weg finden, um ihn von dieser Antiportaloberfläche zu schubsen …", -["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."]="Die Antiportalzone ist über den ganzen Boden und ich habe nichts, um ihn zu töten. Vielleicht könnte ich ihn genug verletzen, wenn ich etwas fallenlasse.", -["You can't fire a portal on the blue surface"]="Du kannst kein Portal auf der blauen Fläche öffnen.", -[" What !! For all of this struggle i just win some ... TIME o0"]="Was?! Für all die Mühen gewinne ich nur etwas … ZEIT?", -["Each turn you get 1-3 random weapons"]="Du bekommst jede Runde 1-3 zufällig gewählte Waffen", -["Game Started!"]="Spiel gestartet!", -["CAPTURE THE FLAG"]="SCHNAPP DIR DIE FLAGGE", -["Flags, and their home base will be placed where each team ends their first turn."]="Fahnen und deren Heimatstandort werden dort plaziert, wo jedes Team deren ersten Zug beendet.", -["RULES OF THE GAME [Press ESC to view]"]="SPIELREGELN (Drücke [Esc] zum Anzeigen)", -["Reflector Shield"]="Reflektorschild", -["Bio-Filter"]="Biofilter", -["Healing Station"]="Heilstation", -["Respawner"]="Wiederbeleber", -["Teleportation Node"]="Teleportationsstation", -["Core"]="Kern", -["Generator"]="Generator", -["Support Station"]="Waffenstation", -["Construction Station"]="Baustation", -["Weapon Filter"]="Waffenfilter", -["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."]="Teleportation fehlgeschlagen. Bitte teleportiere nur innerhalb des Einzugsgebiets deiner Klanteleporter.", -["Teleportation Mode"]="Teleportationsmodus", -["Girder Placement Mode"]="Trägerplatzierungsmodus", -["Rubber Placement Mode"]="Gummiplatzierungsmodus", -["Mine Placement Mode"]="Minenplatzierungsmodus", -["Sticky Mine Placement Mode"]="Haftminenplatzierungsmodus", -["Barrel Placement Mode"]="Pulverfassplatzierungsmodus", -["Health Crate Placement Mode"]="Gesundheitskistenplatzierungsmodus", -["Weapon Crate Placement Mode"]="Waffenkistenplatzierungsmodus", -["Utility Crate Placement Mode"]="Werkzeugkistenplatzierungsmodus", -["Structure Placement Mode"]="Gebäudeplatzierungsmodus", -["Structure Placement Tool"]="Gebäudeplatzierungswerkzeug", -["Object Placement Tool"]="Objektplatzierungswerkzeug", -["Crate Placement Tool"]="Kistenplatzierungswerkzeug", -["Drill Rocket"]="Bohrkopfrakete", -["Mudball"]="Schlammball", -["Cluster Bomb"]="Splittergranate", -["Molotov Cocktail"]="Molotowcocktail", -["Watermelon Bomb"]="Wassermelonenbombe", -["Hellish Handgrenade"]="Höllische Handgranate", -["Limburger"]="Limburger", -["Shotgun"]="Schrotflinte", -["Flamethrower"]="Flammenwerfer", -["Sniper Rifle"]="Scharfschützengewehr", -["Freezer"]="Eiskanone", -["Land Sprayer"]="Landkanone", -["Whip"]="Peitsche", -["Baseball Bat"]="Baseballschläger", -["Seduction"]="Verführung", -["Hammer"]="Hammer", -["Mine"]="Mine", -["Dynamite"]="Dynamit", -["Cake"]="Kuchen", -["Ballgun"]="Ballkanone", -["Sticky Mine"]="Haftmine", -["Cleaver"]="Hackebeil", -["Birdy"]="Vogli", -["Blowtorch"]="Schweißbrenner", -["Pickhammer"]="Presslufthammer", -["Personal Portal Device"]="Portalgerät", -["Rope"]="Seil", -["Parachute"]="Fallschirm", -["Flying Saucer"]="Fliegende Untertasse", -["Invulnerable"]="Unverwundbar", -["Laser Sight"]="Laservisier", -["Vampirism"]="Vampirismus", -["Low Gravity"]="Niedrige Schwerkraft", -["Extra Damage"]="Extraschaden", -["Extra Time"]="Zusatzzeit", -["You may only use 1 Extra Time per turn."]="Du darfst pro Zug nur einmal Zusatzzeit benutzen.", -["You may only spawn 5 crates per turn."]="Du darfst pro Zug nur 5 Kisten platizeren.", -["Invalid Placement"]="Ungültige Position", -["Insufficient Power"]="Unzureichende Energie", -["The Great Hog in the sky sees your sadness and grants you a boon."]="Der Große Igel im Himmel sieht deine Traurigkeit und leistet dir eine Gabe.", -["Cost"]="Kosten", -["CONSTRUCTION MODE"]="BAUMODUS", -["a Hedgewars mini-game"]="ein Hedgewars Mini-Spiel", -["Build a fortress and destroy your enemy."]="Baue ein Fort und zerstöre deinen Feind.", -["There are a variety of structures available to aid you."]="Es gibt verschiedene Gebäude, um dich zu unterstützen.", -["Use the air-attack weapons and the arrow keys to select structures."]="Benutze die Luftangriffswaffen und die Pfeiltasten, um Gebäude auszuwählen.", -["Grants nearby hogs life-regeneration."]="Spendet nahen Igeln Lebensenergie.", -["Aggressively removes enemy hedgehogs."]="Entfernt feindliche Igel aggressiv.", -["Dematerializes weapons and equipment carried by enemy hedgehogs."]="Demateralisiert Waffen und Equipment, das von feindlichen Igeln getragen wird.", -["Reflects enemy projectiles."]="Stößt feindliche Projektile ab.", -["Generates power."]="Erzeugt Energie.", -["Resurrects dead hedgehogs."]="Belebt tote Igel wieder.", -["Allows free teleportation between other nodes."]="Ermöglicht kostenlose Teleportationen zwischen anderen Stationen.", -["Teleporation Node"]="Teleporterstation", -["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."]="Ermöglicht die Platzierung von Trägern, Gummibändern, Minen, Haftminen und Pulverfässern.", -["Allows the placement of weapons, utiliites, and health crates."]="Ermöglicht die Platzierung von Waffen-, Werkzeug- und Gesundheitskisten", -["Note: Some weapons have a second option (See continent information). Find and use them with the \""]="Beachte: Einige Waffen haben eine Zweitoption (Siehe Kontinentinformationen). Finde und benutze sie mit \"", -["Per team weapons"]="Waffen pro Team", -["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."]="Wähle deinen Kontinent/Waffensatz mit den [Hoch]- oder [Runter]-Tasten. Du kannst ihn auch mit dem Waffenmenü auswählen.", -["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."]="Tipp: Benutze die [Esc]-Taste (dieses Menü), wenn du den Kontinent des aktuellen Teams sehen willst, oder die Besonderheiten dieses Kontinents sehen willst.", -["Unique new weapons"]="Einzigartige neue Waffen", -["key."]="Taste.", -["switch"]="Schalter", -["weaponschemes"]="Waffenschemata", -["Green lipstick bullet: [Poisonous, deals no damage]"]="Grüne Lippenstiftpatrone: (giftig, kein Schaden)", -["Cluck-cluck time: [Fire an egg ~ Sabotages and cures poison ~ Cannot be fired close to another hog]"]="Gackerzeit: (Schieß ein Ei – Sabotiert und kuriert Gift – kann nicht in der nähe anderer Igel gefeuert werden)", -["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"]="Anno 1032: (Die Explosion wird stark schubsen – Große Reichweite, betrifft Igel in der Nähe des Ziels nicht)", -["Dust storm: [Deals 15 damage to all enemies in the circle]"]="Staubsturm: (15 Schaden für alle Gegner im Kreis)", -["Cricket time: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"]="Kricket: (Feuere eine 1-Sek.-Mine! – kann nicht in der Nähe anderer Igel gefeuert werden)", -["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"]="Bombe fallenlassen: (Lass einen heroischen Wind, der sich bei Einschlag in eine Bombe verwandelt, fallen)", -["Penguin roar: [Deal 15 damage + 10% of your hogs health to all hogs around you and get 2/3 back]"]="Pinguinröhren: (Richte 15 Schaden + 10% deiner Igelgesundheit auf alle Igel um dich herum und bekomme 2/3 zurück)", -["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"]="Als Felsenpinguin tarnen: (Vertausche die Plätze mit einem zufälligen Igel im Kreis)", -["Lonely Cries: [Rise the water if no hog is in the circle and deal 6 damage to all enemy hogs.]"]="Einsame Heuler: (Erhöhe das Wasser, wenn kein Igel im Kreis ist und richte 6 Schaden auf alle gegnerischen Igel an.)", -["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"]="Igelprojektil: (Feuer deinen Igel wie eine Haftmine)", -["Napalm rocket: [Fire a bomb with napalm!]"]="Napalmrakete: (Feuer eine Bombe mit Napalm ab!)", -["Eagle Eye: [Blink to the impact ~ One shot]"]="Adlerauge: (Teleportiere dich zum Einschlagspunkt – ein Schuss)", -["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"]="Medizin: (Feuere eine explodierende Medizin, die alle Igel im Explosionsradius heilen wird)", -["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"]="Sabotage/Fackel: (Sabotiere alle Igel im Kreis und richte ca. 1 Schaden an, ODER feuer eine Splittergranate in die Luft)", -["- You can switch between hogs at the start of your turns. (Not first one)"]="- Du kannst deinen Igel am Zugbeginn aussuchen (aber nicht am 1. Zug).", -["Area"]="Gebiet", -["Difficulty: "]="Schwierigkeitsgrad: ", -["EASY"]="EINFACH", -["North America"]="Nordamerika", -["Population"]="Einwohnerzahl", -["Special Weapons:"]="Sonderwaffen:", -["GasBomb"]="Gasbombe", -["MEDIUM"]="MITTEL", -["South America"]="Südamerika", -["Europe"]="Europa", -["Molotov"]="Molotowcocktail", -["Africa"]="Afrika", -["- Will give you a parachute every second turn."]="- Wird dir jeden 2. Zug einen Fallschirm geben", -["Asia"]="Asien", -["Australia"]="Australien", -["Baseballbat"]="Baseballschläger", -["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."]="Antarktischer Sommer: – Wird dir einen Träger/Schlammball und zwei Sinuskanonen/Portalgeräte jeden 4. Zug geben", -["Antarctica"]="Antarktika", -["HARD"]="SCHWER", -["Duration"]="Dauer", -["Kerguelen"]="Kerguelen", -["- Massive weapon bonus on first turn"]="- Großer Waffenbonus am ersten Zug", -["- Will Get 1-3 random weapons"]="- wird 1–3 zufällige Waffen erhalten", -["Zealandia"]="Neuseeland-Kontinent", +["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."]="Dein Igel hatte panische Angst vorm Wasser und hatte einen Sicherheitsabstand von %d erreicht.", +["Your height over time"]="Deine Höhe über die Zeit", +["Your hogs must survive!"]="Deine Igel müssen überleben.", +["Your movement skills will be evaluated now."]="Deine Fortbewegungsfähigkeiten werden nun getestet.", +["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.", +["You see, hedgehog spikes are very, very valuable."] = "Ihr müsst verstehen, Igelstacheln sind sehr, sehr wertvoll.", -- A_Classic_Fairytale:queen +["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've reached the goal!| |Time: "]="Ziel erreicht!| |Zeit: ", +["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 will recieve 2-4 weapons on each kill! (Even on own hogs)"]="- Du wirst 2–4 Waffen für jeden Abschuss erhalten (sogar für eigene Igel)!", -["Sundaland"]="Sunda", -["General information"]="Allgemeine Informationen", -[" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"]=" wurde vom Schema extahiert|– Dieser Kontinent wird alle Besonderheiten von den anderen Kontinenten benutzen können!", -["Continental supplies"]="Kontinentallieferungen", -["Let a continent provide your weapons!"]="Lass einen Kontinent dich mit Waffen beliefern!", -["Select continent!"]="Wähle einen Kontinent!", -["NORMAL"]="NORMAL", -["You are sabotaged, RUN!"]="Du wurdest sabotiert, LAUF!", -["WARNING: Sabotage detected!"]="WARNUNG: Sabotage erkannt!", -["Hogs in sight!"]="Igel in Sicht!", -["RULES"]="REGELN", -["Each turn is only ONE SECOND!"]="Jeder Zug dauert nur EINE SEKUNDE!", -["Use your ready time to think."]="Benutze deine Vorbereitungszeit zum Denken.", -["Slot keys save time! (F1-F10 by default)"]="Schnelltasten, um Zeit zu sparen! (standardmäßig F1–F10)", -["SLOTS"]="SLOTS", -["Slot"]="Slot", -["Teleport"]="Teleporter", -["FRENZY"]="WAHNSINN", -["a frenetic Hedgewars mini-game"]="ein hektisches Hedgewars-Minispiel", -["random in range from %i%% to %i%% with period of %i msec"]="Zufällig von %i%% bis %i%% mit einer Periode von %i ms", -["changing range from %i%% to %i%% with period of %i msec"]="Sich verändernde Grenzen von %i%% bis %i%% mit einer Periode von %i ms", -["Gravity"]="Schwerkraft", -["Current setting is "]="Aktuelle Einstellung ist ", -["Setup:|'g=150', where 150 is 150% of normal gravity"]="Syntax:|»g=150«, wobei »150« für 150% der normalen Schwerkraft steht.", -["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"]="Oder »g=50, g2=150, period=4000« für eine Schwerkraft,|die von 50 bis 150 vor und zurück mit einer Periode von 4000 ms oszilliert.", -["Set period to negative value for random gravity"]="Setze period auf einen negativen Werd für eine zufällige Schwerkraft", -["Homing Bee"]="Zielsuchende Biene", -["SineGun"]="Sinuskanone", -["Land Spray"]="Landkanone", -["Kamikaze"]="Kamikaze", -["RC Plane"]="Funkflugzeug", -["Air Attack"]="Luftangriff", -["Mine Strike"]="Minen-Luftangriff", -["Drill Strike"]="Bohr-Luftangriff", -["Air Mine"]="Luftmine", -["Napalm"]="Napalm-Luftangriff", -["Piano Strike"]="Piano-Angriff", -["BlowTorch"]="Schweißbrenner", -["PickHammer"]="Presslufthammer", -["Girder"]="Bauträger", -["Rubber"]="Gummi", -["Resurrector"]="Totenbeschwörung", -["Tardis"]="Zeitkasten", -["Switch Hog"]="Igel wechseln", -["Air Mine Placement Mode"]="Luftminenplatzierungsmodus", -["Target Placement Mode"]="Zielscheibenplatzierungsmodus", -["Cleaver Placement Mode"]="Hackebeilplatzierungsmodus", -["Advanced Repositioning Mode"]="Fortgeschrittner Verlegungsmodus", -["Tagging Mode"]="Markierungsmodus", -["Hog Identity Mode"]="Igelidentitätsmodus", -["Team Identity Mode"]="Team-Identitätsmodus", -["Health Modification Mode"]="Gesundheitsmodifikationsmodus", -["Sprite Placement Mode"]="Sprite-Platzierungsmodus", -["Sprite Modification Mode"]="Sprite-Modifikationsmodus", -["Waypoint Placement Mode"]="Wegpunktplatzierungsmodus", -["Selection Mode"]="Auswahlmodus", -["Placement Mode"]="Platzierungsmodus", -["Deletion Mode"]="Löschmodus", -["Please click on a hedgehog."]="Bitte klick auf einen Igel.", -["LandFlag Modification Mode"]="LandFlag-Modifikationsmodus", -["Sprite Erasure Mode"]="Sprite-Löschmodus", -["Tag Collection Mode"]="Markiermodus: Einsammeln", -["Please click on a crate."]="Bitte klick auf eine Kiste.", -["Tag Victory Mode"]="Markiermodus: Sieg", -["Tag Failure Mode"]="Markiermodus: Niederlage", -["Waypoint Deletion Mode"]="Wegpunktlöschmodus", -["Standard Target"]="Standardziel", -["Standard Cleaver"]="Standardhackebeil", -["Normal Sticky Mine"]="Normale Haftmine", -["Chef"]="Chefkoch", -["Clown"]="Clown", -["Commander"]="Kommandant", -["Engineer"]="Ingenieur", -["Ninja"]="Ninja", -["Physicist"]="Physiker", -["Pyro"]="Pyromane", -["Saint"]="Sankt", -["Sniper"]="Heckenschütze", -["Soldier"]="Soldat", -["Trapper"]="Trapper", -["Sprite Testing Mode"]="Sprite-Testmodus", -["Standard Waypoint"]="Standard-Wegpunkt", -["Level Data Saved!"]="Leveldaten gesichert!", -["HEDGE EDITOR"]="HEDGE EDITOR", -["(well... kind of...)"]="(naja, sozusagen …)", -["Place Girder: Girder"]="Bauträger platzieren: Bauträger", -["Place Rubber: Rubber"]="Gummi platzieren: Gummi", -["Place Gear: Air Attack"]="Gear platzieren: Luftangriff", -["Change Selection: [Up], [Down], [Left], [Right]"]="Auswahl ändern: [Hoch], [Runter], [Links], [Rechts]", -["Toggle Help: Precise+1 (While a tool is selected)"]="Hilfe umschalten: Genaues Zielen + 1 (Während ein Werkzeug ausgewählt ist)", -["COMMANDS: (Use while no weapon is selected)"]="BEFEHLE: (Benutzen, wenn keine Waffe gewählt ist)", -["Save Level: Precise+4"]="Level sichern: Genaues Zielen + 4", -["Toggle Editing Weapons and Tools: Precise+2"]="Waffen- und Werkzeugbearbeitung umschalten: Genaues Zielen + 2", -["GIRDER PLACEMENT MODE"]="BAUTRÄGERPLATZIERUNGSMODUS", -["Use this mode to place girders"]="Benutze diesen Modus, um Bauträger zu platzieren", -["Place Girder: [Left Click]"]="Bauträger platzieren: [Linksklick]", -["Change Rotation: [Left], [Right]"]="Rotieren: [Links], [Rechts]", -["Change LandFlag: [1], [2], [3], [4]"]="LandFlag ändern: [1], [2], [3], [4]", -["1 - Normal Girder"]="1 – Normaler Bauträger", -["2 - Indestructible Girder"]="2 – Unzerstörbarer Bauträger", -["3 - Icy Girder"]="3 – Eisiger Bauträger", -["4 - Bouncy Girder"]="4 – Elastischer Bauträger", -["Deletion Mode: [5]"]="Löschmodus: [5]", -["Toggle Help: Precise+1"]="Hilfe umschalten: Genaues Zielen + 1", -["RUBBER PLACEMENT MODE"]="GUMMIPLATZIERUNGSMODUS", -["Use this mode to place rubberbands"]="Benutze diesen Modus, um Gummibalken zu platzieren", -["Place Object: [Left Click]"]="Objekt platzieren: [Linksklick]", -["1 - Normal Rubber"]="1 – Normales Gummi", -["BARREL PLACEMENT MODE"]="FASSPLATZIERUNGSMODUS", -["Use this mode to place barrels"]="Benutze diesen Modus, um Pulverfässer zu platzieren", -["Change Health: [Left], [Right]"]="Gesundheit ändern: [Links], [Rechts]", -["Change Placement Mode: [Up], [Down]"]="Platzierungsmodus ändern: [Hoch], [Runter]", -["CLEAVER MINE PLACEMENT MODE"]="HACKEBEILPLATZIERUNGSMODUS", -["Use this mode to place cleavers"]="Benutze diesen Modus, um Hackebeile zu platzieren", -["TARGET MINE PLACEMENT MODE"]="ZIELSCHEIBENPLATZIERUNGSMODUS", -["Use this mode to place targets"]="Benutze diesen Modus, um Zielscheiben zu platzieren", -["WAYPOINT PLACEMENT MODE"]="WEGPUNKTPLATZIERUNGSMODUS", -["Use this mode to waypoints"]="Benutze diesen Modus, um Wegpunkte zu platzieren", -["Place Waypoint: [Left Click]"]="Wegpunkt platzieren: [Linksklick]", -["MINE PLACEMENT MODE"]="MINENPLATZIERUNGSMODUS", -["Use this mode to place mines"]="Benutze diesen Modus, um Minen zu platzieren", -["Change Timer (in milliseconds): [Left], [Right]"]="Zeitzünder (in Millisekunden) ändern: [Links], [Rechts]", -["STiCKY MINE PLACEMENT MODE"]="HAFTMINENPLATZIERUNGSMODUS", -["Use this mode to place sticky mines"]="Benutze diesen Modus, um Haftminen zu platzieren", -["AIR MINE PLACEMENT MODE"]="LUFTMINENPLATZIERUNGSMODUS", -["Use this mode to place air mines"]="Benutze diesen Modus, um Luftminen zu platzieren", -["Use this mode to place weapon crates"]="Benutze diesen Modus, um Waffenkisten zu platzieren", -["Change Content: [Left], [Right]"]="Inhalt ändern: [Links], [Rechts]", -["UTILITY CRATE PLACEMENT MODE"]="WERKZEUGKISTENPLATZIERUNGSMODUS", -["Use this mode to place utility crates"]="Benutze diesen Modus, um Werkzeugkisten zu platzieren", -["HEALTH CRATE PLACEMENT MODE"]="GESUNDHEITSKISTENPLATZIERUNGSMODUS", -["Change Health Boost: [Left], [Right]"]="Gesundheitsschub ändern: [Links], [Rechts]", -["ADVANCED REPOSITIONING MODE"]="FORTGESCHRITTENER VERLEGUNGSMODUS", -["Use this mode to select and reposition gears"]="Benutze diesen Modus, um Gears auszuwählen und zu verlegen", -["[Left], [Right]: Change between selection and placement mode."]="[Links], [Rechts]: Zwischen Auswahl- und Verlegungsmodus wechseln.", -["SPRITE MODIFICATION MODE"]="SPRITE-MODIFIKATIONSMODUS", -["Set LandFlag: [1], [2], [3], [4]"]="LandFlag setzen: [1], [2], [3], [4]", -["1 - Normal Land"]="1 – Normales Gelände", -["2 - Indestructible Land"]="2 – Unzerstörbares Gelände", -["3 - Icy Land"]="3 – Eisiges Gelände", -["4 - Bouncy Land"]="4 – Elastisches Gelände", -["SPRITE PLACEMENT MODE"]="SPRITE-PLATZIERUNGSMODUS", -["Use this mode to place custom sprites."]="Benutze diesen Modus, um benutzerdefinierte Sprites zu platzieren.", -["[Left], [Right]: Change sprite selection"]="[Links], [Rechts]: Sprite-Auswahl ändern", -["TAGGING MODE"]="MARKIERUNGSMODUS", -["Use this mode to tag gears for win/lose conditions."]="Benutze diesen Modus, um Gears für Sieg-/Niederlagebedingungen zu markieren.", -["Tag Gear: [Left Click]"]="Gear markieren: [Linksklick]", -["[Left], [Right]: Change between tagging modes."]="[Links], [Rechts]: Zwischen Markierungsmodi wechseln.", -["HOG IDENTITY MODE"]="IGELIDENTITÄTSMODUS", -["Use this mode to give a hog a preset identity and weapons."]="Benutze diesen Modus, um einem Igel ein voreingestelle Idendität sowie Waffen zu geben.", -["Set Identity: [Left Click]"]="Identität setzen: [Linksklick]", -["[Left], [Right]: Change between identities."]="[Links], [Rechts]: Identitäten wechseln.", -["TEAM IDENTITY MODE"]="TEAMIDENTITÄTSMODUS", -["Use this mode to give an entire team themed hats and names."]="Benutze diesen Modus, um einem Team einen Satz Hüte und Namen zu geben.", -["HEALTH MODIFICATION MODE"]="GESUNDHEITSMODIFIKATIONSMODUS", -["Use this mode to set the health of hogs."]="Benutze diesen Modus, um die Igelgesundheit einzustellen.", -["Set Health: [Left Click]"]="Gesundheit setzen: [Linksklick]", -["[Left], [Right]: Change health value."]="[Links], [Rechts]: Gesundheitswert auswählen", -["Warning: Deletition Mode Active"]="Achtung: Löschmodus aktiv", -["The editor weapons and tools have been removed!"]="Die Editorwaffen und -werkzeuge wurden entfernt!", -["The editor weapons and tools have been added!"]="Die Editorwaffen und -werkzeuge wurden hinzugefügt!", -["Bouncy Land"]="Sprunghaftes Gelände", -["Normal Land"]="Normales Gelände", -["Indestructible Land"]="Unzerstörbares Gelände", -["Icy Land"]="Eisiges Gelände", -["HIGHLANDER"]="HOCHLÄNDER", -["Not all hogs are born equal."]="Nicht alle Igel werden gleich geboren.", -["Eliminate enemy hogs and take their weapons."]="Vernichte alle gegnerischen Igel und nimm ihre Waffen.", -["Per-Hog Ammo"]="Munition pro Igel", -["Weapons reset."]="Waffen werden zurückgesetzt.", -["Unlimited Attacks"]="Unbegrenzte Angriffe", -["The first player to kill someone becomes the Mutant."]="Der erste Spieler, der einen umbringt, wird zum Mutanten.", -["The Mutant has super-weapons and a lot of health."]="Der Mutant hat Superwaffen und eine hohe Gesundheit.", -["The Mutant loses health quickly if he doesn't keep scoring kills."]="Der Mutant verliert schnell an Gesundheit, wenn er nicht schnell andere Igel tötet.", -["Normal players can only score points by killing the mutant."]="Andere Spieler erhalten nur durch das Töten des Mutanten Punkte.", -["The player with least points (or most deaths) becomes the Bottom Feeder."]="Der Spieler mit den wenigsten Punkten (oder den meisten Toden) wird zum Versager.", -["The Bottom Feeder can score points by killing anyone."]="Der Versager erhält Punkte durch das Töten beliebiger anderer Igel.", -["POINTS"]="PUNKTE", -["+2 for becoming a Mutant"]="+2 für die Verwandlung zum Mutanten", -["+1 to a Mutant for killing anyone"]="+1 für den Mutanten, der andere tötet", -["+1 to a Bottom Feeder for killing anyone"]="+1 für den Versager, der andere tötet", -["-1 to anyone for a suicide"]="-1 für Selbstmord", -["Other kills don't give you points."]="Andere Abschüsse bringen keine Punkte.", -["Mutant"]="Mutant", -["a Hedgewars tag game"]="ein Hedgewars-Fangenspiel", -["ONE HOG PER TEAM! KILLING EXCESS HEDGES"]="EIN IGEL PRO TEAM! ÜBERFLÜSSIGE IGEL WERDEN GETÖTET", -["FIRST BLOOD MUTATES"]="ERSTER MÖRDER MUTIERT", -["DOUBLE KILL"]="DOPPEL-ABSCHUSS", -["MEGA KILL"]="MEGA-ABSCHUSS", -["ULTRA KILL"]="ULTRA-ABSCHUSS", -["MONSTER KILL"]="MONSTRÖSER ABSCHUSS", -["LUDICROUS KILL"]="HAARSTRÄUBENDER ABSCHUSS", -["HOLY SHYTE!"]="HEILIGE SCHEISSE!", -["INSANITY"]="WAHNSINN", -["Score"]="Punktzahl", -["WINNER IS "]="DER SIEGER IST ", -["-------"]="-------", -[" HAS MUTATED"]=" MUTIERTE", -[" HP"]=" TP", -["Jumping is disabled"]="Sprünge sind deaktiviert!", -["Way-Points Remaining"]="Wegpunkte verbleibend", -["s"]="s", -["RACER"]="WETTRENNEN", -["TRACK COMPLETED"]="STRECKENLAUF BEENDET", -["NEW RACE RECORD: "]="NEUER RENNREKORD: ", -["WINNING TIME: "]="BESTZEIT: ", -["NEW CLAN RECORD: "]="NEUER KLAN-REKORD", -["TIME: "]="ZEIT: ", -["s|"]="s|", -["STATUS UPDATE"]="STATUSAKTUALISIERUNG", -["Rounds Complete: "]="Runden gespielt: ", -["Best Team Times: "]="Beste Team-Zeiten: ", -["Build a track and race."]="Konstruiere eine Strecke und mach ein Wettrennen.", -["Round Limit:"]="Rundenbegrenzung:", -["Available points remaining: "]="Verfügbare Punkte verbleibend:", -["Waypoint placed."]="Wegpunkt gesetzt", -["GAME BEGUN!!!"]="SPIEL GESTARTET!!!", -["Complete the track as fast as you can!"]="Durchlaufe die Strecke so schnell du kannst!", -["NOT ENOUGH WAYPOINTS"]="NICHT GENUG WEGPUNKTE", -["Place more waypoints using the 'Air Attack' weapon."]="Platziere mehr Wegpunkte durch Verwenden der »Luftangriff«-Waffe", -["Please place the way-point in the open, within the map boundaries."]="Bitte platziere den Wegpunkt in der Luft, innerhalb der Kartengrenzen.", -["Please place the way-point further from the waterline."]="Bitte platziere den Wegpunkt weiter weg vom Wasser.", -["Race complexity limit reached."]="Rennkomplexitätslimit erreicht.", -["Good to go!"]="Startklar!", -["Each turn you get one random weapon"]="Du bekommst jede Runde eine zufällig gewählte Waffe.", -["BOOM!"]="KABUMM!", -["SCORE"]="PUNKTZAHL", -["KILLS"]="ABSCHÜSSE", -["invaders destroyed"]="Angreifer zerstört", -["Rounds Complete"]="Runden gespielt", -["Flamer"]="Flammenwerfer", -["selected!"]="ausgewählt!", -["shots remaining."]="Schüsse übrig", -["Barrel Launcher"]="Fasswerfer", -["Ammo Depleted!"]="Munition erschöpft!", -["Mine Deployer"]="Minenleger", -["Shield Depleted"]="Schild aufgebraucht!", -["Power Remaining"]="Verbleibende Energie", -["Shield ON:"]="Schild AN:", -["Shield OFF:"]="Schild AUS:", -["Pings left:"]="Verbleibende Pings:", -["Destroy invaders to score points."]="Zerstöre die Angreifer um Punkte zu erhalten.", -["Round Limit"]="Rundenbegrenzung", -["Turn Time"]="Zeit pro Zug", -["Movement: [Up], [Down], [Left], [Right]"]="Bewegung: [Hoch], [Runter], [Links], [Rechts]", -["Fire"]="Feuer", -["[Left Shift]"]="[Umschalt links]", -["Toggle Shield"]="Schild ein/aus", -["[Enter]"]="[Eingabe]", -["Radar Ping"]="Radarsignal", -["[Backspace]"]="[Rücktaste]", -["Surfer! +15 points!"]="Surfer! +15 Punkte", -["Shield Miser!"]="Schildgieriger", -["Accuracy Bonus!"]="Präzisions-Bonus!", -["Fierce Competition!"]="Harter Wettkampf!", -["Time Extended!"]="Zeit verlängert!", -["Drone Hunter!"]="Drohnenjäger", -["Ammo"]="Munition", -["Ammo Maniac!"]="Munitionsverrückter!", -["Shield boosted! +30 power"]="Schild verstärkt! +30 Energie", -["Shield is fully recharged!"]="Schild vollständig aufgeladen!", -["Shield Seeker!"]="Schildsucher!", -["Boss defeated!"]="Boss wurde besiegt!", -["Boss Slayer!"]="Boss-Töter!", -["Hit Combo!"]="Treffer-Combo!", -["GOTCHA!"]="ERWISCHT!", -["Sniper!"]="Scharfschütze!", -["They Call Me Bullseye!"]="Man nennt mich »Adlerauge«!", -["Point Blank Combo!"]="Nahschuss-Combo!", -["Multi-shot!"]="Multischuss!", -["Shield Master!"]="Schildmeister!", -["Kamikaze Expert!"]="Kamikazeexperte!", -["Depleted Kamikaze!"]="Munitionsloses Kamikaze!", -["Timed Kamikaze!"]="Pünktliches Kamikaze!", -["You can further customize the race by changing the scheme script paramater."]="Du kannst das Renner ferner bearbeiten, indem du den Skriptparameter im Schema änderst.", -["THE SPECIALISTS"]="DIE SPEZIALISTEN", -["Eliminate the enemy specialists."]="Vernichte die gegnerischen Spezialisten", -["Game Modifiers: "]="Spiel-Modifikatoren", -["Weapons Reset"]="Waffenzurücksetzung", -["Switched to "]="Gewechselt zu ", -["Prepare yourself"]="Mach dich bereit", -["ammo extended!"]="Munition aufgestockt!", -["Barrel Eater!"]="Fassfresser!", -["Mine Eater!"]="Minenfresser!", -["Tumbling Time Extended!"]="Purzelzeit verlängert!", -["fuel extended!"]="Treibstoff aufgetankt!", -["Eliminate the enemy hogs to win."]="Vernichte alle gegnerischen Igel, um zu gewinnen.", -["New Mines Per Turn"]="Neue Minen jeden Zug", -["New Barrels Per Turn"]="Neue Fässer jeden Zug", -["Time Extension"]="Zeitverlängerung", -["Change Weapon"]="Waffenwechsel", -["Grab Mines/Explosives"]="Sammle Minen/Fässer", -["Health crates extend your time."]="Erste-Hilfe-Kisten verlängern deine Zeit.", -["Ammo is reset at the end of your turn."]="Munition wird am Ende des Spielzuges zurückgesetzt.", -["Double Kill!"]="Doppelmord!", -["Killing spree!"]="Blutrausch!", -["Unstoppable!"]="Unaufhaltsam!", -["Friendly Fire!"]="Eigenbeschuss!", -["For improved features/stability, play 0.9.18+"]="Für bessere Features/Stabilität, spiele 0.9.18 oder später", -["Surfer!"]="Surfer!", -["All walls touched!"]="Alle Wände berührt!", -["Go surf!"]="Los, surfe!", -["Walls Left"]="Verbleibende Wände", -["Configuration accepted."]="Konfiguration akzeptiert.", -["You may only attack from a rope!"]="Du darfst nur von einem Seil angreifen!", -["Spawn the crate, and attack!"]="Lass die Kiste auftauchen und greif an!", -["Press [Enter] to accept this configuration."]="Drücke [Eingabe], um diese Konfiguration zu akzeptieren.", -["Walls Required"]="Wände benötigt", -["Surf Before Crate"]="Surfen Vor Kiste", -["Attack From Rope"]="Angriff Vom Seil", -["Super Weapons"]="Superwaffen", -["WALL TO WALL"]="WAND-ZU-WAND", -["a shoppa minigame"]="ein Einkaufs-Minispiel", -["Roper"]="Seiler", -["Shoppers"]="Käufer", -["Use your rope to collect all crates as fast as possible."]="Benutze dein Seil, um alle Kisten so schnell wie möglich einzusammeln.", -["Speed Shoppa"]="Rasender Kistensammler", -["%d crate(s) remaining"]="Verbleibende Kisten: %d", -["milliseconds"]="Millisekunden", -["You have finished the challenge in %.3f s."]="Du hast die Herausforderung in %.3fs gemeistert.", -["Challenge failed!"]="Herausforderung gescheitert!", -["crate(s)"]="Kiste(n)", -["You have collected %d out of %d crate(s)."]="Du hast %d von %d Kiste(n) eingesammelt.", -["Trainee"]="Azubi", -["Training Team"]="Traningsteam", -["You have shot %d times."]="Du hast %d mal geschossen.", -["Time’s up!"]="Die Zeit ist um!", -["Targets left: %d"]="Verbleibende Ziele: %d", -["You have destroyed all targets!"]="Du hast alle Ziele zerstört!", -["Congratulations! You have destroyed all targets within the time."]="Gratulation! Du hast alle Ziele innerhalb der verfügbaren Zeit ausgeschaltet.", -["You have finished the target practice!"]="Du hast die Zielübung abgeschlossen!", -["Your accuracy was %.1f%% (+%d points)."]="Deine Treffgenauigkeit betrug %.1f%% (+%d Punkte).", -["You had %.1fs remaining on the clock (+%d points)."]="Du hattest eine verbleibende Zeit von %.1fs (+%d Punkte)." +["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 +["'Zooka Team"]="Die Knalltüten", +["Zook"]="Zook", +["Zork"]="Zork", } diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/de.txt --- a/share/hedgewars/Data/Locale/de.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/de.txt Sun Dec 17 00:09:24 2017 +0100 @@ -32,7 +32,7 @@ 00:29=Ballkanone 00:30=Napalm-Luftangriff 00:31=Funkflugzeug -00:32=Schwerkraft verringern +00:32=Niedrige Schwerkraft 00:33=Zusatzschaden 00:34=Unverwundbarkeit 00:35=Zusatzzeit @@ -60,8 +60,9 @@ 00:56=Hackebeil 00:57=Gummi 00:58=Luftmine +00:59=Quietscheentchen -01:00=Auf in die Schlacht! +01:00=Laden … 01:01=Unentschieden 01:02=%1 gewinnt! 01:03=Lautstärke: %1 % @@ -88,6 +89,10 @@ 01:22=Abwesenheitsmodus 01:23=Autokamera aus 01:24=Autokamera an +01:25=Zieltaste drücken, um das Ziel zu markieren +01:26=Werkzeug nicht verfügbar im Sudden Death +01:27=+%1 +01:28=Leer! ; Event messages ; Hog (%1) died @@ -96,9 +101,22 @@ 02:00=%1 hat’s nicht geschafft! 02:00=%1 stellt sich tot! 02:00=%1 hat schon bessere Tage gesehen! +02:00=%1 ist nun an einem besseren Ort! +02:00=%1 hat die Pflicht getan! 02:00=%1 sieht tote Igel! 02:00=%1 hat ins Gras gebissen! 02:00=%1 ist Futter für die Würmer! +02:00=Für %1 ist’s vorbei +02:00=%1 wird zurückkehren +02:00=%1 braucht etwas Ruhe +02:00=Und tschüss, %1! +02:00=%1 trifft den Großen Weißen Igel im Himmel +02:00=%1 wurde eliminiert +02:00=Nein! Warum musste %1 nur sterben? +02:00=Oh nein, %1! Du hattest noch dein ganzes Leben vor dir … +02:00=%1 ist so tot wie die Dodos +02:00=%1 ist tot umgefallen +02:00=%1 ist tief begraben 02:00=Das war’s wohl, %1! 02:00=%1 hat’s hinter sich! 02:00=%1 kann schon das Licht sehen! @@ -143,6 +161,7 @@ 02:00=Ist ein Arzt im Haus?! 02:00=%1 ist tot 02:00=%1 ist hinüber +02:00=%1 ist über dem Verfallsdatum 02:00=%1 wurde in tausend Stücke zerfetzt 02:00=Schade um %1 02:00=Wir trauern um %1 @@ -157,7 +176,10 @@ 02:00=%1 war ohnehin nur Kanonenfutter 02:00=Mir kommen die Tränen, %1! 02:00=Man wird dich rächen, %1! -02:00=%1 wartet auf die Wiederbelebung. +02:00=Für %1 ist das Spiel vorbei +02:00=%1 ruht für immer +02:00=Lebewohl, %1! +02:00=%1 wartet auf die Wiederbelebung 02:00=%1 hat ein Nach-Tod-Erlebnis 02:00=%1 hat im Spiel des Lebens verloren 02:00=%1 wurde vernichtend geschlagen @@ -166,9 +188,18 @@ 02:00=%1 schläft den ganz langen Winterschlaf 02:00=Warum musstest du sterben, %1? 02:00=Oh, nein, %1! Wir hatten noch so viel vor … -02:00=Jetzt braucht sich %1 nicht mehr vor dem Tod zu fürchten. +02:00=Jetzt braucht sich %1 nicht mehr vor dem Tod zu fürchten 02:00=%1 wurde von den Schrecken des Krieges erlöst 02:00=Klappe zu, %1 tot! +02:00=%1 hat uns im Stich gelassen +02:00=Für %1 ist es vorbei +02:00=%1 sagt »Nein!« zum Leben +02:00=%1 ist tot umgefallen +02:00=%1 fiel der natürlichen Selektion zum Opfer +02:00=%1 geht in die Unterwelt + +02:00=%1 verfällt in die ewige Starre +02:00=%1 ist in die ewigen Jagdgründe gefallen ; Hog (%1) drowned 02:01=%1 geht auf Tauchstation! @@ -210,7 +241,7 @@ 02:01=%1 hat ein Leck 02:01=Wie viele Igel wohl da unten liegen? 02:01=%1 macht das Meer etwas höher -02:01=%1 ist absolut nicht Marinetauglich +02:01=%1 ist absolut nicht marinetauglich 02:01=%1 hält sich für einen Fisch 02:01=Wenigstens ging die Sache nicht ins Klo, %1! 02:01=Sonic konnte nicht schwimmen, %1 auch nicht @@ -225,19 +256,27 @@ 02:01=%1 geht baden 02:01=%1 ist nass, nass, nass 02:01=%1 macht blubb -02:01=%1, Igel, der mit dem Blubb +02:01=%1 macht sich die Stacheln nass +02:01=%1, der mit dem Blubb 02:01=Nächster Halt: Meeresgrund 02:01=%1 hätte den Schwimmkurs nicht schwänzen sollen -02:01=Fischers Fritze fischt frische ... Igel?! +02:01=Fischers Fritze fischt frische … Igel?! 02:01=Grüß die Fische von uns, %1! 02:01=%1 erkundet das Meer 02:01=%1 folgt dem Ruf der Meere +02:01=Igel haben keine Kiemen, %1! +02:01=%1 braucht ein erfrischendes Getränk +02:01=%1 schwimmt kopfüber +02:01=%1 wollte schon immer Tauchen gehen +02:01=%1 verwechselt das Meer mit der Badewanne + 02:01=%1 ist jetzt ein Seeigel! -02:01=Igel haben keine Kiemen, %1! 02:01=%1 lässt sich diese einmalige Tauchgelegenheit nicht entgehen -02:01=Und wir dachten %1 könnte nicht noch tiefer sinken … +02:01=Und wir dachten, %1 könnte nicht noch tiefer sinken … 02:01=%1 zieht eine Etage tiefer 02:01=Seht, %1 kann schwimmen! Nein, doch nicht … +02:01=%1 trinkt zu viel +02:01=Blubb, blubb, weg war %1! ; Round starts 02:02=Auf in die Schlacht! @@ -259,7 +298,12 @@ 02:02=Dem Sieger gehört die Beute 02:02=Diese Schlacht muss gewonnen werden! 02:02=Hedgewars, präsentiert von hedgewars.org +02:02=Viel Glück und viel Spaß! +02:02=Sei froh, wenn du nicht gegen Tiyuri kämpfst +02:02=Sei froh, wenn du nicht gegen unC0Rr kämpfst 02:02=Sei froh, wenn du nicht gegen Nemo kämpfst +02:02=Sei froh, wenn du nicht gegen Smaxx kämpfst +02:02=Sei froh, wenn du nicht gegen Jessor kämpfst 02:02=Gib alles! 02:02=Die Verlierer müssen putzen! 02:02=Lassen Sie den Kampf des Jahrtausends beginnen @@ -267,36 +311,97 @@ 02:02=Lassen Sie den Kampf des Jahrzehnts beginnen 02:02=Lassen Sie den Kampf des Jahres beginnen 02:02=Lassen Sie den Kampf des Monats beginnen -02:02=Lassen Sie den Kampf in der Woche beginnen +02:02=Lassen Sie den Kampf der Woche beginnen 02:02=Lassen Sie den Kampf des Tages beginnen 02:02=Lassen Sie den Kampf der Stunde beginnen 02:02=Zerstört den Feind! 02:02=Viel Glück! 02:02=Viel Spaß! -02:02=Kampf im Schmutz -02:02=Kampf mit Ehre +02:02=Kämpft dreckig! +02:02=Kämpft mit Ehre 02:02=Niemals aufgeben, niemals kapitulieren! -02:02=Lassen Sie das Schlachtfest beginnen! +02:02=Lasst das Schlachtfest beginnen! 02:02=Ich hoffe, du bist bereit für einen Kampf! 02:02=Los, los! 02:02=Igel voraus! 02:02=Zeigt’s ihnen! 02:02=Habt keine Angst! +02:02=Seid mutig und siegreich! -; Round ends (win; unused atm) -02:03=... +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! -; Round ends (draw; unused atm) -02:04=... +; Round ends and team/clan (%1) wins +02:03=%1 gewinnt! +02:03=%1 ist der Champion +02:03=%1 ist der Sieger! +02:03=%1 ist der Gewinner! +02:03=%1 zeigt, wie man gewinnt +02:03=%1 ist der Beste der Besten +02:03=%1 tanzt den Siegestanz +02:03=Sieg für %1! +02:03=Und der Sieger ist %1 +02:03=Gratulation, %1 gewinnt! +02:03=Verneigt euch vor %1 +02:03=%1 hat das Spiel gemeistert +02:03=%1 hat die Schlacht gewonnen +02:03=%1 ist die Nummer eins! +02:03=Bravo, bravo, %1! +02:03=%1 ist der Beste +02:03=Applaus, Applaus, %1! +02:03=%1 zerstörte den Feind +02:03=%1 hat den Feind erobert +02:03=%1 hat den Feind zertrampelt +02:03=%1 kennt die Kunst des Sieges +02:03=Alle jubeln für %1 +02:03=%1 wählte den Sieg statt den Tod +02:03=%1 bekommt einen Stern auf der Siegesstraße +02:03=%1 trinkt den Siegersaft +02:03=%1 triumphiert +02:03=%1 schlürft von der Siegersoße +02:03=%1 hat diese Runde meisterhaft gewonnen +02:03=%1 siegt mit Stil +02:03=Mission erfolgreich, %1 gewinnt +02:03=%1 verdient sich die Siegermedaillie +02:03=Wer ist der Sieger? %1 ist der Sieger! +02:03=%1 hat Grund zum Feiern + +02:03=%1 ist auf dem 1. Platz + +; Round ends in a draw +02:04=Unentschieden +02:04=Es ist unentschieden! +02:04=Keiner gewinnt! Unentschieden +02:04=Unglaublich, diese Runde endet unentschieden +02:04=Unentschieden, wie langweilig +02:04=Unmöglich! Es ist unentschieden +02:04=Unentschieden! Jetzt müssen wir von vorne anfangen … +02:04=Spiel vorbei! Es hat niemand gewonnen +02:04=Unentschieden, was für eine Enttäuschung! +02:04=Heute ist jeder ein Verlierer +02:04=Hey, wo ist der Sieger? +02:04=Wo sind all die Igel hin? +02:04=Öde! Ich will mein Geld zurück! + +02:04=Ach nö, es steht Unentschieden! ; New health crate +02:05=Hilfspaket gesichtet! +02:05=Sanitäter! +02:05=Erste Hilfe aus der Luft! +02:05=Ein Gesundheitspaket für euch +02:05=Gesundheit in Kistenform! 02:05=Alles Gute kommt von oben! 02:05=Linderung in Sicht! 02:05=Das kommt gelegen! 02:05=Jemand denkt an euch! 02:05=Mit Liebe verpackt? 02:05=Frisches Pflaster! -02:05=So werden Sie sich besser fühlen +02:05=Frische Bandagen! +02:05=Damit wirst du dich besser fühlen 02:05=Ein Hallo-Trank! Upps, falsches Spiel 02:05=Zugreifen! 02:05=Ein gesunder Snack @@ -320,16 +425,96 @@ 02:05=Tankt eure Lebensenergie wieder auf! 02:05=Hat jemand »Hatschi!« gesagt? 02:05=Damit fühlt sich der Igel wieder pudelwohl! +02:05=Gesundheit und Gegengift! +02:05=Enthält: Bandagen und Gegengift +02:05=Das sieht gesund aus +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=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=Brotrationen! +02:05=Stell deine Gesundheit wieder her +02:05=Das wird euch helfen +02:05=Eine Arztkiste! +02:05=Sofortgesundheit! +02:05=Gesundheitsschub gesichtet! +02:05=Verbessert deine Gesundheit +02:05=Für den Kampf gegen Krankheit +02:05=Hilfe zur Selbsthilfe +02:05=Gesundheit! +02:05=Empfohlen von 9 von 10 Ärzten +02:05=Hat jemand einen Arzt gerufen? +02:05=Der Freund verwundeter Igel +02:05=Hilfe für kranke Igel +02:05=Ein Helferlein in Kistenform +02:05=Heilt deine Wunden +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=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 +02:05=Die Götter sind gnädig gestimmt +02:05=Eure Gebete wurden erhört! +02:05=Heute ist dein Glückstag! +02:05=Mehr Gesundheit! +02:05=Gesundheitsbonus! +02:05=Je gesünder, desto besser +02:05=Notfallabwurf! +02:05=Notfalllieferung! +02:05=Notvorräte! +02:05=Hartnäckige Igel sind gute Igel +02:05=Vergiss nicht deine Vitamine! +02:05=Jemand hat wohl seine Pillen vergessen +02:05=Wir denken an euch! +02:05=Hilfe für die Verletzten +02:05=Lasst uns deine Hartnäckigkeit erhöhen +02:05=Die (erste) Hilfe zum Sieg +02:05=Hol Erste Hilfe, bevor du den letzten Atemzug machst +02:05=Schlag dem Tod ein Schnippchen! +02:05=Nix da, wir lassen euch doch nicht einfach so sterben +02:05=Damit das Leiden ein Ende hat +02:05=Kostenlose Gesundheitsfürsorge! +02:05=Nimm diese Medizin +02:05=Lebensversicherung für Soldaten +02:05=Dr. Gesundheitskiste ist da! +02:05=Still deinen Hunger nach Gesundheit +02:05=Brauch. Mehr. Gesundheit. +02:05=Zögere nicht, sie an dich zu reißen +02:05=Die Schutzengel haben euch lieb! +02:05=Ein Geschenk der Götter +02:05=Mjam! Leckere Bandagen! +02:05=Eine verdächtige Kiste mit Heilkräften … +02:05=Eine Kiste mit Gesundheit drin +02:05=Man kann niemals gesund genug sein +02:05=Gesund genug? Immer noch kein Problem +02:05=Das Geheimnis der Unsterblichkeit +02:05=Fast wie ein Extraleben + +02:05=Ohne Risiken und Nebenwirkungen +02:05=Packungsbeilage beachten! +02:05=Luftpost von der Apotheke +02:05=Zu Risiken und Nebenwirkungen fragen Sie Ihren Arzt oder Sanitäter ; New ammo crate +02:06=Noch mehr Waffen! 02:06=Nachschub! 02:06=Zeit zum Nachladen! +02:06=Ich frag mich, welche Waffe da drin ist +02:06=Versorgungsgüter eingetroffen! 02:06=Was wohl darin ist? 02:06=Bringt das die Wende? 02:06=Tod aus der Luft! 02:06=Ein Geschenk! -02:06=Spezielle Lieferung! +02:06=Sonderlieferung! 02:06=Es war ein Alptraum, diese Kiste durch den Zoll zu kriegen … +02:06=Weihnachten wurde vorverlegt 02:06=Destruktives Spielzeug aus dem Himmel 02:06=Vorsicht! Inhalt leicht entzündlich 02:06=Einsammeln oder sprengen, das ist die Frage @@ -338,9 +523,10 @@ 02:06=Eine Schachtel zerstörerische Kraft 02:06=Luftpost! 02:06=Was auch immer da drin ist, es ist bestimmt nicht Pizza -02:06=Einsammlen! +02:06=Einsammeln! 02:06=Eine Waffenkiste! -02:06=Lasse nicht zu, dass der Feind sie holt! +02:06=Waffenkiste gesichtet! +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! @@ -354,7 +540,7 @@ 02:06=Ob da eine Melonenbombe drin ist? 02:06=Das ist wie ein Kindergeburtstag! 02:06=Wir brauchen Waffen, viele Waffen! -02:06=Davon kann man nie genug haben. +02:06=Davon kann man nie genug haben 02:06=Neue Waffen, um das Spiel etwas spannender zu machen 02:06=Neue Waffen braucht das Land! 02:06=Nichts für Weicheier! @@ -362,20 +548,121 @@ 02:06=Wer zuerst kommt, mahlt zuerst! 02:06=Für die Waffennarren 02:06=Damit schlägt das Herz jedes Waffennarren höher! +02:06=Dies könnte die spielentscheidende Waffe sein! +02:06=Explosiver Spaß! +02:06=Wer hat das größte Arsenal auf dem Schlachtfeld? +02:06=Lehre deinen Feinden das Fürchten +02:06=Waffenkiste gesichtet! +02:06=Nette Überraschung! +02:06=Neue Spielzeuge +02:06=Eine Kiste voller Überraschungen +02:06=Explosive Übrraschungen! +02:06=Nimm dir das für eine Überraschung +02:06=Heb mich auf! Ich bin eine Kiste! +02:06=Wehe, wenn da kein schweres Geschütz drin ist +02:06=Wer holt sie sich zuerst? +02:06=Bau deinen Waffenvorrat aus +02:06=Wettervorhersage: Bewölkt mit Waffenkisten +02:06=Gib deinen Feinden eine explosive Überraschung +02:06=Der frühe Igel fängt die Waffe +02:06=Soldaten, beschlagnahmt die Kiste! +02:06=Angriff ist die beste Verteidigung +02:06=Lasst uns etwas Spaß haben! +02:06=Spiel mit mir! +02:06=Waffenkiste gesichtet! +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=Ein paar unartige Igel brauchen Bestrafung +02:06=Zerschmettert den Feind! +02:06=Spaß! Explosionen! Zerstörung! +02:06=Lass Tod und Zerstörung auf deine Feinde herabregnen +02:06=Waffen, davon kann man nie genung haben +02:06=Hol sie dir, bevor dir die Munition ausgeht! +02:06=Das bedeutet Chaos! +02:06=Extras für wahre Krieger +02:06=Achtung: Nicht bei hohen Temperaturen aufbewahren +02:06=Bist du gut genug für diese Waffe? +02:06=Herorische 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=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=Auspacken! +02:06=Diese Kiste bringt Zerstörung +02:06=Sie nennen mich »Terminator« +02:06=Eine kleine Kiste für eine große Explosion? +02:06=Wir haben noch mehr Munition gefunden +02:06=Der Spaß ist noch lange nicht vorbei +02:06=Überrumple den Feind +02:06=Aufsammeln oder sterben +02:06=Das hier könnte ein ziemlich großes Loch machen +02:06=Ich wette, das die hier weh tut +02:06=Wirf deine Feinde in eine Welt voller Schmerz +02:06=Mehr Schlagkraft +02:06=Was ist besser als eine Waffe? Zwei Waffen! +02:06=Qualitätsmunition eingetroffen! +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=Die Schonfrist ist vorbei +02:06=Lasst das Wettrüsten beginnen! +02:06=Nimm dich in acht, wenn der Feind sich sie holt +02:06=Achtung: Nicht unbeaufsichtigt lassen +02:06=Achtung: Enthält verschluckbare Kleinteile +02:06=Achtung: Fern von Kindern halten +02:06=Nichts für kleine Igel +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=Das ist die Chance! +02:06=Aufsammeln oder in die Luft jagen? +02:06=Ist das die ultimative Waffe? +02:06=Das ist kein Kinderspielzeug +02:06=Grüße von General Krawumm +02:06=Einen Schritt weiter zum Sieg? +02:06=Die totale Zerstörung … in einer Kiste? +02:06=Macht alles kaputt! +02:06=Auch Soldaten brauchen ihren Spaß +02:06=Benutze sie, um dich zu »verteidigen« +02:06=Selbst der beste Kämpfer braucht Munition +02:06=Keine Muni? Nicht mit uns! +02:06=Sammel dies +02:06=Schnapp sie dir und lach deine Feinde aus +02:06=Damit gewinnt man jede Debatte! +02:06=Hoffentlich ist es nicht Überspringen +02:06=Ohne Waffen gewinnt man keinen Krieg +02:06=Und du dachtest, deine Waffensammlung wäre vollständig? +02:06=Es ist gefährlich da draußen. Nimm dies! +02:06=Der Himmel spielt gern mit Sterblichen +02:06=Peng-peng in einer Kiste! +02:06=Können ein paar von euch bitte sterben? + 02:06=Waffenkiste: Nur echt mit dem Fragezeichen -02:06=Dies könnte die spielentscheidende Waffe sein! +02:06=Ein schlagkräftiges Argument! ; New utility crate 02:07=Nützliches? +02:07=Das sieht praktisch aus 02:07=Tooltime! -02:07=Was wohl darin ist? +02:07=Werkzeuge! +02:07=Hilfsmittel! +02:07=Aufgepasst, da unten! 02:07=Lieferung frei Haus! 02:07=Mehr als nur eine Kiste! 02:07=Weitere Hilfsmittel! 02:07=Extras für dich! 02:07=Dies sollte gut sein! 02:07=Verwende diese mit Bedacht -02:07=Uff, diese Box ist schwer +02:07=Uff, diese Kiste ist schwer +02:07=Das könntest du gebrauchen +02:07=Kann man das gebrauchen? 02:07=Futter für Strategen 02:07=Heimwerker atmen auf! 02:07=Schaffe, schaffe, Häusle baue @@ -387,23 +674,95 @@ 02:07=Verschaffe dir einen strategischen Vorteil 02:07=Muttern und Schrauben! 02:07=Lieferung aus den Igelwerken! +02:07=Direkt von der Baustelle +02:07=Ein Geschenk der Bauarbeiter +02:07=Sehr schön, ein Werkzeug! +02:07=Extras! +02:07=Geheime Technologie gesichtet +02:07=Bau etwas Schönes +02:07=Der Freund der Baumeister +02:07=Bau das Haus deiner Träume +02:07=Werkzeugkiste gesichtet! +02:07=Lass sie nicht auf deine Füße fallen! +02:07=Eine Kiste voller Werkzeuge +02:07=Hier habt ihr ein paar Werkzeuge +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=Ein schwerer Werkzeugkasten fällt vom Himmel! +02:07=Ein kleines Helferlein für kleine Igelchen +02:07=Erweitere deine Möglichkeiten +02:07=Überliste deinen Feind +02:07=Bau dir Brücken zum Sig +02:07=Überraschungswerkzeug! +02:07=Nützliches Geschenk! +02:07=Werkzeug für dich! +02:07=Der Schraubenschlüssel ist mächtiger als die Granate +02:07=Jo, wir schaffen das! +02:07=Zeit, das Dach zu reparieren +02:07=Zeit für eine Renovierung +02:07=Schnapp sie dir, so lange du noch kannst +02:07=Hoffentlich kann man das gebrauchen +02:07=Steckengeblieben? Hiermit kommst du weiter +02:07=Zum Ge- und Missbrauch +02:07=Prof. Heckes neueste Erfindung +02:07=Spielereien! +02:07=Ein Dingsbums! +02:07=Eine Kiste voller Möglichkeiten +02:07=Eine Heimwerkerkiste! +02:07=Interessante Erfindung +02:07=Ist das die neueste Erfindung? +02:07=Werd mobil! Hol dir diese Kiste! +02:07=Mobilität ist der Weg zum Sieg +02:07=Hol sie dir oder sei verdammt +02:07=Für Sammler +02:07=Guck mal, was ich im Werkzeugschuppen gefunden hab! +02:07=Ein Schweizer Messer in Kistenform +02:07=Das könntest du gebrauchen +02:07=Taktische Werkzeugkiste gesichtet! +02:07=Eine wilde Werkzeugkiste ist aufgetaucht! +02:07=Je mehr, desto besser +02:07=Eine Kiste für die taktische Kriegsführung +02:07=Werkzeuge! Sie sind immer nützlich +02:07=Der Höhepunkt der Technologie! +02:07=Unserer neuestes High-Tech-Spielzeug +02:07=Für euch nur die beste Technologie +02:07=Keine Möglichkeiten? Wir haben da etwas … +02:07=Das ist kein Toaster! +02:07=Ich hab gehört, dass hier jemand was braucht … +02:07=Lieferung aus der Fabrik! +02:07=Mit Vorsicht zu handhaben +02:07=Vorsicht: Zerbrechlich +02:07=Das fehlende Puzzlestück in deiner Strategie? +02:07=Unterschätze niemals Werkzeuge +02:07=Hol dir alle Werkzeuge! + 02:07=Damit schlägt das Herz jedes Mechanikers höher! 02:07=So viele Möglichkeiten … +02:07=Bauarbeiter stimmt dies heiter +02:07=Direkt aus dem Baumarkt +02:07=Erwecke den Erfinder in dir ; Hog (%1) skips his turn 02:08=%1 ist so ein Langeweiler … +02:08=%1 will nicht gestört werden 02:08=%1 denkt weiter nach … +02:08=%1 ist ein Faulpelz +02:08=%1 ist planlos +02:08=%1 überspringt den Zug und schämt sich nicht mal +02:08=%1 ist stinkefaul 02:08=%1 schmiedet einen Plan … 02:08=Das war öde, %1! 02:08=%1 führt etwas im Schilde! -02:08=%1 setzt aus. -02:08=%1 ist ein Drückeberger. -02:08=%1 überdenkt die Situation. -02:08=%1 kann sich nicht entscheiden. +02:08=%1 setzt aus +02:08=%1 ist ein Drückeberger +02:08=%1 überdenkt die Situation +02:08=%1 kann sich nicht entscheiden 02:08=%1 ist unmotiviert 02:08=%1 braucht etwas Motivation 02:08=%1 ist ein Pazifist -02:08=%1 hat eine Verschnaufpause +02:08=%1 macht eine Verschnaufpause 02:08=%1 nimmt sich eine Auszeit 02:08=%1 hat kein Vertrauen in die eigenen Fähigkeiten 02:08=%1 beschließt, nichts zu tun @@ -412,7 +771,7 @@ 02:08=%1 versteckt sich 02:08=%1 verpasst die Gelegenheit 02:08=%1 verschenkt die Chance -02:08=%1 meint Nichtstun sei der beste Plan … +02:08=%1 meint, Nichtstun sei der beste Plan … 02:08=%1 ist ein großes Weichei 02:08=%1 hat Angst … 02:08=%1 ist ein Feigling! @@ -421,12 +780,13 @@ 02:08=%1 denkt über den Sinn des Lebens nach 02:08=%1 war noch nie so Recht in Schuss 02:08=%1 wollte eigentlich niemals zur Armee -02:08=Die Zeit ist um, %1! +02:08=Vergeud nicht unsere Zeit, %1! 02:08=Ich bin von dir enttäuscht, %1 02:08=Los, du kannst es besser, %1! 02:08=%1 hat anscheinend Besseres zu tun 02:08=%1 hat sich fast zu Tode erschrocken 02:08=%1 ist eingeschlafen +02:08=%1 ist starr vor Angst 02:08=%1 ist wohl nur aus Versehen hier 02:08=%1 steckt den Kopf in den Sand 02:08=%1 spielt lieber Skat @@ -437,6 +797,22 @@ 02:08=%1 lässt sich die Sonne auf den Bauch scheinen 02:08=%1 genießt die Stille 02:08=%1 fragt sich, ob es schon Zeit für den Winterschlaf ist +02:08=%1 beobachtet die Situation +02:08=%1 ist müde +02:08=%1 ist der langweiligste Igel der Welt +02:08=%1 schaut sich die schöne Landschaft an +02:08=%1 lässt den Gegner fortfahren +02:08=Der Feind ist wohl der beste Freund von %1 +02:08=%1 braucht Zeit, um den Masterplan zu schmieden +02:08=%1 hebt sich den Zug für später auf +02:08=%1 tut nichts, riskiert nichts +02:08=%1 klebt am Boden fest +02:08=%1 macht eine Pause +02:08=%1 hat keine Lust +02:08=%1 greift mit nichts an +02:08=%1 ist passiv + +02:08=%1 will nicht gestört werden ; Hog (%1) hurts himself only 02:09=%1 sollte lieber zielen üben! @@ -445,6 +821,7 @@ 02:09=%1 lebt gefährlich! 02:09=%1 hat keinen Selbsterhaltungstrieb 02:09=%1 ist durcheinander +02:09=%1 ist nicht ganz richtig im Kopf 02:09=%1 vermasselt’s 02:09=Das hat wohl nicht ganz geklappt, %1 02:09=%1 geht ein wenig zu sorglos mit gefährlichen Waffen um @@ -461,12 +838,12 @@ 02:09=%1 zeigt dem Feind, wozu er fähig ist 02:09=%1 ist nicht perfekt 02:09=Mach dir keine Sorgen, %1, piemand ist nerfekt -02:09=%1 hat das mit Absicht getan +02:09=%1 hat das bestimmt mit Absicht getan 02:09=Ich werd es auch niemandem verraten, mein Ehrenwort, %1! 02:09=Wie peinlich! 02:09=Ich hoffe, dass das niemand gesehen hat, %1 02:09=%1 sollte dringend die Gebrauchsanweisung noch einmal durchlesen -02:09=%1s Schuss ging nach hinten los! +02:09=Der Schuss ging wohl nach hinten los, %1! 02:09=%1 macht sich mit den Waffen vertraut 02:09=%1 schießt ein Eigentor 02:09=%1 kennt keinen Schmerz @@ -491,19 +868,56 @@ 02:09=Keine Sorge, %1, nächstes Mal klappt’s bestimmt! 02:09=%1 ist eine Gefahr für sich selbst 02:09=%1 braucht keine Feinde mehr +02:09=Irgendetwas stimmt nicht mit %1 +02:09=%1 hat technische Schwierigkeiten +02:09=%1 ist betrunken +02:09=%1 sagt »Autsch!« +02:09=%1 macht’s verkehrt +02:09=%1 dachte, die Waffe wäre noch gesichert +02:09=%1 wollte die Waffe reinigen +02:09=Schnell! Holt die Zwangsjacke! +02:09=%1 hat einen Termin mit dem Tod +02:09=%1 testete die Waffe – und sie funktioniert! +02:09=%1 steht kurz vor der Selbstzerstörung +02:09=Aber warum, %1? +02:09=%1 verwechselte eine Granate mit einem Apfel +02:09=%1 ist unangepasst +02:09=%1 hat sich enorm verrechnet +02:09=Etwas lief gewaltig schief für %1 +02:09=%1 hatte einen schrecklichen Unfall + +02:09=%1 hat einen Todeswunsch +02:09=%1 macht Selbstversuche +02:09=%1 braucht noch Übung +02:09=%1 sieht der Gefahr ins Auge +02:09=%1 braucht professionelle Hilfe +02:09=%1 führt einen Krieg gegen sich selbst ; Hog (%1) shot an home run (using the bat and another hog) 02:10=Home Run! 02:10=Ein Vogel, ein Flugzeug, … 02:10=Der verleiht Flügel! -02:10=%1 landet einen Home Run! -02:10=%1 vor, noch ein Tor! -02:10=Ausgezeichnet, %1! -02:10=Bravo, %1! +02:10=Hui! +02:10=Igel können sehr wohl fliegen! +02:10=Bis zur Unendlichkeit und noch viel weiter! +02:10=Autsch! Das tat bestimmt weh +02:10=%1, das ist dein Applaus +02:10=Grandioser Wurf! +02:10=Das ist rekordverdächtig! +02:10=%1 lässt Igel fliegen +02:10=%1 ist Physikstudent +02:10=%1 ist der Meister im Igelball +02:10=%1 haut feste drauf +02:10=%1 spielt Baseball mit Igeln +02:10=%1 bietet kostenlose Flüge an +02:10=Ziel: Der Mond +02:10=%1 spielt mit der Schwerkraft +02:10=%1 ist sehr stolz auf diesen Treffer + 02:10=Sehr sportlich, %1! 02:10=Flieg, Iglein, flieg! -02:10=%1 lässt Igel fliegen -02:10=%1 ist Physikstudent +02:10=Ganz großes Kino! +02:10=Voll auf die Zwölf! ; Hog (%1) has to leave (team is gone) 02:11=%1 muss ins Bett! @@ -520,11 +934,301 @@ 02:11=%1 teleportiert sich in ein Paralleluniversum 02:11=%1 verschwindet 02:11=%1 ist futsch -02:11=%1 hat wohl besseres zu tun +02:11=%1 hat wohl Besseres zu tun 02:11=%1 löst sich in Luft auf 02:11=%1 bringt den Müll raus 02:11=%1 flieht 02:11=%1 braucht Urlaub +02:11=%1 muss noch Hausaufgaben machen +02:11=%1 verdrückt sich +02:11=%1 geht weg von all dem Ärger +02:11=%1 muss jetzt aber wirklich weg +02:11=%1 verwandelt sich in Nichts +02:11=%1 ist zu stolz zum Spielen +02:11=%1 hat gerade einen wichtigen Anruf erhalten +02:11=%1 geht heute früher nach Hause +02:11=%1 hat einen Nebenjob +02:11=%1 ist unterfordert +02:11=%1 ist ein kleiner Feigling +02:11=%1 begeht Fahnenflucht! +02:11=%1 läuft aus Angst davon +02:11=%1 ignoriert die Pflichten eines Soldaten +02:11=%1 zettelt eine Meuterei an + +02:11=%1 ist verschwunden + +; Hog (%1) was poisoned +02:12=%1 fühlt sich krank +02:12=%1 sieht gar nicht gut aus +02:12=%1 braucht einen Arzt +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 hat Bauchschmerzen +02:12=%1 sieht nicht gerade gesund aus +02:12=%1 braucht ein Lazarett +02:12=%1 stinkt fürchterlich +02:12=Geht es dir gut, %1? +02:12=%1 leidet unter der Gesundheitsverlustkrankheit +02:12=%1 hat das Gegengift vergessen +02:12=%1 hat Fieber +02:12=%1 sollte nicht diesen üblen Gestank eingeatmet haben +02:12=%1 hätte eine Gasmaske gebrauchen können +02:12=%1 braucht Medizin +02:12=%1 wurde infiziert +02:12=%1 sieht fürchterlich aus +02:12=%1 hat keine Krankenversicherung +02:12=%1 muss ins Krankenhaus +02:12=%1 wurde krank gemacht +02:12=%1 braucht Hustensaft +02:12=%1 versucht, die Krankheit mit Gedanken zu bekämpfen +02:12=Das Gift fließt durch %1 +02:12=Das Gift schwächt %1 +02:12=%1 braucht Erste Hilfe +02:12=%1 braucht Hilfe, und zwar schnell +02:12=Halt dich lieber von %1 fern +02:12=%1 färbt sich ungesund grün +02:12=%1 fühlt das Gift +02:12=%1 fühlt sich schwächer und schwächer +02:12=%1 sollte heute nicht zur Schule gehen +02:12=%1 wurde wohl nie geimpft +02:12=%1 braucht bald Erste Hilfe +02:12=%1 sollte eine Gesundheitskiste aufheben +02:12=%1 wurde von einer Kobra geküsst +02:11=%1 hat ein geschwächtes Immunsystem +02:11=%1 spielte zu lange mit kranken Freunden +02:11=%1 wurde von Bakterien infiziert +02:11=%1 hat einen inneren Kampf gegen einen Virus + +02:12=%1 fallen die Stacheln aus +02:12=%1 meldet sich krank +02:12=%1 muss niesen +02:12=Der Countdown läuft für %1 +02:12=Eine Runde Mitleid für %1 +02:12=Steck uns bloß nicht an, %1! + +; Hog (%1) was resurrected by the Resurrector utility +02:13=%1 wurde wiederbelebt +02:13=%1 wurde zurück IN die Hölle gebracht +02:13=%1 erhält eine zweite Chance +02:13=%1 ist wieder lebendig +02:13=%1 kehrt von den Toten zurück +02:13=%1 ist unter den lebenden Toten +02:13=%1 wurde wiedergeboren +02:13=%1 fühlt sich lebendig wie noch nie +02:13=%1 hat den Tod besiegt +02:13=%1 lacht den Tod aus +02:13=%1 bekommt einen neuen Lebensversuch +02:13=%1 ist wieder quieklebendig +02:13=%1 wurde ins Unleben gerufen +02:13=%1 ist wieder unter uns +02:13=%1 ist überrascht, wieder am Leben zu sein +02:13=%1 fühlt sich sehr erholt +02:13=%1 hatte gutes Karma +02:13=%1 steht von den Toten auf, um dem Feind das Fürchten zu lehren +02:13=%1 ist auferstanden von den Toten +02:13=%1 klettert aus dem Grab +02:13=Vergeude nicht deine zweite Chance, %1 +02:13=%1 wird noch gebraucht +02:13=%1 war zu wichtig, um zu sterben +02:13=%1 ist voller Leben +02:13=%1 fühlt die Kraft des Lebens +02:13=%1 wurde aus dem Himmel geworfen +02:13=%1 ist der Auserwählte +02:13=%1 wusste, dass die Religion der Wiedergeburt Recht hatte +02:13=%1 wusste, dass dieser Tag kommen würde +02:13=Vorsicht, %1 ist wieder da! +02:13=%1 wird Probleme machen … und das schon wieder! +02:13=%1 ist dein schlimmster Alptraum +02:13=Und ihr dachtet, ihr könntet %1 so leicht besiegen? +02:13=%1 ist stärker als der Tod +02:13=Der Tod hat für %1 keine Bedeutung +02:13=%1 wird nicht vergeben +02:13=%1 lebt erneut +02:13=%1 wurde von schwarzer Magie wiederbelebt +02:13=%1 ist bereit, wieder zu dienen +02:13=%1 erhält ein Extraleben +02:13=%1 war noch nicht bereit zum Sterben +02:13=%1 muss wieder dienen +02:13=Die Zeit war noch nicht reif für %1 +02:13=%1 steigt aus dem Grab +02:13=%1 schloss einen Pakt mit einem Totenbeschwörer +02:13=%1 ist bereit, erneut zu sterben +02:13=Leben, sterben, und noch mal von vorne +02:13=%1 will doch noch leben +02:13=%1 wollte den Kampf nicht verpassen + +02:13=%1 hat ausgeschlafen +02:13=%1 will einfach nicht gehen +02:13=%1 wird man nicht los +02:13=%1 dreht eine Ehrenrunde +02:13=%1 schlägt dem Tod ein Schnippchen +02:13=%1 versucht es noch mal +02:13=%1 ist ein Steh-auf-Igel +02:13=%1 hatte sich nur tot gestellt +02:13=%1 hat noch nicht genug +02:13=%1 hat die eigene Beerdigung verpasst +02:13=%1 hält den Tod für überbewertet +02:13=Als wäre %1 nie tot gewesen … +02:13=Comeback für %1 +02:13=Oh Schreck! %1 ist ein Zombie! + +; Hog (%1) explodes after an kamikaze attack +02:14=%1 stirbt in Ehre +02:14=%1 stirbt den Tod eines Mutigen +02:14=Erinnert euch an %1 +02:14=Sag Lebewohl zum mutigen Krieger %1 +02:14=%1 kämpft mit Ehre +02:14=%1 war ehrenvoll +02:14=%1 war in Rage +02:14=%1 explodierte aus Wut +02:14=%1 löst die taktische Selbstzerstörung aus +02:14=Wie mutig von %1! +02:14=%1 ist ein wahrer Held +02:14=%1, Soldat des Mutes +02:14=Wir werden %1 nie vergessen +02:14=%1 wird in unseren Herzen bleiben +02:14=%1 war erfüllt von brennendem Zorn +02:14=%1 stirbt als Kriegsheld +02:14=%1 ist ein Fan von Independence Day +02:14=%1 bringt das größte Opfer +02:14=%1 hat eine Einmalwaffe benutzt +02:14=Was für ein Stunt, %1! +02:14=%1 macht aus dem Krieg eine Kunst +02:14=Ihr solltet euch nicht mit %1 angelegt haben +02:14=%1 spielt mit dem Feuer +02:14=%1 schlägt für ein letztes Mal zu +02:14=%1 schlägt mächtig zu +02:14=%1 war ein fanatischer Anhänger des Todeskults +02:14=%1 bringt Tod und Zerstörung +02:14=%1 ist für immer fort +02:14=%1 hatte keine Ängste +02:14=%1 stirbt fürs Vaterland +02:14=%1 ist ein Kamikazepilot +02:14=%1 tat das nur, um auf die Titelseite zu kommen +02:14=%1 wird weltberühmt +02:14=%1 hatte nichts zu verlieren +02:14=%1 gab alles! +02:14=%1 wendete die ultimative Kampfkunst an +02:14=%1 wollte nicht, dass die Feinde in der Unterwelt alleine sind +02:14=%1 setzt den Kampf in der Unterwelt fort +02:14=%1 wollte auf besonders eindrucksvolle Weise sterben +02:14=%1 wäre ohnehin gestorben + +02:14=%1 ist der Kragen geplatzt +02:14=%1 macht einen stilvollen Abgang +02:14=%1 macht keine halben Sachen +02:14=Wer wird denn gleich in die Luft gehen, %1? +02:14=Raus mit Applaus: %1 +02:14=%1 hat sich selbst geopfert + +; Hog (%1) returned from time-travel with the time box +; These texts are intentionally kept simple and clear to not confuse the player +02:15=%1 kehrt von einer Zeitreise zurück +02:15=Zeitreisender %1 kehrt zurück +02:15=%1 verlässt den Zeitkasten +02:15=Der Zeitkasten von %1 ist wieder da +02:15=%1 ist wieder in unserer Zeit +02:15=Willkommen zurück in unserer Zeit, %1! +02:15=%1 kommt in der Gegenwart an + +; Hog (%1) runs out of turn time (not shown in infinite attack mode) +02:16=%1 war zu langsam +02:16=%1 hat vergessen, ein Auge auf die Zeit zu werfen +02:16=Selbst Schnecken sind schneller als %1 +02:16=%1 ist eingeschlafen +02:16=%1 hat den Angriff vergessen +02:16=%1 war kurz davor, den perfekten Schuss abzugeben. Ich schwör! +02:16=%1 hat kein Zeitgefühl +02:16=%1 spielt in Zeitlupe +02:16=%1 brauchte mehr Zeit +02:16=%1 hätte ein paar Extrasekunden gebrauchen können +02:16=Die Zeit ist um, %1! +02:16=%1 hat soeben eine großartige Gelegenheit vergeudet +02:16=%1 erhält keine Bonuspunkte +02:16=%1 erhält die Teilnehmerurkunde +02:16=%1 würde keine Medaillie in der Olympiade gewinnen +02:16=Denk schneller, %1! +02:16=Du enttäuschst mich, %1! +02:16=Für %1 ist Zeit relativ +02:16=%1 glaubt nicht an das Konzept der Zeit +02:16=Vergeude nicht unsere Zeit, %1! +02:16=Der Nächste, bitte! +02:16=%1 ist unerträglich langsam +02:16=Jemand sollte %1 aufwecken +02:16=%1 hat vergessen, den Wecker zu stellen +02:16=Für %1 ist die Zeit abgelaufen +02:16=%1 lebt das langsame Leben +02:16=Sei beim nächsten Mal etwas schneller, %1! +02:16=Dein Zug dauert nicht ewig, %1! +02:16=%1 hatte keine Uhr dabei +02:16=%1 sollte etwas Zeit mitgebracht haben +02:16=%1 ist ein Zeitverschwender +02:16=Wer schläft, der verliert, %1! +02:16=%1 hat den Startschuss verpasst +02:16=Stricken ist wohl eine passendere Betätigung für %1 +02:16=%1 spielt lieber Schach +02:16=%1 dachte an Blumen +02:16=%1 wird leicht von schönen Dingen abgelenkt +02:16=Haben wir mal wieder die Zeit vergessen, %1? +02:16=Weitergehen! Hier gibt es nichts zu sehen! +02:16=%1 wusste nicht, dass es eine Zeitbegrenzung gibt +02:16=%1 ist überhitzt +02:16=%1 dachte nicht mal daran, anzugreifen +02:16=%1 verliert im Wettlauf gegen die Zeit +02:16=%1 hat sich zu lange vorbereitet + +02:16=%1 findet den Abzug nicht +02:16=%1 fühlt sich nicht angesprochen +02:16=%1 schlummert selig +02:16=%1 ist im Land der Träume +02:16=%1 hält den Betrieb auf +02:16=%1 lehnt Fristen strikt ab +02:16=%1 war noch nie gut unter Zeitdruck +02:16=%1 denkt zu viel +02:16=%1 macht Yoga +02:16=%1 vergisst die Zeit + +; King (%1) has died +02:17=%1 ist tot! Lang lebe %1! +02:17=Königliche Tragödie: %1 tot aufgefunden +02:17=%1 ist nicht mehr bei uns +02:17=Unser geschätzter König %1 ist von uns gegangen +02:17=%1 war eh nur ein Tyrann +02:17=Endlich sind wir %1 los +02:17=Die Tage von %1 als Führer sind gezählt +02:17=Die königliche Tradition von %1 findet ein Ende +02:17=%1 wurde gestürzt! +02:17=Ohne die Führung von %1 ist das Team verloren +02:17=Der großartige Führer %1 sieht auf einmal nicht mehr so großartig aus +02:17=Das Königreich weint für %1 +02:17=%1 starb wie ein richtiger König +02:17=%1 ist ein toter Anführer +02:17=%1 ist ein Ex-König +02:17=%1 wurde des Thrones beraubt +02:17=Die Herrschaft von %1 ist vorüber +02:17=%1 stirbt, und ein ganzes Königreich ebenso +02:17=%1 war ein schwacher König +02:17=Es gibt viel bessere Könige als %1 +02:17=Der Krieg verlangt %1 als Opfer +02:17=%1 hat’s verdient +02:17=%1 hat’s zerrissen +02:17=%1 wurde entmachtet +02:17=%1 stirbt aus königlichen Gründen +02:17=%1 lebte ein gefährliches Leben +02:17=%1 hat den Mob verärgert +02:17=%1 hatte zu viele Feinde +02:17=Und ihr habt %1 einen König genannt? +02:17=%1 hat es nicht verdient, ein König zu sein +02:17=Nieder mit %1! +02:17=Und %1 schimpfte sich einen König? +02:17=%1 war des Königstitels nicht würdig +02:17=%1 spielt »Der sterbende Schwan« +02:17=%1 stirbt auf dramatische Weise +02:17=Das Königreich von %1 wurde besiegt +02:17=%1 wurde schachmatt gesetzt ; Weapon Categories 03:00=Zeitzünder-Granate @@ -588,6 +1292,7 @@ 03:56=Bitte ge- oder missbrauchen 03:57=Werkzeug 03:58=Schwebende Annäherungsmine +03:59=Schwimmende Bombe ; Weapon Descriptions (use | as line breaks) 04:00=Greife deine Feinde mit einfachen Granaten an.|Der Zeitzünder steuert den Explosionszeitpunkt.|1–5: Zeitzünder einstellen|Genaues Zielen + 1-5: Sprungkraft einstellen|Angriff: Halten, um mit mehr Kraft zu werfen @@ -597,7 +1302,7 @@ 04:04=Greife deine Feinde mit einer Schrotflinte und|zwei Schüssen an. Durch die Streuung musst du|nicht genau zielen, um trotzdem zu treffen.|Angriff: Feuern (mehrfach) 04:05=Ab in den Untergrund! Benutze den Presslufthammer,|um einen Schacht nach unten zu graben und so|andere Gebiete zu erreichen.|Angriff: Presslufthammer ein- oder ausschalten|Links/Rechts: Schräg bohren 04:06=Gelangweilt? Keine Optionen? Munition sparen?|Kein Problem! Passe einfach diese Runde, Feigling!|Angriff: Runde ohne Angriff aussetzen -04:07=Überbrücke große Distanzen mit gezielt abgefeuerten|Seilschüssen. Benutze deine Bewegungsenergie, um|andere Igel zu schubsen oder wirf vom Seil aus Granaten|und ähnliche Waffen.|Angriff: Seil abfeuern oder lösen|Hoch/Runter: Seil verkürzen/verlängern|Weitsprung: Waffe benutzen +04:07=Überbrücke große Distanzen mit gezielt abgefeuerten|Seilschüssen. Benutze deine Bewegungsenergie, um|andere Igel zu schubsen oder wirf vom Seil aus Granaten|und ähnliche Waffen.|Angriff: Seil abfeuern oder lösen|Links/Rechts/Hoch/Runter: Seil schwingen/verkürzen/verlängern|Weitsprung: Waffe benutzen 04:08=Halte dir deine Feinde fern oder blockiere sie,|indem du ihnen Minen vor die Beine wirfst.|Sei aber schnell genug, damit du sie nicht noch|selbst auslöst!|Angriff: Mine legen|Genaues Zielen + 1-5: Sprungkraft einstellen 04:09=Nicht so ganz zielsicher? Versuche es mit der|Desert Eagle, denn diese bietet dir vier Schuss.|Angriff: Feuern (mehrfach) 04:10=Rohe Gewalt ist immer eine Lösung. Lege einfach|diesen klassischen Sprengsatz neben deinen Feinden|ab und mach dich aus dem Staub.|Angriff: Dynamitstange legen @@ -615,7 +1320,7 @@ 04:22=Nicht nur etwas für Indiana Jones! Die Peitsche|eignet sich besonders gut, um ungezogene Igel|eine Klippe hinunter zu treiben.|Angriff: Alles vor dem Igel schlagen 04:23=Wenn man nichts mehr zu verlieren hat …|Opfere deinen Igel, indem du ihn in eine|festgelegte Richtung losstürmen lässt.|Er wird alles auf dem Weg treffen und am|Ende selbst explodieren.|Angriff: Tödlichen Angriff starten 04:24=Alles Gute! Schick diesen Kuchen auf den Weg,|damit er deinen lieben Feinden eine explosive|Party beschert. Die Torte überwindet fast jedes|Terrain, verliert dabei aber an Laufzeit.|Angriff: Torte losschicken / explodieren lassen -04:25=Benutze diese Verkleidung, um einen Feind blind|vor Liebe in deine Richtung (und damit in einen|Abgrund oder ähnliches) springen zu lassen.|Angriff: Verkleiden und verführen +04:25=Mit dieser Verkleidung wird dein Igel umwiderstehlich|attraktiv und lässt Igel in der Nähe blind vor Liebe|zu ihm (und einem Abgrund) springen. Die Verführung ist|so herzerwärmend, dass sie sogar das Eis eingefrorener|Igel bricht.|Angriff: Die unwiderstehliche Verführung einsetzen 04:26=Wirf diese saftige (und sprunghafte) Wassermelone auf|deine Feinde. Sobald die Zeit abgelaufen ist, wird|sie in einzelne und explosive Stücke zerspringen.|1-5: Zeitzünder einstellen|Angriff: Halten, um mit mehr Kraft zu werfen 04:27=Entfessle das Höllenfeuer und umgebe deine|Widersacher damit, indem du diesen teuflischen|Sprengsatz gegen sie einsetzt. Komm ihm aber|nicht zu nahe, denn die Flammen könnten|länger bestehen bleiben.|Angriff: Halten, um mit mehr Kraft zu werfen 04:28=Kurz nach dem Start wird diese Rakete beginnen,|sich durch soliden Grund zu graben. Sobald sie|wieder austritt oder der Zeitzünder abläuft,|wird sie explodieren.|Angriff: Halten, um mit mehr Kraft zu feuern @@ -630,7 +1335,7 @@ 04:37=Fürchte nicht das Tageslicht! Die Wirkung hält|nur eine Runde an, aber sie erlaubt es deinem|Igel, 80% des Schadens, den andere Igel während|seines Zuges erleiden, als Leben zu absorbieren.|Angriff: Aktivieren 04:38=Das Scharfschützengewehr kann die vernichtendste|Waffe im gesamten Arsenal sein, allerdings ist|sie auf kurze Distanz sehr ineffektiv. Der|verursachte Schaden nimmt mit der Distanz zu.|Das Zielen ist schwierig, und du musst deine|Stellung halten, sobald die Waffe aktiviert wurde.|Angriff: Zielvisier aktivieren, dann feuern (zwei mal)|Links/Rechts: Umdrehen (zwischen Schüssen) 04:39=Fliege mit der fliegenden Untertasse in andere|Teile der Karte. Sie ist schwer zu beherrschen,|bringt dich aber an so gut wie jeden Ort.|Angriff: Aktivieren/Deaktivieren|Hoch/Links/Rechts: Einmalig in eine Richtung beschleunigen|Weitsprung: Waffe fallen lassen|Genaues Zielen + Weitsprung: Waffe in Zielrichtung feuern|Genaues Zielen + Hoch/Runter: Zielen -04:40=Entzünde einen Teil der Landschaft oder auch etwas|mehr mit dieser (schon bald) brennenden Flüssigkeit.|Angriff: Halten, um mit mehr Kraft zu werfen +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 @@ -644,21 +1349,22 @@ 04:51=Wirf mit Dreck um dich! Der Schlammball|schubst Igel und andere Dinge weg,|aber richtet keinen Schaden an.|Angriff: Halten, um mit mehr Kraft zu werfen 04:52=NICHT IN VERWENDUNG 04:53=Unternimm eine Reise durch Zeit und Raum,|während du deine Kameraden alleine am Schlachtfeld zurücklässt.|Sei darauf vorbereitet, jederzeit wieder zurückzukommen,|oder auf Sudden Death, oder wenn sie alle besiegt wurden.|Haftungsausschluss. Nicht funktionstüchtig, wenn in Sudden Death,|wenn du alleine bist – oder der König.|Angriff: Aktivieren -04:54=Versprühe einen Strahl klebriger Flocken.|Baue Brücken, begrabe Gegner, versiegle Tunnel.|Pass auf, dass du selbst nichts abbekommst!|Angriff: Aktivieren|Hoch/Runter: Beim Feuern zielen|Links/Rechts: Schussweite einstellen +04:54=Versprühe einen Strahl klebriger Flocken.|Baue Brücken, begrabe Gegner, versiegle Tunnel.|Pass auf, dass du selbst nichts abbekommst!|Angriff: Aktivieren/Deaktivieren|Hoch/Runter: Beim Feuern zielen|Links/Rechts: Schussweite einstellen 04:55=Hol die Eiszeit zurück! Friere Igel ein,|mach den Boden rutschig oder|rette dich selbst vor dem Ertrinken,|indem du das Wasser einfrierst.|Angriff: Aktivieren/Deaktivieren|Hoch/Runter: Beim Feuern zielen -04:56=Du kannst zwei Hackebeile auf deinen Feind schleudern,|Passagen und Tunnel blockieren, und sie sogar zum Klettern benutzen!|Sei vorsichtig! Es ist gefährlich, mit Messern zu spielen.|Angriff: Gedrückt halten, um mit mehr Schwung zu werfen (zwei mal) +04:56=Du kannst zwei Hackebeile auf deinen Feind schleudern,|Passagen und Tunnel blockieren, und sie sogar zum Klettern|benutzen! Der Schaden erhöht sich mit der Geschwindigkeit.|Aber sei vorsichtig! Es ist gefährlich, mit Messern zu spielen.|Angriff: Gedrückt halten, um mit mehr Schwung zu werfen (zwei mal) 04:57=Bau einen SEHR elastischen Balken aus Gummi,|von dem Igel und andere Sachen abprallen,|ohne Fallschaden zu nehmen.|Links/Rechts: Ausrichtung des Gummis wählen|Cursor: Gummi platzieren 04:58=Diese Annäherungsmine wird frei in der Luft schweben und|verfolgt törichte Igel, die dumm genug sind, ihr zu nahe zu|kommen. Allerdings ist ihre Explosion schwächer als|die der Landmine.|Angriff: Halten, um mit mehr Kraft zu werfen +04:59=Gib diesen dreckigen Igeln ein Bad! Dieses süße|kleine Quietscheentchen kann auf Wasser schwimmen|und folgt dabei dem Wind. Sie explodiert bei Kollision|mit Land, also stell sicher, sie von einer Klippe oder|einem anderem sicheren Ort fallen zu lassen.|Angriff: Quietscheentschen fallen lassen ; Game goal strings 05:00=Spielmodifikationen -05:01=Die folgenden Regeln gelten -05:02=Festungen: Verteidige deine Festung; vertreibe deine Feinde! -05:03=Niedrige Schwerkraft: Pass auf, wo du hintrittst +05:01=Die folgenden Regeln gelten: +05:02=König platzieren: Wähle einen sicheren Startpunkt für deinen König +05:03=Niedrige Schwerkraft: Pass auf, wo du hintrittst! 05:04=Unverwundbarkeit: Igel sind (so gut wie) unkaputtbar 05:05=Vampirismus: Igel heilen sich um 80% von dem von ihnen verursachten Schaden 05:06=Karma: Igel leiden an dem von ihnen verursachten Schaden -05:07=Schützt den König: Lass deinen König nicht sterben!|König platzieren: Wähle einen sicheren Startpunkt für deinen König +05:07=Schützt den König: Lass deinen König nicht sterben! 05:08=Igel platzieren: Wähle vor dem Spielstart die Positionen deiner Igel 05:09=Artillerie: Deine Igel können nicht laufen 05:10=Unzerstörbares Terrain: Die meisten Waffen zerstören das Gelände nicht @@ -667,9 +1373,10 @@ 05:13=Minenzünder: Minen explodieren sofort 05:14=Minenzünder: Minen explodieren nach 0–5 Sekunden 05:15=Prozentualer Schaden: Alle Waffen verursachen %1 % Schaden -05:16=Alle Igel werden am Ende der Zuges bis zum Anfangswert geheilt -05:17=Computergesteuerte Igel erscheinen nach dem Tod wieder -05:18=Unbegrenzte Attacken -05:19=Waffen werden am Ende jedes Zuges zurückgesetzt -05:20=Igel teilen Waffen nicht untereinander -05:21=Tag Team: Teams gleicher Farbe kommen nacheinander dran und teilen sich ihre Zugzeit. +05:16=Sanitäter: Alle Igel werden am Ende der Zuges bis zum Anfangswert geheilt +05:17=KI-Wiederbelebung: Computergesteuerte Igel erscheinen nach dem Tod wieder +05:18=Unbegrenzte Attacken: Angriffe beenden deinen Zug nicht +05:19=Gleichbleibende Bewaffnung: Waffen werden am Ende jedes Zuges zurückgesetzt +05:20=Igelwaffen: Igel teilen Waffen nicht untereinander +05:21=Staffellauf: Teams gleicher Farbe kommen nacheinander dran|Gemeinsame Zeit: Teams gleicher Farbe teilen sich ihre Zugzeit +05:22=Starker Wind: Wind beeinflusst fast alles diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/el.txt --- a/share/hedgewars/Data/Locale/el.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/el.txt Sun Dec 17 00:09:24 2017 +0100 @@ -51,7 +51,7 @@ 00:48=Σφυρί 00:49=Νεκρανάσταση -01:00=Ας Πολεμήσουμε! +; 01:00=Loading … 01:01=Ισόπαλος Γύρος 01:02=Οι %1 Νικούν! 01:03=Ένταση Ήχου %1% @@ -223,11 +223,11 @@ 02:02=Μην φοβάσαι, να είσαι ατρόμητος! 02:02=Να είσαι γενναίος και να κατακτάς! -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=Οι %1 Νικούν! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Ισόπαλος Γύρος ; New health crate 02:05=Εισερχόμενη βοήθεια! @@ -487,12 +487,12 @@ ; Game goal strings 05:00=Κανόνες Παιχνιδιού 05:01=Ισχύουν οι ακόλουθοι κανόνες : -05:02=Φρούρια : Υπερασπιστείτε το φρούριό σας, συντρίψτε τους εχθρούς σας! +05:02=Τοποθετήστε το βασιλιά : Διαλέξτε ένα προστατευόμενο σημείο εκκίνησης για το βασιλιά σας. 05:03=Μικροβαρύτητα : Προσέξτε πού πατάτε! 05:04=Ασπίδα: Οι σκαντζόχοιροι είναι (σχεδόν) άτρωτοι. 05:05=Βαμπιρισμός : Οι σκαντζόχοιροι θα γιατρεύονται από την προκαλούμενη ζημιά. 05:06=Μοίρα : Οι σκαντζόχοιροι θα πλήττονται εξίσου για την προκαλούμενη ζημιά. -05:07=Προστασία του Βασιλιά : Μην αφήσετε τον βασιλιά σας να πεθάνει!|Τοποθετήστε το βασιλιά : Διαλέξτε ένα προστατευόμενο σημείο εκκίνησης για το βασιλιά σας. +05:07=Προστασία του Βασιλιά : Μην αφήσετε τον βασιλιά σας να πεθάνει! 05:08=Τοποθέτηση Σκαντζόχοιρων : Τοποθετήστε τους σκαντζόχοιρους πριν ξεκινήσει το παιχνίδι. 05:09=Πυροβολικό: Οι σκαντζόχοιροι δεν μπορούν να προχωρήσουν για να αλλάξουν θέση. 05:10=Άφθαρτο Έδαφος : Τα περισσότερα όπλα δεν θα καταστρέψουν το έδαφος. diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/en.txt --- a/share/hedgewars/Data/Locale/en.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/en.txt Sun Dec 17 00:09:24 2017 +0100 @@ -60,8 +60,9 @@ 00:56=Cleaver 00:57=Rubber 00:58=Air Mine +00:59=Rubber Duck -01:00=Let's fight! +01:00=Loading … 01:01=Round draw 01:02=%1 wins! 01:03=Volume %1% @@ -87,9 +88,13 @@ 01:23=Auto Camera Off 01:24=Auto Camera On 01:25=Press the target button to mark the target +01:26=The utility is unavailable in Sudden Death +; E.g. “+25” when gaining health from crate or vampirism +01:27=+%1 +01:28=Empty! ; Event messages -; Hog (%1) died +; Normal hog (%1) died (0 health) 02:00=%1 has kicked the bucket! 02:00=%1 has seen the light! 02:00=%1 never saw that coming! @@ -145,8 +150,50 @@ 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? +02:00=%1 won't get up anymore +02:00=%1 didn't make it +02:00=%1 just pretends to be dead +02:00=%1 has seen better days +02:00=%1 sees dead hedgehogs +02:00=%1 is worm fodder +02:00=%1 has bit the dust +02:00=Game over, %1! +02:00=It's over for %1 +02:00=%1 will return +02:00=%1 needs some rest +02:00=%1 wasn't hardcore enough +02:00=Good bye, %1! +02:00=%1 is dead +02:00=%1 goes to the Hedgehog Heaven +02:00=%1 meets the Great White Hedgehog in the sky +02:00=%1 has been eliminated +02:00=You will be avenged, %1! +02:00=%1 won't feel any pain +02:00=%1 was just cannon fodder +02:00=%1 waits for the resurrection +02:00=%1 has an after-death experience +02:00=%1 lost in the Game of Life +02:00=%1 has been destroyed +02:00=%1 goes into a very long hibernation +02:00=No! Why did %1 have to die? +02:00=Oh no, %1! You had your whole life ahead of you … +02:00=%1 doesn't need to be afraid of death +02:00=%1 has been freed from the horrors of war +02:00=%1 assumes room temperature +02:00=%1 comes to a sticky end +02:00=%1 is dead as a dodo +02:00=%1 is dead as a doornail +02:00=%1 dropped dead +02:00=%1 is six feet under +02:00=%1 lets natural selection take its course +02:00=%1 says no to life +02:00=%1 went to the underworld +02:00=%1 forgot how to breathe +02:00=%1 tripped fatally +02:00=%1 faints forever +02:00=%1 reached the final destination -; Hog (%1) drowned +; Normal hog (%1) drowned 02:01=%1 plays submarine! 02:01=%1 mimics the Titanic! 02:01=%1 swims like a stone! @@ -195,6 +242,15 @@ 02:01=%1 is wet wet wet 02:01=%1 gets his quills wet 02:01=It's Davy Jones' locker for %1 +02:01=%1 explores the Sea +02:01=Hedgehogs have quills, not gills, %1! +02:01=%1 is swimming upside down +02:01=%1 needs a refreshing drink +02:01=%1 retreats to the secret underwater base +02:01=%1 always wanted to try diving +02:01=%1 mistook the sea for a bath +02:01=%1 went to its evolutional roots +02:01=%1 prefers water to air ; Round starts 02:02=Let's fight! @@ -217,7 +273,7 @@ 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=Good luck, and have fun! 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 @@ -251,11 +307,62 @@ 02:02=Have no fear! 02:02=Be brave and conquer -; Round ends (win; unused atm) -02:03=... +; Round ends and a team/clan (%1) wins +02:03=%1 wins! +02:03=%1 is the champion! +02:03=%1 is the winner! +02:03=%1 showed everyone how to win +02:03=%1 is the best of the best +02:03=%1 does the victory dance +02:03=Victory for %1! +02:03=And the winner is %1 +02:03=Congratulations, %1 wins! +02:03=Bow down to %1 +02:03=%1 has mastered the game +02:03=%1 won the battle +02:03=%1 made an amazing victory +02:03=%1 is the number one! +02:03=Bravo, bravo, %1! +02:03=%1 is the best +02:03=Applause, applause, %1! +02:03=What an exciting victory, %1! +02:03=%1 destroyed the enemy +02:03=%1 has conquered the enemy +02:03=%1 has crushed the enemy +02:03=Everyone cheers for %1 +02:03=%1 chose victory over death +02:03=%1 gets a star on Victory Road +02:03=%1 drinks the victory juice +02:03=Triumph for %1 +02:03=%1 takes a sip from the sweet victory sauce +02:03=%1 masterfully won this round +02:03=%1 is the victor +02:03=%1 wins with style +02:03=Mission accomplished, %1 won +02:03=%1 earns the victory medal +02:03=%1 rules the game +02:03=Who's the winner? %1 is the winner! +02:03=%1 is having a party today +02:03=%1 demonstrated a winning strategy -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Round draw +02:04=It's a draw! +02:04=Nobody wins! Round draw +02:04=Unbelievable, the round ended in a draw +02:04=Round draw, how boring +02:04=Impossible! The round ends in a draw +02:04=Round draw! Now we have to start again … +02:04=Game over! Nobody's a winner today +02:04=Round draw, so disappointing! +02:04=Nobody wins, how boring! +02:04=Everyone's a loser today +02:04=A draw! World balance has been sustained +02:04=A draw. Everyone fought bravely to the end +02:04=Hey! Where is the winner?! +02:04=Where have all the hedgehogs gone? +02:04=Boring! Give me my tickets back +02:04=Everyone is dead. Good! ; New health crate 02:05=Incoming aid! @@ -266,7 +373,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 Hi-Potion! Whoops, wrong game 02:05=A pick-me-up! 02:05=Grab it 02:05=A healthy snack @@ -274,6 +381,102 @@ 02:05=Correct dosage: as many as you can find! 02:05=Urgent delivery 02:05=Supplies! +02:05=A first aid kit! +02:05=Hope incoming! +02:05=Delivery from the fountain of youth +02:05=Life in boxes +02:05=Help in sight! +02:05=This makes you feel well again +02:05=Pitch up the sickbay! +02:05=Finally there is help! +02:05=Increase your life expectancy +02:05=First aid! +02:05=Health maker! +02:05=Crate of life +02:05=Increase your life energy +02:05=Did someone say “Achoo!”? +02:05=With this you will feel as fit as a fiddle +02:05=Health and antidote! +02:05=Contains: Band aids and antidote +02:05=This looks healthy! +02:05=Cure the sick! +02:05=This is good for you +02:05=Someone really likes you +02:05=Grab it before the enemy does! +02:05=Gain some extra health +02:05=Help for sick hedgehogs +02:05=Does someone need help down there? +02:05=Everything a wounded hedgehog needs +02:05=Badly wounded? We can fix this +02:05=Get first aid before it's too late! +02:05=Bread rations! +02:05=Restore your health! +02:05=This will be helpful +02:05=A doctor's box! +02:05=Get instant health +02:05=Health booster incoming! +02:05=Boost your health +02:05=Fight the sickness +02:05=Heal yourself with this box! +02:05=Bless you! +02:05=Recommended by 9 out of 10 doctors +02:05=Did somebody call a doctor? +02:05=The friend of wounded hedgehogs +02:05=Help for sick hedgehogs +02:05=Helper in box form +02:05=Heals your wounds +02:05=Live a little longer +02:05=This box will help you +02:05=Need some help? +02:05=Here, let me help you +02:05=Get it before it's too late! +02:05=Low on health? We got you covered! +02:05=1 health left? No problem! +02:05=From almost dead to great health in a blink of an eye! +02:05=The most efficient method of healing +02:05=The gods are favourable +02:05=Your prayers have been heard! +02:05=Today is your lucky day! +02:05=Extra health! +02:05=Health bonus! +02:05=The healthier, the better +02:05=Emergency drop! +02:05=Emergency delivery! +02:05=Emergency supplies! +02:05=Strong hedgehogs are good hedgehogs +02:05=Don't forget to take your vitamins! +02:05=Somebody must have forgotten his daily pills +02:05=Adds to your total health +02:05=We got you covered! +02:05=Hurt hedgehogs have help +02:05=Help for the wounded +02:05=Let's increase your toughness +02:05=The aid to victory! +02:05=Get first aid before you make your last breath +02:05=Escape your death! +02:05=No, we won't let you die just today +02:05=Put an end to the suffering! +02:05=Health insurance finally pays off! +02:05=Free healthcare! +02:05=Take this medicine +02:05=Life insurance for soldiers +02:05=Dr Health Crate arrived! +02:05=Satisfy your hunger for health +02:05=Need. More. Health. +02:05=Satisfaction guaranteed! +02:05=Painkillers for killers +02:05=Just when you thought you defeated the enemy … +02:05=Don't hestitate to take it. You might die +02:05=Take me! +02:05=Guardian angels send their regards +02:05=A gift from the gods +02:05=Mmmm … Tasty bandages +02:05=A suspicious box with healing powers … +02:05=It's a box with health inside! +02:05=You can't get healthy enough +02:05=Healthy enough? Still not a problem +02:05=The secret of immortality +02:05=Almost like an extra life ; New ammo crate 02:06=More weapons! @@ -299,6 +502,129 @@ 02:06=Don't let the enemy grab that! 02:06=Shiny new toys! 02:06=A mysterious box! +02:06=The box of Pandora! +02:06=Who wants to play with me? +02:06=With this you'll give your enemies hell +02:06=Let's get the party started! +02:06=This looks like great fun +02:06=It's like a children's birthday +02:06=Guns, lots of guns +02:06=You'll never get enough of these +02:06=More weapons to make the game more exciting +02:06=Not for wimps +02:06=Warning: Higly explosive +02:06=For those gun nuts +02:06=This could be the match-winning weapon! +02:06=Explosive fun! +02:06=Who has the biggest armory in the battlefield? +02:06=Intimidate your enemies! +02:06=Ammo crate incoming! +02:06=Nice surprise! +02:06=New toys, new toys! +02:06=A box of surprises! +02:06=Explosive surprises! +02:06=Collect this for an advantage +02:06=Collect me! I'm a crate! +02:06=This better contains some big guns +02:06=Who will be the first one to get it? +02:06=Extend your armory +02:06=Restock your ammunition +02:06=Weather forecast: Cloudy with a chance of ammo drops +02:06=Give your enemies an explosive surprise +02:06=The early hedgehog gets the weapon +02:06=Soldiers! Seize this crate! +02:06=Offense is the best defense +02:06=Let's have some fun! +02:06=Play with me! +02:06=Weapon crate detected +02:06=No ammo? No problem! +02:06=Time to reload! +02:06=This one can go boom +02:06=Some hogs like it hot +02:06=Some naughty hogs need punishment +02:06=Smite the enemy! +02:06=Fun! Explosions! Destruction! +02:06=Rain death and destruction upon your foes +02:06=Weapons! You never get enough of them +02:06=Better grab it before you run out of ammo +02:06=This means mayhem! +02:06=This leads to chaos +02:06=Supplies for true warriors +02:06=Caution: Don't expose to high temperatures +02:06=Do you have what it takes to handle this weapon? +02:06=Are you worthy of this weapon? +02:06=Heroric weaponry for heroic hedgehogs +02:06=Surprise weapon! +02:06=Damage in boxes +02:06=Deliver some damage +02:06=I can't wait to see this one in action +02:06=It's raining weapons! +02:06=It's raining crates! +02:06=The ultimate weapon? Or just run-of-the-mill ammo? +02:06=Better get this one first +02:06=This one could turn hedgehogs into toast +02:06=It's a blast! +02:06=It's such a beautiful … weapon +02:06=What's inside? Let's find out! +02:06=Unbox this +02:06=This crate creates destruction +02:06=Call me “Terminator”! +02:06=A small crate for a big explosion? +02:06=Weaponry incoming +02:06=Additional ammo detected +02:06=This single box could make a huge difference +02:06=Outblast your enemies +02:06=The fun is not over yet +02:06=The show must go on +02:06=Collect or die +02:06=This one may leave quite a hole +02:06=I bet this one will hurt +02:06=Throw your foes into a world of hurt +02:06=Superior firepower for superior hedgehogs +02:06=More firepower +02:06=What's better than a weapon? Two weapons! +02:06=High-quality ammunition arrived! +02:06=The crate of chaos +02:06=Classified weaponry detected +02:06=Need more firepower? +02:06=Finders keepers! +02:06=Did I hear “guns”? +02:06=It's time to get serious +02:06=Fun time is over +02:06=Now we're talking! +02:06=Let the arms race begin! +02:06=You better watch out if the enemy grabs it +02:06=Warning: Don't leave unattended +02:06=Warning: Keep away from children +02:06=This ain't for small hedgehogs +02:06=I heard you like weapons … +02:06=Special package delivery! +02:06=Destructive delivery! +02:06=It's time to teach them a lesson! +02:06=Your chance to complete your secret masterplan! +02:06=The ultimate chance! +02:06=Collect it or blow it? +02:06=I've got some weapons +02:06=Is this the ultimate weapon? +02:06=This isn't a children's toy +02:06=Greetings from Sgt Destructo +02:06=One step further to victory? +02:06=Total annihilation … in a box? +02:06=Blow up all the things! +02:06=Soldiers just want to have some fun +02:06=Use this to “defend” yourself +02:06=Even the best fighter needs ammo +02:06=Out of ammo? Not with us! +02:06=Stockpile this +02:06=Grab this and laugh viciously at your foes +02:06=With this you'll win every argument +02:06=Let's hope it's not Skip +02:06=You can't win a war without weapons! +02:06=And you thought your firearms collection was complete? +02:06=It's dangerous to go alone. Take this! +02:06=Heaven likes to play with mortals +02:06=Pew pew in a box! +02:06=Could more of you die, please? ; New utility crate 02:07=Tooltime! @@ -310,8 +636,94 @@ 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=Ooof, this box is heavy 02:07=You might need this +02:07=Is this something useful? +02:07=I wonder what's in there +02:07=More than just a crate +02:07=More tools +02:07=This looks useful +02:07=Engineer's present +02:07=Strategists rejoice! +02:07=Increase your mobility +02:07=Nuts and bolts! +02:07=Delivery from Hedgecogs, Inc. +02:07=Don't be a fool, grab a tool! +02:07=Can you hand me a tool? +02:07=Fresh from the construction site +02:07=A present from construction workers +02:07=Extras! +02:07=Cool! A tool! +02:07=Classified technology detected +02:07=Build something useful +02:07=The builder's friend +02:07=Create the buildings of your dreams! +02:07=Incoming utility crate! +02:07=Don't drop this on your feet! +02:07=A box full of tools! +02:07=Here, have some tools! +02:07=Did someone order a toolbox? +02:07=Useful delivery! +02:07=Need some tools? +02:07=I'm so exited to open this toolbox! +02:07=Heavy toolbox falling from the skies! +02:07=A little helper for little hedgehogs +02:07=Increase your options +02:07=Outsmart your enemy with this +02:07=Building bridges to victory +02:07=Surprise utility! +02:07=Useful present! +02:07=Heavy toolbox incoming! +02:07=Utilities for you +02:07=The wrench is mightier than the grenade +02:07=Yes, we can fix this! +02:07=Time to repair the roof +02:07=A box full of possibilities +02:07=Time for renovation! +02:07=Grab it while you can +02:07=This better is something useful +02:07=Stuck? Here, take this! +02:07=Use or abuse it +02:07=Prof. Hedge's latest invention +02:07=Gears! +02:07=Gadgets! +02:07=A thingamajing! +02:07=Who feels inventive today? +02:07=Here's part 1 of the 19-part DIY set +02:07=A do-it-yourself box! +02:07=For those DIYers +02:07=Interesting invention! +02:07=Is this the latest invention? +02:07=Get mobile! Get this crate! +02:07=Mobility is the road to victory +02:07=Collect it or be damned +02:07=Collectibles! +02:07=Useful utilities! +02:07=Look what I found in the toolshed! +02:07=If I had a spanner … +02:07=A Swiss army knife in box form +02:07=You may need this +02:07=What's inside? +02:07=Tactical utility crate incoming +02:07=A wild toolbox appeared! +02:07=The more, the merrier! +02:07=Batteries included +02:07=A box for tactical warfare +02:07=Utilities! They'll always come in handy +02:07=The pinnacle of technology! +02:07=This is our latest high-tech +02:07=Only the finest technology for you +02:07=Ran out of options? We have something for you … +02:07=This is not a toaster! +02:07=I heard you need something … +02:07=Delivered straight from the factory +02:07=Handle with care +02:07=Warning: Contents fragile +02:07=This may have just what you need +02:07=The final piece of your strategy? +02:07=Never underestimate utilities +02:07=Collect all the tools! +02:07=Tools! ; Hog (%1) skips his turn 02:08=%1 is sooo boring ... @@ -345,11 +757,28 @@ 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=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 +02:08=%1 never wanted to be here +02:08=%1 is observing the situation +02:08=%1 is counting sheep +02:08=%1 enjoys the silence +02:08=%1 is tired +02:08=%1 is the least interesting hedgehog in the world +02:08=%1 looks at the beautiful landscape +02:08=%1 lets the enemy continue +02:08=Apparently the enemy is %1's best friend +02:08=%1 needs time to forge the master plan +02:08=%1 saves the turn for later use +02:08=%1 does nothing, risks nothing +02:08=%1 sticks to the ground +02:08=%1 takes a break +02:08=%1 doesn't feel like taking action +02:08=%1 attacked with nothing +02:08=%1 is passive ; Hog (%1) hurts himself only 02:09=%1 should practice aiming! @@ -370,10 +799,10 @@ 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=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 hurts itself in its confusion 02:09=%1 has a knack for embarrassing himself 02:09=%1 is a klutz! 02:09=%1 is clumsy @@ -383,20 +812,324 @@ 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=I'm sure nobody saw that, %1 02:09=%1 needs to review his field manual 02:09=%1's weapon clearly malfunctioned +02:09=%1 is still practicing +02:09=%1's shot backfired +02:09=Oops! +02:09=%1 likes boomerangs and yo-yos +02:09=%1 wants to win the Darwin Award +02:09=%1 is unable to learn from mistakes +02:09=%1 is a little weirdo +02:09=%1 won't get a promotion anytime soon +02:09=%1 commits self-mutilation +02:09=%1 got out of the wrong side of the bed +02:09=Ouch! That must have hurt +02:09=%1 likes the pain +02:09=%1 confuses the enemy +02:09=Something is wrong with %1 +02:09=Better luck next time, %1! +02:09=%1 is his worst enemy +02:09=Let's call that a technical difficulty, %1? +02:09=%1 is drunk +02:09=%1 says “Ouchywawa!” +02:09=%1 is doing it wrong +02:09=%1 thought the safety was on +02:09=%1 was trying to clean the weapon +02:09=Somebody fetch a straitjacket! +02:09=%1 is late for a meeting with the Reaper +02:09=%1 tested the weapon—and it worked! +02:09=%1 is close to self-destruction! +02:09=But why, %1? +02:09=%1 mistook a grenade for an apple +02:09=%1 goes against the mainstream +02:09=%1 did a terrible miscalculation +02:09=Something went terribly wrong for %1 +02:09=%1 had a terrible accident -; 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=Home Run! 02:10=A bird, a plane, ... 02:10=That one is out! +02:10=Whee! +02:10=Up it goes! +02:10=Who said hedgehogs can't fly? +02:10=To infinity and beyond! +02:10=Ouch! That must have hurt +02:10=This is your applause, %1! +02:10=Excellent shot! +02:10=That's possibly record-breaking! +02:10=%1 sends hogs flying! +02:10=%1 takes physical education literally +02:10=%1 is the master in Hedgehogball +02:10=%1 took physics classes +02:10=%1 just slapped someone really hard +02:10=%1 plays baseball with hedgehogs +02:10=%1 offers free flights +02:10=Destination: Moon +02:10=%1 screws gravity +02:10=%1 is very proud of this hit ; Hog (%1) has to leave (team is gone) 02:11=%1 has to go to bed! 02:11=%1 seems too busy to play 02:11=Beam him up, Scotty! 02:11=%1 has to go +02:11=%1 teleports into a parallel universe +02:11=%1 vanishes into thin air +02:11=%1 is gone +02:11=%1 has better things to do +02:11=%1 is taking out the trash +02:11=%1 escapes +02:11=%1 needs vacation +02:11=%1 has to do some homework +02:11=%1 walks away from the trouble +02:11=%1 evaportated +02:11=%1 really needs to go +02:11=%1 dematerialized +02:11=%1 transforms into nothing +02:11=%1 is too proud to play +02:11=%1 just received an important call +02:11=%1 leaves work early +02:11=%1 has a side job +02:11=%1 is unchallenged +02:11=%1 is a little wimp +02:11=%1 runs away in horror +02:11=%1 deserts! +02:11=%1 ignores the duties of a soldier +02:11=%1 stirs up a mutiny + +; Hog (%1) was poisoned +02:12=%1 feels sick +02:12=%1 looks very bad +02:12=%1 needs a doctor +02:12=%1 has been badly poisoned +02:12=%1 feels uneasy +02:12=%1 fell victim to chemical warfare +02:12=%1's skin assumes a very unhealthy color +02:12=%1 should have taken those vitamins +02:12=%1 feels a pain in the stomach +02:12=%1 doesn't look healthy +02:12=%1 nees a sickbay +02:12=%1 has a really, really foul smell +02:12=Are you okay, %1? +02:12=%1 suffers from the health loss disease +02:12=%1 forgot to take the antidote +02:12=%1 has the fever +02:12=%1 should not have inhaled that awful smell +02:12=%1 should have brought a gas mask +02:12=%1 needs some medicine +02:12=%1 has been infected +02:12=%1 looks awful +02:12=%1 doesn't have health insurance +02:12=%1 needs to go to the hospital +02:12=%1 is sickened +02:12=%1 needs cough-medicine +02:12=%1 tries to fight off the sickness with thoughts +02:12=The poison surges through %1 +02:12=Poison slowly wears down %1 +02:12=%1 needs first aid soon +02:12=%1 needs help fast +02:12=Don't stand too close to %1 +02:12=%1 assumes a sickly green color +02:12=%1 feels the poison +02:12=%1 feels weaker and weaker +02:12=%1 should probably stay home from school today +02:12=Looks like %1 never got vaccinated +02:12=%1 needs a first aid kit very soon +02:12=%1 should collect a health crate +02:12=%1 kissed a cobra +02:12=%1 has an immune-system attack +02:12=%1 played too long with sick friends +02:12=%1 was attacked by bacteria +02:12=%1 has an inner battle with a virus + +; Hog (%1) was resurrected by the Resurrector utility +02:13=%1 has been resurrected +02:13=%1 has been brought back TO hell +02:13=%1 gets a second chance +02:13=%1 is alive again +02:13=%1 has been brought back from the dead +02:13=%1 is among the walking dead +02:13=%1 is reborn +02:13=%1 feels alive like never before +02:13=%1 has defeated death +02:13=%1 laughs at the Grim Reaper +02:13=%1 gets another shot in life +02:13=%1 is alive and well again +02:13=%1 has been brought to unlife +02:13=%1 is among us again +02:13=%1 is surprised to be alive again +02:13=%1 feels super-refreshed +02:13=%1 had good Karma +02:13=%1 rises from the dead to scare the enemy +02:13=%1 rises up from the grave +02:13=Don't ruin your second chance, %1! +02:13=%1 is still needed +02:13=%1 was too important to die +02:13=Life surges through %1 +02:13=%1 feels the power of life +02:13=%1 has been kicked out of Heaven +02:13=%1 is the chosen one +02:13=%1 knew the religion of rebirth was right all along +02:13=%1 knew this day would come +02:13=Beware, %1 is back! +02:13=%1 is going to make some trouble … again! +02:13=%1 is your worst nightmare +02:13=And you thought you could defeat %1? +02:13=%1 is stronger than death +02:13=Death means nothing to %1 +02:13=%1 doesn't forgive +02:13=%1 lives another time +02:13=%1 is revived by black magic +02:13=%1 is ready to serve again +02:13=%1 gets an extra life +02:13=%1 was not ready to die just yet +02:13=%1 serves again +02:13=The time for %1 has not come yet +02:13=%1 rose from the tomb +02:13=%1 had a deal with a necromancer +02:13=%1 is ready to die again +02:13=Live, die, repeat +02:13=%1 prefers living +02:13=%1 couldn't miss the battle +02:13=%1 inserted the next coin + +; Hog (%1) explodes after an kamikaze attack +02:14=%1 dies in honor +02:14=%1 died a brave death +02:14=Forever remember %1 +02:14=Say farewell to the brave warrior %1 +02:14=%1 fights with honor +02:14=%1 was filled with honor +02:14=%1 was full of rage +02:14=%1 exploded in anger +02:14=%1 performs a tactical self-destruction +02:14=How brave of %1! +02:14=%1 is a true hero +02:14=%1, soldier of bravery +02:14=We will not forget %1 +02:14=%1 will be in our hearts +02:14=%1 strikes with furious anger +02:14=%1 dies as a true war hero +02:14=%1 is a huge fan of Independence Day +02:14=%1 made the ultimate sacrifice +02:14=%1 used a one-time weapon +02:14=%1 took “martial arts” literally +02:14=What an impressive stunt, %1! +02:14=%1 turns war into an art form +02:14=You should not have angered %1 +02:14=%1 plays with fire +02:14=%1 strikes for a last time +02:14=%1 deals the final blow +02:14=%1 was a devout follower of the cult of Death +02:14=%1 brings death and destruction +02:14=%1 is gone for good +02:14=%1 had no fears +02:14=%1 dies for the country +02:14=%1 is a kamikaze pilot +02:14=%1 just did it for the attention +02:14=%1 will be world-famous +02:14=%1 had nothing to lose +02:14=%1 gave the best +02:14=%1 used the ultimate martial arts technique +02:14=%1 doesn't want enemies to be lonely in the underworld +02:14=%1 will now continue the battle in afterlife +02:14=%1 always wanted to die in a really cool way +02:14=%1 would have died anyway + +; Hog (%1) returned from time-travel with the time box +; These texts are intentionally kept simple and clear to not confuse the player +02:15=%1 returns from time travel +02:15=Time-traveller %1 returns +02:15=%1 walks out of the time box +02:15=The time box of %1 has arrived +02:15=%1 is back in our present timeline +02:15=Welcome back to our time, %1! +02:15=%1 arrives in the present + +; Hog (%1) runs out of turn time (not shown in infinite attack mode) +02:16=%1 was too slow +02:16=%1 forgot to keep an eye on the time +02:16=Even snails are faster than %1 +02:16=%1 fell asleep +02:16=%1 forgot to attack +02:16=%1 was about to make a perfect shot. I swear! +02:16=%1 has no sense of time +02:16=%1 plays in slow motion +02:16=%1 needed more time +02:16=%1 could have used a few more seconds +02:16=Time's up, %1! +02:16=%1 just wasted an amazing opportunity +02:16=%1 gets no points for style +02:16=%1 would win no medal in the Olympics +02:16=Think faster, %1! +02:16=You disappoint me, %1! +02:16=%1 thinks time is relative +02:16=%1 doesn't believe in the concept of time +02:16=Stop wasting our time, %1! +02:16=Next! +02:16=%1 is unbelievably slow +02:16=Someone should wake up %1 +02:16=%1 forgot to set up the alarm clock +02:16=%1 ran out of time +02:16=%1 lives the slow life +02:16=Try to be faster next time, %1! +02:16=Your turn doesn't last forever, %1! +02:16=%1 forgot to bring a watch +02:16=%1 should have bought some time +02:16=%1 is a time-waster +02:16=You snooze, you lose, %1! +02:16=%1 missed the starting gun +02:16=Knitting is a more suited occupation for %1 +02:16=%1 prefers Chess +02:16=%1 was thinking about flowers +02:16=%1 is easily distracted by pretty things +02:16=Did we forget to check the time, %1? +02:16=Nothing to see here, move along! +02:16=%1 didn't know there's a time limit +02:16=%1 just overheated +02:16=%1 didn't think of attacking +02:16=%1 loses the race against the clock +02:16=The timer! The timer, %1! +02:16=%1 prepared for too long + +; King (%1) has died +02:17=%1 is dead! Long live %1! +02:17=Royal tragedy: %1 found dead +02:17=%1 is no longer with us +02:17=Our beloved king %1 has left us +02:17=%1 was a tyrant anyway +02:17=Finally we got rid of %1! +02:17=%1's days as a leader are counted +02:17=The royal legacy of %1 has come to an end +02:17=%1 has been overthrown! +02:17=Without the guidance of %1, the team is lost +02:17=The great leader %1 suddenly doesn't look so great anymore +02:17=The kingdom cries for %1 +02:17=%1 died like a real king +02:17=%1 is a dead leader +02:17=%1 is an ex-king +02:17=%1 has been dethroned +02:17=The reign of %1 is over +02:17=%1 dies, and so does a kingdom +02:17=%1 loses in King Of The Hill +02:17=%1 was a weak king +02:17=There are far greater kings than %1 +02:17=The war took down %1 +02:17=%1 had it coming +02:17=%1 has been torn apart +02:17=%1's power has been stripped away +02:17=%1 died of kingly causes +02:17=%1 lived a dangerous life +02:17=%1 has angered the mob +02:17=%1 had too many enemies +02:17=And you called %1 a king? +02:17=%1 did not deserve to be king +02:17=Down with %1! +02:17=The Kingdom of %1 has fallen! +02:17=%1 has been checkmated ; Weapon Categories 03:00=Timed grenade @@ -460,6 +1193,7 @@ 03:56=Please use or misuse 03:57=Utility 03:58=Floating proximity bomb +03:59=Swimming bomb ; 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 @@ -469,7 +1203,7 @@ 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 pick hammer to drill|a hole into the ground and reach other areas.|Attack: Start or stop digging|Left/Right: Move while drilling 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|Up/Down: Retract/Extend rope|Long Jump: Drop grenades or similar weapons +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|Left/Right/Up/Down: Swing, retract or extend 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|Precise + 1-5: Set mine's bounce strength 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 @@ -502,7 +1236,7 @@ 04:37=Don't fear the daylight. It will just last one turn|but will enable you to absorb 80% of the damage|dealt 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. Aiming is difficult, so as long this|weapon is activated, you have to hold your position.|Attack: Activate built-in laser sight, then fire (twice)|Left/Right: Turn around (between shots) 04:39=Fly to other parts of the map using the flying|saucer. This hard to master utility can|take you to almost any position on the battlefield.|Attack: Activate/Deactivate|Up/Left/Right: Apply a short boost into one direction|Long Jump: Drop grenades or similar weapons|Precise + Long Jump: Launch weapon to crosshair|Precise + Up/Down: Adjust aim -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: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 @@ -516,32 +1250,34 @@ 04:51=Get in a free shot by hurling a ball of mud.|Deals no damage, but knocks hogs and|objects back.|Attack: Hold to shoot with more power 04:52=UNUSED 04:53=Take a trip through time and space,|while leaving your comrades to fight on alone.|Be prepared to return at any time,|or for Sudden Death or if they are all defeated.|Disclaimer. Does not function in Sudden Death,|if you are alone, or if you are a King.|Attack: Activate -04:54=Spray a stream of sticky flakes.|Build bridges, bury enemies, seal off tunnels.|Be careful you don't get any on you!|Attack: Activate|Up/Down: Continue aiming|Left/Right: Modify spitting power +04:54=Spray a stream of sticky flakes.|Build bridges, bury enemies, seal off tunnels.|Be careful you don't get any on you!|Attack: Activate/Deactivate|Up/Down: Continue aiming|Left/Right: Modify spitting power 04:55=Bring back the ice-age!|Freeze hedgehogs, make the floor slippery or|save yourself from drowning by freezing the water.|Attack: Activate/Deactivate freezeray|Up/Down: Continue aiming -04:56=You can throw two cleavers at your enemy,|block passages and tunnels and even use them for climbing!|Be careful! Playing with knifes is dangerous.|Attack: Hold to shoot with more power (twice) +04:56=You can throw two cleavers at your enemy, block|passages and tunnels and even use them for|climbing! Its damage increases with its speed.|But be careful! Playing with knives is dangerous.|Attack: Hold to shoot with more power (twice) 04:57=Build a VERY elastic rubber band, from which|hedgehogs and other things bounce off|without taking fall damage.|Left/Right: Change rubber band orientation|Cursor: Place rubber band in a valid position 04:58=This proximity bomb will float freely in the air and follow|hedgehogs careless enouogh to come too close to it.|Its explosion is weaker than that of the land mine, however.|Attack: Hold to shoot with more power +04:59=Send those dirty hogs swimming! This cute little squeaky|rubber duck is able to swim on water and will go with the|wind once swimming. It explodes when it hits land, so|make sure to drop it from a cliff or another safe spot.|Attack: Drop the rubber duck ; Game goal strings 05:00=Game Modes -05:01=The following rules apply -05:02=Forts: Defend your fortress; vanquish your enemies! -05:03=Low Gravity: Watch your step +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 80% of 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!|Place the King: Pick a protected starting point for your King +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:09=Artillery: Hogs can't walk 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 - 5 seconds 05:15=Damage Modifier: (Almost) all weapons will deal %1% damage -05:16=Health of all hogs is reset on end of turn -05:17=AI hogs respawn on death -05:18=Unlimited Attacks -05:19=Weapons are reset on end of turn -05:20=Weapons are not shared between hogs +05:16=Paramedics: Hogs are healed up to their initial health on end of turn +05:17=AI Revival: AI hogs respawn on death +05:18=Unlimited Attacks: Attacks don't end your turn +05:19=Constant Weaponry: Weapons are reset on end of turn +05:20=Per-hog Ammo: Weapons are not shared between hogs 05:21=Tag Team: Teams in a clan takes successive turns|Shared Time: Teams within a clan share turn time +05:22=Heavy Wind: Wind affects almost everything diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/es.lua --- a/share/hedgewars/Data/Locale/es.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/es.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { - [":("] = ":(", ["!!!"] = "!!!", ["..."] = "...", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "¡Buena puntería!", +-- ["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 Unlocked"] = "Logro conseguido", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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 +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Practica tu puntería", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW - ["Ammo Depleted!"] = "¡Munición agotada!", - ["ammo extended!"] = "¡Munición aumentada!", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler ["Ammo is reset at the end of your turn."] = "", - ["Ammo Maniac!"] = "¡Loco por la munición!", - ["Ammo"] = "Munición", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies ["Available points remaining: "] = "Puntos restantes:", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 - ["[Backspace]"] = "[Retroceso]", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- ["Bamboo Thicket"] = "Maraña de bambú", - ["Barrel Eater!"] = "¡Tragabarriles!", +-- ["Barrel Eater"] = "", -- Tumbler ["Barrel Launcher"] = "Lanzador de barriles", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "¡Batea pelotas contra tus enemigos|y hazlos caer al agua!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "¡Batea a tus enemigos fuera del campo de juego|a través de las canastas laterales!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Entrenamiento con bazuca", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Mejores tiempos por equipo: ", - ["Best Team Times: "] = "Mejores tiempos del equipo: ", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "¡BUM!", +-- ["Bones"] = "", -- +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion ["Boom!"] = "¡Bum!", - ["Boss defeated!"] = "¡Jefe derrotado!", - ["Boss Slayer!"] = "¡Matajefes!", +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer ["Build a track and race."] = "Dibuja un recorrido y compite.", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "Capturar la bandera", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Descuidado", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge - ["Change Weapon"] = "Cambiar arma", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "Patoso", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Nombre en clave: Trabajo en equipo", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "¡Completa el recorrido lo más rápido que puedas!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope ["Congratulations!"] = "¡Felicidades!", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "¡Felicidades! Has destruido todos los objectivos|dentro del tiempo establecido.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Controla los pilares para anotar puntos.", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Imperio cibernético", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "¡MALDITA SEA, RECLUTA! ¡FUERA DE MI CABEZA!", ["DAMMIT, ROOKIE!"] = "¡MALDITA SEA, RECLUTA!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Patitos peligrosos", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Peso muerto", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor ["Demolition is fun!"] = "¡Destruir es divertido!", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow - ["Depleted Kamikaze!"] = "¡No quedan más kamikazes!", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Acaba con los invasores para conseguir puntos.", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen ["Double Kill!"] = "¡Dos por uno!", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode - ["Drone Hunter!"] = "Matadrones", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Ahogado", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy ["Each turn you get 1-3 random weapons"] = "Cada turno tendrás de 1 a 3 armas elegidas aleatoriamente", ["Each turn you get one random weapon"] = "Cada turno tendrás un arma elegida aleatoriamente", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Elimina a todos los enemigos", ["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 enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "Acaba con los Tóxicos antes de que se agote el tiempo", - ["Eliminate the Blue Team"] = "Elimina al Equipo azul", - ["Eliminate the enemy before the time runs out"] = "Acaba con el enemigo antes de que se agote el tiempo", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Elimina a la Unidad 3378 |- Resistencia Fútil debe sobrevivir", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion ["Energetic Engineer"] = "Ingeniero Eléctrico", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Disfruta del baño...", - ["[Enter]"] = "[Intro]", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Vuelta rápida: ", ["Feeble Resistance"] = "Resistencia Fútil", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 - - ["Fire"] = "Fuego", +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "¡Bandera capturada!", ["Flag respawned!"] = "¡Bandera restablecida!", ["Flag returned!"] = "¡Bandera recuperada!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Las banderas y las bases se colocarán donde los equipos acaben su primer turno.", ["Flamer"] = "Incinerador", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy ["Friendly Fire!"] = "¡Fuego amigo!", - ["fuel extended!"] = "¡Más combustible!", - ["GAME BEGUN!!!"] = "¡EL JUEGO HA EMPEZADO!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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 +-- ["Gangsters"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Objetivo", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "¡Buena suerte!", ["Good so far!"] = "¡Vamos bien!", @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "¡TE PILLÉ!", - ["Grab Mines/Explosives"] = "Coge minas/explosivos", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["Hahahaha!"] = "¡Jajajaja!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "¡Jajaja, eso SÍ que sería espectacular!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil [" Hapless Hogs left!"] = " pobres desgraciados restantes!", ["Hapless Hogs"] = "Pobres desgraciados", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode - ["Health crates extend your time."] = "Los botiquines aumentan el tiempo disponible.", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "Pesado", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Baloncesto", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Jeje, no es para tanto.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood - ["Hit Combo!"] = "¡Combo!", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy ["Hmmm..."] = "Mmm...", -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Artillero", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Instructor", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "invasores destruídos", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,539 +1040,1291 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Menos mal que aún quedan 99 turnos hasta la MUERTE SÚBITA...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "No se puede saltar", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "¡Kamikaze experto!", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion ["Keep it up!"] = "¡Sigue así!", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab ["Killing spree!"] = "¡Frenesí asesino!", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood - ["KILLS"] = "MUERTES", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion ["Last Target!"] = "¡Último objetivo!", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "[Shift izquierdo]", --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "¡Atento, escoria!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow ["Lively Lifeguard"] = "Salvavidas dicharachero", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy ["Mine Deployer"] = "Plantador de minas", - ["Mine Eater!"] = "¡Tragaminas!", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Retraso de las minas:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "MISIÓN COMPLETADA", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "MISIÓN COMPLETADA", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Movimiento: [Arriba], [Abajo], [Izquierda], [Derecha]", --- ["Mudball"] = "", -- Construction_Mode - ["Multi-shot!"] = "¡Disparo múltiple!", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 - ["New Barrels Per Turn"] = "Barriles por turno", - ["NEW CLAN RECORD: "] = "NUEVO RÉCORD PARA EL CLAN", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "NUEVA vuelta rápida: ", - ["New Mines Per Turn"] = "Minas por turno", - ["NEW RACE RECORD: "] = "NUEVO RÉCORD PARA EL RECORRIDO: ", - ["Newton's Hammock"] = "La hamaca de Newton", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "NO HAY SUFICIENTES BALIZAS", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Partido no-tan-amistoso", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Buzo", ["Opposing Team: "] = "Equipo enemigo: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Erizo patético #%d", +-- ["Patches"] = "", -- ["Pathetic Resistance"] = "Patética resistencia", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor ["Place more waypoints using the 'Air Attack' weapon."] = "Coloca más balizas usando el 'Bombardeo aéreo'", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["POINTS"] = "", -- Mutant +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- 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 ["Poison"] = "Veneno", +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "Energía restante", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["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", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow - ["Race complexity limit reached."] = "Máximo de complejidad para el recorrido alcanzado.", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer ["RACER"] = "CORREDOR", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow - ["Round Limit:"] = "Límite de rondas:", - ["Round Limit"] = "Límite de rondas", - ["Rounds Complete: "] = "Rondas completadas: ", - ["Rounds Complete"] = "Rondas completadas", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "REGLAS DEL JUEGO (Presiona ESC para leerlas)", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 ["Save as many hapless hogs as possible!"] = "¡Salva a tantos pobres desgraciados como puedas!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["Score"] = "", -- Mutant - ["SCORE"] = "PUNTUACIÓN", - - ["sec"] = "segundo", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "¡Hasta otra!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood ["selected!"] = "¡Seleccionado!", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "¡Escudo mejorado! +30 puntos", - ["Shield Depleted"] = "Escudo descargado", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "¡Escudo completamente cargado!", - ["Shield Master!"] = "¡Experto del escudo!", - ["Shield Miser!"] = "¡Novato con los escudos!", - ["Shield OFF:"] = "Escudo desactivado:", - ["Shield ON:"] = "Escudo activado:", - ["Shield Seeker!"] = "¡A cubierto!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Escopeteros", - ["Shotgun Training"] = "Entrenamiento con escopeta", ["shots remaining."] = "disparos restantes.", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Idiota", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Sumergible", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "¡%s cayó y Equipo %d|anotó una falta!| |Puntuación:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "¡%s cayó y Equipo %d|anotó un tanto!| |Puntuación:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united ["Sponge"] = "Esponja", ["Spooky Tree"] = "Árbol tenebroso", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["s|"] = "s|", - ["s"] = "s", -- GaudyRacer, Space_Invasion - ["STATUS UPDATE"] = "ACTUALIZACIÓN DE ESTADO", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies ["Switched to "] = "Cambiar a ", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Equipo %d", - ["Team Scores"] = "Puntuaciones", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow ["That Sinking Feeling"] = "Esa sensación de pesadez", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "Eso era innecesario.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "¡El enemigo está escondido detrás del patito del fondo!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "La bandera reaparecerá en el próximo turno.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab ["This one's tricky."] = "Esto va a ser complicado.", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Vaya que si llueve...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["Timed Kamikaze!"] = "¡Kamikaze de precisión!", - ["Time Extended!"] = "¡Tiempo aumentado!", - ["Time Extension"] = "¡Bonus de tiempo!", - ["TIME: "] = "TIEMPO: ", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Activad/desactivar escudo", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "¡PISTA COMPLETADA!", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "TrophyRace", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", - ["Tumbling Time Extended!"] = "¡Tiempo de volteretas aumentado!", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Duración del turno", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Unidad 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- ["Unit 835"] = "Unidad 835", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united ["Unit"] = "Unidad", ["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!", -- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood ["User Challenge"] = "Reto personal", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "¡Usa tu cuerda para llegar a la salida lo más rápido que puedas!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Baliza colocada.", - ["Way-Points Remaining"] = "Balizas restantes", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion ["Weapons Reset"] = "Armamento reiniciado", --- ["Weapons reset."] = "", -- Highlander +-- ["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 -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos ["Well done."] = "Bien hecho.", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1035,13 +2332,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1055,31 +2361,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - ["Will this ever end?"] = "¿Es que nunca se va a terminar?", --- ["WINNER IS "] = "", -- Mutant - ["WINNING TIME: "] = "MEJOR TIEMPO: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1087,68 +2401,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "¡Has anotado!", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "¡Has salvado", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "Bazuqueros", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/es.txt --- a/share/hedgewars/Data/Locale/es.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/es.txt Sun Dec 17 00:09:24 2017 +0100 @@ -58,7 +58,7 @@ ; 00:54=Estructura 00:54=Pistola de barro -01:00=¡Luchad! +; 01:00=Loading … 01:01=Empate 01:02=¡%1 venció! 01:03=Volumen %1% @@ -239,11 +239,11 @@ 02:02=¡Dadles caña! 02:02=¡No temáis! -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=¡%1 venció! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Empate ; Botiquín 02:05=¡Ayuda en camino! @@ -509,12 +509,12 @@ ; Game goal strings 05:00=Modos de juego 05:01=Las siguientes reglas están activas: -05:02=Fuertes: ¡defiende tu fortaleza, conquista la tus enemigos! +05:02=Posicionar el rey: elige un buen cobijo para tu rey 05:03=Baja gravedad: mira bien dónde pisas 05:04=Invulnerabilidad: todos los erizos tienen un campo de fuerza personal que los protege 05:05=Vampirismo: dañar a tus enemigos te curará a ti 05:06=Karma: compartirás parte del daño que inflijas -05:07=Rey: ¡no permitas que tu rey muera!|Posicionar el rey: elige un buen cobijo para tu rey +05:07=Rey: ¡no permitas que tu rey muera! 05:08=Posicionar erizos: los jugadores posicionan a mano su erizos por turnos antes de empezar a jugar 05:09=Artillería: afina tu puntería, los erizos no pueden moverse 05:10=Terreno indestructible: la mayoría de armas no pueden dañar el terreno de juego diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/fi.txt --- a/share/hedgewars/Data/Locale/fi.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/fi.txt Sun Dec 17 00:09:24 2017 +0100 @@ -37,7 +37,7 @@ 00:34=Kuolemattomuus 00:35=Ylimääräistä aikaa 00:36=Lasertähtäin -00:37=Vampyrismi +00:37=Vampirismi 00:38=Tarkkuuskivääri 00:39=Lentävä lautanen 00:40=Polttopullo @@ -58,8 +58,10 @@ 00:55=Jäädytin 00:56=Jättiveitsi 00:57=Kuminauha +00:58=Ilmamiina +00:59=Kumiankka -01:00=Taistelu alkakoon! +; 01:00=Loading … 01:01=Tasapeli 01:02=%1 voitti! 01:03=Äänenvoimakkuus %1% @@ -84,6 +86,8 @@ 01:22=Poissa näppäimistöltä 01:23=Passiivinen kamera 01:24=Aktiivinen kamera +01:25=Paina aktivointinappia merkitäksesi kohteen +01:26=Ei käytettävissä äkkikuolemassa ; Event messages ; Hog (%1) died @@ -120,7 +124,7 @@ 02:00=%1 pysäytti luoteja naamallaan 02:00=%1 on sankari ih...siilien joukossa 02:00=%1 löytää paikkansa Valhallasta -02:00=%1 on poistnut rakennuksesta +02:00=%1 on poistunut rakennuksesta 02:00=%1 seuraa dinosaurusten jalanjälkiä 02:00=%1 vie siilet askelta lähemmäksi sukupuuttoa 02:00=%1 tuo kyyneleen silmääni @@ -210,7 +214,7 @@ 02:02=Pidä itseäsi onnekkaana ettet pelaa Smaxxia vastaan 02:02=Pidä itseäsi onnekkaana ettet pelaa Jessoria vastaan 02:02=Anna kaikkesi! -02:02=Häiväjät siivoaa jäljet! +02:02=Häviäjät siivoaa jäljet! 02:02=Vuosituhannen taistelu alkakoon 02:02=Vuosisadan taistelu alkakoon 02:02=Vuosikymmenen taistelu alkakoon @@ -235,11 +239,11 @@ 02:02=Älkää pelätko! 02:02=Olkaa urheita ja voittakaa -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 voitti! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Tasapeli ; New health crate 02:05=Apua tulossa! @@ -265,7 +269,7 @@ 02:06=Mikä ase tuon sisällä on? 02:06=Varusteita! 02:06=Mitä sisällä onkaan? -02:06=Hedgewarsissa joulu tulee etuajassa +02:06=Hedgewarsissa on joulu joka päivä 02:06=Lahja! 02:06=Erikoislähetys! 02:06=Tämän saaminen tullin läpi oli painajaista @@ -273,28 +277,28 @@ 02:06=Varoitus! Räjähdysherkkää 02:06=Poimi tai räjäytä, valinta on sinun 02:06=Tavaraa! -02:06=Mmm..ammuksia +02:06=Mmm... ammuksia 02:06=Tuhovoimainen laatikko 02:06=Ilmapostia! 02:06=Mitä tahansa tuossa laatikossa onkin, se ei ole pizzaa 02:06=Hae se! 02:06=Aselaatikko tulossa 02:06=Älä anna vihollisesi poimia tuota! -02:06=Uuden karheita leluja! -02:06=Mysteterilaatikko! +02:06=Uudenkarheita leluja! +02:06=Mysteerilaatikko! ; New utility crate -02:07=Työkaluaika! -02:07=Tämä voisi olla hyödyllinen... +02:07=Tämä saattaa olla hyödyllinen... 02:07=Työkaluja! 02:07=Hyödynnä tätä laatikkoa 02:07=Varokaa siellä alhaalla 02:07=Lisää työkaluja! -02:07=Työkaluja sinulle! +02:07=Työkaluja juuri sinulle! 02:07=Tämän pitäisi olla hyvä! 02:07=Käytä tätä viisaasti 02:07=Ui, tämä laatikko on painava 02:07=Saatat tarvita tätä +02:07=Vasara ja nauloja ; Hog (%1) skips his turn 02:08=%1 on niin tylsä... @@ -434,45 +438,47 @@ 03:55=Tätä coolimpaa asetta ei ole! 03:56=Käytä tai väärinkäytä 03:57=Työkalu +03:58=Leijuva miina +03:59=Kelluva pommi ; Weapon Descriptions (use | as line breaks) 04:00=Hyökkää yksinkertaisella kranaatilla.|Se räjähtää kun ajastimesta loppuu aika.|1-5: Säädä kranaatin ajastin|Hyökkää: Pidä pohjassa lisätäksesi heittovoimaa 04:01=Hyökkää sirpalepommilla.|Se jakaantuu pienemmiksi pommeiksi ajan|loppuessa ajastimesta|1-5: Säädä kranaatin ajastin|Hyökkää: Pidä pohjassa lisätäksesi heittovoimaa 04:02=Hyökkää ballistisella ammuksella|johon tuuli saattaa vaikuttaa|Hyökkää: Pidä pohjassa lisätäksesi voimaa -04:03=Laukaise ohjattu mehiläinen joka lukittuu|valittuun kohteeseen. Älä ammu täydellä voimalla|lisätäksesi tarkkuutta|Kursori: Valitse kohde|Hyökkää: Pidä pohjassa lisätäksesi voimaa -04:04=Ammu vihollisiasi kahdesti laukeavalla haulikolla.|Kiitos leviämisen sinun ei tarvitse tähdätä suoraan|vahingoittaeksi vihollisiasi.|Hyökkää: Ammu (useita kertoja) +04:03=Laukaise ohjattu mehiläinen joka lukittuu|valittuun kohteeseen. Älä ammu täydellä|voimalla lisätäksesi tarkkuutta|Kursori: Valitse kohde|Hyökkää: Pidä pohjassa lisätäksesi voimaa +04:04=Ammu vihollisiasi kahdesti laukeavalla haulikolla.|Kiitos leviämisen sinun ei tarvitse tähdätä suoraan|vahingoittaaksesi vihollisiasi.|Hyökkää: Ammu (useita kertoja) 04:05=Siirry maan alle! Käytä maaporaa porataksesi|reiän maahan päästäksesi muille alueille.|Hyökkää: Aloita ja lopeta kaivaminen 04:06=Tylsää? Ei mitään tapaa hyökätä? Säästät ammuksiasi?|Ei hätää! Jätä vuoro väliin, pelkuri!|Hyökkää: Jätä vuorosi väliin ilman tappelua -04:07=Ylitä pitkiä välimatkoja|hyvin ajoitetuilla laukauksilla ja köydellä.|Käytä momenttiasi liukuaksesi muiden siilien sekaan|tai pudota kranaatteja ja muita aseita niiden päälle.|Hyökkää: Ammu ja irroita köysi|Pitkä hyppy: Pudota kranaatteja ja vastaavia aseita +04:07=Ylitä pitkiä välimatkoja|hyvin ajoitetuilla laukauksilla ja köydellä.|Käytä momenttiasi liukuaksesi muiden siilien sekaan|tai pudota kranaatteja ja muita aseita niiden päälle.|Hyökkää: Ammu ja irrota köysi|Pitkä hyppy: Pudota kranaatteja ja vastaavia aseita 04:08=Pidä viholliset kaukana pudottamalla miina|kapeille käytäville tai suoraan niiden jalkojen juureen.|Pakene ennen kuin aktivoit sen itse!|Hyökkää: Pudota miina viereesi 04:09=Oletko epävarma tähtäyksestäsi? Käytä Desert|Eaglea hyökätäksesi neljällä laukauksella| Hyökkää: Ammu (useita kertoja) -04:10=Raaka voima on aina vaihtoehto. Käytä tätä klassista|räjähdettä vihollisiis ja pakene.|Hyökkää: Pudota dynamiitti viereesi +04:10=Raaka voima on aina vaihtoehto. Käytä tätä klassista|räjähdettä vihollisiisi ja pakene.|Hyökkää: Pudota dynamiitti viereesi 04:11=Hankkiudu vihollissiileistä eroon lyömällä ne mailalla|kartan ulkopuolelle tai veteen. Tai miten olisi|muutaman miinan lyöminen kavereillesi?|Hyökkää: Lyö kaikkia edessä olevia -04:12=Mene henkilökohtaisuuksiin vapauttamalla|tämän melkein tappavan kamppailulajitekniikan voimat.|Hyökkää: Suorita Fire Punch +04:12=Mene henkilökohtaisuuksiin vapauttamalla|tämän melkein tappavan kamppailulajitekniikan voimat.|Hyökkää: Tee ninjapotku 04:13=UNUSED -04:14=Korkean paikan kammo? Parempi ottaa laskuvarjo.|Se avautuu kun putoat liian kauas|ja pelastaa siilen putoamisvaurioilta.|Hyökkää: Avaa laskuvarjo +04:14=Korkean paikan kammo? Parempi ottaa laskuvarjo.|Se avautuu kun putoat liian kauas|ja pelastaa siilin putoamisvaurioilta.|Hyökkää: Avaa laskuvarjo 04:15=Kutsu lentokone hyökkäämään vihollisiasi päin|pommituslennolla|Vasen/Oikea: Valitse suunta|Osoitin: Valitse kohdealue -04:16=Kutsu lentokone pudottaaman useita miinoja kohdealueelle|Vasen/Oikea: Valitse hyökkäyssuunta|Osoitin: Valitse kohdealue -04:17=Tarvitsetko suojaa? Käytä puhalluslamppua kaivaaksesi|tunnelin maahan saadaksesi suojaa|Hyökkää: Aloita ja lopeta kaivaminen -04:18=Tarvitsetko suojaa vai haluatko ylittää|ylittämättömän maa-alueen? Sijoita muutamia palkkeja kuten haluat|Vasen/Oikea: Valitse asetettava palkki|Osoitin: Sijoita palkki sallittuun kohtaan -04:19=Oikealla hetkellä käytettynä kaukosiirto|voi olla voimakkaampi kuin melkein mikään tahansa muu ase|koska se antaa sinun pelastaa siilesi vaarallisista tilanteista sekunneissa.|Osoitin: Valitse kohdealue -04:20=Antaa sinun vaihtaa vuoro toiselle siilelle|Hyökkää: Laita siilen vaihto -tila päälle +04:16=Kutsu lentokone pudottamaan useita miinoja kohdealueelle|Vasen/Oikea: Valitse hyökkäyssuunta|Osoitin: Valitse kohdealue +04:17=Tarvitsetko suojaa? Käytä puhalluslamppua|kaivaaksesi tunnelin maahan saadaksesi suojaa|Hyökkää: Aloita ja lopeta kaivaminen +04:18=Tarvitsetko suojaa vai haluatko kiivetä ylittämättömän|maa-alueen? Sijoita muutamia palkkeja kuten haluat|Vasen/Oikea: Valitse asetettava palkki|Osoitin: Sijoita palkki sallittuun kohtaan +04:19=Oikealla hetkellä käytettynä kaukosiirto|voi olla voimakkaampi kuin melkein mikään|muu ase, koska se antaa sinun pelastaa|siilisi vaarallisista tilanteista.|Osoitin: Valitse kohdealue +04:20=Vaihda vuoro toiselle siilille|Hyökkää: Laita siilin vaihto -tila päälle 04:21=Ammu kranaatin kaltainen ammus|joka vapauttaa useita pommeja osuessaan|Hyökkää: Ammu täydellä voimalla 04:22=Ei vain Indiana Jonesille! Piiska on hyödyllinen ase|useissa tilanteissa. Erityisesti|jos haluat sysätä jonkun alas kielekkeeltä|Hyökkää: Iske kaikkea edessäsi olevaa -04:23=Jos sinulla ei ole mitään menettävää|tämä saattaa olla melko kätevä.|Uhraa siilesi laukaisemalla se|valittuun suuntan vahingottaen kaikkea tiellä olevaa räjähtäen lopussa|Hyökkää: Laukaise tuhoisa ja tappava hyökkäys +04:23=Jos sinulla ei ole mitään menettävää|tämä saattaa olla melko kätevä.|Uhraa siilisi laukaisemalla se valittuun|suuntaan vahingoittaen kaikkea tiellä|olevaa räjähtäen lopussa.|Hyökkää: Laukaise tuhoisa ja tappava hyökkäys 04:24=Hyvää syntymäpäivää! Laukaise tämä kakku ja anna sen kävellä|vihollistesi viereen ja järjestä heille räjähtävät kekkerit.|Tämä kakku voi ylittää melkein minkä tahansa maaston|Mutta se saattaa räjähtää matkalla|Hyökkää: Laukaise kakku tai anna sen pysähtyä ja räjähtää 04:25=Käytä tätä naamioitumispakkausta saadaksesi vihollisesi|hyppäämään halatakseen (ja sitten putoamaan kuoppaan tai reikään).|Hyökkää: Käytä pakkausta ja yritä vietellä toinen siili -04:26=Heitä tämä mehukas vesimeloni vihollsiasi kohti|Kun ajastimesta loppuu aika, se hajoaa useiksi|räjähtäviksi palasiksi.|1-5: säädä vesimelonin ajastinta|Hyökkää: Pidä pohjassa lisätäksesi voimaa -04:27=Anna helvetin tulen sataa vihollistesi päälle käyttämällä tätä|pirullista räjähdettä. Älä mene liian lähelle tätä räjähdettä|koska pienemmät tulet saattavat kestää pitempään.|Hyökkää: Pidä pohjassa ampuaksesi voimakkaammin -04:28=Hetken kuluttua tämän raketin laukaisusta|se alkaa porautumaan maan läpi ja räjähtää|kun sen sytytyslanka palaa loppuun tai kun se päätyy maan pinnalle.|Hyökkää: Pidä pohjassa ampuaksesi voimakkaammin -04:29=Tämä ei ole pienille lapsille! Tämä palloase ampuu|tonneittain pieniä räjähtäviä värikkäitä palloja.|Hyökkää: Ammu täydellä teholla|Ylös/Alas: Jatka tähtäämist +04:26=Heitä tämä mehukas vesimeloni vihollisiasi kohti|Kun ajastimesta loppuu aika, se hajoaa useiksi|räjähtäviksi palasiksi.|1-5: säädä vesimelonin ajastinta|Hyökkää: Pidä pohjassa lisätäksesi voimaa +04:27=Anna manalan tulen sataa vihollistesi päälle käyttämällä tätä|pirullista räjähdettä. Älä mene liian lähelle tätä räjähdettä|koska pienemmät tulet saattavat kestää pitempään.|Hyökkää: Pidä pohjassa ampuaksesi voimakkaammin +04:28=Hetken kuluttua tämän raketin laukaisusta|se alkaa porautumaan maan läpi ja räjähtää|kun sen sytytyslanka palaa loppuun tai kun|se päätyy maan pinnalle.|Hyökkää: Pidä pohjassa ampuaksesi voimakkaammin +04:29=Tämä ei ole pienille lapsille! Tämä palloase ampuu|tonneittain pieniä räjähtäviä värikkäitä palloja.|Hyökkää: Ammu täydellä teholla|Ylös/Alas: Jatka tähtäämistä 04:30=Kutsu lentokone laukaisemaan tehokas napalmi-isku.|Oikein tähdättynä tämä hyökkäys voi hävittää|suuria palasia maastosta epäonnisine siileineen.|Vasen/Oikea: Valitse hyökkäyssuunta|Osoitin: Valitse kohdealue 04:31=Kauko-ohjattava lentokone on ihannease laatikkojen keräämiseen|ja kaukaisten siilien kimppuun hyökkäämiseen.|Ohjaa se suoraan vihollisia päin|tai pudota muutama pommi ensin.|Hyökkää: Laukaise lentokone tai pudota pommeja|Ylös/Alas: Ohjaa lentokonetta 04:32=Matala painovoima on tehokkaampi kuin mikään laihdutuskeino!|Hyppää korkeammalle ja pitemmälle tai anna vihollistesi|lentää entistä pitemmälle|Hyökkää: Aktivoi 04:33=Joskus tarvitset vähän lisätehoa tehdäksesi enemmän vahinkoa|Hyökkää: Aktivoi 04:34=Koskemattomuus!|Hyökkää: Aktivoi -04:35=Joskus aika kuluu liian nopeasti. Nappaa muutama lisäsekunti|viimeistelläksi hyöykkäyksesi.|Hyökkää: Aktivoi -04:36=No, joskus olet vain liian huono thähtäämään.|Hanki vähän apua nykyteknologiasta.|Hyökkää: Aktivoi +04:35=Joskus aika kuluu liian nopeasti. Nappaa muutama lisäsekunti|viimeistelläksesi siirtosi.|Hyökkää: Aktivoi +04:36=No, joskus olet vain liian huono tähtäämään.|Hanki vähän apua nykyteknologiasta.|Hyökkää: Aktivoi 04:37=Älä pelkää päivänvaloa. Se kestää vain yhden vuoron|mutta se imee vahingon jonka teet muille siileille|Hyökkää: Aktivoi 04:38=Tarkkuuskivääri on tuhoisin ase arsenaalissasi,|mutta tehoton lähietäisyydellä.|Tehty vahinko lisääntyy etäisyyden mukaan|Hyökkää: Ammu (kahdesti) 04:39=Lennä kartan muihin osiin lentävällä lautasella|Tämä vaikeasti omaksuttava apuväline vie sinut melkein minne tahansa|Hyökkää: Aktivoi|Ylös/Vasen/Oikea: Liiku tiettyyn suuntaan @@ -480,41 +486,44 @@ 04:41=Todiste siitä että luonto on lentävää lautastakin|parempi. Lintu voi kuljettaa siiliä ympäriinsä ja|pudottaa munia vihollisten päälle|Hyökkää: Aktivoi ja pudota munia|Ylös/Vasen/Oikea: Räpytä yhteen suuntaan 04:42=Tämä siirrettävä portaalilaite pystyy välittömästi|siirtämään sinut, vihollisesi tai ammuksesi|kahden paikan välillä.|Käytä sitä viisaasti ja kampanjasi tulee olemaan...|HUGE SUCCESS!|Hyökkää: Ammu portaali|Vaihto: Vaihda portaalien välillä 04:43=Tee musikaalisesta debyytistäsi räjähtävä menestys!|Pudota piano taivaista, mutta varo...|Jonkun täytyy soittaa sitä, ja se voi maksaa elämäsi!|Kursori: Valitse kohdealue|F1-F9: Soita pianoa -04:44=Tämä ei ole vain juustoa, vaan biologista sodankäyntiä!|Se ei tuota suurta vahinkoa kerralla|mutta ajastimen saavuttaessa nollan se taatusti|myrkyttää kaikki epäonniset jotka haistaa sen!|1-5: Aseta ajastin|Hyökkää: Pidä pohjassa heittääksesi isommalla voimalla +04:44=Tämä ei ole mikä tahansa juusto, vaan biologinen ase!|Se ei tuota suurta vahinkoa kerralla, mutta|ajastimen saavuttaessa nollan se taatusti|myrkyttää kaikki epäonniset jotka haistaa sen!|1-5: Aseta ajastin|Hyökkää: Pidä pohjassa heittääksesi isommalla voimalla 04:45=Istuminen kaikilla niillä fysiikan tunneilla|kannatti viimein, laukaise tuhoisa|sini-aalto vihollisiasi päin.|Varo, tämä ase potkaisee aika kovaa.|Hyökkää: Ammu -04:46=Peitä vastustajasi sähisevällä liekehtivällä nesteellä.|Sydäntä lämmittävää!|Hyökkää: Aktivoi|Ylös/Alas: Jatka tähtäystä|Vasen/Oikea: Muuta sylkyvoimaa. +04:46=Peitä vastustajasi sähisevällä liekehtivällä|nesteellä. Sydäntä lämmittävää!|Hyökkää: Aktivoi|Ylös/Alas: Jatka tähtäystä|Vasen/Oikea: Muuta sylkyvoimaa. 04:47=Kaksinkertaista hauskuus kahdella piikikkäällä,|petollisella, tarttuvalla miinalla.|Viritä ketjureaktio tai puolusta itseäsi (tai molempia!)|Hyökkää: Pidä pohjassa ampuaksesi kovemmalla voimalla (kahdesti) -04:48=Miksi vain myyrät saa kaiken pahoinpitelyn?|Siilien hakkaaminen voi olla ihan yhtä kivaa!|Sopiva isku tällä vasaralla iskee pois kolmanneksen|siilin terveydestä ja lyö ne maan alle.|Hyökkää: Ammu kohteen vierellä. +04:48=Miksi vain myyriä kaltoinkohdellaan?|Siilien torjunta voi olla ihan yhtä kivaa!|Sopiva isku tällä vasaralla iskee pois kolmanneksen|siilin terveydestä ja lyö ne maan alle.|Hyökkää: Ammu kohteen vierellä. 04:49=Herätä ystäväsi henkiin!|Mutta varo, tämä herättää myös vihollisesi henkiin.|Hyökkää: Pidä hyökkäysnappia pohjassa herättääksesi henkiin hitaasti.|Ylös: Kiihdytä henkiin herätystä 04:50=Piilotteleeko joku maan alla?|Kaiva heidät ulos poraiskulla!|Poraraketit räjähtävät ajastimen loputtua.|1-5: Säädä ajastin|Vasen/Oikea: Valitse hyökkäyssuunta|Osoitin: Valitse kohdealue -04:51=Heitä mutapallo, joka ei maksa siirtoasi.|Sysää siilet liikkeelle.|Hyökkää: Pidä pohjassa ampuaksesi kovemmalla voimalla +04:51=Heitä mutapallo, joka ei maksa siirtoasi.|Sysää siilit liikkeelle.|Hyökkää: Pidä pohjassa ampuaksesi|kovemmalla voimalla 04:52=UNUSED -04:53=Lähde matkalle ajassa ja tilassa, jättäen| muut toverit taistelemaan yksin.|Valmistaudu palautumaan koska tahansa, |äkkikuolemassa tai kun muut joukkueesi siilet on tuhottu.|Ei toimi äkkikuolemassa, jos joukkueessa on enää yksi siili tai kuninkaalla.|Hyökkää: Aktivoi. +04:53=Lähde matkalle ajassa ja tilassa, jättäen| muut toverit taistelemaan yksin.|Valmistaudu palautumaan koska tahansa, |äkkikuolemassa tai kun muut joukkueesi siilit on tuhottu.|Ei toimi äkkikuolemassa, jos joukkueessa on enää yksi siili tai kuninkaalla.|Hyökkää: Aktivoi. 04:54=Suihkuttaa tahmeita hiutaleita, muodostaen maata.|Tuki reittejä, siiliä tai luo silta!|Ole tarkkana, ettet suihkuta itseesi.|Hyökkää: Aktivoi.|Ylös/Alas: Muuta tähtäystä|Vasen/Oikea: Muuta sylkyvoimaa -04:55=Palauta jääkausi!|Pakasta siilet usean vuoron ajaksi, tai jäädytä maata ja vettä.|Hyökkää: Aktivoi -04:56=Voit heittää kaksi veitseä vihollista kohti,|tukkia käytäviä tai vaikkapa tehdä niistä portaat!|Ole kuitenkin varovainen, teräaseilla leikkiminen on vaarallista!|Hyökkää: Aktivoi -04:57=Rakenna elastinen kumiseinä, josta siilet |ja aseet kimpoavat vahingoittumatta.|Vasen/Oikea: Käännä kumea|Hiiri: Sijoita kumi +04:55=Palauta jääkausi! Pakasta siilit usean vuoron ajaksi, tai|jäädytä maata ja vettä.|Hyökkää: Aktivoi +04:56=Voit heittää kaksi veistä vihollista kohti,|tukkia käytäviä tai vaikkapa tehdä niistä portaat!|Ole kuitenkin varovainen, teräaseilla leikkiminen on vaarallista!|Hyökkää: Aktivoi +04:57=Rakenna elastinen kumiseinä, josta siilit |ja aseet kimpoavat vahingoittumatta.|Vasen/Oikea: Käännä kumea|Hiiri: Sijoita kumi +04:58=Tämä pommi leijuu ilmassa ja odottaa huolimattomia|siiliä jotka tulevat sen lähelle.|Sen teho on tavallista miinaa heikompi.|Hyökkää: Heitä ilmaan +04:59=Laita likaiset siilet pesulle! Tämä söpö pieni|kumiankka ui vedessä ja liikkuu tuulen mukana.|Se räjähtää koskettaessaan maata, joten|varmista, että pudotat sen sopivasta kohdasta.|Hyökkää: Pudota ankka ; Game goal strings 05:00=Pelimoodit 05:01=Seuraavat säännöt ovat voimassa -05:02=Linnoitukset: Puolusta linnoitustasi; kukista vastustajasi! +05:02=Sijoita kuningas: Valitse suojattu aloituspiste kuninkaallesi 05:03=Matala painovoima: Varo askeliasi -05:04=Kuolemattomuus: Siilet ovat (melkein) vahingoittumattomia -05:05=Vampyrismi: Siilet paranevat sen verran kuin ne vahingoittavat -05:06=Karma: Siilet vahingoittuvat itse saman verran kuin tekevät vahinkoa -05:07=Puolusta kunginasta: Älä anna kuninkaasi kuolla!|Sijoita kunginas: Valitse suojattu aloituspiste kuninkaallesi -05:08=Sijoita siilet: Sijoita siilesi ennen pelin alkua -05:09=Tykistö: Siilet eivät voi vaihtaa sijaintiaan +05:04=Kuolemattomuus: Siilit ovat (melkein) vahingoittumattomia +05:05=Vampirismi: Siilit paranevat sen verran kuin ne vahingoittavat +05:06=Karma: Siilit vahingoittuvat itse saman verran kuin tekevät vahinkoa +05:07=Puolusta kuningasta: Älä anna kuninkaasi kuolla! +05:08=Sijoita siilit: Sijoita siilisi ennen pelin alkua +05:09=Tykistö: Siilit eivät voi vaihtaa sijaintiaan 05:10=Vahingoittumaton maasto: Useimmat aseet eivät tuhoa maastoa -05:11=Jaetut paonkset: Kaikki saman värin joukkueet jakavat ammuksensa +05:11=Jaetut panokset: Kaikki saman värin joukkueet jakavat ammuksensa 05:12=Miinojen ajastimet: Miinat räjähtävät %1 sekunnin kuluttua 05:13=Miinojen ajastimet: Miinat räjähtävät välittömästi 05:14=Miinojen ajastimet: Miinat räjähtävät 0 - 3 sekunnin kuluttua 05:15=Vahinkokerroin: Kaikki aseet tekevät %1% vahinkopistettä 05:16=Siilien terveys palautetaan vuoron vaihtuessa -05:17=Tekoälysiilet uudelleensyntyvät kuollessa +05:17=Tekoälysiilit uudelleensyntyvät kuollessa 05:18=Rajattomat hyökkäykset 05:19=Aseet korvataan vuoron vaihtuessa 05:20=Aseita ei jaeta joukkueen kesken -05:21=Jaettu aika: Vuoron aika jaetaan tasan klaanin sisällä \ No newline at end of file +05:21=Jaettu aika: Vuoron aika jaetaan tasan klaanin sisällä +05:22=Kova tuuli: Tuuli vaikuttaa lähes kaikkeen diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/fr.lua --- a/share/hedgewars/Data/Locale/fr.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/fr.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,564 @@ locale = { --- [":("] = "", -- ["!!!"] = "", --- ["???"] = "", -- ["..."] = "", -- ["011101000"] = "", -- ["011101001"] = "", --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant ["-1 to anyone for a suicide"] = "-1 pour cause de suicide", - ["+2 for becoming a Mutant"] = "+2 pour être devenu un Mutant", +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant ["30 minutes later..."] = "30 minutes plus tard...", +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "Il y a un mois, un cyborg est venu et nous a dit que vous étiez des cannibales !", - ["Accuracy Bonus!"] = "Bonus précision", +-- ["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 Unlocked"] = "Succès débloqué", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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", ["Actually, you aren't worthy of life! Take this..."] = "En fait, tu n'es pas digne de vivre ! Prends ça....", ["A cy-what?"] = "Un cy-quoi ?", - ["Advanced Repositioning Mode"] = "Mode de repositionnement avancé", +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen ["Adventurous"] = "Aventurier", - ["a frenetic Hedgewars mini-game"] = "un mini-jeu frénétique d'HedgeWars", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy ["Africa"] = "Afrique", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "Après que Grosse Fuite ait trahit sa tribu, il rejoignât les cannibales... ", +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "Après le choc causé par l'espion ennemi, Grosse Fuite et Nuage Dense partirent chasser pour se détendre.", +-- ["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!"] = "Encore avec votre 'cannibale' truc", --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode - ["a Hedgewars challenge"] = "un challenge d'Hegdewars", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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."] = "AHHh qu'il est bon d'être à la maison. Fait en %d secondes.", -- ClimbHome +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Entraînement de tir", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice ["Air Attack"] = "Attaque Aérienne", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor ["A leap in a leap"] = "Un bond dans un bond", +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen ["A little gift from the cyborgs"] = "Un petit cadeau de la part des cyborgs", +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW ["All gone...everything!"] = "Évaporé...plus rien !", - ["Allows free teleportation between other nodes."] = "Autorise gratuitement une téléportation vers d'autres noeuds", -- Construction_Mode - ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "Autorise le placement de poutres, d'élastiques, de mines, de mines collantes et de tonneaux", -- Construction_Mode - ["Allows placement of structures."] = "Autorise le placement de structures", -- Construction_Mode - ["Allows the placement of weapons, utiliites, and health crates."] = "Autorise le placement d'armes, d'utilitaires et de caisse de soin", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen ["All right, we just need to get to the other side of the island!"] = "Très bien, nous devons juste rejoindre l'autre côté de l'île !", +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen ["All walls touched!"] = "Tous les murs sont touchés", -- WxW - ["Ammo Depleted!"] = "Munitions épuisées !", - ["ammo extended!"] = "Munitions en plus !", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler ["Ammo is reset at the end of your turn."] = "Les munitions sont réinitialisées à la fin du tour", - ["Ammo Maniac!"] = "Collectionneur de munitions !", - ["Ammo"] = "Munitions", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion ["And how am I alive?!"] = "Et comment suis-je en vie ?", - ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "Et il apparut que Grosse Fuite échoua dans sa mission ! Il atterit, alourdi par la honte...", +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood ["And so it began..."] = "Et c'est ainsi que ça commença...", +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen ["...and so the cyborgs took over the world..."] = "...Et c'est ainsi que les cyborgs prirent le contrôle du monde...", ["And so they discovered that cyborgs weren't invulnerable..."] = "Et c'est ainsi qu'ils découvrirent que les cyborgs n'étaient pas invulnérables...", +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen ["And where's all the weed?"] = "Et où est toute l'herbe ?", ["And you believed me? Oh, god, that's cute!"] = "Et tu m'as cru ? Oh mon dieu, c'est mignon !", +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - ["Antarctica"] = "Antarctique", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- ["Area"] = "Zone", -- Continental_supplies ["Are we there yet?"] = "Sommes-nous toujours là ?", ["Are you accusing me of something?"] = "Es-tu en train de m'accuser de quelque chose ? ", +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen ["Are you saying that many of us have died for your entertainment?"] = "Vous dites que beaucoup d'entre nous sont morts pour votre divertissement ? ", +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen ["Artur Detour"] = "Arthur Detour", ["As a reward for your performance, here's some new technology!"] = "Comme récompense, voici une nouvelle technologie !", --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW ["Asia"] = "Asie", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 ["Assault Team"] = "Equipe d'assault", - ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "Vu que les munitions sont éparpillées tu devrais relancer le grappin en plein vol", +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "Comme le défi était accompli, Grosse Fuite posa les pieds sur le sol...", +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 ["As you can see, there is no way to get on the other side!"] = "Comme tu peux le voir, il n'y a pas de moyen d'atteindre l'autre côté !", - ["Attack From Rope"] = "Attaquer d'une corde", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 ["Australia"] = "Australie", -- Continental_supplies ["Available points remaining: "] = "Points restants disponibles", -- need the situation of when this sentence is used +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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...", --- ["[Backspace]"] = "effacement arrière", --maybe the original name is better... +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil ["Backstab"] = "Coup de poignard dans le dos", +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal ["Bad Team"] = "Mauvaise équipe", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", --really, i don't know the good translation for this - ["Barrel Eater!"] = "Mangeur de barile", +-- ["Barrel Eater"] = "", -- Tumbler ["Barrel Launcher"] = "Lanceur de barile", --need the situation for me to understand sens of sentence +-- ["Barrel Launcher selected!"] = "", -- Tumbler +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor ["Barrel Placement Mode"] = "Mode de placement de barile", -- Construction_Mode - ["Baseball Bat"] = "Batte de Baseball", -- Construction_Mode -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Frappez vos ennemis à la batte|et envoyez-les à la mer !", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Frappez vos ennemis à la batte|, marquez des paniers ou envoyez-les à la mer !", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Entraînement au 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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Meilleurs tours par équipe", - ["Best Team Times: "] = "Meilleurs temps d'équipe", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey ["Beware, though! If you are slow, you die!"] = "Attention tout de même ! Si tu es lent, tu meurs !", +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode ["Bio-Filter"] = "Filtre Biologique", -- Construction_Mode -- ["Biomechanic Team"] = "", --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- ["Blender"] = "Mixeur", -- ["Bloodpie"] = "", -- ["Bloodrocutor"] = "", ["Bloodsucker"] = "Sangsue", ["Bloody Rookies"] = "Nouvelles recrues", -- 01#Boot_Çamp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree - ["Blowtorch"] = "Chalumeau", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- ["Blue Team"] = "Team Bleue", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", ["Bonely"] = "Bonely", --- ["BOOM!"] = "", +-- ["Bones"] = "", -- -- ["Boom!"] = "", - ["Boss defeated!"] = "Boss vaincu", - ["Boss Slayer!"] = "Tueur de Boss !", +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- ["Brainiac"] = "", -- ["Brainila"] = "", -- ["Brain Stu"] = "", -- ["Brain Teaser"] = "", +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- ["Brutus"] = "", ["Build a fortress and destroy your enemy."] = "Cronstruit une forteresse et décime ton ennemi", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer ["Build a track and race."] = "Construisez un parcours et faites la course.", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode ["Bullseye"] = "Dans le mille", +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- ["But it proved to be no easy task!"] = "Mais cela ne s'avéra pas être une tâche facile !", +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final ["But that's impossible!"] = "Mais c'est impossible !", ["But the ones alive are stronger in their heart!"] = "Mais les survivants sont plus forts dans leur coeur !", +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen ["But...we died!"] = "Mais... nous avons été tués !", ["But where can we go?"] = "Mais où pouvons nous aller ? ", +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen ["But why would they help us?"] = "Mais pourquoi nous aideraient-ils ? ", ["But you're cannibals. It's what you do."] = "Mais vous êtes cannibales. C'est ce que vous faites.", ["But you said you'd let her go!"] = "Mais vous aviez dit que vous la laisseriez partir !", - ["Cake"] = "Gâteau", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- +-- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family ["Çall me Beep! Well, 'cause I'm such a nice...person!"] = "Appelle-moi Beep ! Hum, parce que je suis du genre sympa !", +-- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood ["Çannibals"] = "Çannibales", +-- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey ["Çannibal Sentry"] = "Sentinelle cannibale", +-- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy ["Çannibals?! You're the cannibals!"] = "Çannibales ? C'est vous les cannibales !", - ["CAPTURE THE FLAG"] = "Çapturez le drapeau !", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Çareless"] = "Imprudent", ["Careless"] = "Imprudent", -- User_Mission_-_That_Sinking_Feeling -- ["Çarol"] = "", +-- ["Carol"] = "", -- A_Classic_Fairytale:family ["CHALLENGE COMPLETE"] = "Challenge Réussi", -- User_Mission_-_RCPlane_Challenge - ["Change Weapon"] = "Changez d'arme", - ["changing range from %i%% to %i%% with period of %i msec"] = "modification de la portée de %i%% à %i%% à une période de %i msec", -- Gravity +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor ["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...", +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- ["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 -- ["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"] = "Maladroit", - ["Cluster Bomb"] = "Bombe à fragmentation", -- Construction_Mode - ["Cluster Bomb MASTER!"] = "Maitre de la bombe à fragmentation", -- Basic_Training_-_Cluster_Bomb ["Cluster Bomb Training"] = "Entrainement à la bombe à fragmentation", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Nom de code : Travail d'équipe", ["Collateral Damage"] = "Dommages collatéraux", ["Collateral Damage II"] = "Dommages collatéraux II", ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen ["Come closer, so that your training may continue!"] = "Rapproche-toi, ainsi ton entraînement pourra continuer !", +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Finissez la course aussi vite que possible !", - ["COMPLETION TIME"] = "Temps d'achèvement", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen ["Configuration accepted."] = "Configuration acceptée", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 + ["Congratulations!"] = "Félicitations!", ["Congratulations"] = "Félicitations", -- Basic_Training_-_Rope - ["Congratulations!"] = "Félicitations!", - ["Congratulations! You needed only half of time|to eliminate all targets."] = "Félicitations! Tu n'as eu besoin que de la moitié du temps pour éliminer toutes tes cibles.", -- Basic_Training_-_Cluster_Bomb - ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "Félicitations! Vous avez complété le tutoriel de la corde ! |- Tutoriel terminé en 10 secondes!", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Félicitations ! Vous avez éliminé toutes les cibles|dans le temps alloué.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos ["CONSTRUCTION MODE"] = "MODE DE CONSTRUCTION", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode ["Construction Station"] = "Station de construction", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Contrôlez les piliers pour marquer des points", - ["Core"] = "Noyau", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- ["Corporationals"] = "Organismes", -- ["Corpsemonger"] = "", -- ["Corpse Thrower"] = "", ["Cost"] = "Coût", -- Construction_Mode - ["Crate Placement Tool"] = "Outil de placement de caisse", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion ["Crates Left:"] = "Caisses restantes:", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies - ["Current setting is "] = "Le paramètre actuel est ", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Empire cybernétique", ["Cyborg. It's what the aliens call themselves."] = "Cyborg. C'est ainsi que s'appellent les aliens entre eux.", -- ["Dahmer"] = "", +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE!"] = "Et merde, recrue", ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "Et merde, recrue ! Dégage de ma tête !", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Çanetons dangereux", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "poids mort", - ["Decrease"] = "Diminuer", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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"] = "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 !", - ["Defend your core from the enemy."] = "Prôtège ton noyau des ennemis", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon sélection menu"] = "Défends toi ! |Conseil : Tu peux obtenir des astuces sur l'utilisation des armes en plaçant ta souris dessus dans le menu de sélection des armes", - ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "Dématérialise les armes et l'équipement portés par les hedgehogs ennemis", -- Construction_Mode +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor ["Demolition is fun!"] = "La démolition c'est marrant", +-- ["Demo"] = "", -- The_Specialists + ["Dense Cloud must have already told them everything..."] = "Nuage Dense leur a sûrement déjà tout raconté...", ["Dense Cloud"] = "Nuage épais", - ["Dense Cloud must have already told them everything..."] = "Nuage Dense leur a sûrement déjà tout raconté...", --- ["Depleted Kamikaze!"] = "Kamikaze ... !", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Détruisez les envahisseurs pour marquer des points", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion ["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 ? ", +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen ["Did you see him coming?"] = "L'as-tu vu venir ?", ["Did you warn the village?"] = "As-tu averti le village ?", ["Die, die, die!"] = "Meurs, meurs, meurs !", +-- ["Difficulty: "] = "", -- Continental_supplies +-- ["Difficulty: Easy"] = "", -- A_Classic_Fairytale:first_blood +-- ["Difficulty: Hard"] = "", -- A_Classic_Fairytale:first_blood +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 ["Do not laugh, inexperienced one, for he speaks the truth!"] = "Ne ris pas le bleu, car il dit la vérité ! ", ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "Ne laisses pas ses mots te distraire, petit scarabée ! Il te poignardera dès que tu auras le dos tourné !", - ["Do the deed"] = "Accomplir l'acte", +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen ["Double Kill!"] = "Double meurtre !", - ["DOUBLE KILL"] = "DOUBLE MEURTRE", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["Do you have any idea how bad an exploding arrow hurts?"] = "", -- A_Classic_Fairytale:queen ["Do you have any idea how valuable grass is?"] = "Est-ce que vous avez une idée de la valeur de votre herbe ?", +-- ["Do you have any idea what it's like in the village for a woman?"] = "", -- A_Classic_Fairytale:queen +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen ["Do you think you're some kind of god?"] = "Vous vous prenez pour un genre de dieu ?", ["Dragon's Lair"] = "La tanière du dragon", - ["Drill Rocket"] = "Missile forant", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- ["Drills"] = "Perce", -- ["Drill Strike"] = "", -- Construction_Mode - ["Drone Hunter!"] = "Chasseur de drône", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer -- ["Drowner"] = "",-- can't have a good translation, think its a merge of drone and owner so if wanna translate it will be : tueur de drone, wich is like drone hunter... +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- ["Dude, all the plants are gone!"] = "Mec, toutes les plantes sont parties !", ["Dude, can you see Ramon and Spiky?"] = "Mec, peux tu voir Ramon et Spkiky ? ", +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil ["Dude, that's so cool!"] = "Mec, c'est si cool !", +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen ["Dude, we really need a new shaman..."] = "Mec, on a vraiment besoin d'un nouveau Shaman...", ["Dude, what's this place?!"] = "Mec, quel est cet endroit?", ["Dude, where are we?"] = "Mec, on est où ? ", -- ["Dude, wow! I just had the weirdest high!"] = "", +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor ["Duration"] = "Durée", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "Tempête de sable: [Inflige 15 dégâts à tous les ennemis dans le cercle]", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 ["Each turn is only ONE SECOND!"] = "Chaque tour dure seulement UNE SECONDE!", -- Frenzy ["Each turn you get 1-3 random weapons"] = "À chaque tour, tu as 1 à 3 armes aléatoires", ["Each turn you get one random weapon"] = "À chaque tour, tu as une arme aléatoire", - ["Eagle Eye"] = "Oeil d'aigle", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - + ["Eagle Eye"] = "Oeil d'aigle", -- ["Ear Sniffer"] = "", +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", - ["Eliminate your captor."] = "Éliminez votre capteur", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Éliminez tous les ennemis", +-- ["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 enemy hogs and take their weapons."] = "Éliminez les hogs ennemis and prenez leurs armes.", -- Highlander - ["Eliminate Poison before the time runs out"] = "Éliminez tout le Poison avant d'être à cours de temps.", - ["Eliminate the Blue Team"] = "Éliminez l'équipe bleue", - ["Eliminate the enemy before the time runs out"] = "Eliminez les ennemis avant que le temps ne soit épuisé", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "Éliminez l'unité 3378|- Résistance Futile doit survivre", +-- ["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 + ["Eliminate your captor."] = "Éliminez votre capteur", -- User_Mission_-_The_Great_Escape +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion ["Energetic Engineer"] = "Ingénieur énergique", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Profitez du bain ...", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 ["Everyone knows this."] = "Tout le monde sait ça.", ["Every single time!"] = "À chaque fois !", ["Everything looks OK..."] = "Tout a l'air d'être OK ...", +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil ["Exactly, man! That was my dream."] = "Exactement, mec ! C'était mon rêve.", - ["Extra Damage"] = "Dégâts supplémentaires", -- Construction_Mode - ["Extra Time"] = "Temps Supplémentaire", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 ["Eye Chewer"] = "Mâcheur d'oeil", +-- ["Fair Wind"] = "", -- ["Family Reunion"] = "Réunion de famille ", ["Fastest lap: "] = "Meilleur tour : ", ["Feeble Resistance"] = "Résistance Futile", @@ -270,62 +566,118 @@ ["Fell From Heaven"] = "Est tombé du Ciel", ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "Tombée de l'Enfer est la meilleure ! Tombée de l'Enfer est la meilleure !", ["Femur Lover"] = "Amoureux du fémur", - ["Fierce Competition!"] = "Compétition féroce!", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen ["Fiery Water"] = "Eau bouillante", +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 ["Filthy Blue"] = "Bleu dégueulasse", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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]", - ["Fire"] = "Feu", -- ["Fire a mine: [Does what it says ~ Çant be dropped close to an enemy ~ 1 sec]"] = "", -- Continental_supplies +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler ["First aid kits?!"] = "Des kits de premiers secours ?!", --- ["FIRST BLOOD MUTATES"] = "", -- Mutant ["First Blood"] = "Premier sang", +-- ["First killer will mutate"] = "", -- Mutant ["First Steps"] = "Premiers pas", +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Drapeau capturé !", ["Flag respawned!"] = "Drapeau réapparu", ["Flag returned!"] = "Drapeau récupéré", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Les drapeaux et leur base seront placés là où chaque équipe finit son premier tour", ["Flamer"] = "Flambeur", - ["Flamethrower"] = "Lance-flammes", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler ["Flaming Worm"] = "Ver flamboyant", - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 ["Flesh for Brainz"] = "Flesh for Brainz", - ["Flying Saucer"] = "Soucoupe volante", -- Construction_Mode, Frenzy - ["For improved features/stability, play 0.9.18+"] = "Pour de meilleurs fonctionnalités/stabilité, jouez en 0.9.18+", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh ["Free Dense Cloud and continue the mission!"] = "Libérez Nuage Dense et continuez la mission !", --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy ["Friendly Fire!"] = "Feu allié!", - ["fuel extended!"] = "Le plein d'essence !", - ["GAME BEGUN!!!"] = "Le jeu a commencé !!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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 ?!", +-- ["Gangsters"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", +-- ["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"] = "Informations générales", -- Continental_supplies - ["Generates power."] = "Génère de l'énergie", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 +-- ["Generator: Generates energy."] = "", -- Construction_Mode ["Generator"] = "Générateur", -- Construction_Mode ["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 out of there!"] = "Sors d'ici !", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 ["Get that crate!"] = "Prends cette caisse", ["Get the crate on the other side of the island!|"] = "Prends la caisse de l'autre côté de l'île !", --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "Fais sortir tes coéquipiers de leur prison naturelle et sauve la princesse ! |Percer des trous résoudrait tout. |Ce serait une bonne idée de placer quelques poutres avant de commencer à percer. Moi j'dis ça mais j'dis rien. |Tous vos hérissons doivent être au dessus de la hauteur marquée ! | Grosse Fuite doit être très proche de la princesse ! ", - ["GG!"] = "Bien joué!", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", - ["Goal"] = "But", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 ["Good luck...or else!"] = "Bonne chance.... ou pas !", ["Good luck out there!"] = "Bonne chance pour sortir d'ici", ["Good so far!"] = "Pas mal jusqu'ici!", @@ -334,158 +686,364 @@ ["Go, quick!"] = "Va ! Vite !", ["Gorkij"] = "Gorkij", ["Go surf!"] = "Va faire du surf", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "je t'ai eu !", - ["Grab Mines/Explosives"] = "Emparez vous des Mines/Explosifs", - ["Grants nearby hogs life-regeneration."] = "Confère de la régénération de vie aux hogs proches", -- Construction_Mode - ["Gravity"] = "Gravité", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity ["Great choice, Steve! Mind if I call you that?"] = "Bon choix, Steve ! Ça t'ennuie si je t'appele comme ça ?", +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "Bien joué! Maintenant, fracasse le avec une batte de baseball ! Astuce: Tu peux changer d'arme avec un 'clique droit'!", -- Basic_Training_-_Rope ["Great! You will be contacted soon for assistance."] = "Super ! Tu seras bientot contacté pour de l'aide.", - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies ["Greetings, cloudy one!"] = "Salutation, le nuageux !", - ["Greetings, "] = "Salutations, ", --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 ["Grenade Training"] = "Entrainement à la grenade", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- ["Guys, do you think there's more of them?"] = "Les gars, vous pensez qu'il y en a encore plus ?", --- ["HAHA!"] = "", -- ["Haha!"] = "", +-- ["HAHA!"] = "", +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen -- ["Hahahaha!"] = "", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Haha, maintenant ÇA, ça va être quelquechose !", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen ["Hammer"] = "Marteau", -- Construction_Mode, Continental_supplies ["Hannibal"] = "Hannibal", -- ["Hapless Hogs"] = "", -- [" Hapless Hogs left!"] = "", - [" HAS MUTATED"] = " a muté", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", ["Have no illusions, your tribe is dead, indifferent of your choice."] = "N'aies pas d'illusion, ta tribue est morte, quel que soit ton choix", +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 ["Have we ever attacked you first?"] = "Avons-nous jamais attaqué en premier ? ", +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode ["Healing Station"] = "Station de soignement", -- Construction_Mode +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor ["Health Crate Placement Mode"] = "Mode de placement de caisse de soin", -- Construction_Mode - ["Health crates extend your time."] = "Les caisses de vie augmentent votre temps.", +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Heavy Çannfantry"] = "", +-- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "Lourd", --- ["Heavy Çannfantry"] = "", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - --- ["Hedgewars-Basketball"] = "", --- ["Hedgewars-Knockball"] = "", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Hé, c'est pas si mal.", - ["Hellish Handgrenade"] = "Grenade de la mort", -- Construction_Mode - ["Hello again, "] = "Re-bonjour,", +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 !", ["He moves like an eagle in the sky."] = "Il se déplace comme un aigle dans le ciel", ["He must be in the village already."] = "Il doit déjà être au village", +-- ["HeneK"] = "", -- ["Here, let me help you!"] = "Laissez-moi vous aider !", ["Here, let me help you save her!"] = "Laissez-moi vous aider à la sauver !", ["Here...pick your weapon!"] = "Ici...prend ton arme !", +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer ["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 guys!"] = "Salut les gars !", ["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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos ["Hey! This is cheating!"] = "Hé ! C'est de la triche !", --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion ["Hightime"] = "Meilleur temps", +-- ["Hightower"] = "", -- +-- ["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: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "Astuce : Sélectionnez le chalumeau, visez et tirez avec [Espace]. [espace] à nouveau pour stopper. |N'explosez pas la caisse.", - ["Hint: Select the LowGravity and press [Fire]."] = "Astuce : Sélectionnez gravité faible et appuyez sur [espace]", +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "Astuce : Vous aimeriez probablement rester hors de vue et prendre toutes les caisses...|", ["His arms are so strong!"] = "Ses bras sont si forts !", --- ["Hit Combo!"] = "", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm..."] = "", ["Hmmm...actually...I didn't either."] = "Humm... en fait...je ne savais pas non plus.", - ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "Hmmm, je vais devoir trouver un moyen de le faire partir de la plateforme anti-portail", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal ["Hmmm...it's a draw. How unfortunate!"] = "Hmmm... C'est un ex-aequo. Pas de chance !", ["Hmmm...perhaps a little more time will help."] = "Humm...Peut être qu'un peu plus de temps aiderait", +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 - ["HOLY SHYTE!"] = "Mère de dieu !", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- ["Hostage Situation"] = "Situation d'otage", ["How can I ever repay you for saving my life?"] = "Comment pourrais-je jamais te remercier de m'avoir sauvé la vie ?", ["How come in a village full of warriors, it's up to me to save it?"] = "Comment entrer dans un village plein de guerriers ? C'est à moi de le sauver ?", +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen ["How difficult would you like it to be?"] = "À quel point veux-tu que ce soit difficile ?", - ["HOW DO THEY KNOW WHERE WE ARE???"] = "COMMENT SAVENT-ILS OÙ NOUS SOMMES ?", +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united +-- ["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 ...", --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Chasseur", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 ["I believe there's more of them."] = "Je crois qu'il y en a encore d'autres", +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen ["I can see you have been training diligently."] = "Je vois que tu t'es entraîné assiduement.", +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil ["I can't believe it worked!"] = "Je ne peux pas croire que ça aie marché !", ["I can't believe this!"] = "Je peux pas le croire !", ["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 Jake"] = "", -- A_Space_Adventure:ice01 ["I could just teleport myself there..."] = "Je pourrais juste me téléporter là-bas...", +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor ["I'd better get going myself."] = "Je ferais mieux de rentrer.", ["I didn't until about a month ago."] = "Je ne savais pas jusqu'à il y a un mois", - ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "Je ne sais pas comment tu as fait ca... Mais bravo ! Le prochain devrai être facile!", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen ["I feel something...a place! They will arrive near the circles!"] = "Je sens quelque chose... une localisation ! Ils vont arriver près des cercles !", ["If only I had a way..."] = "Si seulement j'avais un moyen...", ["If only I were given a chance to explain my being here..."] = "Si seulement vous me laissiez une chance d'expliquer ce que je fais ici...", ["I forgot that she's the daughter of the chief, too..."] = "J'avais oublié qu'elle était aussi la fille du chef...", +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final ["If they try coming here, they can have a taste of my delicious knuckles!"] = "S'ils essaient de venir, ils pourront goûter de mes poings", ["If you agree to provide the information we need, you will be spared!"] = "Si tu es d'accord pour nous donner les informations dont nous avons besoin, tu seras épargné !", -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "Si tu décides de nous aider, et bien, nous n'aurons plus besoin de chercher un nouveau gouverneur pour l'île.", ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "Si vous êtes coincés, utilisez l'Aigle du Désert, ou recommencez la mission", +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 ["If you know what I mean..."] = "Si tu vois ce que je veux dire...", ["If you say so..."] = "Si tu le dis...", +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil ["If you wish to restart the course, hold [Precise] while your turn ends (e.g with Skip)!|"] = "Si tu souhaites recommencer la course, maintiens [precise] quand ton tour se termine (avec [passe ton tour ] par exemple", +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos ["I guess you'll have to kill them."] = "Je suppose que vous devrez les tuer", ["I have come to make you an offering..."] = "Je suis venu te faire une offre...", +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen +-- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow ["I have no idea where that mole disappeared...Çan you see it?"] = "Je n'ai aucune idée où cette taupe a bien pu aller... Peux-tu la voir ?", +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 ["I have to follow that alien."] = "Je dois suivre cet extraterrestre", ["I have to get back to the village!"] = "Je dois retourner au village !", +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 ["I hope you are prepared for a small challenge, young one."] = "J'espère que tu es préparé pour un petit défi, petit scarabée", ["I just don't want to sink to your level."] = "Je ne veux pas m'abaisser à ton niveau.", +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos ["I'll hold them off while you return to the village!"] = "Je vais les retenir pendant que tu retournes au village", +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "Imagines que ces cibles sont les loups qui ont tués tes parents ! Défoule ta colère sur eux !", ["I'm...alive? How? Why?"] = "Je suis...vivant ? Comment ? Pourquoi ?", ["I'm a ninja."] = "Je suis un ninja", ["I marked the place of their arrival. You're welcome!"] = "J'ai marqués les lieux d'où ils arriveront. De rien !", +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "Ce doit être une erreur, mes chers hérissons", ["I mean, none of you ceased to live."] = "Je veux dire, aucun d'entre vous n'a cessé de vivre", ["I'm getting old for this!"] = "Je deviens vieux pour ça !", ["I'm getting thirsty..."] = "J'ai soif", +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil ["I'm here to help you rescue her."] = "Je suis ici pour t'aider à la secourir.", +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen ["I'm not sure about that!"] = "Je n'en suis pas si sûr !", ["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 ["I'm so scared!"] = "J'ai tellement peur !", - ["Increase"] = "Augmente", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen ["Incredible..."] = "Incroyable...", +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace ["I need to find the others!"] = "Je dois trouver les autres !", ["I need to get to the other side of this island, fast!"] = "Je dois aller sur l'autre côté de cette île, rapidemment !", ["I need to move the tribe!"] = "Je dois emmener la tribue", ["I need to prevent their arrival!"] = "Je dois prévoir leur arrivée !", ["I need to warn the others."] = "Je dois avertir les autres.", ["In fact, you are the only one that's been acting strangely."] = "En fait, tu es le seul qui ait agi étrangement.", - ["In order to get to the other side, you need to collect the crates first.|"] = "Dans le but d'atteindre l'autre coté, tu dois d'abord collecter les caisses ", - ["INSANITY"] = "FOLIE", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Instructeur", -- 01#Boot_Çamp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode ["Interesting idea, haha!"] = "Idee intéressante, haha !", ["Interesting! Last time you said you killed a cannibal!"] = "Intéressant ! La dernière fois tu as dit que tu avais tué un cannibale !", +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "Envahisseur détruit", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode ["Invasion"] = "Invasion", --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen ["I saw it with my own eyes!"] = "Je l'ai vu de mes propres yeux !", ["I see..."] = "Je vois...", +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon ["I see you have already taken the leap of faith."] = "Je vois que tu as déjà fait le saut de la foi.", ["I see you would like his punishment to be more...personal..."] = "Je vois que tu voudrais que son châtiment soit plus...personnel...", +-- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab ["I sense another wave of cannibals heading our way!"] = "Je sens qu'une autre vague de cannibale arrive !", +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 ["I shouldn't have drunk that last pint."] = "Je n'aurais pas du boire cette dernière pinte", ["Is this place in my head?"] = "Est-ce que cet endroit est dans ma tête ?", +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "Ça n'a pas d'importance. Je ne laisserais pas cet alien blesser ma fille !", +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil ["I think we are safe here."] = "Je pense que nous sommes en sécurité ici.", ["I thought their shaman died when he tried our medicine!"] = "Je pensais que leur shaman mourut quand il essaya notre potion !", ["It is called 'Hogs of Steel'."] = "C'est appelé 'hérissons d'acier' .", @@ -495,554 +1053,1316 @@ ["It must be the aliens' deed."] = "Ce doit être à cause des extraterrestres", ["It must be the cyborgs again!"] = "Ce doit encore etre les cyborgs !", ["I told you, I just found them."] = "Je te l'ai dit, je les ai juste trouvés", +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "C'est une bonne chose que la MORT SUBITE soit dans 99 tours", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil ["It's always up to women to clear up the mess men created!"] = "C'est toujours aux femmes de s'occuper du bazar que les hommes ont créé !", +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen ["It's a shame, I forgot how to do that!"] = "C'est une honte, j'ai oublié comment faire !", +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion ["It's impossible to communicate with the spirits without a shaman."] = "C'est impossible de communiquer avec les esprits sans un shaman.", +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer ["It's over..."] = "C'est terminé...", +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen ["It's time you learned that your actions have consequences!"] = "Il est temps pour toi d'apprendre que tes actions ont des conséquences !", ["It's worth more than wood!"] = "C'est pire que le bois !", +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil ["It wants our brains!"] = "Ça veut nos cerveaux", +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen ["It was not a dream, unwise one!"] = "Ce n'était pas un rêve, imprudent !", +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 ["I've seen this before. They just appear out of thin air."] = "J'ai déjà vu ça. Ils apparaissent dans les airs", +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 ["I want to play a game..."] = "Je veux faire un jeu...", ["I want to see how it handles this!"] = "Je veux voir comment ils vont faire avec ça !", - ["I wish to help you, "] = "Je souhaite t'aider,", +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon ["I wonder where Dense Cloud is..."] = "Je me demande où est Nuage Dense...", ["I wonder why I'm so angry all the time..."] = "Je me demande pourquoi je suis toujours tellement en colère", ["I won't let you kill her!"] = "Je ne te laisserai pas la tuer !", +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Le saut est désactivé", ["Just kidding, none of you have died!"] = "Je rigole, aucun d'entre vous n'est mort !", +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen ["Just on a walk."] = "Je faisais juste une promenade", ["Just wait till I get my hands on that trauma! ARGH!"] = "Attends un peu que je mette la main sur ce traumatisme ! ARGH !", +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode --- ["Kamikaze Expert!"] = "", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion ["Keep it up!"] = "Continue !", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab ["Killing spree!"] = "Massacre", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 ["KILL IT!"] = "TUE LE !", - ["KILLS"] = "Meurtres", +-- ["Kills: %d"] = "", -- Space_Invasion ["Kill the aliens!"] = "Tue les aliens !", ["Kill the cannibal!"] = "Tue le cannibale !", - ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "Tue le traître... ou épargne sa vie ! |Tue le ou appuie sur [Precise] !", --- ["Land Sprayer"] = "", -- Construction_Mode - ["Laser Sight"] = "Visée laser", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion ["Last Target!"] = "Dernière cible !", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Leaderbot"] = "", ["Leader"] = "Chef", --- ["Leaderbot"] = "", +-- ["Lead the Green Bananas 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 !", ["Leaks A Lot must survive!"] = "Grosse Fuite doit survivre !", -- ["Led Heart"] = "", -- ["Lee"] = "", --- ["left shift"] = "", -- Continental_supplies --- ["[Left Shift]"] = "",-- touche majuscule gauche --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies ["Let me test your skills a little, will you?"] = "Laisse-moi te tester un peu, veux-tu ?", +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 ["Let's go home!"] = "Rentrons à la maison !", +-- ["Let's go, %s!"] = "", -- WxW ["Let's head back to the village!"] = "Retournons au village !", ["Let's see what your comrade does now!"] = "Voyons ce que fait ton camarade maintenant !", ["Let's show those cannibals what we're made of!"] = "Montrons à ces cannibales de quel bois on se chauffe !", ["Let them have a taste of my fury!"] = "Ils vont goûter de ma fureur !", ["Let us help, too!"] = "Allons aider nous aussi !", +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Çannfantry"] = "", --- ["Limburger"] = "", -- Construction_Mode +-- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Écoutez, asticots", ["Little did they know that this hunt will mark them forever..."] = "Savait-il que cette chasse allait les marquer à jamais...", -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 !", - ["Low Gravity"] = "Peu de gravité", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion ["Luckily, I've managed to snatch some of them."] = "Heureusement, j'ai réussi à en avoir quelques unes", --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- ["Made it!"] = "Je l'ai fait !", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer ["May the spirits aid you in all your quests!"] = "Puissent les esprits t'aider dans tes quêtes !", +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "Soin: [Tire un kit de survie explosif qui soigne tous les hogs dans le rayon de l'explosion]", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", - ["Mine Eater!"] = "Mangeur de Mines", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode --- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "Mission réussie", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "SUCCÈS DE LA MISSION", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- ["More Natives"] = "Plus d'indigènes", --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Mouvement: [haut], [bas], [gauche], [droite]", --- ["Mudball"] = "", -- Construction_Mode --- ["Multi-shot!"] = "", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", ["Muscle Dissolver"] = "Monsieur Muscle", --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [Fire a bomb with napalm!]"] = "", -- Continental_supplies +-- ["Naranja Jed"] = "", -- A_Space_Adventure:fruit01 ["Natives"] = "Indigènes", -- ["Naughty Ninja"] = "", -- User_Mission_-_Dangerous_Ducklings - ["New Barrels Per Turn"] = "Nouveaux barrils par tour", --- ["NEW CLAN RECORD: "] = "", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "Nouveau meilleur temps", - ["New Mines Per Turn"] = "Nouvelles mines par tour", - ["NEW RACE RECORD: "] = "NOUVEAU RECORD DE COURSE", - ["Newton's Hammock"] = "Le hammac de Newton", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos ["Nicely done, meatbags!"] = "Bien joués, sac à viande !", - ["Nice work, "] = "Beau boulot, ", +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 ["Nice work!"] = "Beau travail !", +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 ["No, I came back to help you out..."] = "Non je suis revenu pour t'aider...", ["No...I wonder where they disappeared?!"] = "Non...Je me demande où ils ont disparu ?!", -- ["Nom-Nom"] = "", -- ["NomNom"] = "", +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 ["Nope. It was one fast mole, that's for sure."] = "Non. C'était une taupe rapide, ça c'est certain.", ["No! Please, help me!"] = "Non ! S'il te plaît, aide moi !", +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "Pas assez de points de passage", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion ["Not now, Fiery Water!"] = "Pas maintenant, Fiery Water !", ["Not So Friendly Match"] = "Match pas si amical", -- Basketball, Knockball ["Not you again! My head still hurts from last time!"] = "Pas encore vous ! Ma tête me fait encore mal de la dernière fois !", +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer ["No, we made sure of that!"] = "Non, nous nous en sommes assurés", -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 ["No! What have I done?! What have YOU done?!"] = "Non ! Qu'ais-je fait ? Qu'est-ce que TU as fait ?!", ["No. Where did he come from?"] = "Non. D'où est-il venu ?", ["Now how do I get on the other side?!"] = "Maintenant, comment je me rends de l'autre coté ?", +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 ["No. You and the rest of the tribe are safer there!"] = "Non, toi et le reste de la tribu êtes plus en sécurité ici ! ", --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", ["Obstacle course"] = "Course d'obstacles", +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen ["Of course I have to save her. What did I expect?!"] = "Bien sûr je dois la sauver. Qu'est ce que j'imaginais ?", +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 ["OH, COME ON!"] = "OH, ALLEZ !", +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 +-- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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.", +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- ["Omnivore"] = "", ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "Il était une fois, sur une île possédant de grandes ressources naturelles, vivaient deux tribus en violent conflit...", --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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", --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer ["Oops...I dropped them."] = "Oups ... Je les ai laissées tomber.", +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 ["Open that crate and we will continue!"] = "Ouvre cette caisse et nous pourrons continuer", --- ["Operation Diver"] = "", ["Opposing Team: "] = "Équipe opposée", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome ["Our tribe, our beautiful island!"] = "Notre tibu, notre belle ile !", +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Hérisson pathétique #%d", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies ["Pfew! That was close!"] = "Ouf! C'est pas passé loin !", +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor ["Place more waypoints using the 'Air Attack' weapon."] = "Place plus de points de passage avec l'arme : attaque aérienne.", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos ["Play with me!"] = "Joue avec moi !", --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["POINTS"] = "", -- Mutant +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- 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 ["Poison"] = "Poison", +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "Astuce du Portail : l'un est la destination, l'autre est l'entrée ", --- ["Portal mission"] = "", -- portal --- ["Power Remaining"] = "", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["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", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory ["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", --- ["Race complexity limit reached."] = "", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 ["Really?! You thought you could harm me with your little toys?"] = "Vraiment ? Tu pensais pouvoir me blesser avec tes petits jouets ?", +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- ["Reinforcements"] = "", +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "Souviens toi, pathétique animal : quand le jour viendra, tu regretteras ton aveugle loyauté !", --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "Retourne vers Grosse Fuite ! Si tu es bloqué, appuie sur [Precise] pour réessayer !", +-- ["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 +-- ["Rider"] = "", -- portal +-- ["Rifleman"] = "", -- Battalion -- ["Righteous Beard"] = "Righteous Beard", --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- ["Rot Molester"] = "Rot Molester", --- ["Round Limit:"] = "", --- ["Round Limit"] = "", --- ["Rounds Complete: "] = "", --- ["Rounds Complete"] = "", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "RÈGLES DU JEU | [Appuyez Échap pour voir]", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", +-- ["Salty Dog"] = "", -- ["Salvation"] = "Le salut", ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 -- ["Save as many hapless hogs as possible!"] = "", ["Save Fell From Heaven!"] = "Sauve Tombée de l'Enfer ! ", - ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "Sauve Grosse Fuite ! |L'outil changer de hérisson pourrait aider", +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "Sauve la princesse, tous tes hérissons doivent survivre ! |Tue les cyborgs en premier ! Utilise les munitions très prudemment ! |Tu voudras peut être garder une poutre pour te couvrir !", ["Save the princess by collecting the crate in under 12 turns!"] = "Sauve la princesse en collectant la caisse en moins de 3 tours !", +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", --- ["SCORE"] = "", --- ["Score"] = "", -- Mutant - --- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Çapture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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 ? ", ["See ya!"] = "Bye bye", -- ["Segmentation Paul"] = "", +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies - ["Select difficulty: [Left] - easier or [Right] - harder"] = "Choisis la difficulté : [Gauche] : plus facile, ou [Droite] : plus dur", -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["s"] = "", -- GaudyRacer, Space_Invasion +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge ["... share your beauty with the world every morning, my princess!"] = "...partage ta beauté avec le monde chaque matin, ma princesse !", +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- ["She's behind that tall thingy."] = "Elle est derrière ce grand truc.", - ["Shield boosted! +30 power"] = "Bouclier boosté! +30", - ["Shield Depleted"] = "Bouclier épuisé", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Bouclier chargé à fond!", - ["Shield Master!"] = "Maître du Bouclierr", --- ["Shield Miser!"] = "", - ["Shield OFF:"] = "Bouclier OFF", - ["Shield ON:"] = "Bouclier ON", --- ["Shield Seeker!"] = "", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Équipe de choc", - ["Shotgun Training"] = "Entraînement au fusil", ["shots remaining."] = "Tirs restants", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil -- ["Silly"] = "", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode -- ["Sinky"] = "", -- ["Sirius Lee"] = "", - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s est dehors et l'équipe %d| reçoit une pénalité ! | |Score : ", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s est dehors et l'équipe %d| reçoit un point ! | |Score : ", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- ["Slippery"] = "Glissant", --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- ["Smith 0.98"] = "", -- ["Smith 0.99a"] = "", -- ["Smith 0.99b"] = "", -- ["Smith 0.99f"] = "", -- ["Smith 1.0"] = "", +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos ["So humiliating..."] = "Si humiliant...", --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies ["So? What will it be?"] = "Alors ? Qu'est ce que ce sera ?", --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- ["Sponge"] = "éponde",--?? ["Spooky Tree"] = "Arbre fantomatique", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer ["Step By Step"] = "Pas à Pas", -- ["Steve"] = "", -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "Survis ! Les cinématique peuvent être passées avec la touche [Precise]. ", +-- ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW +-- ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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", +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies -- ["Switched to "] = "", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- ["Talk about mixed signals..."] = "Parlons des signaux mélangés", --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Équipe %d : ", --- ["Team Scores"] = "", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy ["Teleport hint: just use the mouse to select the destination!"] = "Téléporte : utilise la souris pour sélectionner la destination !", -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil ["Thanks!"] = "Merci !", +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 ["Thank you, my hero!"] = "Merci, mon héros !", ["Thank you, oh, thank you, Leaks A Lot!"] = "Merci, oh, merci, Grosse Fuite !", ["Thank you, oh, thank you, my heroes!"] = "Merci, oh, merci mes héros !", +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 ["That is, indeed, very weird..."] = "C'est ça, en effet, très étrange...", ["That makes it almost invaluable!"] = "Ça la rends presque inestimable !", ["That ought to show them!"] = "Ça leur apprendra !", +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil ["That's for my father!"] = "Pour mon père !", ["That shaman sure knows what he's doing!"] = "Ce Shaman sait vraiment ce qu'il fait !", -- ["That Sinking Feeling"] = "", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen ["That's not our problem!"] = "Ce n'est pas notre problème !", ["That's typical of you!"] = "C'est typiquemment vous !", +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen ["That was just mean!"] = "C'était méchant !", - ["That was pointless."] = "C'était inutile.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 ["The answer is...entertaintment. You'll see what I mean."] = "La réponse est... divertissement. Tu comprendras ce que je veux dire", --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 ["The Bull's Eye"] = "Dans le mille", ["The caves are well hidden, they won't find us there!"] = "Les cavernes sont bien cachées, ils ne nous y trouverons pas !", +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 ["The Crate Frenzy"] = "Frénésie de caisses", +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- ["The Dilemma"] = "Le dilemne", - ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "Les ennemis ne peuvent pas bouger mais ce serait une bonne idée de rester hors de vue", +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "L'ennemi se cache là-bas sur le canard !", ["The Enemy Of My Enemy"] = "Les ennemis de mes ennemis", +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 ["The First Blood"] = "Le premier sang", ["The First Encounter"] = "La première rencontre", --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Le drapeau va réapparaitre au prochain tour", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling ["The food bites back"] = "La nourriture mord en retour", ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 ["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 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.", +-- ["The Iron Curtain"] = "", -- ["The Journey Back"] = "Le voyage du retour", +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen ["The Leap of Faith"] = "Le saut de la foi", +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos ["The Moonwalk"] = "La Marche Lunaire", -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope ["Then how do they keep appearing?"] = "Alors, comment continuent-il à apparaître ?", +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen ["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 player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 ["There must be a spy among us!"] = "Il doit y avoir un espion parmi nous", ["There's more of them? When did they become so hungry?"] = "Il y en encore ? Quand sont-ils devenu si affamés ?", ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "Il n'y a rien de plus satisfaisant pour moi que de te voir partager ta beauté avec le monde chaque matin, ma princesse !", ["There's nothing more satisfying to us than seeing you share your beauty..."] = "Il n'y a rien de plus satisfaisant pour moi que de te voir partager ta beauté...", -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", ["The Rising"] = "L'ascension", +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 ["The Savior"] = "Le sauveur", ["These primitive people are so funny!"] = "Ces primitis sont si amusants !", ["The Shadow Falls"] = "La chute des ombres", ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "Les esprits des ancêtres sont sûrement ravis, Grosse Fuite.", +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 ["The Torment"] = "Le supplice", +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 ["The Tunnel Maker"] = "Le creuseur de tunnel", ["The Ultimate Weapon"] = "L'arme ultime", ["The Union"] = "L'union", ["The village, unprepared, was destroyed by the cyborgs..."] = "Le village, non préparé, fut détruit par les cyborgs...", ["The walk of Fame"] = "La marche d'honneur", ["The wasted youth"] = "Une jeunesse ruinée", +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen ["The weapon in that last crate was bestowed upon us by the ancients!"] = "L'arme dans cette dernière caisse nous a été conférée par les anciens", -- ["The what?!"] = "", ["The wind whispers that you are ready to become familiar with tools, now..."] = "Le vent me murmure que tu es maintenant prêt à te familiariser avec les outils ...", ["They are all waiting back in the village, haha."] = "Ils attendent tous au village, haha.", --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They Çall Me Bullseye!"] = "", -- Space_Invasion ["They have weapons we've never seen before!"] = "Ils ont des armes que nous n'avons jamais vu avant !", -- ["They keep appearing like this. It's weird!"] = "", --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united ["They must be trying to weaken us!"] = "Ils doivent essayer de nous affaiblir !", ["They never learn"] = "Ils n'apprennent jamais", +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen ["They told us to wear these clothes. They said that this is the newest trend."] = "Ils nous ont dit de porter ces vêtements. Ils nous ont dit que c'était la nouvelle mode.", ["They've been manipulating us all this time!"] = "Ils nous ont tous manipulé cette fois !", +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "Ça y est ! il est temps d'impressionner Tombée de l'Enfer ", ["This island is the only place left on Earth with grass on it!"] = "Cette île est le dernier endroit sur terre avec de l'herbe dessus !", +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 ["This is typical!"] = "C'est typique !", ["This must be some kind of sorcery!"] = "Ce doit être une sorte de sorcellerie", ["This must be the caves!"] = "Ce doit être les cavernes !", ["This one's tricky."] = "Celui-là est piégeux.", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Cette pluie, c'est vraiment quelque chose !", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- ["Those aliens are destroying the island!"] = "Ces aliens sont en train de détruire l'ile !", --- ["Timed Kamikaze!"] = "", --- ["Time Extended!"] = "", --- ["Time Extension"] = "", - ["TIME: "] = "TEMPS : ", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope --- ["Toggle Shield"] = "", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 ["To help you, of course!"] = "Pour t'aider évidemment !", +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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]", ["Torn Muscle"] = "Muscle déchiré", - [" to save the village."] = "de sauver le village", ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "COURSE COMPLÉTÉE", - --- ["training"] = "", -- portal +-- ["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", +-- ["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 -- ["Tribe"] = "", -- ["TrophyRace"] = "", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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", -- ["T_T"] = "", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", - [" turns until Sudden Death! Better hurry!"] = "tours avant la mort subite ! tu ferais mieux de te dépêcher !", --- ["Turn Time"] = "", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos ["Two little hogs cooperating, getting past obstacles..."] = "Deux petits hérissons coopérant à passer les obstacles...", +-- ["Ugly Mug"] = "", -- ["Uhm...I met one of them and took his weapons."] = "hum... J'ai rencontré l'un d'entre eux et j'ai pris ses armes.", +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen ["Uhmm...ok no."] = "Humm... ok non.", --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit"] = "", -- ["Unit 0x0007"] = "", +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", ["Unit 3378"] = "Unité 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- -- ["Unit 835"] = "", +-- ["Unit 883"] = "", -- ["United We Stand"] = "Nous restons unis", +-- ["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 - ["[Up], [Down] to aim, [Space] to shoot!"] = "[haut], [bas] pour viser, [espace] pour tirer !", +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge ["Use it wisely!"] = "à utiliser intelligemment", ["Use it with precaution!"] = "À utiliser avec précaution", -- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 ["Use the rope to get on the head of the mole, young one!"] = "Utilise le grappin pour atteindre la tête de la taupe, le bleu !", +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Utilisez votre Grappin pour aller du début à la fin aussi vite que vous pouvez !", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion ["Vedgies"] = "Vedgies", +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 !", --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 ["Watch your steps, young one!"] = "Regarde ou tu marches le bleu !", --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Point de passage placé.", - ["Way-Points Remaining"] = "Points de passage restants", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer ["Weaklings"] = "Faiblesses", ["We all know what happens when you get frightened..."] = "Nous savons tous ce qui arrive quand tu es effrayé", -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion ["Weapons Reset"] = "Armes réinitialisées", --- ["Weapons reset."] = "", -- Highlander +-- ["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 !", ["We can't hold them up much longer!"] = "Nous ne pouvons pas les retenir plus longtemps !", ["We can't let them take over our little island!"] = "Nous ne pouvons pas les laisser prendre notre petite île !", +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen ["We have no time to waste..."] = "Nous n'avons pas de temps à perdre...", ["We have nowhere else to live!"] = "Nous n'avons nul part autre où vivre !", +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "Bienvenue, Grosse Fuite !", +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos -- ["Well done."] = "", ["We'll give you a problem then!"] = "Nous allons vous donner des problèmes alors !", +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 ["We'll spare your life for now!"] = "Nous t'épargnons la vie pour le moment !", +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil ["Well, that was a waste of time."] = "Bien, c'était une perte de temps.", +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos ["Well, well! Isn't that the cutest thing you've ever seen?"] = "Bien, Bien ! N'est pas la chose la plus mignonne que tu aies jamais vu ? ", ["Well, yes. This was a cyborg television show."] = "Bien, oui. C'est une émission de télévision cyborg.", +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen ["We made sure noone followed us!"] = "Nous nous sommes assurés que personne ne nous as suivis !", +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen ["We need to move!"] = "Nous devons partir !", ["We need to prevent their arrival!"] = "Nous devons prévoir leur arrivée !", ["We need to warn the village."] = "Nous devons avertir le village", +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos ["We should head back to the village now."] = "Nous devrions retourner au village maintenant.", +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen ["We were trying to save her and we got lost."] = "On essayait de la sauver et on s'est perdu.", +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen ["We won't let you hurt her!"] = "Nous ne te laisserons pas la blesser !", +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "Quoi ?! Un cannibale ? Ici ? Il n'y a pas de temps à perdre ! Viens, tu es préparé.", +-- ["What?!"] = "", -- A_Classic_Fairytale:queen ["What a douche!"] = "Quelle douche !", +-- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family ["What are you doing at a distance so great, young one?"] = "Qu'est ce que tu fais si loin, le bleu ? ", ["What are you doing? Let her go!"] = "Que fais-tu ? Laisse la partir ! ", ["What a ride!"] = "Quel voyage !", ["What a strange cave!"] = "Quelle étrange caverne !", ["What a strange feeling!"] = "Quel étrange sentiment !", +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen ["What do my faulty eyes observe? A spy!"] = "Que voient mes vieux yeux ? Un espion !", +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 --["Whatever floats your boat..."] = "Comme tu veux...", --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab ["What? Here? How did they find us?!"] = "Quoi ? ici ? Comment nous ont-ils trouvés ?", +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen ["What is this place?"] = "Quel est cet endroit ? ", +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen ["What shall we do with the traitor?"] = "Que devons nous faire avec le traître ? ", +-- ["What the?"] = "", -- A_Classic_Fairytale:queen ["WHAT?! You're the ones attacking us!"] = "Quoi ?! C'est vous qui nous attaquez !", ["When I find it..."] = "Quand je vais le trouver...", ["When?"] = "Quand ?", @@ -1056,31 +2376,39 @@ ["Where do you get that?!"] = "D'où ça vous vient ?!!", ["Where have you been?!"] = "Où étais-tu ?!", ["Where have you been?"] = "Où étais-tu ? ", --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen ["Why are you doing this?"] = "Pourquoi fais tu ça ? ", ["Why are you helping us, uhm...?"] = "Pourquoi nous aidez vous, hum ...?", ["Why can't he just let her go?!"] = "Pourquoi ne peut-il pas juste la laisser partir ?!", +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen ["Why do men keep hurting me?"] = "Pourquoi les hommes continuent de me blesser ?", +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen ["Why do you not like me?"] = "Pourquoi tu m'aimes pas ?", ["Why do you want to take over our island?"] = "Pourquoi voulez vous notre île ?", ["Why me?!"] = "Pourquoi moi ?!", +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen ["Why would they do this?"] = "Pourquoi feraient-ils ça ?", -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant - ["WINNING TIME: "] = "Temps gagnant : ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer ["Wise Oak"] = "Faucon Sage", ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "Avec Nuage Dense dans le territoire des ombres, je suis le seul espoir du village...", - ["With the rest of the tribe gone, it was up to "] = "Avec le reste de la tribu partie, il était temps de ", +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "Pas d'inquiétude, c'est un animal pacifique ! Il n'y a pas de raison d'avoir peur...", ["Wow, what a dream!"] = "Wow, quel rêve !", +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- ["Y3K1337"] = "Y3K1337", ["Yay, we won!"] = "Ouais, on a gagné !", -- ["Y Chwiliad"] = "", @@ -1088,69 +2416,227 @@ ["Yeah, sure! I died. Hillarious!"] = "Ouais, sûr ! Il est mort. Hillarant !", ["Yeah, take that!"] = "Ouais, prends ça !", ["Yeah? Watcha gonna do? Cry?"] = "Ouais? Qu'est ce que tu vas faire ? Pleurer ? ", +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen ["Yes!"] = "Oui !", ["Yes, yeees! You are now ready to enter the real world!"] = "Oui, Ouiii ! Maintenant tu es prêt à entrer dans le monde réel !", +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen ["Yo, dude, we're here, too!"] = "Yo mec, on est là aussi !", --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome ["You are given the chance to turn your life around..."] = "Tu as une chance de voir ta vie changer de cap...", +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos ["You are playing with our lives here!"] = "Vous jouez avec nos vies !", --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["You bear impressive skills, "] = "Tu as des compétences impressionantes, ", --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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..."] = "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 beaten the challenge!"] = "", -- ClimbHome ["You have been giving us out to the enemy, haven't you!"] = "Tu nous as vendu aux ennemis, n'est ce pas ?!", --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope ["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 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 !", ["You have finally figured it out!"] = "Tu t'en es finallement rendu compte !", +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice ["You have kidnapped our whole tribe!"] = "Vous avez kidnappé notre tribu entière !", +-- ["You have killed all enemies."] = "", -- Big_Armory ["You have killed an innocent hedgehog!"] = "Tu as tué un innocent !", +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge ["You have proven yourself worthy to see our most ancient secret!"] = "Tu as prouvé que tu étais digne de voir notre plus ancien secret !", ["You have proven yourselves worthy!"] = "Vous vous êtes montrés dignes !", +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "Vous avez marqué !", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb - ["You have "] = "Tu as", +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos ["You have won the game by proving true cooperative skills!"] = "Vous avez gagné le jeu en prouvant de vraies compétences de coopération !", ["You just appeared out of thin air!"] = "Tu es apparu comme par magie ! ", +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen ["You just committed suicide..."] = "Tu viens de signer ton arrêt de mort...", ["You killed my father, you monster!"] = "Tu as tué mon père, monstre !", ["You know...taking a stroll."] = "Vous savez... promenade.", ["You know what? I don't even regret anything!"] = "Tu sais quoi ? Je ne regrette rien !", +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag ["You meatbags are pretty slow, you know!"] = "Vous les sacs à viande êtes plutot lent vous savez !", ["You might want to find a way to instantly kill arriving cannibals!"] = "Tu aimerais sûrement trouver un moyen de tuer instantanément les cannibales qui arrivent !", +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen ["Young one, you are telling us that they can instantly change location without a shaman?"] = "Disciple, tu es en train de nous dire qu'ils peuvent changer de place sans shaman ?", +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer ["You probably know what to do next..."] = "Tu sais probablement ce que tu dois faire ensuite....", - ["Your deaths will be avenged, cannibals!"] = "Vos morts seront vengées, cannibales !", +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 !", ["You're a pathetic liar!"] = "Tu es un menteur pathétique", ["You're funny!"] = "Tu es drôle !", --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen ["You're pathetic! You are not worthy of my attention..."] = "Tu es pathétique ! Tu n'es pas digne de mon attention... ", ["You're probably wondering why I bought you back..."] = "Tu te demandes probablement pourquoi je t'ai ramené...", +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen ["You're terrorizing the forest...We won't catch anything like this!"] = "Tu terrorrises la fôret... Nous n'attraperons rien comme ça !", +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome ["Your hogs must survive!"] = "Vos hérissons doivent survivre !", ["Your movement skills will be evaluated now."] = "Tes compétences de mouvement vont maintenant être évaluées .", --- ["You saved"] = "", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal -- ["'Zooka Team"] = "", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/fr.txt --- a/share/hedgewars/Data/Locale/fr.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/fr.txt Sun Dec 17 00:09:24 2017 +0100 @@ -58,7 +58,7 @@ 00:55=Congélateur 00:56=Hachoir -01:00=C'est parti ! +; 01:00=Loading … 01:01=Round ex-aequo 01:02=%1 gagne ! 01:03=Volume %1% @@ -217,11 +217,11 @@ 02:02=Combattez jusqu'à la fin ! 02:02=Que la force soit avec vous ! -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 gagne ! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Round ex-aequo ; New health crate 02:05=Pharmacie ! @@ -494,12 +494,12 @@ ; Game goal strings 05:00=Modes de jeu 05:01=Les règles suivantes s'appliquent -05:02=Forts : Défendez votre forteresse ; exterminez vos ennemis ! +05:02=Placez le roi : Choisissez un point de départ sécurisé pour le roi 05:03=Faible gravité : Attention à vos mouvements 05:04=Invulnérabilité : Les hérissons sont (presque) invulnérables 05:05=Vampirisme : Les hérissons récupèrent des points de vie par les dégâts qu'ils infligent 05:06=Karma: Les hérissons sont victimes des blessures qu'ils infligent -05:07=Protégez le roi : Ne laissez pas mourir le roi !|Placez le roi : Choisissez un point de départ sécurisé pour le roi +05:07=Protégez le roi : Ne laissez pas mourir le roi ! 05:08=Placez les hérissons : Placez vos hérissons avant le début de la partie 05:09=Artillerie : Les hérissons ne peuvent pas se déplacer pour changer de place 05:10=Terrain indestructible : La plupart des armes sont incapables de modifier le terrain diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/gd.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Locale/gd.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,549 @@ +; Scottish Gaelic locale + +00:00=Durcan-spreadhaidh +00:01=Boma sgapaidh +00:02=Bazooka +00:03=Seillean-amasaidh +00:04=Gunna-froise +00:05=Piocaid ’s òrd +00:06=Leig seachad +00:07=Ròpa +00:08=Mèinn +00:09=Iolaire an fhàsaich +00:10=Dineamait +00:11=Bata ball-beusa +00:12=Shoryuken +00:13=diog +00:14=Paraisiut +00:15=Ionnsaigh adhair +00:16=Buille mèinne +00:17=Lòchran +00:18=Togail +00:19=Tele-portadh +00:20=Gràineag eile +00:21=Mortar +00:22=Cuip +00:23=Kamikaze +00:24=Cèic +00:25=Suirghe +00:26=Boma meal-bhuic +00:27=Durcan-spreadhaidh ifrinneach +00:28=Rocaid tochlaidh +00:29=Gunna-bhàlaichean +00:30=Napalm +00:31=Itealan le smachd chèin +00:32=Iom-tharraing ìosal +00:33=Barrachd dhochainn +00:34=Do-leònaidh +00:35=Barrachd ùine +00:36=Fradharc leusair +00:37=Sùgh fala +00:38=Isneach fàtha +00:39=Soitheach-itealaich +00:40=Molotov Cocktail +00:41=Eunan +00:42=Tele-phortadh sgiobalta +00:43=Clàrsach mòr +00:44=Seann-chàise Limburg +00:45=Gunna sìneis +00:46=Gunna loisgidh +00:47=Mèinn steigeach +00:48=Òrd +00:49=Uidheam aiseirigh +00:50=Buille tochlaidh +00:51=Bàla puill +00:52=Gun arm +00:53=Bogsa ama +; 00:54=Structar +00:54=Stealladh tìre +00:55=Reòthadair +00:56=Corc +00:57=Bann rubair +00:58=Mèinne adhair + +; 01:00=Loading … +01:01=Cuairt co-ionnann +01:02=bhuannaich %1! +01:03=Fuaim %1% +01:04=’Na stad +01:05=Fàgail dha-rìribh? (Y/Esc) (Briog gus leantainn air adhart) +01:06=Bàs obann! +01:07=%1 air fhàgail +01:08=Connadh +01:09=’Ga shioncronachadh… +01:10=Ma chleachdas tu an acainn seo, chan adhbharaich 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! +01:15=Beagan +01:16=Ìosal +01:17=Àbhaisteach +01:18=Àrd +01:19=Anabarrach +01:20=Bocadh %1 +01:21=Fuaim mùchte +01:22=Modh “Air falbh on mheur-chlàr” +01:23=Camara fèin-obrachail dheth +01:24=Camara fèin-obrachail air +01:25=Brùth air a’ phutan amais gus comharra a chur ris an amas + +; Event messages +; Hog (%1) died +02:00=Thilg %1 suas an deò! +02:00=Thriall %1! +02:00=Cha robh %1 an dùil air seo idir! +02:00=Thuirt %1 soraidh slàn! +02:00=Shiubhail %1 gu àite nas fhearr! +02:00=Dh’eug %1! +02:00=Cha dèan %1 greim-bàis tuilleadh! +02:00=Choilean %1 a dhleastanas! +02:00=Chaidh %1 ’na bheò-ìobairt! +02:00=Theast %1! +02:00=Chrìochnaich %1! +02:00=Dh’fhalbh an ùine air %1! +02:00=Fhuair %1 sìth bhuan! +02:00=Dh’fhàg sinn soraidh slàn aig %1! +02:00=Chuir %1 a bhean is clann air cùl +02:00=Cha tilg %1 bazooka tuilleadh +02:00=Cha tilg %1 durcan-spreadhaidh tuilleadh +02:00=Cha dèan %1 cèic tuilleadh +02:00=Cha ghabh %1 dreallag air ròp tuilleadh +02:00=Cha dèan %1 ionnsaigh-adhair tuilleadh +02:00=Cha loisg %1 gunna-froise tuilleadh +02:00=Cha tilg %1 meal-bhuc tuilleadh +02:00=Cha do mhair %1 +02:00=Siud deireadh %1 +02:00=Bu mhath le %1 creat slàinte +02:00=Dh’fhalbh %1 gus geama nas fhearr a chluich +02:00=Thàinig an latha a bheir %1 suas +02:00=Cha deach an latha le %1 +02:00=%1 a thruaghain … +02:00=Tha %1 dheth +02:00=Bhac %1 peilearan le aodann +02:00=Tha %1 ’na shàr-ghaisgeach am measg nan daoi… gràineagan +02:00=Sheòl %1 gu Tìr nan Òg +02:00=Dh’fhalbh %1 +02:00=Lean %1 air na dìneasaran +02:00=Saoil an adhbharaich %1 gun tèid gràineagan à bith? +02:00=Tha sinn a’ caoineadh %1 +02:00=Chaidh %1 gu clos +02:00=Sheòl %1 an caolas +02:00=Chaidh %1 a dhìth +02:00=Can mar sin leat ri %1 +02:00=Chan eil dòchas air %1 tuilleadh +02:00=Dh’eugnaich %1 +02:00=Chan eil %1 ann tuilleadh +02:00=Thàinig ceal air %1 +02:00=Chaochail %1 +02:00=Tha %1 cho marbh ri sgadan +02:00=Chan eil %1 ann tuilleadh +02:00=Theirig %1 +02:00=Fois shìorraidh gun robh aig anam %1 +02:00=Chaidh %1 a mhùthadh +02:00=Tha %1 ullamh! +02:00=Cha tàinig ri %1 gun losgte air +02:00=Bu mhath le %1 beatha a bharrachd +02:00=A bheil lighiche ann? + +; Hog (%1) drowned +02:01=Tha %1 a’ cluich le bàta-tumaidh! +02:01=Chuir %1 dreach na Titanic air! +02:01=Rinn %1 snàmh mar chlach! +02:01=Tha %1 a’ fleòdradh mar bhreige! +02:01=Tha %1 a’ toirt sùil air a’ cheann dhomhain +02:01=Tha %1 a’ dèanamh glug glug glug +02:01=Tha %1 a’ plubadh +02:01=Dhìochuimhnich %1 na bannan-gàirdein +02:01=B’ fheairrde %1 snàmh ionnsachadh +02:01=Dh’fhàg %1 am bòrd-surfaidh aig an taigh +02:01=Chaidh %1 a sguabadh air falbh leis a’ mhuir +02:01=Tha %1 cho fliuch ris a’ mhuc eile +02:01=Cha do chuir %1 seacaid-teasairginn air +02:01=Tha %1 a’ dèanamh slub-slab +02:01=Tha %1 ’na chadal leis na h-èisg +02:01=Chan eil %1 dèidheil air fiosaigeachd an uisge sa gheama seo +02:01=Tha coltas a’ phathaidh aig %1 +02:01=Shiubhail %1 sa mhuir +02:01=Chair %1 air chall air fairge +02:01=Cha dug %1 uidheamachd daoibhigidh leis +02:01=Chaidh %1 adhlacadh aig muir +02:01=Chaith %1 an cuan +02:01=Tha %1 a’ feuchainn ri snàmh-droma ionnsachadh +02:01=Chaidh %1 an toir air a’ Titanic +02:01=Cha deach le %1 coiseachd air a’ mhuir +02:01=Tha %1 a’ lorg Nemo +02:01=Fhuair %1 a mhuir +02:01=Saoil co mheud gràineag a tha shìos an-siud? +02:01=Rinn %1 a’ mhuir beagan nas àirde +02:01=Cha deach %1 air a’ chabhlach +02:01=Chuir %1 dreach an èisg mhairbh air +02:01= Tha %1 a’ sgrùdadh grunnd na fairge +02:01=Rinn %1 buille gun snàmh +02:01=Chaidh %1 ithe le beul na mara +02:01=Tha %1 a’ coiseachd fon mhuir +02:01=Lorg %1 baile caillte Atlantis +02:01=Chan eil %1 math air plubraich +02:01=Riaslaich %1 an cuan +02:01=Bhuail %1 air a’ mhuir +02:01=Chan eil builgeadh math dha %1 +02:01=Tha %1 gann a ràth +02:01=Tha %1 dhen bheachd gu bheil sàl math airson a’ chraicinn +02:01=Fhuair %1 sàl ’na lotan +02:01=Chaidh %1 air a cheann dìreach a-mach air a’ mhuir +02:01=Ghabh %1 amar +02:01=Tha %1 fliuch bàithte +02:01=Tha %1 cho fliuch ri iasg +02:01=Leig %1 e fhèin sìos dhan ghrunnd + +; Round starts +02:02=Dèanamaid sabaid! +02:02=Astas air lagh! +02:02=Deiseil is deònach? +02:02=Tòisicheamaid! +02:02=A bheil thu deònach orra? +02:02=Buannaichidh a’ ghràineag as seasmhaiche +02:02=Siuthadaibh! +02:02=Dèan deas! +02:02=Ullaich! +02:02=Thòisich e… +02:02=Gabh orra! +02:02=Fàilte gu Hedgewars +02:02=Fàilte gu toiseach an airm +02:02=Mill do nàimhdean! +02:02=Gum buannaich a’ ghràineag as fhearr +02:02=Buaidh no bàs +02:02=Gheibh am fear a bhuannaicheas an creach +02:02=Chan fhaod sinn call +02:02=Dèan cogadh! +02:02=Hedgewars, ’ga thoirt dhut le Hedgewars.org +02:02=Gura math a thèid leat ’s gabh tlachd! +02:02=Nach math dhut nach eil thu a’ sabaid an aghaidh Tiyuri +02:02=Nach math dhut nach eil thu a’ sabaid an aghaidh unC0Rr +02:02=Nach math dhut nach eil thu a’ sabaid an aghaidh Nemo +02:02=Nach math dhut nach eil thu a’ sabaid an aghaidh Smaxx +02:02=Nach math dhut nach eil thu a’ sabaid an aghaidh Jessor +02:02=Cuir do shaothair uile an cleachdadh ri gnìomh! +02:02=Nì an fheadhainn a chailleas an sgioblachadh! +02:02=Feumaidh tu sabaid mus tog thu an creach +02:02=Gun tòisich cath an linn +02:02=Gun tòisich cath an deicheid +02:02=Gun tòisich cath a’ bhliadhna +02:02=Gun tòisich cath a’ mhìosa +02:02=Gun tòisich cath na seachdaine +02:02=Gun tòisich cath an latha +02:02=Gun tòisich cath na h-uarach +02:02=Dèan do dhìcheall! +02:02=Sgrios an nàmhaid! +02:02=Gura math a thèid leat +02:02=Gabh tlachd +02:02=Dèan sabaid mhath +02:02=Dèan sabaid shuarach +02:02=Dèan sabaid onarach +02:02=Na gèill +02:02=Na gèill gu bhràth +02:02=Mill iad! +02:02=Cuir an sìneadh orra! +02:02=A bheil thu deònach air beagan spòrs? +02:02=Tiugainn! +02:02=A ghràineagan, air adhart! +02:02=Thoiribh dhàsan e! +02:02=Na bhiodh an t-eagal ort! +02:02=Bi dàna is ceannsaich + +; Round ends (team/clan %1 wins) +; TODO: Translate the other messages from en.txt +02:03=bhuannaich %1! + +; Round ends (draw) +; TODO: Translate the other messages from en.txt +02:04=Cuairt co-ionnann + +; New health crate +02:05=Tha cobhair a’ tighinn! +02:05=Lighiche! +02:05=Ciad chobhair o na speuran! +02:05=Seo pacaid slàinte dhut +02:05=Slàinte mhath… ann am bogsa! +02:05=Tha lighiche a’ tadhal ort +02:05=Plàstairean ùra! +02:05=Bidh thu a’ faireachdainn nas fhearr a dh’aithghearr +02:05=Gabhaidh seo leigheas +02:05=Beagan spionnadh ort! +02:05=Tog e +02:05=Mias fhallain +02:05=Leigheas dhan phian +02:05=Chan eil dòs iomchaidh ann ach an t-uiread a gheibh thu greim air! +02:05=Lìbhrigeadh èiginneach +02:05=Stòrasan! + +; New ammo crate +02:06=Barrachd airm! +02:06=Foirlionadh! +02:06=Loisgeamaid orra! +02:06=Saoil dè an t-arm a tha ’na bhroinn? +02:06=Stòras! +02:06=Saoil dè th’ ann? +02:06=Thàinig an Nollaig tràth ann an Hedgewars +02:06=Seo tìodhlac dhut! +02:06=Lìbhrigeadh sònraichte! +02:06=Abair dragh a chur a’ chusbainn oirnn +02:06=Dèideagan millteach on speur +02:06=Rabhadh! Susbaint luaineach +02:06=Tog no spreadh e a-rèir do thoil +02:06=Math math! +02:06=Connadh cunnartach +02:06=Bogsa dhe chumhachd millteach +02:06=Post-adhair! +02:06=Ge b’ e dè tha sa bhogsa ud, chan e ceann-cropaig a th’ ann +02:06=Faigh e! +02:06=Tha airm a’ tighinn +02:06=Nach fhaigheadh an nàmhaid greim air siud! +02:06=Dèideagan ùra gleansach! +02:06=Bogsa dìomhair! + +; New utility crate +02:07=Àm nan acainnean! +02:07=Bidh seo feumail gun teagamh… +02:07=Goireasan! +02:07=Cuir am bogsa seo gu feum +02:07=Thoir an aire gu h-ìosal +02:07=Barrachd goireasan! +02:07=Acainnean dhut! +02:07=Feumaidh gu bheil seo math! +02:07=Cleachd seo gu glic +02:07=Abair thusa gu bheil am bogsa seo trom +02:07=Saoil am bi seo gu feum dhut? + +; Hog (%1) skips his turn +02:08=Abair thusa gu bheil %1 ràsanach… +02:08=Tha %1 coma +02:08=Tha %1 ’na ghraineag leisg +02:08=Chan eil beachd aig %1 +02:08=Ghèill %1 +02:08=Thoir an aire no caillidh tu, %1 +02:08=Tha %1 na leisgear +02:08=Tha %1 cho leisg ri cù na sitig +02:08=Tha beagan brosnachaidh a dhìth air %1 +02:08=Tha %1 ’na shìochantair +02:08=Tha %1 a’ leigeil anail +02:08=Tha %1 a’ gabhail fois +02:08=Tha %1 air a s(h)ocair +02:08=Chan eil misneachd aig %1 +02:08=Chuir %1 roimhe gun a bhith a’ dèanamh dad +02:08=Tha %1 an dùil gun dèan an nàmhaid sgrios air fhèin +02:08=Chan eil %1 dèidheil air hòrò-gheallaidh +02:08=Tha %1 ’ga f(h)alach +02:08=Cha do ghabh %1 an cothrom seo +02:08=Shaoil %1… gun a bhith a’ dèanamh dad +02:08=’S e buigean a th’ ann an %1 +02:08=Is gealltair %1 +02:08=Ghabh %1 eagal +02:08=’S e gealtair a th’ ann an %1! +02:08=Tha %1 a’ feitheamh air a’ bhàs obainn +02:08=Cha toil le %1 sabaid +02:08=Chan eil %1 cinnteach carson a tha e beò +02:08=Cha robh amas aig %1 a-riamh +02:08=Cha robh %1 airson gabhail san arm co-dhiù +02:08=Sguir dhe bhith a’ caitheamh ar n-ùine, %1 +02:08=’S e briseadh-dùil a th’ annad, %1 +02:08=Siuthad is dèan nas fhearr, %1! +02:08=Chaill %1 a mhisneachd +02:08=Saoil a bheil an aire aig %1 air rudan nas inntinniche? +02:08=Tha %1 chun a bhith gòrach leis an eagal +02:08=Thuit %1 ’na chadal + +; Hog (%1) hurts himself only +02:09=Chan eil amas math aig %1! +02:09=Tha coltas gur lugha air %1 e fhèin +02:09=Sheas %1 air an taobh chearr! +02:09=Saoil a bheil %1 ri fèin-mhurt? +02:09=Fhuair %1 greim air taobh cearr an airm +02:09=Is %1 an gille crùbaich as a’ ghleann +02:09=Is toigh le %1 pian +02:09=Tha %1 coma mu mhairsinn beò +02:09=Rinn %1 bùrach dheth +02:09=Rinn %1 tòn dheth +02:09=Abair droch amas a bh’ agad, %1 +02:09=Tha %1 caran mì-chùramach a thaobh airm chunnartach +02:09=Saoil am bhiodh dreuchd eile a’ tighinn air %1? +02:09=Abair thusa gun robh sin uabhasach dona! +02:09=Obh ob %1 a sheòid, ’s ann air an nàmhaid a dh’fheumas tu losgadh! +02:09=Cha bu chòir dha %1 milleadh ach an nàmhaid +02:09=Tha am fèin-mhurt gu bhith tighinn air %1 +02:09=Thug %1 cobhair dhan nàmhaid +02:09=Nach tusa a tha gòrach, %1 +02:09=Tha %1 dhen bheachd nach dèanar math gun mhulad +02:09=Tha %1 troimhe chèile +02:09=Leòin %1 e fhèin +02:09=Tha %1 math air a nàrachadh fhèin +02:09=’S e crògaire a th’ ann an %1! +02:09=Tha %1 slibist +02:09=Sheall %1 dhan nàmhaid dè na comasan a th’ air +02:09=Chan urrainn dha %1 bhith foirfe gach turas +02:09=Na gabh dragh %1 gu bheil thu ’nad amadan +02:09=’S ann air aona-ghnothach a rinn %1 seo +02:09=Cha chan mi guth mus can thu fhèin, %1 +02:09=Abair nàire! +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 + +; Hog shot an home run (using the bat and another hog) +02:10=A’ seòladh nan neul! +02:10=Seallaibh na dh’èirich air … +02:10=Mach, mach! + +; Hog (%1) has to leave (team is gone) +02:11=Feumaidh %1 a dhol innte! +02:11=Tha %1 ro thrang airson cluiche +02:11=Chaidh %1 air chall! +02:11=Feumaidh %1 falbh + +; Weapon Categories +03:00=Durcan-spreadhaidh le tìmear +03:01=Durcan-spreadhaidh le tìmear +03:02=Arm tilgeil +03:03=Arm stiùirichte +03:04=Gunna (iomadh losgadh) +03:05=Acainn tochlaidh +03:06=Gnìomh +03:07=Goireas siubhail +03:08=Boma fagasachd +03:09=Gunna (iomadh losgadh) +03:10=DÙD! +03:11=Buille! +03:12=Ealain còmhraige +03:13=GUN CHLEACHDADH +03:14=Goireas siubhail +03:15=Ionnsaigh adhair +03:16=Ionnsaigh adhair +03:17=Acainn tochlaidh +03:18=Goireas +03:19=Goireas siubhail +03:20=Gnìomh +03:21=Arm tilgeil +03:22=Can Indiana rium! +03:23=Fìor-ealain còmhraige +03:24=Chan e breug a tha sa chèic seo! +03:25=Arm tarraingeach +03:26=Durcan-spreadhaidh sùghach +03:27=Durcan-spreadhaidh teinnteach +03:28=Arm tilgeil +03:29=Arm tilgeil +03:30=Ionnsaigh adhair +03:31=Boma le smachd chèin +03:32=Buil shealach +03:33=Buil shealach +03:34=Buil shealach +03:35=Buil shealach +03:36=Buil shealach +03:37=Buil shealach +03:38=Gunna (iomadh losgadh) +03:39=Goireas siubhail +03:40=Durcan-spreadhaidh losgaidh +03:41=Glè dhèidheil air sgreuchail +03:42=Gabhaidh mi nòta… +; the misspelled "Beethoven" is intentional (-> to beat) +03:43=Seinnidh e marbhrann +03:44=Best before: 1923 +03:45=Cumhachd an t-saidheins +03:46=Teth teth teth! +03:47=Steig àiteigin feumail i! +03:48=Cead òrd a bhualadh air bàirnich +03:49=’S ann gun ifrinn a thilleas na mairbh! +03:50=Dèidheil air famhan +03:51=Lorg sinn e air an làr +03:52=GUN CHLEACHDADH +03:53=Seòrsa 40 +;03:54=Tog rudeigin +03:54=Goireas +03:55=Chan fhàs i nas fhionnaire na seo! +03:56=Dèan cleachdadh no droch chleachdadh +03:57=Goireas +03:58=Boma fagasachd air fhleòd + +; 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 +04:03=Cuir seillean spreadhach gu dol a nì lorg air an amas a thagh thu.|Na loisg le làn-chumhachd e gus am bidh e nas pongaile.|Cùrsair: Tagh an t-amas|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart +04:04=Thoir ionnsaigh air an nàmhaid agad le gunna-froise|a ghabhas losgadh dà thuras. Ri linn an sgapaidh,|cha leig thu leas a bhith pongail gus cron a dhèanamh|air na nàimhdean agad.|Ionnsaigh: Loisg (iomadh turas) +04:05=Gluais fon talamh! Cleachd piocaid ’s òrd gus toll san talamh|a dhriligeadh agus raointean eile a ruigsinn.|Ionnsaigh: Tòisich no cuir stad air tochladh|Clì/Deas: Gluais rè an driligidh +04:06=A bheil thu seachd searbh?|Gun dòigh gus ionnsaigh a thoirt?|Airson an connadh agad a shàbhaladh?|Chan eil seo ’na dhuilgheadas!|Nach leig thu seachad a’ chuairt agad, a ghealtair?|Ionnsaigh: Leig seachad a’ chuairt agad gun sabaid +04:07=Rach astar mòr a’ tilgeadh an ròpa gu sgileil. Cleachd an rot agad gus leum air|gràineagan eile no leig às durcain-spreadhaidh is airm eile orra.|Ionnsaigh: Tilg no leig às an ròpa|Suas/Sìos: Leudaich/Giorraich an ròpa|Leum fada: Leig às durcan-spreadhaidh no arm coltach ris +04:08=Cum na nàimhdean air falbh ’s tu a’ leigeil mèinn am badeigin|cumhang no dìreach fon chasan.|Dèan cinnteach gun cùlaich thu air eagal gun spreidh thu fhèin i!|Ionnsaigh: Leig às a’ mhèinn ri taobh do chois|Amas pongail + 1-5: Suidhich neart bocadaich na mèinne +04:09=Nach eil thu math air amas? Cleachd iolaire an fhàsaich|gus ionnsaigh a thoirt le suas ri ceithir losgaidhean.|Ionnsaigh: Loisg (iomadh turas) +04:10=Nì ainneart a’ chùis gu tric. Leig às an stuth-spreadhaidh|clasaigeach seo ri taobh do nàimhdean agus cùlaich.|Ionnsaigh: Leig às dineamait ri taobh do chois +04:11=Thoir slaic air gràineagan eile le bata gus an dèid iad|thar oir a’ mhapa no dhan uisge.|No am put thu mèinnean cha na caraidean agad?|Ionnsaigh: Buail le bata air a h-uile càil air do bheulaibh +04:12=Thig faisg air do nàimhdean le cumhachd an ealain|còmhraige seo a tha caran marbhtach.|Ionnsaigh: Dèan Shoryuken iongantach. +04:13=GUN CHLEACHDADH +04:14=Nach toigh leat an àirde? Faigh greim air paraisiut. Thèid a neo-phasgadh gu|fèin-obrachail nuair a thuiteas tu ro fhada agus sàbhailidh e do ghràineag|o dhochann tuiteim.|Ionnsaigh: Neo-phaisg no cuir à comas am paraisiut a làimh|Clì/Deas/Suas/Sìos: Stiùirich far an sgiathaich thu|Leum fada: Leig às durcan-spreadhaidh no arm coltach ris +04:15=Iarr itealan a bheir ionnsaigh air na nàimhdean agad|le bomaichean.|Clì/Deas: Tagh comhair na h-ionnsaighe|Cùrsair: Tagh raon amais +04:16=Iarr itealan leigeas às bomaichean san raon-amais.|Clì/Deas: Tagh comhair na h-ionnsaighe|Cùrsair: Tagh raon amais +04:17=A bheil thu feumach air fasgadh? Cleachd an lòchran gus|tunail a thochladh san talamh a bheir fasgadh dhut.|Ionnsaigh: Tòisich air no sgur dhen tochladh|Suas/Sìos: Atharraich comhair an tochlaidh +04:18=A bheil barrachd dìona a dhìth ort no a bheil thu airson dol thairis air talamh nach|urrainn dhut coiseachd air? Cuir teannadairean ann far an togair thu.|Clì/Deas: Tagh teannadair ri chur ann|Cùrsair: Cuir an teannadair air ionad dligheach +04:19=Ma chleachdas tu aig an àm cheart e, faodaidh tele-phortadh a bhith nas|cumhachdaiche na cha mhòr arm sam bith on a leigeas e leat gràineag|a shàbhaladh o shuidheachadh cunnartach ann an tiotag.|Cùrsair: Tagh raon amais|clì/Deas: Tagh comhair na h-aghaidh +04:20=Leigidh seo leat a’ chuairt làithreach a ghabhail le gràineag eile.|Ionnsaigh: Cuir atharrachadh ghràineagan an comas|Dèan suids: Tagh an ath-ghràineag|Amas pongail + Dèan suids: Tagh a’ ghràineag roimhpe +04:21=Loisg astas a sgaoileas iomadh peilear nuair a bhuaileas e.|Thèid na peilearan a thilgeil air ais agus tha iad nas|cunnartaiche na am prìomh-pheilear.|Ionnsaigh: Loisg le làn-chumhachd +04:22=Chan eil seo gu feum dha Indiana Jones a-mhàin!|’S e arm feumail a tha sa chuip ann an iomadh suidheachadh.|Gu h-àraidh nuair a bhios tu airson cuideigin a bhrùthadh far chreag.|Ionnsaigh: Buail air a h-uile càil air do bheulaibh +04:23=Mur eil dòchas eile ann tuilleadh, faodaidh seo a bhith goireasach gu leòr.|Dèan ìobairt dhe do ghràineag agus tilg i an comhair shònraichte gus|dochann a dhèanamh air càil sam bith ’na rathad.|Spreidhidh i air an deireadh.|Ionnsaigh: Thoir ionnsaigh sgriosail mharbhtach +04:24=Co-là breith sona dhut! Cuir a’ chèic seo gu dol ach an dèid i gu|taobh do nàimhdean ach am bi hòro-gheallaidh spreadhach aca.|Gheibh a’ chèic thar cha mhòr tìr sam bith ach dh’fhaoidte gun|spreidh i nas tràithe mar sin.|Ionnsaigh: Cuir a’ chèic gu dol no cuir stad is spreadhadh oirre +04:25=Nuair a chuireas tu a’ chulaidh seo air do ghràineag,bidh i|cho tarraingeach nach e ruith ach leum a th’ ann dha na|gràineagan faisg oirre on a thèid an dalladh leis|a’ ghaol (agus ’s dòcha gun dèid iad ann am beàrn no toll).|Leaghaidh lasair na suirghe seo fiù ’s cridhean ghràineagan reòite.|Ionnsaigh: Dèan suirghe nach gabh diùltadh +04:26=Tilg a’ mheal-bhuc sùghail (is sgeingeach) air na nàimhdean. Nuair a dh’fhalbhas an ùine air an tìmear, thèid a sgapadh ’na bomaichean beaga.|1-5: Suidhich tìmear na meal-bhuic|Ionnsaigh: Cum sìos gus a tilgeil le barrachd neart +04:27=Dòirt teine ifrinneach air do nàimhdean leis an stuth-spreadhaidh mallaichte seo. Cum air falbh on spreadhadh on a dh’fhaodas teinntean beaga maireachdainn greis.|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart +04:28=Greis às dèidh dhut an rocaid seo a chur gu dol, tòisichidh i|air tochladh ron làr agus spreadhaidh i nuair a thèid a fiùsa air|no nuair a ruigeas i an uachdair a-rithist.|Ionnsaigh: Cum sìos gus a cur gu dol le barrachd neart +04:29=Chan eil an t-inneal seo iomchaidh dhan chlann! Loisgidh an gunna-bhàlaichean torr bhàlaichean beaga dathte a tha làn stuth-spreadhaidh.|Ionnsaigh: Loisg le làn-neart|Suas/Sìos: Lean ort ’ga amas +04:30=Iarr itealan a bheir ionnsaigh cumhachdach le napalm.|Leis an amas cheart, millidh an ionnsaigh seo raon mòr|dhen tìr, a’ gabhail a-steach nan gràineagan mì-fhortanach|a tha ’nan seasamh ann.|Clì/Deas: Tagh comhair na h-ionnsaighe|Cùrsair: Tagh raon amais +04:31=’S e an t-arm as fhearr gus creataichean a thogail no ionnsaigh a thoirt air gràineagan fad air falbh a tha san itealan le smachd chèin. Buail ri nàmhaid leis no leig às bomaichean an toiseach.|Ionnsaigh: Cuir an t-itealan gu dol no leig às boma|Leum fada: Dèan còmhrag|Clì/Deas: Stiùirich an t-itealan +04:32=Tha iom-tharraing ìosal nas èifeachdaiche na daithead sam bith! Leum nas àirde is nas fhaide no tilg na nàimhdean agad nas fhaide.|Ionnsaigh: Gnìomhaich +04:33=Aig amannan, chan eil a dhìth ort ach beagan dochainn a bharrachd. Ma ghnìomhaicheas tu seo, thèid 50% a chur ris an dochann gu deireadh na cuairte.|Ionnsaigh: Gnìomhaich +04:34=Chan fhulaing thu dochann gu deireadh do chuairt. Na bi ro bhragail co-dhiù on a ghabhas do bhàthadh fhathast.|Ionnsaigh: Gnìomhaich +04:35=Faodaidh gum falbh an ùine ort ro luath.|Faigh 30 diog a bharrachd gus an ionnsaigh agad a thoirt gu buil.|Ionnsaigh: Gnìomhaich +04:36=Uill, nach eil sgilean amais a dhìth ort? Faigh beagan taice le teicneolas ùr-nòsach.|Ionnsaigh: Gnìomhaich +04:37=Na cuireadh solas an latha an t-eagal ort! Cha mhair e ach cuairt agus sùghaidh tu 80% dhen dochann a dh’fhulaingeas na gràineagan eile.|Ionnsaigh: Gnìomhaich +04:38=Faodaidh an isneach fàtha a bhith ’na arm as milltiche san arm-lann agad|ach chan eil i èifeachdach idir ma tha an t-amas faisg ort.|Mar as fhaide air falbh an t-amas ’s ann as motha a bhios an dochann a nì i.|Tha i doirbh tomhadh, mar sin feumaidh tu fuireach far a bheil thu fhad ’s a|bhios an t-arm seo an gnìomh.|Ionnsaigh: Gnìomhaich am fradharc-leusair agus loisg an uairsin (dà thuras)|Clì/Deas: Tionndaidh an chomhair do chùil (eadar dà losgadh) +04:39=Sgiathaich gu sgìre eile a’ mhapa leis an t-soitheach-itealaich. Bheir an goireas seo|a tha doirbh làimhseachadh cha mhòr gu àite sam bith air a’ bhlàr thu.|Ionnsaigh: Gnìomhaich/Cuir à gnìomh|Cuas/Clì/Deas: Luathachadh goirid dhan chomhair sin|Leum fada: Leig às durcan-spreadhaidh no airm coltach riutha|Amas pongail + leum fada: Tilg arm dhan chrois-ribe|Amas pongail + Suas/Sìos: Gleus an tomhadh +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: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 bualadh air ais 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 +04:47=Thoir an dà latha air do nàimhdean le dà mhèinn steigeach spèiceach shlìogach.|Suidhich frith-spreadhadh no dìon thu fhèin (no an dà chuid!)|Ionnsaigh: Cum sìos gus an tilgeil le barrachd neart +04:48=Carson nach rachadh bualadh ach air famhan?|Tha bualadh air gràineag (no mèin, no baraill) a cheart cho tlachdmhor!|Bheir bualadh math leis an òrd seo an treas cuid a shlàinte o ghràineag|(no an dàrna leth le barrachd dochainn) agus cuiridh e fon talamh i.|Ionnsaigh: Gnìomhaich +04:49=Dèan ìobairt dhe do shlàinte gus do charaidean aiseirigh!|Ach thoir an aire gun dèid do nàimhdean aiseirigh cuideachd.|Ionnsaigh: Cum sìos gus an aiseirigh gu slaodach|Suas: Luathaich an aiseirigh +04:50=A bheil cuideigin ’na fhalach fon talamh?|Thoir dhan uachdar iad le buille tochlaidh!|Stiùirichidh an tìmear dè cho domhainn ’s a thochlas e.|Clì/Deas: Tagh comhair na h-ionnsaighe|1-5: Suidhich an tìmear|Cùrsair: Tagh raon amais +04:51=Faigh losgadh an-asgaidh ’s tu a’ tilgeil bàla puill.|Cha dèan e dochann ach putaidh e gràineagan is nithean.|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart +04:52=GUN CHLEACHDADH +04:53=Gabh sgrìobag thar àm is rum fhad ’s a dh’fhàgas tu do chuideachd|a’ sabaid ’nan aonar. Bi an dùil air tilleadh uair sam bith no air bàs|obann ma thèid an ruaig uile.|Aithris-àichidh: Chan obraich e ann am modh a’ bhàir obainn|ma tha thu ’nad aonar no mas e rìgh a th’ annad.|Ionnsaigh: Gnìomhaich +04:54=Steall sruth dhe bhleideagan steigeach.|Tog drochaidean, tòrr nàimhdean, dùin tunailean.|Thoir an aire nach cuir thu gin dheth ort fhèin!|Ionnsaigh: Gnìomhaich|Suas/Sìos: Lean ort ’ga amas|clì/Deas: Gleus neart an steallaidh +04:55=Till dhan linn-deighe!|Cuir reòthadh air gràineagan, dèan an làr sleamhainn no sàbhail thu fhèin on bhàthadh le reòthadh an uisge.|Ionnsaigh: Gnìomhaich/Cuir à gnìomh an gath-reòthaidh|Suas/Sìos: Lean ort ’ga amas +04:56=Tilg dà chorc air do nàimhdean no cleachd iad gus bealaich is tunailean a bhacadh no gus sreap leotha!|Thoir an aire! Tha cluich le sgian cunnartach.|Ionnsaigh: Cum sìos gus an tilgeil le barrachd neart (dà thuras) +04:57=Tog bann rubair lastaigeach sìnteach às a bhocas gràineagan is rudan eile gun a bhith|a’ fulang dochann tuiteim.|Clì/Deas: Atharraich comhair a’ bhanna rubair|Cùrsair: Cuir am bann rubair air ionad dligheach +04:58=Sgiathaidh am boma fagais seo san adhar gu saor agus leanaidh e air a’ gràineag a tha cho mì-fhaiceallach ’s a thèid i ro fhaisg air.|Chan eil an spreadhadh aige cho làidir ’s a tha aig a’ mhèinn thìreach co-dhiù.|Ionnsaigh: Cum sìos gus a thilgeil le barrachd neart + +; Game goal strings +05:00=Modhan a’ gheama +05:01=Seo na riaghailtean a bhios an gnìomh +05:02=Dùin: Dìon na dùin agad; sgrios na nàimhdean! +05:03=Iom-tharraing ìosal: Coisich gu cùramach +05:04=Do-leònaidh: Tha na gràineagan (cha mhòr) do-leònta +05:05=Sùgh fala: Thèid na gràineagan a shlànachadh le 80% dhen dochann a fhuair iad +05:06=Karma: Fulaingidh na gràineagan airson an dochainn a rinn iad +05:07=Dìon an rìgh: Na leig leis an rìgh agad bàsachadh!|Cuir an rìgh ann: Tagh ionad-tòiseachaidh dìonta airson an rìgh agad +05:08=Cuir ann gràineagan: Tagh ionadan nan gràineagan agad mus tòisich an geama +05:09=Làmhachas: Chan urrainn dha na gràineagan agad coiseachd gu ionad eile +05:10=Tìr do-mhillte: Cha mhill a’ mhòrchuid a dh’airm an tìr +05:11=Connadh co-roinnte: Co-roinnidh gach sgioba air a bheil an t-aon dath an cuid connaidh +05:12=Tìmearan nam mèinnean: Spreadhaidh mèinnean às dèidh %1 diog(an) +05:13=Tìmearan nam mèinnean: Spreadhaidh mèinnean sa bhad +05:14=Tìmearan nam mèinnean: Spreadhaidh mèinnean às dèidh 0 – 5 diogan +05:15=Atharraichear dochainn: Nì (cha mhòr) a h-uile arm %1% a dhochann +05:16=Thèid slàinte nan gràineagan uile ath-shuidheachadh air deireadh na cuairte +05:17=Thèid gràineagan nan IF ath-ghintinn nuair a gheibh iad bàs +05:18=Ionnsaighean gun chuingeachadh +05:19=Thèid na h-airm ath-shuidheachadh air deireadh na cuairte +05:20=Cha cho-roinn na gràineagan na h-airm +05:21=Sgiabag sgioba: Gabhaidh na sgiobaidhean ann an cinneadh cuairt fear mu seach|Ùine cho-roinnte: Co-roinnidh na sgiobaidhean ann an cinneadh ùine nan cuairt diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/gl.txt --- a/share/hedgewars/Data/Locale/gl.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/gl.txt Sun Dec 17 00:09:24 2017 +0100 @@ -42,7 +42,7 @@ 00:39=Disco volador 00:40=Cóctel Molotov -01:00=Á loita! +; 01:00=Loading … 01:01=Empate 01:02=%1 gaña! 01:03=Volume %1% @@ -143,11 +143,11 @@ 02:02=Espetádeos contra o chan! 02:02=Ourizada! -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 gaña! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Empate ; New health crate 02:05=Haberá aspirinas? diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_ar.ts --- a/share/hedgewars/Data/Locale/hedgewars_ar.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_ar.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -29,6 +100,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -69,14 +148,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -84,6 +155,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -356,10 +435,6 @@ لم اتمكن من حقظ الملف %1 - DefaultTeam - - - Hedgewars Demo File File Types @@ -448,10 +523,6 @@ - This page requires an internet connection. - - - Guest @@ -464,11 +535,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. ar.txt @@ -835,15 +933,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -855,6 +954,20 @@ + MinesTimeSpinBox + + Random + عشوائي + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -918,6 +1031,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -931,13 +1063,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1036,6 +1180,47 @@ Random Team فريق عشوائي + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1074,20 +1259,7 @@ (%1 kill) - - - - - - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - - - - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + Number of kills in stats screen, written after the team name @@ -1110,6 +1282,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1424,6 +1611,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1498,7 +1706,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - دافع عن القلعة و دمر الاعداء. فريقان الحد الاقصى + دافع عن القلعة و دمر الاعداء. فريقان الحد الاقصى Teams will start on opposite sides of the terrain, two team colours max! @@ -1708,6 +1916,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1766,13 +1978,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1878,6 +2110,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -1985,6 +2221,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2068,6 +2312,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2235,10 +2503,6 @@ - Stereo rendering - - - Style @@ -2301,10 +2565,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2337,14 +2597,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2380,6 +2632,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2395,6 +2656,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2488,20 +2753,8 @@ ادخل رقم الغرقة - Record Play - Error - - - Please select record from the list - اختر المقطع من القائمة - - - Cannot rename to - - - - Cannot delete file - + اختر المقطع من القائمة Room Name - Error @@ -2624,6 +2877,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2668,7 +2947,7 @@ Go! - ابدا + ابدا Play demo @@ -2731,10 +3010,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2754,6 +3029,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2786,10 +3072,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -3109,10 +3397,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3120,6 +3404,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3200,7 +3489,7 @@ Toggle labels above hedgehogs: - تغيير العناوبن فوق اللاعبين + تغيير العناوبن فوق اللاعبين Record video: @@ -3218,6 +3507,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_bg.ts --- a/share/hedgewars/Data/Locale/hedgewars_bg.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_bg.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Таралежови войни %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -73,14 +152,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -88,6 +159,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -360,7 +439,7 @@ DefaultTeam - СтандартенОтбор + СтандартенОтбор Hedgewars Demo File @@ -451,10 +530,6 @@ - This page requires an internet connection. - - - Guest @@ -467,11 +542,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. bg.txt @@ -838,15 +940,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -858,6 +961,20 @@ + MinesTimeSpinBox + + Random + + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -921,6 +1038,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -934,13 +1070,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1039,6 +1187,47 @@ Random Team Случаен отбор + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1077,20 +1266,7 @@ (%1 kill) - - - - - - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - - - - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + Number of kills in stats screen, written after the team name @@ -1113,6 +1289,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1427,6 +1618,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1516,10 +1728,6 @@ PageScheme - Defend your fort and destroy the opponents, two team colours max! - - - Land can not be destroyed! @@ -1715,6 +1923,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1773,13 +1985,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1885,6 +2117,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -1992,6 +2228,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2087,6 +2331,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2259,7 +2527,7 @@ Stereo rendering - Стерео режим + Стерео режим Style @@ -2324,10 +2592,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2360,14 +2624,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2403,6 +2659,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2418,6 +2683,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2511,20 +2780,8 @@ Моля въведете име на стая - Record Play - Error - - - Please select record from the list - Изберете запис от списъка - - - Cannot rename to - - - - Cannot delete file - + Изберете запис от списъка Room Name - Error @@ -2648,6 +2905,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2668,7 +2951,7 @@ Go! - Напред! + Напред! Start @@ -2755,10 +3038,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2778,6 +3057,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2810,10 +3100,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -3137,10 +3429,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3148,6 +3436,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3228,7 +3521,7 @@ Toggle labels above hedgehogs: - Премключване на надписи над таралежите: + Премключване на надписи над таралежите: Record video: @@ -3246,6 +3539,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_cs.ts --- a/share/hedgewars/Data/Locale/hedgewars_cs.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_cs.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -73,14 +152,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -88,6 +159,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -366,7 +445,7 @@ DefaultTeam - VýchozíTeam + VýchozíTeam Hedgewars Demo File @@ -457,10 +536,6 @@ - This page requires an internet connection. - - - Guest @@ -473,11 +548,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. cs.txt @@ -844,15 +946,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -864,6 +967,21 @@ + MinesTimeSpinBox + + Random + Náhodné + + + %1 seconds + + + + + + + + PageAdmin Clear Accounts Cache @@ -927,6 +1045,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -940,13 +1077,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1045,6 +1194,47 @@ Random Team Náhodný tým + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1086,6 +1276,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 úlovek) (%1 úlovky) @@ -1094,7 +1285,7 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> si myslel, že je dobré střílet do vlastních ježků s <b>%2</b> bodem. <b>%1</b> si myslel, že je dobré střílet do vlastních ježků se <b>%2</b> body. <b>%1</b> si myslel, že je dobré střílet do vlastních ježků s <b>%2</b> body. @@ -1102,7 +1293,7 @@ <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> zabil <b>%2</b> vlastního ježka. <b>%1</b> zabil <b>%2</b> vlastní ježky. <b>%1</b> zabil <b>%2</b> vlastních ježků. @@ -1126,6 +1317,23 @@ (%1 %2) + 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” + + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1441,6 +1649,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1540,7 +1769,7 @@ Defend your fort and destroy the opponents, two team colours max! - Braň svou pevnoust a znič protivníky, dvě barvy týmů maximálně! + Braň svou pevnoust a znič protivníky, dvě barvy týmů maximálně! Teams will start on opposite sides of the terrain, two team colours max! @@ -1742,6 +1971,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1800,13 +2033,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1913,6 +2166,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2020,6 +2277,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2115,6 +2380,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2287,7 +2576,7 @@ Stereo rendering - Duální vykreslování + Duální vykreslování Style @@ -2352,10 +2641,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2388,14 +2673,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2431,6 +2708,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2446,6 +2732,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2539,20 +2829,8 @@ Prosím zadejte jméno místnosti - Record Play - Error - - - Please select record from the list - Prosím vyberte záznam ze seznamu - - - Cannot rename to - - - - Cannot delete file - + Prosím vyberte záznam ze seznamu Room Name - Error @@ -2677,6 +2955,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2721,7 +3025,7 @@ Go! - Jedem! + Jedem! Play demo @@ -2784,10 +3088,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2807,6 +3107,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2839,10 +3150,12 @@ C + Caption of the column for the number of connected clients in the list of rooms K T + Caption of the column for the number of teams in the list of rooms T @@ -3166,10 +3479,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3177,6 +3486,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3257,7 +3571,7 @@ Toggle labels above hedgehogs: - Přepni popisky nad ježky: + Přepni popisky nad ježky: Record video: @@ -3275,6 +3589,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_da.ts --- a/share/hedgewars/Data/Locale/hedgewars_da.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_da.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -73,14 +152,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -88,6 +159,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -364,7 +443,7 @@ DefaultTeam - StandardHold + StandardHold Hedgewars Demo File @@ -455,10 +534,6 @@ - This page requires an internet connection. - - - Guest @@ -471,11 +546,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. en.txt @@ -842,15 +944,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -862,6 +965,20 @@ + MinesTimeSpinBox + + Random + Tilfældig + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -925,6 +1042,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -938,13 +1074,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1043,6 +1191,47 @@ Random Team Tilfældige Hold + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1081,6 +1270,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 drab) (%1 drab) @@ -1088,14 +1278,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> troede det var en god idé at skyde sine egne pindsvin med <b>%2</b> point. <b>%1</b> troede det var en god idé at skyde sine egne pindsvin med <b>%2</b> point. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> dræbte <b>%2</b> af sine egne pindsvin. <b>%1</b> dræbte <b>%2</b> af sine egne pindsvin. @@ -1117,6 +1307,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1431,6 +1636,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1521,7 +1747,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Forsvar dit fort og udryd dine modstandere. Maksimalt to holdfarver! + Forsvar dit fort og udryd dine modstandere. Maksimalt to holdfarver! Teams will start on opposite sides of the terrain, two team colours max! @@ -1731,6 +1957,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1789,13 +2019,33 @@ Vælg en mission! - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1901,6 +2151,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2008,6 +2262,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2103,6 +2365,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2275,7 +2561,7 @@ Stereo rendering - 3D-rendering + 3D-rendering Style @@ -2348,10 +2634,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2384,14 +2666,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2427,6 +2701,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2442,6 +2725,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2535,20 +2822,8 @@ - Record Play - Error - - - Please select record from the list - Vælg venligst en optagelse fra listen - - - Cannot rename to - - - - Cannot delete file - + Vælg venligst en optagelse fra listen Room Name - Error @@ -2672,6 +2947,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2716,7 +3017,7 @@ Go! - I gang! + I gang! Play demo @@ -2775,10 +3076,6 @@ - Upload this video to your Youtube account - - - Cancel uploading @@ -2802,6 +3099,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2834,10 +3142,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -3161,10 +3471,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3172,6 +3478,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3252,7 +3563,7 @@ Toggle labels above hedgehogs: - Slå mærkater over pindsvin fra og til: + Slå mærkater over pindsvin fra og til: Record video: @@ -3270,6 +3581,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_de.ts --- a/share/hedgewars/Data/Locale/hedgewars_de.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_de.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,18 +1,99 @@ - + About - Unknown Compiler Unbekannter Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + Revision %1 (%2) + + + Visit our homepage: %1 + Besuch unsere Homepage: %1 + + + This program is distributed under the %1. + Dieses Programm wird unter der %1 veröffentlicht. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + GNU GPL v2 + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + Abhängigkeitsversionen: + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL_net</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL_net</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL_image</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL_image</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL_ttf</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL_ttf</a>: %1.%2.%3 + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + AbstractPage - Go back Zurück @@ -32,89 +113,88 @@ Kopie von %1 - New - Neu - - - + Neu + + Copy of %1 - + Kopie von %1 + + + New (%1) + Neu (%1) + + + Copy of %1 (%2) + Kopie von %1 (%2) BanDialog - - IP IP-Adresse - Nick Spitzname - IP/Nick IP-Adresse/Spitzname - Reason Grund - Duration Dauer - Ok OK - Cancel Abbrechen - Ban player - - - - + Spieler verbannen + + you know why du weißt schon, warum - Warning Warnung - Please, specify %1 - Bitte leg %1 fest - - - + Bitte leg %1 fest + + nickname - Spitzname - - - + Spitzname + + permanent - Spitzname + Permanent + + + Please specify an IP address. + Please specify an IP address. + + + Please specify a nickname. + Please specify a nickname. DataManager - Use Default Verwende Standard @@ -122,22 +202,18 @@ FeedbackDialog - Feedback - Feedback - - - + Feedback + + View Ansehen - Cancel Abbrechen - Send Feedback Feedback senden @@ -146,7 +222,6 @@ Bitte gib uns Feedback! - We are always happy about suggestions, ideas, or bug reports. Wir freuen uns immer über Vorschläge, Ideen oder Fehlerberichte. @@ -159,17 +234,14 @@ Deine E-Mail-Adresse ist optional, aber wir könnten sie brauchen, um dich zu kontaktieren. - Send us feedback! Schicke uns dein Feedback! - If you found a bug, you can see if it's already been reported here: - Falls du einen Fehler gefunden hast, kannst du hier sehen, ob er bereits bekannt is (auf Englisch): - - - + Falls du einen Fehler gefunden hast, kannst du hier sehen, ob er bereits bekannt ist (auf Englisch): + + Your email address is optional, but necessary if you want us to get back at you. Deine E-Mail-Adresse ist optional, es sei denn du möchtest, dass wir dir antworten. @@ -177,12 +249,10 @@ FreqSpinBox - Never Nie - Every %1 turn Jede Runde @@ -193,12 +263,10 @@ GameCFGWidget - Edit weapons Arsenal bearbeiten - Edit schemes Spielprofil bearbeiten @@ -207,17 +275,14 @@ Spieloptionen - Game scheme will auto-select a weapon Das Auswählen eines Spielprofils wird automatisch ein Arsenal auswählen - Map Karte - Game options Spieloptionen @@ -225,7 +290,6 @@ GameUIConfig - Guest Gast @@ -233,8 +297,6 @@ HWApplication - - %1 minutes %1 Minute @@ -242,7 +304,6 @@ - %1 hour %1 Stunde @@ -250,9 +311,6 @@ - - - %1 hours %1 Stunde @@ -260,7 +318,6 @@ - %1 day %1 Tag @@ -268,9 +325,6 @@ - - - %1 days %1 Tag @@ -278,17 +332,14 @@ - Scheme '%1' not supported Das Spielprofil »%1« wird nicht unterstützt - Cannot create directory %1 Das Verzeichnis %1 konnte nicht angelegt werden - Failed to open data directory: %1 @@ -299,62 +350,51 @@ Bitte überprüfe deine Installation! - Usage command-line Verwendung - OPTION command-line SCHALTER - - CONNECTSTRING command-line VERBINDUNGSTEXT - Options command-line Schalter - Display this help command-line Diese Hilfe anzeigen - Custom path for configuration data and user data command-line Benutzerdefinierter Pfad für Konfigurations- und Benutzerdaten - Custom path to the game data folder command-line Benutzerdefinierter Pfad für das Spieldatenverzeichnis - Hedgewars can use a %1 (e.g. "%2") to connect on start. command-line Hedgewars kann ein %1 (z.B. »%2«) verwenden, um beim Start zu verbinden. - Malformed option argument: %1 command-line Fehlerhaftes Schalterargument: %1 - Unknown option argument: %1 command-line Unbekannter Schalter: %1 @@ -363,7 +403,6 @@ HWAskQuitDialog - Do you really want to quit? Willst du wirklich beenden? @@ -371,82 +410,66 @@ HWChatWidget - %1 has been removed from your ignore list %1 wurde aus deiner Ignorierliste entfernt - %1 has been added to your ignore list %1 wurde in deine Ignorierliste aufgenommen - %1 has been removed from your friends list %1 wurde aus deiner Freundesliste entfernt - %1 has been added to your friends list %1 wurde in deine Freundesliste aufgenommen - Stylesheet imported from %1 Stylesheet aus %1 importiert - Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset! Gib %1 ein, wenn du das jetzige Stylesheet in Zukunft weiterverwenden willst; gib %2 ein, um es zurückzusetzen! - Couldn't read %1 Konnte %1 nicht lesen - StyleSheet discarded Stylesheet verworfen - StyleSheet saved to %1 Stylesheet wurde nach %1 gesichert - Failed to save StyleSheet to %1 Stylesheet konnte nicht nach %1 gesichert werden - %1 has joined %1 ist beigetreten - Chat log - - - - + Chat-Protokoll + + Enter chat messages here and send them with [Enter] - - - - + Gib hier Chatnachrichten ein und sende sie mit [Eingabe] + + List of players - - - - + Liste der Spieler + + %1 has left %1 ist gegangen - %1 has left (%2) %1 ist gegangen (%2) @@ -454,72 +477,57 @@ HWForm - - Cannot save record to file %1 Datei %1 konnte nicht gespeichert werden - DefaultTeam - Standard-Team - - - + Standard-Team + + Hedgewars Demo File File Types Hedgewars-Wiederholungsdatei - Hedgewars Save File File Types Hedgewars-Spielstandsdatei - Demo name Wiederholungsname - Demo name: Wiederholungsname: - Game aborted Spiel abgebrochen - Nickname Spitzname - - No nickname supplied. Kein Spitznahme angegeben. - Someone already uses your nickname %1 on the server. Please pick another nickname: Dein Spitzname »%1« ist bereits in Verwendung. Bitte wähle einen anderen Spitznamen: - %1's Team Team von %1 - Hedgewars - Nick registered Hedgewars – Spitzname registriert - This nick is registered, and you haven't specified a password. If this nick isn't yours, please register your own nick at www.hedgewars.org @@ -532,7 +540,6 @@ Passwort: - Your nickname is not registered. To prevent someone else from using it, please register it at www.hedgewars.org @@ -541,7 +548,6 @@ ihn bitte auf www.hedgewars.org - Your password wasn't saved either. @@ -550,79 +556,88 @@ Außerdem wurde auch dein Passwort nicht gespeichert. - - Hedgewars - Empty nickname Hedgewars – leerer Spitzname - Hedgewars - Wrong password Hedgewars – falsches Passwort - You entered a wrong password. Du hast ein falsches Passwort eingegeben. - Try Again noch einmal versuchen - Hedgewars - Connection error Hedgewars – Verbindungsfehler - You reconnected too fast. Please wait a few seconds and try again. Du hast dich zu früh erneut verbunden. Bitte warte ein paar Sekunden und versuch es noch einmal. - - - - Guest Gast - Room password Raumkennwort - The room is protected with password. Please, enter the password: Der Raum wird durch ein Kennwort geschützt. Bitte Kennwort eingeben: - This page requires an internet connection. - Diese Seite benötigt eine Internetverbindung. + Diese Seite benötigt eine Internetverbindung. + + + Team 1 + Team 1 + + + Team %1 + Default team name + Team %1 + + + Computer %1 + Default computer team name + Computer %1 + + + Unknown network error (possibly missing SSL library). + Unbekannter Netzwerkfehler (möglicherweise fehlt eine SSL-Bibliothek). + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + Diese Funktion benötigt eine Internetverbindung, aber du scheinst nicht online zu sein (Fehlercode: %1). + + + Internal error: Reply object is invalid. + Interner Fehler: Reply-Objekt ist ungültig. HWGame - - en.txt + 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. de.txt - Cannot open demofile %1 Wiederholungsdatei »%1« konnte nicht geöffnet werden - A Fatal ERROR occured! - The game engine had to stop. We are very sorry for the inconvenience :( @@ -644,202 +659,163 @@ HWHostPortDialog - Connect to server - + Zu Server verbinden HWMapContainer - All Alles - Small Klein - Medium Mittel - Large Groß - Cavern Höhle - Wacky Verrückt - Small tunnels Kleine Tunnel - Medium tunnels Mittelgroße Tunnel - Seed Seed - Map type: Kartentyp: - Image map Bild - Mission map Missionskarte - Hand-drawn Handgemalt - Randomly generated Zufallsgeneriert - Random maze Zufallslabyrinth - Forts - - - - + Festungen + + Random Zufall - View and edit the seed, the source of randomness in the game - - - - + Den Seed (Zufallsquelle des Spiels) anzeigen oder bearbeiten + + Map preview: Kartenvorschau: - Load map drawing Gezeichnete Karte laden - Edit map drawing Gezeichnete Karte bearbeiten - Small islands Kleine Inseln - Medium islands Mittelgroße Inseln - Large islands Große Inseln - Randomize the theme - - - - + Zufällige Szenierie auswählen + + Choose a theme - - - - + Szenerie auswählen + + Randomize the map, theme and seed - - - - + Zufällige Karte, Szenerie und zufälligen Seed auswählen + + Randomize the theme and seed - - - - + Zufällige Szenerie und zufälligen Seed auswählen + + Randomize the seed - - - - + Zufälligen Seed auswählen + + Click to randomize the map, theme and seed - - - - + Klicken, um Karte, Szenerie und Seed zufällig auszuwählen + + Click to randomize the theme and seed - - - - + Klicken, um Szenerie und Seed zufällig auszuwählen + + Adjust the complexity of the generated map - - - - + Komplexität der generierten Karte anpassen + + Adjust the distance between forts - - - - + Abstand zwischen den Festungen anpassen + + Click to edit - - - - + Anklicken zum Bearbeiten + + Map size: Kartengröße: - Maze style: Labyrinth-Art: - Mission: Mission: - Map: Karte: @@ -848,38 +824,30 @@ Thema: - Load drawn map Gezeichnete Karte laden - Drawn Maps Gezeichnete Karten - All files Alle Dateien - Large tunnels Große Tunnel - - Theme: %1 Szenerie: %1 - Random perlin Perlinzufall - Style: Stil: @@ -887,17 +855,14 @@ HWNetServersModel - Title Spielname - IP IP - Port Port @@ -905,33 +870,26 @@ HWNewNet - The host was not found. Please check the host name and port settings. Der Server wurde nicht gefunden. Bitte überprüfe deine Einstellungen. - Connection refused Verbindungsaufbau abgelehnt - Quit reason: Gegangen wegen: - Room destroyed Raum geschlossen - You got kicked Du wurdest hinausgeworfen - - %1 *** %2 has joined the room %1 *** %2 hat den Raum betreten @@ -940,32 +898,26 @@ %1 *** %2 ist beigetreten - %1 *** %2 has left (%3) %1 *** %2 ist gegangen (%3) - %1 *** %2 has left %1 *** %2 ist gegangen - User quit Benutzer ist gegangen - Remote host has closed connection Die Verbindung wurde von der anderen Seite geschlossen. - The server is too old. Disconnecting now. Der Server ist zu alt. Verbindung wird beendet. - Server authentication error Server-Authentifizierungsfehler @@ -973,12 +925,10 @@ HWPasswordDialog - Login Einloggen - To connect to the server, please log in. If you don't have an account on www.hedgewars.org, @@ -989,17 +939,14 @@ dann trag einfach nur deinen Spitznamen ein. - Nickname: Spitzname: - Password: Passwort: - New Account Neues Benutzerkonto @@ -1007,12 +954,10 @@ HWUploadVideoDialog - Upload video Video hochladen - Upload Hochladen @@ -1020,7 +965,6 @@ HatButton - Change hat (%1) Hut wechseln (%1) @@ -1028,22 +972,18 @@ HatPrompt - Choose a hat - - - - + Hut wählen + + Cancel Abbrechen - Use selected hat Gewählten Hut auswählen - Search for a hat: Nach einem Hut suchen: @@ -1058,7 +998,6 @@ KeyBinder - Category Kategorie @@ -1079,121 +1018,175 @@ %1 Bilder pro Sekunde, - Audio: Audio: - unknown unbekannt - Duration: %1m %2s - Dauer: %1m %2s - - - + Dauer: %1m %2s + + Video: %1x%2 Video: %1x%2 - %1 fps - %1 Hz + %1 Hz + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + Dauer: %1min %2s + + + %1 FPS + %1 FPS + + + + MainWindow + + Undo + Rückgängig + + + Save + Speichern + + + Load + Laden MapModel - No description available. Keine Beschreibung verfügbar. + MinesTimeSpinBox + + Random + Zufall + + + %1 seconds + + %1 Sekunde + %1 Sekunden + + + + + MyWindow + + Add + Hinzufügen + + + Save + Speichern + + + Load + Laden + + + Error + Fehler + + + PageAdmin - Clear Accounts Cache Zwischenspeicher leeren - Fetch data Lade Daten - Server message for latest version: Server-Nachricht für aktuelle Version: - Server message for previous versions: Server-Nachricht für ältere Versionen: - Latest version protocol number: Protokollnummer der neuesten Version: - MOTD preview: - MOTD Vorschau: - - - + MOTD-Vorschau: + + Set data Speichere Daten - General Allgemein - Bans Verbannungen - IP/Nick IP-Adr./Spitzname - Expiration Ablaufzeitpunkt - Reason Grund - Refresh Aktualisieren - Add Hinzufügen - Remove Entfernen + PageCampaign + + Team + Team + + + Campaign + Kampagne + + + Mission + Mission + + + Start fighting + Auf in den Kampf! + + + PageConnecting - Connecting... Verbinden … @@ -1201,87 +1194,89 @@ PageDataDownload - Loading, please wait. Ladevorgang. Bitte warten. - This page requires an internet connection. - Diese Seite benötigt eine Internetverbindung. - - - + Diese Seite benötigt eine Internetverbindung. + + Open packages directory Paketeverzeichnis öffnen + + Load the start page + Startseite laden + + + Open the directory in which the downloaded files are stored in your system + Verzeichnis, in dem sich die heruntergeladenen Dateien in deinem System befinden, öffnen + + + Unknown network error (possibly missing SSL library). + Unbekannter Netzwerkfehler (möglicherweise fehlt eine SSL-Bibliothek). + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + Diese Funktion benötigt eine Internetverbindung, aber du scheinst nicht online zu sein (Fehlercode: %1). + + + Internal error: Reply object is invalid. + Interner Fehler: Reply-Objekt ist ungültig. + PageDrawMap - Undo Rückgängig - Clear Leeren - Load Laden - Save Speichern - Load drawn map Gezeichnete Karte laden - Save drawn map Gezeichnete Karte sichern - - Drawn Maps Gezeichnete Karten - - All files Alle Dateien - Eraser Radierer - Polyline Linienzug - Rectangle Rechteck - Ellipse Ellipse - Optimize Optimieren @@ -1289,84 +1284,109 @@ PageEditTeam - General Allgemein - Select an action to choose a custom key bind for this team Wählt eine Aktion, um eine benutzerdefinierte Taste für dieses Team auszuwählen - Use my default Verwende meine Vorgabe - Reset all binds Alle Tastenbelegungen zurücksetzen - Custom Controls Benutzerdefinierte Steuerung - Hat Hut - Name Name - This hedgehog's name Name dieses Igels - Randomize this hedgehog's name Zufälligen Igelnamen generieren - Random Team Zufallsteam + + Play a random example of this voice + Ein zufälliges Beispiel dieser Stimme abspielen + + + Random Hats + Zufallshüte + + + Random Names + Zufallsnamen + + + Randomize the team name + Zufälligen Teamnamen generieren + + + Randomize the grave + Zufälliges Grab auswählen + + + Randomize the flag + Zufällige Flagge auswählen + + + Randomize the voice + Zufällige Stimme auswählen + + + Randomize the fort + Zufällige Festung auswählen + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + CPU %1 + + + %1 (%2) + %1 (%2) + PageGameStats - Details Details - - Health graph Lebenspunkteverlauf - Ranking Platzierung - The best shot award was won by <b>%1</b> with <b>%2</b> pts. - Der beste Schuss geht an <br>%1</b> mit <b>%2</b> Schadenspunkt. - Der beste Schuss geht an <br>%1</b> mit <b>%2</b> Schadenspunkten. + Der Preis für den besten Schuss geht an <b>%1</b> mit <b>%2</b> Schadenspunkt. + Der Preis für den besten Schuss geht an <b>%1</b> mit <b>%2</b> Schadenspunkten. - The best killer is <b>%1</b> with <b>%2</b> kills in a turn. Der blutigste Kämpfer ist <b>%1</b> mit <b>%2</b> Opfer in einer Runde. @@ -1374,7 +1394,6 @@ - A total of <b>%1</b> hedgehog(s) were killed during this round. Insgesamt fand <b>%1</b> Igel ein trauriges Ende in dieser Runde. @@ -1382,60 +1401,68 @@ - (%1 kill) + Number of kills in stats screen, written after the team name (%1 Opfer) (%1 Opfer) - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. + + <b>%1</b> dachte, es sei gut, die eigenen Igel mit <b>%2</b> Punkt zu verletzen. + <b>%1</b> dachte, es sei gut, die eigenen Igel mit <b>%2</b> Punkten zu verletzen. + + + + <b>%1</b> killed <b>%2</b> of his own hedgehogs. + + <b>%1</b> erledigte <b>%2</b> seiner eigenen Igel. + <b>%1</b> erledigte <b>%2</b> seiner eigenen Igel. + + + + <b>%1</b> was scared and skipped turn <b>%2</b> times. + + <b>%1</b> hatte Angst und übersprang <b>%2</b> Runde. + <b>%1</b> hatte Angst und übersprang <b>%2</b> Runden. + + + + Play again + Nochmal spielen + + + Save + Speichern + + + (%1 %2) + 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” + + (%1 %2) + (%1 %2) + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. <b>%1</b> dachte, es sei gut, die eigenen Igel mit <b>%2</b> Punkt zu verletzen. <b>%1</b> dachte, es sei gut, die eigenen Igel mit <b>%2</b> Punkten zu verletzen. - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. - - <b>%1</b> erledigte <b>%2</b> seiner eigenen Igel. - <b>%1</b> erledigte <b>%2</b> seiner eigenen Igel. - - - - - <b>%1</b> was scared and skipped turn <b>%2</b> times. + <b>%1</b> killed <b>%2</b> of their own hedgehogs. - <b>%1</b> hatte Angst und übersprang <b>%2</b> Runde. - <b>%1</b> hatte Angst und übersprang <b>%2</b> Runden. - - - - - Play again - Nochmal spielen - - - - Save - Speichern - - - - (%1 %2) - - (%1 %2) - (%1 %2) + <b>%1</b> erledigte <b>%2</b> der eigenen Igel. + <b>%1</b> erledigte <b>%2</b> der eigenen Igel. PageInGame - In game... Im Spiel … @@ -1443,7 +1470,6 @@ PageInfo - Open the snapshot folder Screenshot-Verzeichnis öffnen @@ -1451,72 +1477,58 @@ PageMain - Downloadable Content Herunterladbare Inhalte - Play a game on a single computer Auf einen einzelnen Computer spielen - Play a game across a network Über ein Netzwerk spielen - Read about who is behind the Hedgewars Project Lies wer hinter dem Hedgewars-Projekt steckt - Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars Hier kannst du uns Feedback geben, indem du uns Probleme meldest, neue Funktionen vorschlägst oder einfach nur sagst, wie dir Hedgewars gefällt - Access the user created content downloadable from our website Auf von Benutzern erstellte Inhalte, die man von unserer Webseite herunterladen kann, zugreifen - Exit game Spiel verlassen - Manage videos recorded from game Vom Spiel aufgezeichnete Videos verwalten - Edit game preferences Spieleinstellungen bearbeiten - Play a game across a local area network ein Spiel über ein lokales Netzwerk (LAN) spielen - Play a game on an official server ein Spiel auf einem offiziellen Server spielen - Feedback Feedback - Play local network game Im lokalen Netzwerk spielen - Play official network game Im offiziellem Netzwerk spielen @@ -1524,17 +1536,14 @@ PageMultiplayer - Start Starten - Start fighting (requires at least 2 teams) - - - - + In die Schlacht ziehen (benötigt mindestens 2 Teams) + + Edit game preferences Spieleinstellungen bearbeiten @@ -1546,55 +1555,45 @@ Steuerung - Edit game preferences Spieleinstellungen bearbeiten - Turn on the lightbulb to show the other players when you're ready to fight - - - - + Schalte die Lampe ein, um den anderen Spielern zu zeigen, dass du bereit zum Kämpfen bist + + Start Starten - Update Aktualisieren - Room name - - - - + Raumname + + Update the room name - - - - + Raumnamen aktualisieren + + Room controls Raumeinstellungen - Start fighting (requires at least 2 teams) - + In die Schlacht ziehen (benötigt mindestens 2 Teams) PageNetServer - Click here for details Klick hier, um mehr zu erfahren - Insert your address here Gib deine Adress hier ein @@ -1602,241 +1601,214 @@ PageOptions - New team Neues Team - Edit team Team bearbeiten - Delete team Team löschen - You can't edit teams from team selection. Go back to main menu to add, edit or delete teams. Du kannst keine Teams bei der Team-Auswahl ändern. Gehe zum Hauptmenü zurück, um Teams hinzuzufügen, zu editieren oder zu löschen. - New scheme Neues Spielprofil - Edit scheme Spielprofil bearbeiten - Delete scheme Spielprofil löschen - New weapon set Neues Arsenal - Edit weapon set Arsenal bearbeiten - Delete weapon set Arsenal löschen - Advanced Erweitert - Reset to default colors Auf Standard-Farben zurücksetzen - Proxy host Host - Proxy port Port - Proxy login Benutzername - Proxy password Passwort - No proxy Kein Proxy - Socks5 proxy Socks5-Proxy - HTTP proxy HTTP-Proxy - System proxy settings System-Proxy-Einstellungen - Select an action to change what key controls it Wähle eine Aktion, um ihre Tastenbelegung zu ändern - Reset to default Auf Standard zurücksetzen - Reset all binds Alle Tastenbelegungen zurücksetzen - - Game Spiel - Graphics Grafik - Audio Ton - Controls Steuerung - Video Recording Videoaufzeichnung - Network Netzwerk - Teams Teams - Schemes Spielprofile - Weapons Arsenale - Frontend Benutzeroberfläche - Custom colors Benutzerdefinierte Farben - Game audio Ton im Spiel - Frontend audio Ton in der Benutzeroberfläche - Account Benutzerkonto - Proxy settings Proxy-Einstellungen - Miscellaneous Verschiedenes - Updates Updates - Check for updates nach Updates suchen - Video recording options Videoaufzeichnungseinstellungen + + MISSING LANGUAGE NAME [%1] + FEHLENDER SPRACHNAME [%1] + + + Can't delete last team + Kann letztes Team nicht löchen + + + You can't delete the last team! + Du kannst das letzte Team nicht löschen! + + + x + 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 + × + + + Check now + Jetzt überprüfen + PagePlayDemo - Play demo - Wiederholung abspielen - - - + Wiederholung abspielen + + Play the selected demo - - - - + Ausgewählte Wiederholung abspielen + + Load the selected game - - - - + Ausgewähltes Spiel laden + + Rename dialog Umbenennen - Enter new file name: Neuer Dateiname: @@ -1852,7 +1824,6 @@ Betreten - Admin features Verwalten @@ -1877,7 +1848,6 @@ Leeren - %1 players online %1 Spieler online @@ -1885,22 +1855,18 @@ - Search for a room: Raumsuche: - Create room Raum erstellen - Join room Raum beitreten - Room state Raumfilter @@ -1909,7 +1875,6 @@ Filter leeren - Open server administration page Server-Administrationsseite öffnen @@ -1917,27 +1882,22 @@ PageScheme - New Neu - Delete Löschen - Gain 80% of the damage you do back in health 80% des ausgeteilten Schadens werden dir als Gesundheitspunkte gutgeschrieben - Share your opponents pain, share their damage Teile den Schmerz deines Gegners, teile seinen verursachten Schaden - Your hogs are unable to move, put your artillery skills to the test Deine Igel können sich nicht bewegen, gib Dein Bestes im Fernkampf @@ -1950,231 +1910,190 @@ Sekunden - Defend your fort and destroy the opponents, two team colours max! - Verteidige deine Festung und zerstöre die des Gegners, maximal zwei Teamfarben! + Verteidige deine Festung und zerstöre die des Gegners, maximal zwei Teamfarben! Teams will start on opposite sides of the terrain, two team colours max! Die Teams starten auf gegenüberliegenden Terrainseiten, maximal zwei Teamfarben! - Land can not be destroyed! Die Landschaft ist nicht zerstörbar! - Lower gravity Verringerte Schwerkraft - Assisted aiming with laser sight Zielfhilfe durch Laservisier - All hogs have a personal forcefield Alle Igel haben ein eigenes Schutzschild - Order of play is random instead of in room order. Gespielt wird in zufälliger Reihenfolge. - Play with a King. If he dies, your side dies. Beschütze deinen König! Ohne ihn hast du verloren. - Take turns placing your hedgehogs before the start of play. Platziere deine Igel selbständig vor Rundenbeginn. - Ammo is shared between all teams that share a colour. Alle Teams mit gleicher Farbe teilen sich den gleichen Waffenvorrat. - Disable girders when generating random maps. Keine Bauträger auf Zufallskarten platzieren. - Disable land objects when generating random maps. Keine Landschaftsobjekte beim Generieren von Zufallskarten platzieren. - AI respawns on death. KI wird wiederbelebt. - All (living) hedgehogs are fully restored at the end of turn Alle (lebenden) Igel werden am Ende der Runde vollkommen geheilt - Attacking does not end your turn. Angriffe beenden die Runde nicht. - Weapons are reset to starting values each turn. Arsenal wird jede Runde zurückgesetzt. - Each hedgehog has its own ammo. It does not share with the team. Jeder Igel hat sein eigenes Arsenal. Es wird nicht mit dem Team geteilt. - You will not have to worry about wind anymore. Du wirst dich nicht mehr um Wind kümmern müssen. - Wind will affect almost everything. Wind beeinflusst fast alles. - + Name of this scheme + Name dieses Spielprofils + + Copy Kopieren - Teams in each clan take successive turns sharing their turn time. Teams gleicher Farbe kommen nacheinander dran und teilen sich ihre Zugzeit. - Add an indestructible border around the terrain Dem Spielfeld eine unzerstörbare Randbegrenzung hinzufügen - Add an indestructible border along the bottom Dem unteren Kartenrand eine unzerstörbare Randbegrenzung anfügen - Each clan starts in its own part of the terrain. - - - - + Jeder Klan startet in seinem eigenen Teil des Geländes. + + Overall damage and knockback in percent - - - - + Basisschaden und -rückschlag in Prozent + + Turn time in seconds - - - - + Zugzeit in Sekunden + + Initial health of hedgehogs - - - - + Anfangsgesundheit der Igel + + How many rounds have to be played before Sudden Death begins - - - - + Wie viele Runden gespielt werden müssen, bevor der Sudden Death beginnt + + How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. - - - - + Wie hoch das Wasser je Zug im Sudden Death steigt. Zusammen mit Sudden-Death-Schaden auf 0 setzen, um Sudden Death zu deaktivieren. + + 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. - - - - + Wie viel Gesundheit die Igel pro Zug im Sudden Death verlieren, bis zu 1 runter. Zusammen mit Sudden-Death-Wasseranstieg auf 0 setzen, um Sudden Death zu deaktivieren. + + Maximum rope length in percent - - - - + Maximale Seillänge in Prozent + + Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. - - - - + Wahrscheinlichkeit, dass eine abgeworfene Kiste ein Erste-Hilfe-Koffer ist. Alle anderen Kisten werden Waffen- oder Werkzeugkisten sein. + + Likelihood of a crate dropping before a turn - - - - + Wahrscheinlichkeit, dass vor Zugbeginn eine Kiste abgeworfen wird + + Health bonus for collecting a health crate - - - - + Gesundheitsbonus für das Aufsammeln eines Erste-Hilfe-Koffers + + 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. - - - - + Minenzeitzünder. Ein zufälliger Zeitzünder liegt zwischen 0 und 5 Sekunden. Luftminen detonieren nach einem Viertel dieser Zeit. + + Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. - - - - + Durchschnittliche Anzahl der Minen, die auf mittelgroßen Inselkarten platziert werden. Dieser Wert wird für andere Karten skaliert. + + Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. - - - - + Wahrscheinlichkeit, dass eine Mine ein Blindgänger ist. Minen, die von Igeln platziert wurden, sind daavon nicht betroffen. + + Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - - - - + Durchschnittliche Anzahl von Pulverfässern, die auf mittelgroßen Inselkarten platziert werden. Dieser Wert wird für andere Karten skaliert. + + Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - - - - + Durchschnittliche Anzahl der Luftminen, die auf mittelgroßen Inselkarten platziert werden. Dieser Wert wird für andere Karten skaliert. + + Affects the left and right boundaries of the map - - - - + Die Art des linken und rechten Kartenrands + + Time you get after an attack - - - - + Zeit, die du nach einem Angriff erhälst + + Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. - - - - + Zusätzlicher Parameter, um Spielstile zu konfigurieren. Die Bedeutung hängt vom verwendeten Stil ab, siehe Dokumentation. Im Zweifel leer lassen. + + None (Default) Keine (Standard) - Wrap (World wraps) Umbrechen (Welt wiederholt sich) - Bounce (Edges reflect) Abprallen (Grenzen reflektieren) - Sea (Edges connect to sea) Ozean (Grenzen sind mit dem Wasser verbunden) @@ -2182,22 +2101,18 @@ PageSelectWeapon - Default Standard - Delete Löschen - New Neu - Copy Kopieren @@ -2205,32 +2120,26 @@ PageSinglePlayer - Play a quick game against the computer with random settings Ein Schnellspiel gegen den Computer mit Zufallseinstellungen spielen - Play a hotseat game against your friends, or AI teams Gegen deine Freunde oder KI-Teams spielen - Campaign Mode Kampagnenmodus - Practice your skills in a range of training missions Deine Fähigkeiten in verschiedenen Trainingsmissionen verbessern - Watch recorded demos Aufgezeichnete Widerholungen ansehen - Load a previously saved game Ein vormals gespeichertes Spiel ansehen @@ -2238,22 +2147,42 @@ PageTraining - + Pick the training to play + Wähle eine Übung aus + + + Pick the challenge to play + Wähle eine Herausforderung aus + + + Pick the scenario to play + Wähle ein Szenario aus + + + Trainings + Übungen + + + Challenges + Herausforderungen + + + Scenarios + Szenarios + + No description available Keine Beschreibung verfügbar - Select a mission! Wähle eine Mission! - Pick the mission or training to play - Wähle eine Mission oder ein Training - - - + Wähle eine Mission oder ein Training + + Start fighting Auf in den Kampf! @@ -2261,17 +2190,14 @@ PageVideos - Name Name - Size Größe - %1 bytes %1 Byte @@ -2279,17 +2205,14 @@ - (in progress...) (in Bearbeitung …) - encoding encoden - uploading hochladen @@ -2304,12 +2227,10 @@ Größe: %1 - Date: %1 Datum: %1 - Size: %1 Größe: %1 @@ -2317,54 +2238,46 @@ QAction - Kick Hinauswerfen - Restrict Joins Beitreten unterbinden - Restrict Team Additions Hinzufügen weiterer Teams unterbinden - Info Info - Ban Verbannen - + Delegate room control + Raumleitung überlassen + + Follow Folgen - - Ignore Ignorieren - - Add friend Als Freund hinzufügen - Unignore Nicht mehr ignorieren - Remove friend Als Freund entfernen @@ -2373,27 +2286,22 @@ Aktualisieren - Restrict Unregistered Players Join Beitreten unregistrierter Spieler unterbinden - Show games in lobby Spiele in Vorbereitung zeigen - Show games in-progress Zur Zeit laufende Spiele zeigen - Show password protected Passwortgeschützte Spiele zeigen - Show join restricted Spiele mit Zutrittsverbot zeigen @@ -2401,166 +2309,137 @@ QCheckBox - Fullscreen Vollbild - Show FPS Bildwiederholrate anzeigen - Alternative damage show Alternativen Schaden anzeigen - Append date and time to record file name Datum und Uhrzeit an Wiederholungsdateinamen anhängen - Check for updates at startup Beim Spielstart nach neuen Versionen suchen - Show ammo menu tooltips Kurzinfos für Waffen anzeigen - - Save password Passwort speichern - Save account name and password Kontoname und Passwort speichern - Video is private Video ist privat - Record audio Audio aufzeichnen - Use game resolution Spielauflösung verwenden - Visual effects Visuelle Effekte - - Sound Ton - In-game sound effects Toneffekte im Spiel - - Music Musik - In-game music Musik im Spiel - Frontend sound effects Toneffekte in der Benutzeroberfläche - Frontend music Musik in der Benutzeroberfläche - Team Team - Enable team tags by default Teambeschriftungsschilder standardmäßig aktivieren - Hog Igel - Enable hedgehog tags by default Namensschilder standardmäßig aktivieren - Health Lebenspunkte - Enable health tags by default Lebenspunktebeschriftungsschilder standardmäßig aktivieren - Translucent Transluzent - Enable translucent tags by default Transluzente Beschriftungsschilder standardmäßig aktivieren + + Enable visual effects such as animated menu transitions and falling stars + Aktiviert visuelle Effekte, wie z.B. animierte Menüübergänge und fallende Sterne + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + Falls aktiviert, wird Hedgewars das Datum und die Uhrzeit in der Form »YYYY-MM-DD_hh-mm« in die Dateinamen von automatisch erstellten Wiederholungen hinzufügen. + QComboBox - Human Mensch - Computer (Level %1) - + Computer (Stufe %1) Level Stufe - (System default) (Systemstandard) - - Community - - - Any Alle @@ -2573,125 +2452,129 @@ Im Spiel - Disabled Deaktiviert - Red/Cyan Rot/Türkis - Cyan/Red Türkis/Rot - Red/Blue Rot/Blau - Blue/Red Blau/Rot - Red/Green Rot/Grün - Green/Red Grün/Rot - Side-by-side Nebeneinander - Top-Bottom Übereinander - Red/Cyan grayscale Rot/Türkis, Graustufen - Cyan/Red grayscale Türkis/Rot, Graustufen - Red/Blue grayscale Rot/Blau, Graustufen - Blue/Red grayscale Blau/Rot, Graustufen - Red/Green grayscale Rot/Grün, Graustufen - Green/Red grayscale Grün/Rot, Graustufen + + Community + Community + + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + Stereoskopie erzeugt eine Tiefenillusion, wenn man eine 3D-Brille trägt. + + + 24 FPS + 24 FPS + + + 25 FPS + 25 FPS + + + 30 FPS + 30 FPS + + + 50 FPS + 50 FPS + + + 60 FPS + 60 FPS + QGroupBox - Team Members Teammitglieder - Fort Festung - Net game Netzwerkspiel - Playing teams Spielende Teams - Game Modifiers Spielmodifikatoren - Basic Settings Grundeinstellungen - Team Settings Teameinstellungen - Videos Videos - Description Beschreibung @@ -2699,37 +2582,30 @@ QLabel - Weapons Arsenal - Host: Host: - Port: Port: - Resolution Auflösung - FPS limit Bildwiederholratenbegrenzung (Hz) - Server name: Servername: - Server port: Serverport: @@ -2738,72 +2614,58 @@ Version - Initial sound volume Ausgangslautstärke - Damage Modifier Prozentualer Schaden - Turn Time Rundenzeit - Initial Health Anfangslebenspunkte - Sudden Death Timeout Runden bis Sudden Death - Mines Time Minenzündzeit - Mines Minen - Barrels - - - - + Pulverfässer + + Air Mines Luftminen - % Retreat Time - - - - + % Rückzugszeit + + Scheme Name: Spielprofil: - Crate Drops Kistenabwurf - % Dud Mines % Blindgänger - Name Name @@ -2812,27 +2674,22 @@ Typ - Player - - - - + Spieler + + Grave Grab - Flag Flagge - Voice Stimme - Locale Sprache @@ -2845,47 +2702,38 @@ Tipp: - Quality Qualität - % Health Crates % Erste-Hilfe-Koffer - Health in Crates Lebenspunkte in Erste-Hilfe-Koffern - Sudden Death Water Rise - Steigen des Wassers - - - + Sudden-Death-Wasseranstieg + + Sudden Death Health Decrease - Schaden bei Sudden Death - - - + Sudden-Death-Schaden + + % Rope Length % Seillänge - Stereo rendering - Stereo-Rendering - - - + Stereo-Rendering + + Style Stil - Scheme Spielprofil @@ -2898,7 +2746,6 @@ Dieses Spiel wird unter den Bedingungen der GNU General Public License v2 verbreitet - There are videos that are currently being processed. Exiting now will abort them. Do you really want to quit? @@ -2907,170 +2754,149 @@ Willst du wirklich verlassen? - Please provide either the YouTube account name or the email address associated with the Google Account. Bitte gib entwerder deinen YouTube-Kontonamen oder die entsprechende eMail-Adresse des Google-Kontos an. - Account name (or email): Kontoname (oder E-Mail): - Password: Passwort: - Video title: Videotitel: - Video description: Videobeschreibung: - Tags (comma separated): Tags (durch Kommas getrennt): - Description Beschreibung - Nickname Spitzname - Format Format - Audio codec Audio-Codec - Video codec Video-Codec - Framerate Bildrate - Bitrate (Kbps) - Bitrate (kB/s) - - - + Bitrate (kB/s) + + This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! Diese Entwicklungsversion ist unfertig und könnte nicht kompatibel mit anderen Versionen des Spiels sein, wobei sogar einige Funktionen sogar kaputt oder unfertig sein könnten. - Fullscreen Vollbild - Fullscreen Resolution Vollbild-Auflösung - Windowed Resolution Fenster-Auflösung - Your Email Deine E-Mail-Adresse - Summary Zusammenfassung - Send system information Systeminformation senden - Type the security code: Gib den Sicherheitscode ein: - Revision - Revision - - - + Revision + + This program is distributed under the %1 - Dieses Programm wird unter der %1 veröffentlicht - - - - + Dieses Programm wird unter der %1 veröffentlicht + + Tip: %1 Tipp: %1 - Displayed tags above hogs and translucent tags Angezeigte/transluzente Beschriftungsschilder über Igel - This setting will be effective at next restart. Diese Einstellung tritt ab nächstem Neustart in Kraft. - World Edge Spielfeldgrenze - Script parameter Skriptparameter + + Stereoscopy + Stereoskopie + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + Bitrate (Kibit/s) + QLineEdit - unnamed unbenannt - - hedgehog %1 Igel %1 - anonymous anonym + + unnamed (%1) + unbenannt (%1) + QMainWindow - Hedgewars %1 Hedgewars %1 @@ -3078,79 +2904,62 @@ QMessageBox - Connection to server is lost Verbindung zum Server wurde unterbrochen - Error Fehler - File association failed. Dateizuordnung fehlgeschlagen. - Error while authenticating at google.com: Fehler während Authentifizierung auf google.com: - Login or password is incorrect Login oder Passwort inkorrekt - Error while sending metadata to youtube.com: Fehler bei Senden von Meta-Daten zu youtube.com: - Teams - Are you sure? Teams - Bist du dir sicher? - Do you really want to delete the team '%1'? Willst du das Team »%1« wirklich löschen? - - Cannot delete default scheme '%1'! Standard-Profil »%1« kann nicht gelöscht werden! - Please select a record from the list Bitte wähle eine Aufnahme in der Liste aus - Unable to start server Server konnte nicht gestartet werden - - Hedgewars - Error Hedgewars – Fehler - - Hedgewars - Success Hedgewars – Erfolg - All file associations have been set Alle Dateizuordnungen wurden gesetzt @@ -3189,102 +2998,76 @@ Fehler-Code: %1 - - Video upload - Error Video hochladen - Fehler - - Netgame - Error Netzwerkspiel - Fehler - Please select a server from the list Bitte wähle einen Server von der Liste - Please enter room name Bitte einen Raumnamen eingeben - - - - Record Play - Error - Aufnahmewiedergabe - Fehler - - - - + Aufnahmewiedergabe - Fehler + + Please select record from the list - Bitte eine Aufnahme aus der Liste auswählen - - - + Bitte eine Aufnahme aus der Liste auswählen + + Cannot rename to - Datei konnte nicht unbenannt werden nach - - - + Datei konnte nicht unbenannt werden nach + + Cannot delete file - Datei konnte nicht gelöscht werden - - - + Datei konnte nicht gelöscht werden + + Room Name - Error Raumname - Fehler - Please select room from the list Bitte einen Raum aus der Liste auswählen - Room Name - Are you sure? Raumname - Bist du dir sicher? - The game you are trying to join has started. Do you still want to join the room? Das Spiel in das du beitreten möchtest hat bereits begonnen. Willst du trotzdem den Raum betreten? - Schemes - Warning Spielprofile – Warnung - Schemes - Are you sure? Spielprofile – Bist du dir sicher? - Do you really want to delete the game scheme '%1'? Willst du das Spielprofil »%1« wirklich löschen? - - - Videos - Are you sure? Videos – Bist du dir sicher? - Do you really want to delete the video '%1'? Willst du das Video »%1« wirklich löschen? - Do you really want to remove %1 file(s)? Willst du wirklich %1 Datei entfernen? @@ -3292,113 +3075,115 @@ - Do you really want to cancel uploading %1? Willst du das Hochladen von %1 wirklich abbrechen? - - - File error Dateifehler - Cannot open '%1' for writing »%1« konnte zum Schreiben nicht geöffnet werden - - Cannot open '%1' for reading »%1« konnte zum Lesen nicht geöffnet werden - Cannot use the ammo '%1'! Munition »%1« kann nicht benutzt werden! - - Weapons - Warning Arsenal – Warnung - Cannot overwrite default weapon set '%1'! Standard-Arsenal »%1« kann nicht überschrieben werden! - Cannot delete default weapon set '%1'! Standard-Arsenal »%1« kann nicht gelöscht werden! - Weapons - Are you sure? Arsenal – Bist du dir sicher? - Do you really want to delete the weapon set '%1'? Willst du das Arsenal »%1« wirklich löschen? - Hedgewars - Nick not registered Hedgewars – Spitzname nicht registriert - System Information Preview Systeminformations-Vorschau - - Failed to generate captcha Captcha-Generierung fehlgeschlagen - Failed to download captcha Captcha-Download fehlgeschlagen - Please fill out all fields. Email is optional. Bitte füll alle Felder aus. Das Feld »E-Mail« ist optional. - Hedgewars - Warning Hedgewars – Warnung - Hedgewars - Information Hedgewars – Information - Not all players are ready Es sind nicht alle Spieler bereit - Are you sure you want to start this game? Not all players are ready. Bist du sicher, dass du diesees Spiel starten willst? Es sind nicht alle Spieler bereit. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + Tschuldigung, Hedgewars kann nicht mit mehr als 48 Igeln gespielt werden. Bitte versuch es mit weniger Igeln erneut. + +Momentane Anzahl Igel: %1 + + + Please select a file from the list. + Bitte wähl eine Datei aus der Liste. + + + Cannot rename file to %1. + Datei konnte nicht nach %1 umbenannt werden. + + + Cannot delete file %1. + Datei %1 konnte nicht gelöscht werden. + + + Teams - Name already taken + Teams – Name bereits belegt + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + Der Teamname »%1« ist bereits belegt, daher wurde der Name deines Teams auf »%2« geändert. + QObject - - No description available Keine Beschreibung verfügbar @@ -3406,148 +3191,114 @@ QPushButton - - Go! - Los! - - - + Los! + + default Standard - OK OK - - Cancel Abbrechen - Start server Server starten - Connect Verbinden - Update Aktualisieren - Specify Verbinden zu … - Start Starten - Play demo - Wiederholung abspielen - - - + Abspielen + + Rename Umbenennen - - - Delete Löschen - Load Laden - Associate file extensions Dateitypen zuordnen - More info Mehr Info - Set default options Auf Standardeinstellungen zurücksetzen - Open videos directory Videoverzeichnis anzeigen - Play Abspielen - - - Upload to YouTube Auf YouTube hochladen - Cancel uploading Hochladen abbrechen - Restore default coding parameters Standard-Kodierungs-Einstellungen wiederherstellen - Open the video directory in your system Das Videoverzeichnis deines Systems öffnen - Play this video Dieses Video abspielen - Delete this video Dieses Video löschen - Upload this video to your Youtube account - Dieses Video zu deinem YouTube-Benutzerkonto hochladen - - - + Dieses Video zu deinem YouTube-Benutzerkonto hochladen + + Reset Zurücksetzen - Set the default server port for Hedgewars Den Standard-Server-Port für Hedgewars setzen - Invite your friends to your server in just 1 click! Lad deine Freunde zu deinem Server mit nur einem Klick ein! @@ -3556,36 +3307,40 @@ Klick, um deine einzigartige URL in die Zwischenablage zu kopieren. Versende diesen Link an deine Freunde, damit sie dich auf deinem Server besuchen können. - Start private server Privaten Server starten - Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you. Klicke um deine Server-Adresse in die Zwischenablage zu kopieren. Sende diese als Link zu deinen Freunden, damit sie dir beitreten können. + + Upload this video to your YouTube account + Dieses Video zu deinem YouTube-Benutzerkonto hochladen + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + Legt die Bitrate von aufgezeichneten Videos als ein Vielfaches von 1024 Bits pro Sekunde fest + RoomNamePrompt - Enter a name for your room. Gib einen Namen für deinen Raum ein. - Cancel Abbrechen - - Create room Raum erstellen - set password Kennwort setzen @@ -3593,72 +3348,60 @@ RoomsListModel - In progress Im Spiel - Room Name Raumname - C + Caption of the column for the number of connected clients in the list of rooms Sp. - T + Caption of the column for the number of teams in the list of rooms T. - Owner Besitzer - Map Karte - Rules Spielprofil - Weapons Arsenal - Random Map Zufallskarte - Random Maze Zufallslabyrinth - Hand-drawn Handgemalt - Forts - - - - + Festungen + + Script Stil - Random Perlin Zufälliges Perlin @@ -3666,27 +3409,22 @@ SeedPrompt - Seed - Seed - - - + Seed + + The map seed is the basis for all random values generated by the game. Der sog. Seed (wörtlich übersetzt: engl. für »Saat«) ist die Basis für alle Zufallswerte, die vom Spiel generiert werden. - Cancel Abbrechen - Set seed Seed setzen - Close Schließen @@ -3694,44 +3432,36 @@ SelWeaponWidget - Weapon set Anfangsbewaffnung - Probabilities Wahrscheinlichkeiten - Ammo in boxes Kisteninhalte - Delays Verzögerungen - New - Neu - - - + Neu + + New (%1) - - - - + Neu (%1) + + Copy of %1 - - - - + Kopie von %1 + + Copy of %1 (%2) - + Kopie von %1 (%2) new @@ -3749,13 +3479,11 @@ TCPBase - Unable to start server at %1. Der Server konnte nicht gestartet werden. Pfad: %1 - Unable to run engine at %1 Error code: %2 Die Spiel-Engine konnte nicht gestartet werden. @@ -3763,7 +3491,6 @@ Fehlercode: %2 - The game engine died unexpectedly! (exit code %1) @@ -3781,7 +3508,6 @@ TeamSelWidget - At least two teams are required to play! Es sind mindestens zwei Teams für ein Spiel nötig! @@ -3796,22 +3522,18 @@ ThemePrompt - Cancel Abbrechen - Search for a theme: Nach einer Szenerie suchen: - Choose a theme - - - - + Szenerie auswählen + + Use selected theme Ausgewählte Szenerie benutzen @@ -3819,41 +3541,30 @@ binds - - up Hoch - - left Links - - right Rechts - - down Runter - attack Angreifen - put Platzieren - switch Wechseln @@ -3862,205 +3573,170 @@ Igel finden - ammo menu Munitions-Menü - slot 1 Slot 1 - slot 2 Slot 2 - slot 3 Slot 3 - slot 4 Slot 4 - slot 5 Slot 5 - slot 6 Slot 6 - slot 7 Slot 7 - slot 8 Slot 8 - slot 9 Slot 9 - timer 1 sec Timer 1 Sek. - timer 2 sec Timer 2 Sek. - timer 3 sec Timer 3 Sek. - timer 4 sec Timer 4 Sek. - timer 5 sec Timer 5 Sek. - pause Pause - volume down Lautstärke verringern - volume up Lautstärke erhöhen - change mode Modus ändern - capture Bildschirmfoto - quit Beenden - chat Chatten - chat history Chatverlauf - confirmation Bestätigung - precise aim Genaues Zielen - zoom in Vergrößern - zoom out Verkleinern - reset zoom Zurücksetzen - long jump Weitsprung - high jump Hochsprung - slot 10 Slot 10 - mute audio - stummschalten - - - + Stummschalten + + record - aufzeichnen - - - + Aufzeichnen + + hedgehog info - Igel-Info - - - + Igel-Info + + autocam / find hedgehog Autokamera / Igel finden - speed up replay Wiederholung beschleunigen + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + Teamleisten umschalten + binds (categories) - Movement Bewegung - Weapons Waffen - Camera Kamera - Miscellaneous Verschiedenes @@ -4068,32 +3744,26 @@ binds (descriptions) - Traverse gaps and obstacles by jumping: Abgründe und Hindernisse mit Sprüngen überwinden: - Fire your selected weapon or trigger an utility item: Deine gewählte Waffe feuern oder dein Werkzeug benutzen: - Pick a weapon or a target location under the cursor: Eine Waffe oder einen Zielpunkt mit dem Cursor wählen: - Switch your currently active hog (if possible): Den zu steuernden Igel wählen (falls möglich): - Pick a weapon or utility item: Eine Waffe oder Werkzeug auswählen: - Set the timer on bombs and timed weapons: Den Zeitzünder von verschiedenen Waffen setzen: @@ -4102,462 +3772,373 @@ Die Kamera zum aktiven Igel bewegen: - Move the cursor or camera without using the mouse: Den Zeiger oder die Kamera ohne die Maus bewegen: - Modify the camera's zoom level: Den Zoom verändern: - Talk to your team or all participants: Mit anderen Spielern sprechen: - Pause, continue or leave your game: Spiel pausieren, fortsetzen oder verlassen: - Modify the game's volume while playing: Lautstärke im Spiel ändern: - Toggle fullscreen mode: Vollbildmodus umschalten: - Take a screenshot: Screenshot machen: - Toggle labels above hedgehogs: - Beschriftungsschilder über Igel durchschalten: - - - + Beschriftungsschilder über Igel durchschalten: + + Record video: Video aufzeichnen: - Hedgehog movement Igel-Bewegung - Toggle automatic camera / refocus on active hedgehog: Automatische Kamera umschalten / auf aktiven Igel wiederzentrieren: - Demo replay: Wiederholung abspielen: + + Heads-up display: + Heads-up display: + binds (keys) - Axis Achse - - (Up) (Hoch) - - (Down) (Runter) - Hat Cooliehat - (Left) (Links) - (Right) (Rechts) - Button Taste - Keyboard Tastatur - Mouse: Left button Maus: Linke Taste - Mouse: Middle button Maus: Mittlere Taste - Mouse: Right button Maus: Rechte Taste - Mouse: Wheel up Maus: Mausrad hoch - Mouse: Wheel down Maus: Mausrad runter - Backspace Rückstelltaste - Tab Tabulator - Clear Clear - Return Eingabetaste - Pause Pause - Escape Escape - Space Leertaste - Delete Entf - Numpad 0 Ziffernblock 0 - Numpad 1 Ziffernblock 1 - Numpad 2 Ziffernblock 2 - Numpad 3 Ziffernblock 3 - Numpad 4 Ziffernblock 4 - Numpad 5 Ziffernblock 5 - Numpad 6 Ziffernblock 6 - Numpad 7 Ziffernblock 7 - Numpad 8 Ziffernblock 8 - Numpad 9 Ziffernblock 9 - Numpad . Ziffernblock , - Numpad / Ziffernblock / - Numpad * Ziffernblock * - Numpad - Ziffernblock - - Numpad + Ziffernblock + - Enter Enter - Equals Gleich - Up Hoch - Down Runter - Right Rechts - Left Links - Insert Einfg - Home Pos1 - End Ende - Page up Bild auf - Page down Bild ab - Num lock Numlock - Caps lock Feststelltaste - Scroll lock Rollen - Right shift Rechte Umschalttaste - Left shift Linke Umschalttaste - Right ctrl Strg rechts - Left ctrl Strg links - Right alt Alt rechts - Left alt Alt links - Right meta Meta rechts - Left meta Meta links - A button A-Taste - B button B-Taste - X button X-Taste - Y button Y-Taste - LB button Linke Schultertaste - RB button Rechte Schultertaste - Back button Zurück-Taste - Start button Start-Taste - Left stick Linker Analogstick - Right stick Rechter Analogstick - Left stick (Right) Linker Analogstick (Rechts) - Left stick (Left) Linker Analogstick (Links) - Left stick (Down) Linker Analogstick (Runter) - Left stick (Up) Linker Analogstick (Hoch) - Left trigger Linker Auslöser - Right trigger Rechter Auslöser - Right stick (Down) Rechter Analogstick (Runter) - Right stick (Up) Rechter Analogstick (Hoch) - Right stick (Right) Rechter Analogstick (Rechts) - Right stick (Left) Rechter Analogstick (Links) - DPad Steuerkreuz @@ -4565,264 +4146,212 @@ server - Authentication failed Authentifizierung fehlgeschlagen - 60 seconds cooldown after kick 60 Sekunden Abkühlzeit nach Hinauswurf - kicked hinausgeworfen - Ping timeout Ping-Timeout - bye tschüss - Your vote counted Deine Stimme zählte - Pause toggled Pause umgeschaltet - new seed Neuer Seed - number of hedgehogs in team Anzahl der Igel im Team - Empty config entry Leerer Konfigurations-Eintrag - Corrupted hedgehogs info Kaputte Igel-Info - too many teams zu viele Teams - too many hedgehogs zu viele Igel - There's already a team with same name in the list Es gibt bereits ein Team mit dem selben Namen in der Liste - round in progress laufende Runde - restricted eingeschränkt - REMOVE_TEAM: no such team REMOVE_TEAM: kein solches Team - Not team owner! Nicht Team-Besitzer*In! - Less than two clans! Weniger als zwei Klans! - Room with such name already exists ein Raum mit einem solchen Namen existiert bereits - /maxteams: specify number from 2 to 8 /maxteams: Zahl zwischen 2 und 8 wählen - Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs Verfügbare »callvote«-Befehle: kick <Spitzname>, map <Name>, pause, newseed, hedgehogs - callvote kick: specify nickname callvote kick: Spitznamen festlegen - callvote kick: no such user callvote kick: Benutzer existiert nicht - callvote map: no such map callvote map: Karte existiert nicht - callvote pause: no game in progress callvote pause: es läuft kein Spiel - callvote hedgehogs: specify number from 1 to 8 callvote hedgehogs: Zahl zwischen 1 und 8 wählen - Illegal room name Verbotener Raumname - No such room Ein solcher Raum existiert nicht - Joining restricted Zutritt verboten - Registered users only Nur für registrierte Benutzer - You are banned in this room Du wurdest aus diesem Raum verbannt - Nickname already chosen Spitzname bereits gewählt - Illegal nickname Verbotener Spitzname - Protocol already known Protokoll bereits bekannt - Bad number Schlechte Zahl - Nickname is already in use Spitzname bereits in Benutzung - Restricted Eingeschränkt - Not room master Nicht Gastgeber - No checker rights Keine Rechte zum Benutzen des Inspektionshilfsprogramms - Room version incompatible to your hedgewars version Die Raumversion ist inkompatibel zu deiner Hedgewars-Version - You already have voted Du hast bereits deine Stimme abgegeben - Voting closed Abstimmung abgeschlossen - New voting started Neue Abstimmung gestartet - Voting expired Abstimmung abgelaufen - kick hinauswerfen - map Karte - pause pausieren - Reconnected too fast Zu schnell wieder verbunden - Warning! Chat flood protection activated Nicht jeder weiß, was »Flooding« heißt, daher ist die Übersetzung etwas ausführlicher. Achtung! Chat-Flood-Schutz ist aktiv. Bitte red etwas langsamer. - Excess flood Nicht jeder weiß, was »Flooding« heißt, daher wird es hier umschrieben. Zu viele Nachrichten in kurzer Zeit abgeschickt - Game messages flood detected - 1 Zu viele Spielnachrichten in kurzer Zeit ermittelt – 1 @@ -4831,13 +4360,11 @@ Zu viele Spielnachrichten in kurzer Zeit ermittelt – 2 - Warning! Joins flood protection activated Nicht jeder weiß, was »Flooding« heißt, daher ist die Übersetzung etwas ausführlicher und umschreibend. Achtung! Der Server wird ein zu schnelles Beitreten in kurzer Zeit nicht akzeptieren - There's no voting going on Zur Zeit findet keine Abstimmung statt diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_el.ts --- a/share/hedgewars/Data/Locale/hedgewars_el.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_el.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -29,6 +100,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -69,14 +148,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -84,6 +155,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -356,7 +435,7 @@ DefaultTeam - Ομάδα εξ' ορισμού + Ομάδα εξ' ορισμού Hedgewars Demo File @@ -449,10 +528,6 @@ - This page requires an internet connection. - - - Guest @@ -465,6 +540,32 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame @@ -474,6 +575,7 @@ en.txt + 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. @@ -836,15 +938,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -856,6 +959,20 @@ + MinesTimeSpinBox + + Random + Τυχαίο + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -919,6 +1036,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -932,13 +1068,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1037,6 +1185,47 @@ Random Team Τυχαία Ομάδα + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1075,6 +1264,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 σκοτωμός) (%1 σκοτωμοί) @@ -1082,14 +1272,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + Ο <b>%1</b> θεώρησε ορθό να μακελέψει τους συμπαίχτες του, αφαιρώντας τους <b>%2</b> πόντο. Ο <b>%1</b> θεώρησε ορθό να μακελέψει τους συμπαίχτες του, αφαιρώντας τους <b>%2</b> πόντους. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + Ο <b>%1</b> σκότωσε <b>%2</b> συνάδελφό του. Ο <b>%1</b> σκότωσε <b>%2</b> από τους συναδέλφους του. @@ -1111,6 +1301,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1425,6 +1630,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1515,7 +1741,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Υπερασπιστείτε το φρούριό σας και καταστρέψτε τους αντιπάλους σας, μέγιστο επιτρεπόμενο δυο χρώματα ομάδων! + Υπερασπιστείτε το φρούριό σας και καταστρέψτε τους αντιπάλους σας, μέγιστο επιτρεπόμενο δυο χρώματα ομάδων! Teams will start on opposite sides of the terrain, two team colours max! @@ -1725,6 +1951,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1775,10 +2005,6 @@ PageTraining - Pick the mission or training to play - - - Start fighting @@ -1790,6 +2016,30 @@ Select a mission! + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1895,6 +2145,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2002,6 +2256,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2097,6 +2359,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2302,10 +2588,6 @@ Ψευδώνυμο - Stereo rendering - - - % Rope Length @@ -2326,10 +2608,6 @@ - Bitrate (Kbps) - - - Style @@ -2370,14 +2648,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2413,6 +2683,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2428,6 +2707,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2521,20 +2804,8 @@ Εισάγετε το όνομα του δωματίου - Record Play - Error - - - Please select record from the list - Παρακαλώ επιλέξτε εγγραφή από την λίστα - - - Cannot rename to - - - - Cannot delete file - + Παρακαλώ επιλέξτε εγγραφή από την λίστα Room Name - Error @@ -2658,6 +2929,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2702,7 +2999,7 @@ Go! - Ξεκίνα! + Ξεκίνα! Play demo @@ -2761,10 +3058,6 @@ - Upload this video to your Youtube account - - - Cancel uploading @@ -2788,6 +3081,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2820,10 +3124,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -3143,10 +3449,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3154,6 +3456,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3234,7 +3541,7 @@ Toggle labels above hedgehogs: - Εναλλάξτε τις επιγραφές πάνω από τους σκατζόχοιρους : + Εναλλάξτε τις επιγραφές πάνω από τους σκατζόχοιρους : Record video: @@ -3252,6 +3559,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_en.ts --- a/share/hedgewars/Data/Locale/hedgewars_en.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_en.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,18 +1,89 @@ - + About Unknown Compiler - + Unknown Compiler + + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + Revision %1 (%2) + + + Visit our homepage: %1 + Visit our homepage: %1 + + + This program is distributed under the %1. + This program is distributed under the %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + GNU GPL v2 + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + Dependency versions: + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 AbstractPage Go back - + Go back @@ -23,108 +94,124 @@ New - New + New Copy of %1 - + Copy of %1 + + + New (%1) + New (%1) + + + Copy of %1 (%2) + Copy of %1 (%2) BanDialog IP - IP + IP Nick - + Nick IP/Nick - + IP/Nick Reason - + Reason Duration - + Duration Ok - + Ok Cancel - Cancel + Cancel you know why - + you know why Warning - + Warning Please, specify %1 - + Please, specify %1 nickname - + nickname permanent - + permanent Ban player - + Ban player + + + Please specify an IP address. + Please specify an IP address. + + + Please specify a nickname. + Please specify a nickname. DataManager Use Default - + Use Default FeedbackDialog View - + View Cancel - Cancel + Cancel Send Feedback - + Send Feedback We are always happy about suggestions, ideas, or bug reports. - + We are always happy about suggestions, ideas, or bug reports. Send us feedback! - + Send us feedback! If you found a bug, you can see if it's already been reported here: - + If you found a bug, you can see if it’s already been reported here: Your email address is optional, but necessary if you want us to get back at you. - + Your email address is optional, but necessary if you want us to get back at you. Feedback - + Feedback @@ -153,199 +240,202 @@ Game scheme will auto-select a weapon - + Game scheme will auto-select a weapon Map - Map + Map Game options - + Game options GameUIConfig Guest - + Guest HWApplication %1 minutes - - - + + %1 minute + %1 minutes %1 hour - - - + + %1 hour + %1 hours %1 hours - - - + + %1 hour + %1 hours %1 day - - - + + %1 day + %1 days %1 days - - - + + %1 day + %1 days Scheme '%1' not supported - + Scheme ‘%1’ not supported Cannot create directory %1 - Cannot create directory %1 + Cannot create directory %1 Failed to open data directory: %1 Please check your installation! - + Failed to open data directory: +%1 + +Please check your installation! Usage command-line - + Usage OPTION command-line - + OPTION CONNECTSTRING command-line - + CONNECTSTRING Options command-line - + Options Display this help command-line - + Display this help Custom path for configuration data and user data command-line - + Custom path for configuration data and user data Custom path to the game data folder command-line - + Custom path to the game data folder Hedgewars can use a %1 (e.g. "%2") to connect on start. command-line - + Hedgewars can use a %1 (e.g. "%2") to connect on start. Malformed option argument: %1 command-line - + Malformed option argument: %1 Unknown option argument: %1 command-line - + Unknown option argument: %1 HWAskQuitDialog Do you really want to quit? - + Do you really want to quit? HWChatWidget %1 has been removed from your ignore list - + %1 has been removed from your ignore list %1 has been added to your ignore list - + %1 has been added to your ignore list %1 has been removed from your friends list - + %1 has been removed from your friends list %1 has been added to your friends list - + %1 has been added to your friends list Stylesheet imported from %1 - + Stylesheet imported from %1 Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset! - + Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset! Couldn't read %1 - + Couldn’t read %1 StyleSheet discarded - + StyleSheet discarded StyleSheet saved to %1 - + StyleSheet saved to %1 Failed to save StyleSheet to %1 - + Failed to save StyleSheet to %1 %1 has joined - + %1 has joined %1 has left - + %1 has left %1 has left (%2) - + %1 has left (%2) Chat log - + Chat log Enter chat messages here and send them with [Enter] - + Enter chat messages here and send them with [Enter] List of players - + List of players @@ -356,7 +446,7 @@ DefaultTeam - Default Team + Default Team Hedgewars Demo File @@ -370,36 +460,118 @@ Demo name - + Demo name Demo name: - + Demo name: Game aborted - + Game aborted Nickname - Nickname + Nickname No nickname supplied. - + No nickname supplied. Someone already uses your nickname %1 on the server. Please pick another nickname: - + Someone already uses your nickname %1 on the server. +Please pick another nickname: %1's Team - + %1’s Team Hedgewars - Nick registered - + Hedgewars—Nick registered + + + This nick is registered, and you haven't specified a password. + +If this nick isn’t yours, please register your own nick at www.hedgewars.org + +Password: + This nick is registered, and you haven’t specified a password. + +If this nick isn’t yours, please register your own nick at www.hedgewars.org + +Password: + + + Your nickname is not registered. +To prevent someone else from using it, +please register it at www.hedgewars.org + Your nickname is not registered. +To prevent someone else from using it, +please register it at www.hedgewars.org + + + + +Your password wasn't saved either. + + +Your password wasn’t saved either. + + + Hedgewars - Empty nickname + Hedgewars—Empty nickname + + + Hedgewars - Wrong password + Hedgewars—Wrong password + + + You entered a wrong password. + You entered a wrong password. + + + Try Again + Try Again + + + Hedgewars - Connection error + Hedgewars—Connection error + + + You reconnected too fast. +Please wait a few seconds and try again. + You reconnected too fast. +Please wait a few seconds and try again. + + + This page requires an internet connection. + This page requires an internet connection. + + + Guest + Guest + + + Room password + Room password + + + The room is protected with password. +Please, enter the password: + The room is protected with password. +Please, enter the password: + + + Team 1 + Team 1 + + + Team %1 + Default team name + Team %1 This nick is registered, and you haven't specified a password. @@ -407,67 +579,35 @@ If this nick isn't yours, please register your own nick at www.hedgewars.org Password: - - - - Your nickname is not registered. -To prevent someone else from using it, -please register it at www.hedgewars.org - - - - + This nick is registered, and you haven't specified a password. + +If this nick isn't yours, please register your own nick at www.hedgewars.org -Your password wasn't saved either. - - - - Hedgewars - Empty nickname - - - - Hedgewars - Wrong password - - - - You entered a wrong password. - - - - Try Again - - - - Hedgewars - Connection error - - - - You reconnected too fast. -Please wait a few seconds and try again. - - - - This page requires an internet connection. - - - - Guest - - - - Room password - - - - The room is protected with password. -Please, enter the password: - +Password: + + + Computer %1 + Default computer team name + Computer %1 + + + Unknown network error (possibly missing SSL library). + Unknown network error (possibly missing SSL library). + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + This feature requires an Internet connection, but you don’t appear to be online (error code: %1). + + + Internal error: Reply object is invalid. + Internal error: Reply object is invalid. HWGame en.txt + 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. en.txt @@ -483,14 +623,21 @@ Last two engine messages: %2 - + A Fatal ERROR occured! - The game engine had to stop. + +We are very sorry for the inconvenience :( + +If this keeps happening, please click the ‘%1’ button in the main menu! + +Last two engine messages: +%2 HWHostPortDialog Connect to server - + Connect to server @@ -521,159 +668,159 @@ Small tunnels - + Small tunnels Medium tunnels - + Medium tunnels Seed - + Seed Map type: - + Map type: Image map - + Image map Mission map - + Mission map Hand-drawn - + Hand-drawn Randomly generated - + Randomly generated Random maze - + Random maze Random - Random + Random Map preview: - + Map preview: Load map drawing - + Load map drawing Edit map drawing - + Edit map drawing Small islands - + Small islands Medium islands - + Medium islands Large islands - + Large islands Map size: - + Map size: Maze style: - + Maze style: Mission: - + Mission: Map: - + Map: Load drawn map - + Load drawn map Drawn Maps - + Drawn Maps All files - + All files Large tunnels - + Large tunnels Theme: %1 - + Theme: %1 Random perlin - + Random perlin Style: - + Style: Forts - + Forts View and edit the seed, the source of randomness in the game - + View and edit the seed, the source of randomness in the game Randomize the theme - + Randomize the theme Choose a theme - + Choose a theme Randomize the map, theme and seed - + Randomize the map, theme and seed Randomize the theme and seed - + Randomize the theme and seed Randomize the seed - + Randomize the seed Click to randomize the map, theme and seed - + Click to randomize the map, theme and seed Click to randomize the theme and seed - + Click to randomize the theme and seed Adjust the complexity of the generated map - + Adjust the complexity of the generated map Adjust the distance between forts - + Adjust the distance between forts Click to edit - + Click to edit @@ -731,137 +878,141 @@ User quit - + User quit Remote host has closed connection - + Remote host has closed connection The server is too old. Disconnecting now. - + The server is too old. Disconnecting now. Server authentication error - + Server authentication error HWPasswordDialog Login - + Login To connect to the server, please log in. If you don't have an account on www.hedgewars.org, just enter your nickname. - + To connect to the server, please log in. + +If you don’t have an account on www.hedgewars.org, +just enter your nickname. Nickname: - + Nickname: Password: - + Password: New Account - + New Account HWUploadVideoDialog Upload video - + Upload video Upload - + Upload HatButton Change hat (%1) - + Change hat (%1) HatPrompt Cancel - Cancel + Cancel Use selected hat - + Use selected hat Search for a hat: - + Search for a hat: Choose a hat - + Choose a hat KB SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It's recommended to update your freetype lib. - SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It's recommended to update your freetype lib. + SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It’s recommended to update your freetype lib. KeyBinder Category - + Category LibavInteraction Audio: - + Audio: unknown - - - - Duration: %1m %2s - + unknown Video: %1x%2 - - - - %1 fps - + Video: %1×%2 + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + Duration: %1min %2s + + + %1 FPS + %1 FPS MapModel No description available. - + No description available. MinesTimeSpinBox Random - Random + Random %1 seconds - + %1 second %1 seconds @@ -875,59 +1026,78 @@ Fetch data - + Fetch data Server message for latest version: - + Server message for latest version: Server message for previous versions: - + Server message for previous versions: Latest version protocol number: - + Latest version protocol number: MOTD preview: - + MOTD preview: Set data - + Set data General - General + General Bans - + Bans IP/Nick - + IP/Nick Expiration - + Expiration Reason - + Reason Refresh - + Refresh Add - + Add Remove - + Remove + + + + PageCampaign + + Team + Team + + + Campaign + Campaign + + + Mission + Mission + + + Start fighting + Start fighting @@ -941,70 +1111,90 @@ PageDataDownload Loading, please wait. - + Loading, please wait. This page requires an internet connection. - + This page requires an internet connection. Open packages directory - + Open packages directory + + + Load the start page + Load the start page + + + Open the directory in which the downloaded files are stored in your system + Open the directory in which the downloaded files are stored in your system + + + Unknown network error (possibly missing SSL library). + Unknown network error (possibly missing SSL library). + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + This feature requires an Internet connection, but you don’t appear to be online (error code: %1). + + + Internal error: Reply object is invalid. + Internal error: Reply object is invalid. PageDrawMap Undo - + Undo Clear - + Clear Load - Load + Load Save - + Save Load drawn map - + Load drawn map Save drawn map - + Save drawn map Drawn Maps - + Drawn Maps All files - + All files Eraser - + Eraser Polyline - + Polyline Rectangle - + Rectangle Ellipse - + Ellipse Optimize - + Optimize @@ -1015,39 +1205,80 @@ Select an action to choose a custom key bind for this team - + Select an action to choose a custom key bind for this team Use my default - + Use my default Reset all binds - + Reset all binds Custom Controls - + Custom Controls Hat - + Hat Name - Name + Name This hedgehog's name - + This hedgehog’s name Randomize this hedgehog's name - + Randomize this hedgehog’s name Random Team - Random Team + Random Team + + + Play a random example of this voice + Play a random example of this voice + + + Random Hats + Random Hats + + + Random Names + Random Names + + + Randomize the team name + Randomize the team name + + + Randomize the grave + Randomize the grave + + + Randomize the flag + Randomize the flag + + + Randomize the voice + Randomize the voice + + + Randomize the fort + Randomize the fort + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + CPU %1 + + + %1 (%2) + %1 (%2) @@ -1066,9 +1297,9 @@ The best shot award was won by <b>%1</b> with <b>%2</b> pts. - - The best shot award was won by <b>%1</b> with <b>%2</b> pts. - + + The best shot award was won by <b>%1</b> with <b>%2</b> point. + The best shot award was won by <b>%1</b> with <b>%2</b> points. @@ -1087,6 +1318,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 kill) (%1 kills) @@ -1094,16 +1326,16 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - + + <b>%1</b> thought it’s good to shoot his own hedgehogs with <b>%2</b> point. + <b>%1</b> thought it’s good to shoot his own hedgehogs with <b>%2</b> points. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - - - + + <b>%1</b> killed <b>%2</b> of his own hedgehogs. + <b>%1</b> killed <b>%2</b> of his own hedgehogs. @@ -1115,17 +1347,32 @@ Play again - + Play again Save - + Save (%1 %2) - - - + 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” + + (%1 %2) + (%1 %2) + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> point. + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> points. + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1133,73 +1380,73 @@ PageInGame In game... - + In game... PageInfo Open the snapshot folder - + Open the snapshot folder PageMain Downloadable Content - + Downloadable Content Play a game on a single computer - + Play a game on a single computer Play a game across a network - + Play a game across a network Read about who is behind the Hedgewars Project - + Read about who is behind the Hedgewars Project Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars - + Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars Access the user created content downloadable from our website - + Access the user created content downloadable from our website Exit game - + Exit game Manage videos recorded from game - + Manage videos recorded from game Edit game preferences - + Edit game preferences Play a game across a local area network - + Play a game across a local area network Play a game on an official server - + Play a game on an official server Feedback - + Feedback Play local network game - + Play local network game Play official network game - + Play official network game @@ -1210,11 +1457,11 @@ Edit game preferences - + Edit game preferences Start fighting (requires at least 2 teams) - + Start fighting (requires at least 2 teams) @@ -1225,46 +1472,46 @@ Edit game preferences - + Edit game preferences Start - Start + Start Update - Update + Update Room controls - + Room controls Room name - + Room name Update the room name - + Update the room name Turn on the lightbulb to show the other players when you're ready to fight - + Turn on the lightbulb to show the other players when you’re ready to fight Start fighting (requires at least 2 teams) - + Start fighting (requires at least 2 teams) PageNetServer Click here for details - + Click here for details Insert your address here - + Insert your address here @@ -1283,159 +1530,184 @@ You can't edit teams from team selection. Go back to main menu to add, edit or delete teams. - You can't edit teams from team selection. Go back to main menu to add, edit or delete teams. + You can’t edit teams from team selection. Go back to main menu to add, edit or delete teams. New scheme - + New scheme Edit scheme - + Edit scheme Delete scheme - + Delete scheme New weapon set - + New weapon set Edit weapon set - + Edit weapon set Delete weapon set - + Delete weapon set Advanced - Advanced + Advanced Reset to default colors - + Reset to default colors Proxy host - + Proxy host Proxy port - + Proxy port Proxy login - + Proxy login Proxy password - + Proxy password No proxy - + No proxy Socks5 proxy - + Socks5 proxy HTTP proxy - + HTTP proxy System proxy settings - + System proxy settings Select an action to change what key controls it - + Select an action to change what key controls it Reset to default - + Reset to default Reset all binds - + Reset all binds Game - + Game Graphics - + Graphics Audio - + Audio Controls - + Controls Video Recording - + Video Recording Network - + Network Teams - Teams + Teams Schemes - + Schemes Weapons - Weapons + Weapons Frontend - + Frontend Custom colors - + Custom colors Game audio - + Game audio Frontend audio - + Frontend audio Account - + Account Proxy settings - + Proxy settings Miscellaneous - + Miscellaneous Updates - + Updates Check for updates - + Check for updates Video recording options - + Video recording options + + + MISSING LANGUAGE NAME [%1] + MISSING LANGUAGE NAME [%1] + + + Can't delete last team + Can’t delete last team + + + You can’t delete the last team! + You can’t delete the last team! + + + x + 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 + × + + + Check now + Check now + + + You can't delete the last team! + You can't delete the last team! @@ -1450,15 +1722,15 @@ Play demo - Play demo + Play demo Play the selected demo - + Play the selected demo Load the selected game - + Load the selected game @@ -1481,37 +1753,37 @@ %1 players online - - - + + %1 player online + %1 players online Search for a room: - + Search for a room: Create room - + Create room Join room - + Join room Room state - + Room state Open server administration page - + Open server administration page PageScheme Defend your fort and destroy the opponents, two team colours max! - Defend your fort and destroy the opponents, two team colours max! + Defend your fort and destroy the opponents, two team colours max! Teams will start on opposite sides of the terrain, two team colours max! @@ -1575,43 +1847,43 @@ Disable land objects when generating random maps. - + Disable land objects when generating random maps. AI respawns on death. - + AI respawns on death. All (living) hedgehogs are fully restored at the end of turn - + All (living) hedgehogs are fully restored at the end of turn Attacking does not end your turn. - + Attacking does not end your turn. Weapons are reset to starting values each turn. - + Weapons are reset to starting values each turn. Each hedgehog has its own ammo. It does not share with the team. - + Each hedgehog has its own ammo. It does not share with the team. You will not have to worry about wind anymore. - + You will not have to worry about wind anymore. Wind will affect almost everything. - + Wind will affect almost everything. Copy - + Copy Teams in each clan take successive turns sharing their turn time. - + Teams in each clan take successive turns sharing their turn time. Add an indestructible border around the terrain @@ -1619,99 +1891,103 @@ Add an indestructible border along the bottom - + Add an indestructible border along the bottom None (Default) - + None (Default) Wrap (World wraps) - + Wrap (World wraps) Bounce (Edges reflect) - + Bounce (Edges reflect) Sea (Edges connect to sea) - + Sea (Edges connect to sea) Each clan starts in its own part of the terrain. - + Each clan starts in its own part of the terrain. Overall damage and knockback in percent - + Overall damage and knockback in percent Turn time in seconds - + Turn time in seconds Initial health of hedgehogs - + Initial health of hedgehogs How many rounds have to be played before Sudden Death begins - + How many rounds have to be played before Sudden Death begins How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. - + How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. 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. - + 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. Maximum rope length in percent - + Maximum rope length in percent Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. - + Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. Likelihood of a crate dropping before a turn - + Likelihood of a crate dropping before a turn Health bonus for collecting a health crate - + Health bonus for collecting a health crate 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. - + 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. Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. - + Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. - + Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - + Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - + Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. Affects the left and right boundaries of the map - + Affects the left and right boundaries of the map Time you get after an attack - + Time you get after an attack Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. - + Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + + Name of this scheme + Name of this scheme @@ -1726,68 +2002,88 @@ New - New + New Copy - + Copy PageSinglePlayer Play a quick game against the computer with random settings - + Play a quick game against the computer with random settings Play a hotseat game against your friends, or AI teams - + Play a hotseat game against your friends, or AI teams Campaign Mode - + Campaign Mode Practice your skills in a range of training missions - + Practice your skills in a range of training missions Watch recorded demos - + Watch recorded demos Load a previously saved game - + Load a previously saved game PageTraining No description available - + No description available Select a mission! - - - - Pick the mission or training to play - + Select a mission! Start fighting - + Start fighting + + + Pick the training to play + Pick the training to play + + + Pick the challenge to play + Pick the challenge to play + + + Pick the scenario to play + Pick the scenario to play + + + Trainings + Trainings + + + Challenges + Challenges + + + Scenarios + Scenarios PageVideos Name - Name + Name Size - + Size %1 bytes @@ -1798,23 +2094,23 @@ (in progress...) - + (in progress …) encoding - + encoding uploading - + uploading Date: %1 - + Date: %1 Size: %1 - + Size: %1 @@ -1865,23 +2161,27 @@ Restrict Unregistered Players Join - + Restrict Unregistered Players Join Show games in lobby - + Show games in lobby Show games in-progress - + Show games in-progress Show password protected - + Show password protected Show join restricted - + Show join restricted + + + Delegate room control + Delegate room control @@ -1912,83 +2212,91 @@ Save password - + Save password Save account name and password - + Save account name and password Video is private - + Video is private Record audio - + Record audio Use game resolution - + Use game resolution Visual effects - + Visual effects Sound - + Sound In-game sound effects - + In-game sound effects Music - + Music In-game music - + In-game music Frontend sound effects - + Frontend sound effects Frontend music - + Frontend music Team - + Team Enable team tags by default - + Enable team tags by default Hog - + Hog Enable hedgehog tags by default - + Enable hedgehog tags by default Health - + Health Enable health tags by default - + Enable health tags by default Translucent - + Translucent Enable translucent tags by default - + Enable translucent tags by default + + + Enable visual effects such as animated menu transitions and falling stars + Enable visual effects such as animated menu transitions and falling stars + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + If enabled, Hedgewars adds the date and time in the form “YYYY-MM-DD_hh-mm” for automatically created demos. @@ -2007,71 +2315,95 @@ Community - + Community Disabled - + Disabled Red/Cyan - + Red/Cyan Cyan/Red - + Cyan/Red Red/Blue - + Red/Blue Blue/Red - + Blue/Red Red/Green - + Red/Green Green/Red - + Green/Red Side-by-side - + Side-by-side Top-Bottom - + Top-Bottom Red/Cyan grayscale - + Red/Cyan grayscale Cyan/Red grayscale - + Cyan/Red grayscale Red/Blue grayscale - + Red/Blue grayscale Blue/Red grayscale - + Blue/Red grayscale Red/Green grayscale - + Red/Green grayscale Green/Red grayscale - + Green/Red grayscale Computer (Level %1) - + Computer (Level %1) + + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + 24 FPS + 24 FPS + + + 25 FPS + 25 FPS + + + 30 FPS + 30 FPS + + + 50 FPS + 50 FPS + + + 60 FPS + 60 FPS @@ -2106,11 +2438,11 @@ Videos - + Videos Description - + Description @@ -2217,173 +2549,168 @@ Quality - + Quality % Health Crates - + % Health Crates Health in Crates - + Health in Crates Sudden Death Water Rise - + Sudden Death Water Rise Sudden Death Health Decrease - + Sudden Death Health Decrease % Rope Length - - - - Stereo rendering - + % Rope Length Style - + Style Scheme - + Scheme There are videos that are currently being processed. Exiting now will abort them. Do you really want to quit? - + There are videos that are currently being processed. +Exiting now will abort them. +Do you really want to quit? Please provide either the YouTube account name or the email address associated with the Google Account. - + Please provide either the YouTube account name or the email address associated with the Google Account. Account name (or email): - + Account name (or email): Password: - + Password: Video title: - + Video title: Video description: - + Video description: Tags (comma separated): - + Tags (comma separated): Description - + Description Nickname - Nickname + Nickname Format - + Format Audio codec - + Audio codec Video codec - + Video codec Framerate - - - - Bitrate (Kbps) - + Framerate This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! - + This development build is ‘work in progress’ and may not be compatible with other versions of the game, while some features might be broken or incomplete! Fullscreen - Fullscreen + Fullscreen Fullscreen Resolution - + Fullscreen Resolution Windowed Resolution - + Windowed Resolution Your Email - + Your Email Summary - + Summary Send system information - + Send system information Type the security code: - - - - Revision - - - - This program is distributed under the %1 - + Type the security code: This setting will be effective at next restart. - + This setting will be effective at next restart. Tip: %1 - + Tip: %1 Displayed tags above hogs and translucent tags - + Displayed tags above hogs and translucent tags World Edge - + World Edge Script parameter - + Script parameter Air Mines - + Air Mines Player - + Player Barrels - + Barrels % Retreat Time - + % Retreat Time + + + Stereoscopy + Stereoscopy + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + Bitrate (Kibit/s) @@ -2394,11 +2721,15 @@ hedgehog %1 - + hedgehog %1 anonymous - + anonymous + + + unnamed (%1) + unnamed (%1) @@ -2420,53 +2751,55 @@ File association failed. - + File association failed. Error while authenticating at google.com: - + Error while authenticating at google.com: + Login or password is incorrect - + Login or password is incorrect Error while sending metadata to youtube.com: - + Error while sending metadata to youtube.com: + Teams - Are you sure? - + Teams—Are you sure? Do you really want to delete the team '%1'? - + Do you really want to delete the team ‘%1’? Cannot delete default scheme '%1'! - + Cannot delete default scheme ‘%1’! Please select a record from the list - + Please select a record from the list Unable to start server - + Unable to start server Hedgewars - Error - + Hedgewars—Error Hedgewars - Success - + Hedgewars—Success All file associations have been set - + All file associations have been set Cannot create directory %1 @@ -2478,164 +2811,193 @@ Video upload - Error - + Video upload—Error Netgame - Error - + Netgame—Error Please select a server from the list - + Please select a server from the list Please enter room name - Please enter room name + Please enter room name Record Play - Error - + Record Play—Error Please select record from the list - Please select record from the list + Please select record from the list Cannot rename to - + Cannot rename to Cannot delete file - + Cannot delete file Room Name - Error - + Room Name—Error Please select room from the list - Please select room from the list + Please select room from the list Room Name - Are you sure? - + Room Name—Are you sure? The game you are trying to join has started. Do you still want to join the room? - The game you are trying to join has started. + The game you are trying to join has started. Do you still want to join the room? Schemes - Warning - + Schemes—Warning Schemes - Are you sure? - + Schemes—Are you sure? Do you really want to delete the game scheme '%1'? - + Do you really want to delete the game scheme ‘%1’? Videos - Are you sure? - + Videos—Are you sure? Do you really want to delete the video '%1'? - + Do you really want to delete the video ‘%1’? Do you really want to remove %1 file(s)? - - - + + Do you really want to remove %1 file? + Do you really want to remove %1 files? Do you really want to cancel uploading %1? - + Do you really want to cancel uploading %1? File error - + File error Cannot open '%1' for writing - + Cannot open ‘%1’ for writing Cannot open '%1' for reading - + Cannot open ‘%1’ for reading Cannot use the ammo '%1'! - + Cannot use the ammo ‘%1’! Weapons - Warning - + Weapons—Warning Cannot overwrite default weapon set '%1'! - + Cannot overwrite default weapon set ‘%1’! Cannot delete default weapon set '%1'! - + Cannot delete default weapon set ‘%1’! Weapons - Are you sure? - + Weapons—Are you sure? Do you really want to delete the weapon set '%1'? - + Do you really want to delete the weapon set ‘%1’? Hedgewars - Nick not registered - + Hedgewars—Nick not registered System Information Preview - + System Information Preview Failed to generate captcha - + Failed to generate captcha Failed to download captcha - + Failed to download captcha Please fill out all fields. Email is optional. - + Please fill out all fields. Email is optional. Hedgewars - Warning - + Hedgewars—Warning Hedgewars - Information - + Hedgewars—Information Not all players are ready - + Not all players are ready Are you sure you want to start this game? Not all players are ready. - + Are you sure you want to start this game? +Not all players are ready. + + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + Sorry, Hedgewars can’t be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + Please select a file from the list. + Please select a file from the list. + + + Cannot rename file to %1. + Cannot rename file to %1. + + + Cannot delete file %1. + Cannot delete file %1. + + + Teams - Name already taken + Teams—Name already taken + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + The team name ‘%1’ is already taken, so your team has been renamed to ‘%2’. QObject No description available - + No description available @@ -2674,7 +3036,7 @@ Go! - Go! + Go! Play demo @@ -2698,168 +3060,181 @@ More info - + More info Set default options - + Set default options Open videos directory - + Open videos directory Play - + Play Upload to YouTube - + Upload to YouTube Cancel uploading - + Cancel uploading Restore default coding parameters - + Restore default coding parameters Open the video directory in your system - + Open the video directory in your system Play this video - + Play this video Delete this video - + Delete this video Upload this video to your Youtube account - + Upload this video to your Youtube account Reset - + Reset Set the default server port for Hedgewars - + Set the default server port for Hedgewars Invite your friends to your server in just 1 click! - + Invite your friends to your server in just 1 click! Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you. - + Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you. Start private server - + Start private server + + + Upload this video to your YouTube account + Upload this video to your YouTube account + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + Specify the bitrate of recorded videos as a multiple of 1024 bits per second RoomNamePrompt Enter a name for your room. - + Enter a name for your room. Cancel - Cancel + Cancel Create room - + Create room set password - + set password RoomsListModel In progress - + In progress Room Name - Room Name + Room Name C - C + Caption of the column for the number of connected clients in the list of rooms + C T - T + Caption of the column for the number of teams in the list of rooms + T Owner - Owner + Owner Map - Map + Map Rules - Rules + Rules Weapons - Weapons + Weapons Random Map - Random Map + Random Map Random Maze - + Random Maze Hand-drawn - + Hand-drawn Script - + Script Random Perlin - + Random Perlin Forts - + Forts SeedPrompt The map seed is the basis for all random values generated by the game. - + The map seed is the basis for all random values generated by the game. Cancel - Cancel + Cancel Set seed - + Set seed Close - + Close Seed - + Seed @@ -2886,31 +3261,32 @@ New - New + New New (%1) - + New (%1) Copy of %1 - + Copy of %1 Copy of %1 (%2) - + Copy of %1 (%2) TCPBase Unable to start server at %1. - + Unable to start server at %1. Unable to run engine at %1 Error code: %2 - + Unable to run engine at %1 +Error code: %2 The game engine died unexpectedly! @@ -2919,33 +3295,38 @@ We are very sorry for the inconvenience :( If this keeps happening, please click the '%2' button in the main menu! - + The game engine died unexpectedly! +(exit code %1) + +We are very sorry for the inconvenience :( + +If this keeps happening, please click the ‘%2’ button in the main menu! TeamSelWidget At least two teams are required to play! - + At least two teams are required to play! ThemePrompt Cancel - Cancel + Cancel Search for a theme: - + Search for a theme: Use selected theme - + Use selected theme Choose a theme - + Choose a theme @@ -3108,42 +3489,47 @@ mute audio - + mute audio record - + record hedgehog info - + hedgehog info autocam / find hedgehog - + autocam / find hedgehog speed up replay - + speed up replay + + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + toggle team bars binds (categories) Movement - + Movement Weapons - Weapons + Weapons Camera - + Camera Miscellaneous - + Miscellaneous @@ -3182,7 +3568,7 @@ Modify the camera's zoom level: - Modify the camera's zoom level: + Modify the camera’s zoom level: Talk to your team or all participants: @@ -3194,7 +3580,7 @@ Modify the game's volume while playing: - Modify the game's volume while playing: + Modify the game’s volume while playing: Toggle fullscreen mode: @@ -3206,58 +3592,62 @@ Toggle labels above hedgehogs: - Toggle labels above hedgehogs: + Toggle labels above hedgehogs: Record video: - + Record video: Hedgehog movement - + Hedgehog movement Toggle automatic camera / refocus on active hedgehog: - + Toggle automatic camera / refocus on active hedgehog: Demo replay: - + Demo replay: + + + Heads-up display: + Heads-up display: binds (keys) Axis - + Axis (Up) - + (Up) (Down) - + (Down) Hat - + Hat (Left) - + (Left) (Right) - + (Right) Button - + Button Keyboard - + Keyboard Delete @@ -3265,502 +3655,502 @@ Mouse: Left button - + Mouse: Left button Mouse: Middle button - + Mouse: Middle button Mouse: Right button - + Mouse: Right button Mouse: Wheel up - + Mouse: Wheel up Mouse: Wheel down - + Mouse: Wheel down Backspace - + Backspace Tab - + Tab Clear - + Clear Return - + Return Pause - + Pause Escape - + Escape Space - + Space Numpad 0 - + Numpad 0 Numpad 1 - + Numpad 1 Numpad 2 - + Numpad 2 Numpad 3 - + Numpad 3 Numpad 4 - + Numpad 4 Numpad 5 - + Numpad 5 Numpad 6 - + Numpad 6 Numpad 7 - + Numpad 7 Numpad 8 - + Numpad 8 Numpad 9 - + Numpad 9 Numpad . - + Numpad . Numpad / - + Numpad / Numpad * - + Numpad * Numpad - - + Numpad - Numpad + - + Numpad + Enter - + Enter Equals - + Equals Up - + Up Down - + Down Right - + Right Left - + Left Insert - + Insert Home - + Home End - + End Page up - + Page up Page down - + Page down Num lock - + Num lock Caps lock - + Caps lock Scroll lock - + Scroll lock Right shift - + Right shift Left shift - + Left shift Right ctrl - + Right ctrl Left ctrl - + Left ctrl Right alt - + Right alt Left alt - + Left alt Right meta - + Right meta Left meta - + Left meta A button - + A button B button - + B button X button - + X button Y button - + Y button LB button - + LB button RB button - + RB button Back button - + Back button Start button - + Start button Left stick - + Left stick Right stick - + Right stick Left stick (Right) - + Left stick (Right) Left stick (Left) - + Left stick (Left) Left stick (Down) - + Left stick (Down) Left stick (Up) - + Left stick (Up) Left trigger - + Left trigger Right trigger - + Right trigger Right stick (Down) - + Right stick (Down) Right stick (Up) - + Right stick (Up) Right stick (Right) - + Right stick (Right) Right stick (Left) - + Right stick (Left) DPad - + DPad server Restricted - + Restricted Not room master - + Not room master Corrupted hedgehogs info - + Corrupted hedgehogs info too many teams - + too many teams too many hedgehogs - + too many hedgehogs There's already a team with same name in the list - + There’s already a team with same name in the list round in progress - + round in progress restricted - + restricted REMOVE_TEAM: no such team - + REMOVE_TEAM: no such team Not team owner! - + Not team owner! Less than two clans! - + Less than two clans! Illegal room name - + Illegal room name Room with such name already exists - + Room with such name already exists Nickname already chosen - + Nickname already chosen Illegal nickname - + Illegal nickname Protocol already known - + Protocol already known Bad number - + Bad number Nickname is already in use - + Nickname is already in use No checker rights - + No checker rights Authentication failed - + Authentication failed 60 seconds cooldown after kick - + 60 seconds cooldown after kick kicked - + kicked Ping timeout - + Ping timeout bye - + bye No such room - + No such room Room version incompatible to your hedgewars version - + Room version incompatible to your hedgewars version Joining restricted - + Joining restricted Registered users only - + Registered users only You are banned in this room - + You are banned in this room Empty config entry - + Empty config entry You already have voted - + You already have voted Voting closed - + Voting closed New voting started - + New voting started Voting expired - + Voting expired kick - + kick map - + map pause - pause + pause Reconnected too fast - + Reconnected too fast Warning! Chat flood protection activated - + Warning! Chat flood protection activated Excess flood - + Excess flood Game messages flood detected - 1 - + Game messages flood detected - 1 Warning! Joins flood protection activated - + Warning! Joins flood protection activated There's no voting going on - + There’s no voting going on Your vote counted - + Your vote counted Pause toggled - + Pause toggled new seed - + new seed number of hedgehogs in team - + number of hedgehogs in team /maxteams: specify number from 2 to 8 - + /maxteams: specify number from 2 to 8 Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs - + Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs callvote kick: specify nickname - + callvote kick: specify nickname callvote kick: no such user - + callvote kick: no such user callvote map: no such map - + callvote map: no such map callvote pause: no game in progress - + callvote pause: no game in progress callvote hedgehogs: specify number from 1 to 8 - + callvote hedgehogs: specify number from 1 to 8 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_es.ts --- a/share/hedgewars/Data/Locale/hedgewars_es.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_es.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -73,14 +152,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -88,6 +159,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -364,7 +443,7 @@ DefaultTeam - Equipo predeterminado + Equipo predeterminado Hedgewars Demo File @@ -455,10 +534,6 @@ - This page requires an internet connection. - - - Guest @@ -471,11 +546,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. es.txt @@ -842,15 +944,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -862,6 +965,20 @@ + MinesTimeSpinBox + + Random + Aleatorio + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -925,6 +1042,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -938,13 +1074,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1043,6 +1191,47 @@ Random Team Equipo aleatorio + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1081,6 +1270,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 baja) (%1 bajas) @@ -1088,14 +1278,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> prefiere disparar a sus miembros, con un total de <b>%2</b> pt. <b>%1</b> prefiere disparar a sus miembros, con un total de <b>%2</b> pts. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> acabó con <b>%2</b> de sus propios miembros. @@ -1117,6 +1307,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1431,6 +1636,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1549,7 +1775,7 @@ Defend your fort and destroy the opponents, two team colours max! - Defiende tu fuerte y destruye el de tus oponentes. ¡2 facciones como máximo! + Defiende tu fuerte y destruye el de tus oponentes. ¡2 facciones como máximo! Teams will start on opposite sides of the terrain, two team colours max! @@ -1731,6 +1957,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1789,13 +2019,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1901,6 +2151,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2008,6 +2262,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2103,6 +2365,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2275,7 +2561,7 @@ Stereo rendering - Estereoscopía + Estereoscopía Style @@ -2344,10 +2630,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2380,14 +2662,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2423,6 +2697,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2438,6 +2721,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2531,20 +2818,8 @@ Por favor, introduce un nombre para la sala - Record Play - Error - - - Please select record from the list - Por favor, selecciona una entrada de la lista - - - Cannot rename to - - - - Cannot delete file - + Por favor, selecciona una entrada de la lista Room Name - Error @@ -2668,6 +2943,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2680,7 +2981,7 @@ QPushButton Go! - ¡Adelante! + ¡Adelante! default @@ -2775,10 +3076,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2798,6 +3095,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2830,10 +3138,12 @@ C + Caption of the column for the number of connected clients in the list of rooms J T + Caption of the column for the number of teams in the list of rooms E @@ -3157,10 +3467,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3168,6 +3474,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3248,7 +3559,7 @@ Toggle labels above hedgehogs: - Cambia las etiquetas sobre los erizos: + Cambia las etiquetas sobre los erizos: Record video: @@ -3266,6 +3577,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_fi.ts --- a/share/hedgewars/Data/Locale/hedgewars_fi.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_fi.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Tuntematon kääntäjä + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + Tämän ohjelman lisenssi: %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -18,20 +89,20 @@ AmmoSchemeModel - new - uusi - - - copy of %1 - %1 kopio - - New - Uusi + Uusi Copy of %1 - + %1 kopio + + + New (%1) + Uusi (%1) + + + Copy of %1 (%2) + %1 kopio (%2) @@ -74,11 +145,11 @@ Please, specify %1 - Tarkenna: %1 + Tarkenna: %1 nickname - nimimerkki + nimimerkki permanent @@ -86,6 +157,14 @@ Ban player + Bannaa pelaaja + + + Please specify an IP address. + + + + Please specify a nickname. @@ -128,7 +207,7 @@ Feedback - Palaute + Palaute @@ -141,7 +220,7 @@ Every %1 turn Joka vuorolla - Joka %1:s vuoro + Joka %1. vuoro @@ -149,15 +228,15 @@ GameCFGWidget Edit weapons - Muokkaa aseita + Muokkaa pelissä mukana olevia aseita Edit schemes - Muokkaa sääntöjä + Hienosäädä pelin sääntöjä ja muuttujia Game scheme will auto-select a weapon - Aseet valitaan sääntöjen mukaan + Kun lukittu, aseet valitaan sääntöjen mukaan Map @@ -214,7 +293,7 @@ Scheme '%1' not supported - Säännöille '%1' ei ole tukea + Säännöt '%1' ei ole tuettu Cannot create directory %1 @@ -344,15 +423,15 @@ Chat log - + Keskusteluloki Enter chat messages here and send them with [Enter] - + Kirjoita viestisi ja lähetä [Enter]-napilla List of players - + Pelaajalista @@ -363,7 +442,7 @@ DefaultTeam - Oletusjoukkue + Oletusjoukkue Hedgewars Demo File @@ -399,7 +478,7 @@ Someone already uses your nickname %1 on the server. Please pick another nickname: Nimimerkkisi %1 on jo käytössä. -Valiste jokin muu: +Valitse jokin muu: %1's Team @@ -465,7 +544,7 @@ This page requires an internet connection. - Tämä sivu vaatii internet-yhteyden. + Tämä sivu vaatii internet-yhteyden. Guest @@ -481,11 +560,38 @@ Huoneeseen pääsee vain salasanalla. Salasana: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. fi.txt @@ -515,7 +621,7 @@ HWHostPortDialog Connect to server - + Yhdistä palvelimelle @@ -594,7 +700,7 @@ Edit map drawing - Muokkaa piirrosta + Piirrä kartta Small islands @@ -650,55 +756,55 @@ Style: - Tyyli: + Pelityyppi: Forts - + Linnakkeet View and edit the seed, the source of randomness in the game - + Muokkaa siemenlukua, jonka pohjalle pelin satunnaisuus perustuu Randomize the theme - + Satunnainen teema Choose a theme - + Vaihda teema Randomize the map, theme and seed - + Satunnainen kartta, teema sekä siemenluku Randomize the theme and seed - + Satunnainen teema ja siemenluku Randomize the seed - + Satunnainen siemenluku Click to randomize the map, theme and seed - + Klikkaa sekoittaaksesi kartan, teeman ja siemenluvun Click to randomize the theme and seed - + Klikkaa sekoittaaksesi teeman ja siemenluvun Adjust the complexity of the generated map - + Säädä maaston ryppyisyyttä Adjust the distance between forts - + Säädä linnakkeiden välistä etäisyyttä Click to edit - + Klikkaa muokataksesi @@ -736,17 +842,13 @@ You got kicked - Sinut potkittiin + Sinut potkittiin huoneesta %1 *** %2 has joined the room %1 *** %2 liittyi huoneeseen - %1 *** %2 has joined - %1 *** %2 liittyi - - %1 *** %2 has left %1 *** %2 poistui @@ -834,14 +936,7 @@ Choose a hat - - - - - KB - - SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It's recommended to update your freetype lib. - SDL_ttf palautti virheen mallintaessaan tekstiä, todennäköisesti syy on freetype2:n ohjelmavirheessä. Freetype-kirjaston päivitys on suosiltetavaa. + Valitse hattu @@ -863,15 +958,24 @@ Duration: %1m %2s - Kesto: %1min %2sek + Kesto: %1min %2sek Video: %1x%2 - + Video: %1x%2 %1 fps - %1 kuvaa/s + %1 kuvaa/s + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS + @@ -882,6 +986,20 @@ + MinesTimeSpinBox + + Random + Sekoita + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -945,6 +1063,25 @@ + PageCampaign + + Team + Joukkue + + + Campaign + Operaatio + + + Mission + Tehtävä + + + Start fighting + Käynnistä harjoitus + + + PageConnecting Connecting... @@ -959,12 +1096,28 @@ This page requires an internet connection. - Tämä sivu vaatii internet-yhteyden. + Tämä sivu vaatii internet-yhteyden. Open packages directory Avaa pakettikansio + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1053,16 +1206,57 @@ This hedgehog's name - Tämän siilen nimi + Tämän siilin nimi Randomize this hedgehog's name - Generoi tämän siilen nimi + Generoi tämän siilin nimi Random Team Satunnainen joukkue + + Play a random example of this voice + Kuuntele ääninäyte + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1101,6 +1295,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 tappo) (%1 tappoa) @@ -1108,14 +1303,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - <b>%1</b> ajatteli, että omia siilejä on hienoa vahingoittaa <b>%2</b> vahinkopisteellä. - <b>%1</b> ajatteli, että omia siilejä on hienoa vahingoittaa <b>%2</b> vahinkopisteellä. + + <b>%1</b> ajatteli, että omia siilijä on hienoa vahingoittaa <b>%2</b> vahinkopisteellä. + <b>%1</b> ajatteli, että omia siilijä on hienoa vahingoittaa <b>%2</b> vahinkopisteellä. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> tappoi <b>%2</b> omaa siiltä. <b>%1</b> tappoi <b>%2</b> omaa siiltä. @@ -1137,11 +1332,26 @@ (%1 %2) + 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” + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. + + + + + PageInGame @@ -1181,7 +1391,7 @@ Access the user created content downloadable from our website - Verkkosivuiltamme tarjolla olevaa ladattavaa sisältöä + Verkkosivuiltamme tarjolla olevaa ilmaiseksi ladattavaa sisältöä Exit game @@ -1228,16 +1438,12 @@ Start fighting (requires at least 2 teams) - + Aloita tappelu (vaatii vähintään kaksi joukkuetta) PageNetGame - Control - Säädöt - - Edit game preferences Muokkaa asetuksia @@ -1255,19 +1461,19 @@ Room name - + Huoneen nimi Update the room name - + Päivitä huoneen nimeä Turn on the lightbulb to show the other players when you're ready to fight - + Sytytä lamppu kun olet valmis tappeluun Start fighting (requires at least 2 teams) - + Aloita tappelu (vaatii vähintään kaksi joukkuetta) @@ -1451,6 +1657,27 @@ Video recording options Videotallennusasetukset + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1464,51 +1691,23 @@ Play demo - Toista nauhoite + Toista nauhoite Play the selected demo - + Toista valittu nauhoite Load the selected game - + Lataa valittu peli PageRoomsList - Create - Luo - - - Join - Liity - - Admin features Ylläpitäjän ominaisuudet - - Room Name: - Huoneen nimi: - - - Rules: - Säännöt: - - - Weapons: - Aseet: - - - Search: - Haku: - - - Clear - Tyhjennä - %1 players online @@ -1530,7 +1729,7 @@ Room state - Huoneen tilanne + Suodata Open server administration page @@ -1540,14 +1739,6 @@ PageScheme - Defend your fort and destroy the opponents, two team colours max! - Puolusta linnaasi ja tuhoa vastustajasi, enintään kaksi joukkueväriä! - - - Teams will start on opposite sides of the terrain, two team colours max! - Joukkueet aloittavat kartan vastakkaisista päistä, maksimissaan kaksi joukkueväriä! - - Land can not be destroyed! Maata ei voi tuhota! @@ -1565,23 +1756,15 @@ Gain 80% of the damage you do back in health - Saa 80% aiheuttamastasi vahingosta takaisin omaan terveyteesi + Vampirismi: Saat 80% aiheuttamastasi vahingosta takaisin omaan terveyteesi Share your opponents pain, share their damage - Jaa vastuastajasi tuska, jaa heidän vahinkonsa + Jaa vastustajasi tuska, jaa heidän vahinkonsa Your hogs are unable to move, put your artillery skills to the test - Siilit eivät voi liikkua, testaa tykistötaitojasi - - - Random - Satunnainen - - - Seconds - Sekuntia + Siilit eivät voi liikkua: testaa tykistötaitojasi New @@ -1593,55 +1776,55 @@ Order of play is random instead of in room order. - Pelaamisjärjestys on satunnainen huoneen järjestyksen sijaan. + Pelaamisjärjestys on satunnainen huoneen järjestyksen sijaan Play with a King. If he dies, your side dies. - Pelaa kuninkaalla. Jos hän kuolee, sinun jokkueesi häviää. + Pelissä on kuningas. Jos hän kuolee, joukkueesi häviää Take turns placing your hedgehogs before the start of play. - Sijoittakaa siilenne vuorotellen ennen pelin alkua. + Siilit sijoitetaan vuorotellen ennen pelin alkua Ammo is shared between all teams that share a colour. - Ammukset ovat yhteiset saman värin kesken. + Ammukset ovat yhteiset värien kesken Disable girders when generating random maps. - Kytke palkit pois päältä satunnaisissa kartoissa. + Kytke palkit pois päältä satunnaisissa kartoissa Disable land objects when generating random maps. - Poista maaesteet satunnaisten karttojen luonnissa. + Poista maaesteet satunnaisten karttojen luonnissa AI respawns on death. - Tekoäly syntyy uudelleen kuollessaan. + Tekoäly syntyy uudelleen tuhoutuessaan All (living) hedgehogs are fully restored at the end of turn - Kaikki elossa olevat siilet palautetaan täyteen terveyteen vuoron lopussa + Kaikki elossa olevat siilit palautetaan täyteen terveyteen vuoron lopussa Attacking does not end your turn. - Ampuminen ei lopeta vuoroasi. + Ampuminen ei lopeta vuoroasi Weapons are reset to starting values each turn. - Aseet palautetaan alkutilaan vuoron lopussa. + Asesetti palautetaan alkutilaan vuoron lopussa Each hedgehog has its own ammo. It does not share with the team. - Jokaisella siilellä on omakohtaiset ammukset, jotka eivät jakaudu joukkueen kesken. + Jokaisella siilillä on omakohtaiset ammukset, joita ei jaeta joukkueen kesken You will not have to worry about wind anymore. - Tuulella ei ole vaikutusta. + Tuulella ei ole vaikutusta Wind will affect almost everything. - Tuuli vaikuttaa lähes kaikkeen. + Tuuli vaikuttaa lähes kaikkeen Copy @@ -1649,7 +1832,7 @@ Teams in each clan take successive turns sharing their turn time. - Vuoron aika jaetaan klaanin joukkueiden kesken. + Vuoron aika jaetaan klaanin joukkueiden kesken Add an indestructible border around the terrain @@ -1677,79 +1860,83 @@ Each clan starts in its own part of the terrain. - + Jokainen klaani aloittaa omalla mantereellaan Overall damage and knockback in percent - + Mitä isompi luku, sitä enemmän vahinkoa kaikki tuottaa, prosentteina oletustasosta Turn time in seconds - + Vuoron aika sekunteina Initial health of hedgehogs - + Terveyspisteet pelin alussa How many rounds have to be played before Sudden Death begins - + Kierrosten lukumäärä ennen äkkikuolemaa How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. - + Vedennousun määrä kierroksella äkkikuolemassa. Aseta tämä ja terveydenpudotus nollaksi ottaaksesi äkkikuoleman pois käytöstä. 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. - + Terveyspisteiden pudotus kierroksella äkkikuolemassa. Ei mene alle yhden. Aseta tämä ja vedennousu nollaksi ottaaksesi äkkikuoleman pois käytöstä. Maximum rope length in percent - + Köyden maksimipituus prosentteina Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. - + Todennäköisyys, että pudotettu laatikko on lääkelaatikko. Muuten laatikko on joko työkalu- tai aselaatikko. Likelihood of a crate dropping before a turn - + Todennäköisyys, että ennen vuoroa putoaa jokin laatikko Health bonus for collecting a health crate - + Lääkelaatikon terveyspisteet 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. - + Miinojen ajastin, nollan ja viiden sekunnin väliltä. Leijuvat miinat ovat neljäsosan tästä ajasta. Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. - + Montako miinaa keskikokoiselle kartalle sijoitetaan. Lukua muutetaan kartan koon mukaan. Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. - + Viallisten miinojen osuus. Ei vaikuta siilien asettamiin miinoihin. Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - + Tynnyreiden lukumäärä keskikokoisella kartalla. Lukua muutetaan kartan koon mukaan. Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - + Leijuvien miinojen lukumäärä keskikokoisella kartalla. Lukua muutetaan kartan koon mukaan. Affects the left and right boundaries of the map - + Vaikuttaa kartan vasempaan ja oikeaan reunaan Time you get after an attack - + Aika, jonka saat ampumisen jälkeen Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. - + Lisäparametrit pelityypin muokkaamiseksi. Tämän tarkoitus riippuu itse pelityypistä, katso tarkat ohjeet dokumentaatiosta. Jätä tyhjäksi jos olet epävarma. + + + Name of this scheme + Sääntöjen nimi @@ -1783,7 +1970,7 @@ Campaign Mode - Tehtävät (englanniksi) + Operaatiot Practice your skills in a range of training missions @@ -1809,13 +1996,33 @@ Valitse tehtävä! - Pick the mission or training to play - Valitse tehtävä tai harjoitus luettelosta - - Start fighting Käynnistä harjoitus + + Pick the training to play + Valitse perusharjoitus listalta + + + Pick the challenge to play + Valitse haaste listalta + + + Pick the scenario to play + Valitse pelitilanne listalta + + + Trainings + Harjoitukset + + + Challenges + Haasteet + + + Scenarios + Tilanteet + PageVideos @@ -1915,11 +2122,15 @@ Show password protected - + Näytä salasanalla suojatut Show join restricted - + Näytä rajoitetut huoneet + + + Delegate room control + Siirrä huoneen oikeudet @@ -2028,6 +2239,14 @@ Enable translucent tags by default Näytä kuplat läpinäkyvinä + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2036,10 +2255,6 @@ Ihminen - Level - Taso - - (System default) (Järjestelmän oletus) @@ -2048,18 +2263,6 @@ Yhteisö - Any - Mikä tahansa - - - In lobby - Aulassa - - - In progress - Kesken - - Disabled Pois päältä @@ -2121,6 +2324,30 @@ Computer (Level %1) + Tekoäly (Taso %1) + + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS @@ -2174,10 +2401,6 @@ Miinat - Version - Versio - - Weapons Aseet @@ -2227,7 +2450,7 @@ Scheme Name: - Kaavan nimi: + Sääntöjen nimi: Crate Drops @@ -2242,10 +2465,6 @@ Nimi - Type - Tyyppi - - Grave Hauta @@ -2262,14 +2481,6 @@ Kieli - Explosives - Räjähteet - - - Tip: - Vinkki: - - Quality Laatu @@ -2295,21 +2506,17 @@ Stereo rendering - Stereoskopia + Stereoskopia Style - Tyyli + Pelityyppi Scheme Säännöt - % Get Away Time - Pakoaika (%) - - There are videos that are currently being processed. Exiting now will abort them. Do you really want to quit? @@ -2367,7 +2574,7 @@ Bitrate (Kbps) - Laatu (Kbps) + Laatu (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2383,7 +2590,7 @@ Windowed Resolution - Ikknan koko + Ikkunan koko Your Email @@ -2403,11 +2610,11 @@ Revision - Revisio + Revisio This program is distributed under the %1 - Tämän ohjelman lisenssi: %1 + Tämän ohjelman lisenssi: %1 This setting will be effective at next restart. @@ -2431,18 +2638,27 @@ Air Mines - + Leijuvat miinat Player - + Pelaaja Barrels - + Tynnyrit % Retreat Time + % Pakoaika + + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second @@ -2460,6 +2676,10 @@ anonymous anonyymi + + unnamed (%1) + + QMainWindow @@ -2531,14 +2751,6 @@ Tiedostotyypit ovat varattu - Cannot create directory %1 - Hakemiston %1 luonti epäonnistui - - - Unable to start the server: %1. - Palvelinta ei pystytty käynnistämään: %1. - - Video upload - Error Videon lähetys - Virhe @@ -2556,19 +2768,19 @@ Record Play - Error - Nauhoituksen katselu - Virhe + Nauhoituksen katselu - Virhe Please select record from the list - Ole hyvä ja valitse nauhoite listasta + Ole hyvä ja valitse nauhoite listasta Cannot rename to - Ei voi uudelleennimetä: + Ei voi uudelleennimetä: Cannot delete file - Ei voi poistaa: + Ei voi poistaa: Room Name - Error @@ -2693,6 +2905,32 @@ Haluatko varmasti aloittaa pelin? Kaikki pelaajat eivät ole valmiita. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2736,10 +2974,6 @@ Käynnistä - Go! - Aloita! - - Play demo Toista nauhoite @@ -2801,7 +3035,7 @@ Upload this video to your Youtube account - Julkaise tämä video YouTube-tililläsi + Julkaise tämä video YouTube-tililläsi Reset @@ -2823,6 +3057,17 @@ Start private server Käynnistä oma palvelin + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2855,10 +3100,12 @@ C + Caption of the column for the number of connected clients in the list of rooms A T + Caption of the column for the number of teams in the list of rooms J @@ -2891,7 +3138,7 @@ Script - Kaava + Tyyppi Random Perlin @@ -2899,7 +3146,7 @@ Forts - + Linnakkeet @@ -2922,7 +3169,7 @@ Seed - Siemen + Siemen @@ -2944,28 +3191,20 @@ Viipeet - new - uusi - - - copy of %1 - %1 kopio - - New - Uusi + Uusi New (%1) - + Uusi (%1) Copy of %1 - + %1 kopio Copy of %1 (%2) - + %1 kopio (%2) @@ -3018,7 +3257,7 @@ Choose a theme - + Valitse teema @@ -3056,10 +3295,6 @@ vaihto - find hedgehog - etsi siili - - ammo menu asevalikko @@ -3189,7 +3424,7 @@ hedgehog info - siilitiedot + siilitiedot autocam / find hedgehog @@ -3199,6 +3434,11 @@ speed up replay nopeuta videoa + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3223,7 +3463,7 @@ binds (descriptions) Traverse gaps and obstacles by jumping: - Ylitä aukot ja esteet hyyppäämällä: + Ylitä aukot ja esteet hyppäämällä: Fire your selected weapon or trigger an utility item: @@ -3246,10 +3486,6 @@ Ajasta pommi ja ajastetut aseet: - Move the camera to the active hog: - Liikuta kamera aktiivisen siilen luokse: - - Move the cursor or camera without using the mouse: Liikuta kursoria tai kameraa ilman hiirtä: @@ -3279,7 +3515,7 @@ Toggle labels above hedgehogs: - Vaihda siilien yläpuolella näkyviä "leimoja": + Vaihda siilien yläpuolella näkyviä "leimoja": Record video: @@ -3287,7 +3523,7 @@ Hedgehog movement - Siilen liikkuminen + Siilin liikkuminen Toggle automatic camera / refocus on active hedgehog: @@ -3297,6 +3533,10 @@ Demo replay: Demojen katselu: + + Heads-up display: + + binds (keys) @@ -3784,10 +4024,6 @@ Peliviestien tulva havaittu - 1 - Game messages flood detected - 2 - Peliviestien tulva havaittu - 2 - - Warning! Joins flood protection activated Varoitus! Liittymisien tulvasuoja aktivoitu @@ -3797,47 +4033,47 @@ Your vote counted - + Sinun äänesi ratkaisi Pause toggled - + Tauko new seed - + uusi siemen number of hedgehogs in team - + siilien määrä pelissä /maxteams: specify number from 2 to 8 - + /maxteams: anna luku välillä 2-8 Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs - + Käytössä äänestyskomennot: kick <nimi>, map <nimi>, pause, newseed, hedgehogs callvote kick: specify nickname - + callvote kick: anna nimimerkki callvote kick: no such user - + callvote kick: moista käyttäjää ei löydy callvote map: no such map - + callvote map: moista karttaa ei löydy callvote pause: no game in progress - + callvote pause: peli ei ole käynnissä callvote hedgehogs: specify number from 1 to 8 - + callvote hedgehogs: anna luku väliltä 1-8 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_fr.ts --- a/share/hedgewars/Data/Locale/hedgewars_fr.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_fr.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Compilateur inconnu + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + Ce programme est distribué par %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -74,11 +153,11 @@ Please, specify %1 - Veuillez spécifier %1 + Veuillez spécifier %1 nickname - Pseudo + Pseudo permanent @@ -88,6 +167,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -112,15 +199,15 @@ Please give us feedback! - Nous avons besoin de votre avis! + Nous avons besoin de votre avis ! We are always happy about suggestions, ideas, or bug reports. - Toutes suggestions, idées ou rapport de bug sont les bienvenues. + Toutes suggestions, idées ou rapport de bug sont les bienvenus. If you found a bug, you can see if it's already known here (english): - Si vous trouvez un bug, vous pouvez vérifier si il est déjà connu ici (anglais): + Si vous trouvez un bug, vous pouvez vérifier s'il est déjà connu ici (anglais): Your email address is optional, but we may want to contact you. @@ -128,7 +215,7 @@ Send us feedback! - Envoyez-nous votre avis ressenti ! + Envoyez-nous vos avis ! If you found a bug, you can see if it's already been reported here: @@ -375,7 +462,7 @@ DefaultTeam - Équipe par défaut + Équipe par défaut Hedgewars Demo File @@ -477,7 +564,7 @@ This page requires an internet connection. - Cette page nécessite une connexion internet. + Cette page nécessite une connexion internet. Guest @@ -492,11 +579,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. fr.txt @@ -883,15 +997,16 @@ inconnu - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -903,6 +1018,20 @@ + MinesTimeSpinBox + + Random + Aléatoire + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -966,6 +1095,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + Commencer le combat + + + PageConnecting Connecting... @@ -980,12 +1128,28 @@ This page requires an internet connection. - Cette page nécessite une connexion internet. + Cette page nécessite une connexion internet. Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1084,6 +1248,47 @@ Random Team Équipes aléatoires + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1122,6 +1327,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 tué) (%1 tués) @@ -1129,14 +1335,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> pense que c'est bien de tirer sur ses propres hérissons pour <b>%2</b> point. <b>%1</b> pense que c'est bien de tirer sur ses propres hérissons pour <b>%2</b> points. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> a tué <b>%2</b> de ses propres hérissons. @@ -1158,6 +1364,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1472,6 +1693,27 @@ Video recording options Options d'enregistrement vidéo + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1594,7 +1836,7 @@ Defend your fort and destroy the opponents, two team colours max! - Défendez votre fort et détruisez vos adversaires, deux couleurs d'équipe au maximum ! + Défendez votre fort et détruisez vos adversaires, deux couleurs d'équipe au maximum ! Teams will start on opposite sides of the terrain, two team colours max! @@ -1777,6 +2019,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1836,12 +2082,36 @@ Pick the mission or training to play - Choisis une mission ou entraîne-toi à jouer + Choisis une mission ou entraîne-toi à jouer Start fighting Commencer le combat + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1957,6 +2227,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2064,6 +2338,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2159,6 +2441,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2331,7 +2637,7 @@ Stereo rendering - Rendu stéréo + Rendu stéréo Style @@ -2403,7 +2709,7 @@ Bitrate (Kbps) - Bitrate(Kb/s) + Bitrate(Kb/s) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2439,11 +2745,11 @@ Revision - Version de développement + Version de développement This program is distributed under the %1 - Ce programme est distribué par %1 + Ce programme est distribué par %1 This setting will be effective at next restart. @@ -2481,6 +2787,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2496,6 +2811,10 @@ anonymous anonyme + + unnamed (%1) + + QMainWindow @@ -2596,19 +2915,19 @@ Record Play - Error - Jouer l'enregistrement - Erreur + Jouer l'enregistrement - Erreur Please select record from the list - Veuillez choisir un enregistrement dans liste + Veuillez choisir un enregistrement dans liste Cannot rename to - Impossible de renommer en + Impossible de renommer en Cannot delete file - Impossible de supprimer le fichier + Impossible de supprimer le fichier Room Name - Error @@ -2733,6 +3052,32 @@ Etes-vous sûr de vouloir lancer cette partie? Les joueurs ne sont pas tous prêts. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2753,7 +3098,7 @@ Go! - C'est parti! + C'est parti! Start @@ -2841,7 +3186,7 @@ Upload this video to your Youtube account - Importer cette vidéo sur votre compte Youtube + Importer cette vidéo sur votre compte Youtube Reset @@ -2863,6 +3208,17 @@ Start private server Démarrer un serveur privé + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2895,10 +3251,12 @@ C + Caption of the column for the number of connected clients in the list of rooms J T + Caption of the column for the number of teams in the list of rooms É @@ -3232,7 +3590,7 @@ hedgehog info - Informations sur l'hérisson + Informations sur l'hérisson autocam / find hedgehog @@ -3242,6 +3600,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3322,7 +3685,7 @@ Toggle labels above hedgehogs: - (Dés)activez les étiquettes au-dessus des hérissons: + (Dés)activez les étiquettes au-dessus des hérissons: Record video: @@ -3340,6 +3703,10 @@ Demo replay: + + Heads-up display: + + binds (keys) @@ -3692,7 +4059,7 @@ Corrupted hedgehogs info - Info hérisson corrompus + Info hérisson corrompu too many teams @@ -3708,11 +4075,11 @@ round in progress - La partie est en cour + La partie est en cours restricted - Ajout interdis + Ajout interdit REMOVE_TEAM: no such team @@ -3740,19 +4107,19 @@ Joining restricted - Accès interdis + Accès interdit Registered users only - Accès réservé aux utilisateurs enregistré + Accès réservé aux utilisateurs enregistrés You are banned in this room - Vous avez été bannis de cette room + Vous avez été banni de cette room Nickname already chosen - Pseudo déjà choisis + Pseudo déjà choisi Illegal nickname @@ -3772,7 +4139,7 @@ Restricted - + Limité No checker rights @@ -3780,51 +4147,51 @@ Room version incompatible to your hedgewars version - + La version de la room est incompatible avec votre version du jeu You already have voted - + Vous avez déjà voté Voting closed - + Vote terminé New voting started - + Nouveau vote ouvert Voting expired - + Vote expiré kick - + Expulsé map - + Carte pause - pause + Pause Reconnected too fast - + Reconnecté trop vite Warning! Chat flood protection activated - + Attention! La protection anti-flood du chat est activé Excess flood - + Trop de spam Game messages flood detected - 1 - + Spam des messages du jeu détecté Warning! Joins flood protection activated @@ -3832,15 +4199,15 @@ There's no voting going on - + Il n'y a pas de vote en ce moment Your vote counted - + Votre vote est enregistré Pause toggled - + En pause new seed @@ -3848,7 +4215,7 @@ number of hedgehogs in team - + Nombre de hedgehogs dans la team /maxteams: specify number from 2 to 8 @@ -3860,23 +4227,23 @@ callvote kick: specify nickname - + Vote d'expulsion: spécifié le pseudo callvote kick: no such user - + Vote d'expulsion: pas d'autres utilisateurs callvote map: no such map - + Vote de carte: pas d'autres cartes callvote pause: no game in progress - + Vote de pause: pas de partie en cours callvote hedgehogs: specify number from 1 to 8 - + Vote d'hedgehogs: spécifié un chiffre entre 1 et 8 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_gd.ts --- a/share/hedgewars/Data/Locale/hedgewars_gd.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_gd.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,10 +1,83 @@ - + + + About Unknown Compiler Trusaiche neo-aithnichte + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + Tha am prògram seo ’ga sgaoileadh fo cheadachas %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -16,12 +89,20 @@ AmmoSchemeModel - new - ùr - - - copy of %1 - lethbhreac de %1 + New + Ùr + + + Copy of %1 + Lethbhreac dhe %1 + + + New (%1) + Ùr (%1) + + + Copy of %1 (%2) + Lethbhreac dhe %1 (%2) @@ -64,22 +145,34 @@ Please, specify %1 - Feuch an sònraidh thu %1 + Feuch an sònraidh thu %1 nickname - far-ainm + far-ainm permanent buan + + Ban player + Toirmeasg an cluicheadair + + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager Use Default - Cleachd a' bhun-roghainn + Cleachd a’ bhun-roghainn @@ -112,6 +205,10 @@ Your email address is optional, but necessary if you want us to get back at you. Cha leig thu leas seòladh puist-d a chur seachad ach ma tha thu airson freagairt fhaighinn. + + Feedback + Beachdan thugainn + FreqSpinBox @@ -121,7 +218,12 @@ Every %1 turn - Gach %1d cuairtGach %1a cuairtGach %1mh cuairtGach %1mh cuairt + + Gach %1d cuairt + Gach %1a cuairt + Gach %1mh cuairt + Gach %1mh cuairt + @@ -136,7 +238,7 @@ Game scheme will auto-select a weapon - Taghaidh sgeama a' gheama arm gu fèin-obrachail + Taghaidh sgeama a’ gheama arm gu fèin-obrachail Map @@ -144,7 +246,7 @@ Game options - Roghainnean a' gheama + Roghainnean a’ gheama @@ -158,31 +260,56 @@ HWApplication %1 minutes - %1 mhionaid%1 mhionaid%1 mionaidean%1 mionaid + + %1 mhionaid + %1 mhionaid + %1 mionaidean + %1 mionaid + %1 hour - %1 uair%1 uair%1 uairean%1 uair + + %1 uair + %1 uair + %1 uairean + %1 uair + %1 hours - %1 uair%1 uair%1 uairean%1 uair + + %1 uair + %1 uair + %1 uairean + %1 uair + %1 day - %1 latha%1 latha%1 làithean%1 latha + + %1 latha + %1 latha + %1 làithean + %1 latha + %1 days - %1 latha%1 latha%1 làithean%1 latha + + %1 latha + %1 latha + %1 làithean + %1 latha + Scheme '%1' not supported - Cha chuir sinn taic ris an sgeama "%1" + Cha chuir sinn taic ris an sgeama “%1” Cannot create directory %1 - Chan urrainn dhuinn am pasgan "%1" a chruthachadh + Chan urrainn dhuinn am pasgan “%1” a chruthachadh Failed to open data directory: @@ -217,22 +344,22 @@ Display this help command-line - Seall a' chobhair seo + Seall a’ chobhair seo Custom path for configuration data and user data command-line - Slighe ghnàthaichte airson dàta rèiteachaidh 's a' chleachdaiche + Slighe ghnàthaichte airson dàta rèiteachaidh ’s a’ chleachdaiche Custom path to the game data folder command-line - Slighe ghnàthaichte gu pasgan dàta a' gheama + Slighe ghnàthaichte gu pasgan dàta a’ gheama Hedgewars can use a %1 (e.g. "%2") to connect on start. command-line - 'S urrainn do Hedgewars %1 (m.e. "%2") a chleachdadh gus ceangal leis an tòiseachadh. + ’S urrainn do Hedgewars %1 (m.e. “%2”) a chleachdadh gus ceangal leis an tòiseachadh. Malformed option argument: %1 @@ -280,7 +407,7 @@ Couldn't read %1 - Cha b' urrainn dhuinn %1 a leughadh + Cha b’ urrainn dhuinn %1 a leughadh StyleSheet discarded @@ -292,7 +419,7 @@ Failed to save StyleSheet to %1 - Cha b' urrainn dhuinn an siota-stoidhle a shàbhaladh gu %1 + Cha b’ urrainn dhuinn an siota-stoidhle a shàbhaladh gu %1 %1 has joined @@ -300,11 +427,23 @@ %1 has left - Dh'fhalbh %1 + Dh’fhalbh %1 %1 has left (%2) - Dh'fhalbh %1 (%2) + Dh’fhalbh %1 (%2) + + + Chat log + Loga na cabadaich + + + Enter chat messages here and send them with [Enter] + Cuir teachdaireachdan na cabadaich a-steach an-seo agus cuir iad le [Enter] + + + List of players + Liosta dhe chluicheadairean @@ -315,7 +454,7 @@ DefaultTeam - Sgioba tùsail + Sgioba tùsail Hedgewars Demo File @@ -350,7 +489,7 @@ Someone already uses your nickname %1 on the server. Please pick another nickname: - Cha cuideigin a' chleachdadh d' fhar-ainm %1 air an fhrithealaiche mar-thà. + Cha cuideigin a’ chleachdadh d’ fhar-ainm %1 air an fhrithealaiche mar-thà. Feuch an tagh thu far-ainm eile: @@ -362,12 +501,12 @@ Hedgewars - Far-ainm clàraichte - This nick is registered, and you haven't specified a password. + This nick is registered, and you haven't specified a password. -If this nick isn't yours, please register your own nick at www.hedgewars.org +If this nick isn't yours, please register your own nick at www.hedgewars.org Password: - Tha am far-ainm seo clàraichte 's cha chuir thu facal-faire a-steach. + Tha am far-ainm seo clàraichte ’s cha chuir thu facal-faire a-steach. Mur ann agadsa a tha am far-ainm seo, clàraich fear agad fhèin air www.hedgewars.org @@ -377,8 +516,8 @@ Your nickname is not registered. To prevent someone else from using it, please register it at www.hedgewars.org - Chan eil d' fhar-ainm clàraichte. -'S urrainn dhut a chlàradh air www.hedgewars.org + Chan eil d’ fhar-ainm clàraichte. +’S urrainn dhut a chlàradh air www.hedgewars.org ach nach cleachd duine eile e. @@ -391,11 +530,11 @@ Hedgewars - Empty nickname - Hedgewars - Far-ainm falamh + Hedgewars – Far-ainm falamh Hedgewars - Wrong password - Hedgewars - Facal-faire ceàrr + Hedgewars – Facal-faire ceàrr You entered a wrong password. @@ -407,7 +546,7 @@ Hedgewars - Connection error - Hedgewars - Mearachd leis a' cheangal + Hedgewars – Mearachd leis a’ cheangal You reconnected too fast. @@ -417,7 +556,7 @@ This page requires an internet connection. - Tha an duilleag seo feumach air ceangal dhan eadar-lìn. + Tha an duilleag seo feumach air ceangal dhan eadar-lìn. Guest @@ -433,11 +572,38 @@ Chaidh an seòmar seo a dhìon le facal-faire. Cuir a-steach am facal-faire: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. gd.txt @@ -449,21 +615,28 @@ 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 '%1' button in the main menu! Last two engine messages: %2 - Thachair MEARACHD mharbhtach! - Thug seo stad air inneal a' gheama. + Thachair MEARACHD mharbhtach! – Thug seo stad air inneal a’ gheama. Tha sinn glè dhuilich mun trioblaid seo :( -Ma thachras seo a-rithist 's a-rithist, briog air a' phutan "%1" sa phrìomh chlàr-taice! +Ma thachras seo a-rithist ’s a-rithist, briog air a’ phutan “%1” sa phrìomh chlàr-taice! An dà theachdaireachd mu dheireadh aig an inneal: %2 + HWHostPortDialog + + Connect to server + Ceangail ris an fhrithealaiche + + + HWMapContainer All @@ -503,7 +676,7 @@ Map type: - Seòrsa a' mhapa: + Seòrsa a’ mhapa: Image map @@ -531,7 +704,7 @@ Map preview: - Ro-shealladh air a' mhapa: + Ro-shealladh air a’ mhapa: Load map drawing @@ -555,11 +728,11 @@ Map size: - Meud a' mhapa: + Meud a’ mhapa: Maze style: - Stoidhle a' chuartain: + Stoidhle a’ chuartain: Mission: @@ -597,6 +770,54 @@ Style: Stoidhle: + + Forts + Dùin + + + View and edit the seed, the source of randomness in the game + Seall is deasaich an sìol, seo tùs na tuaireamachd sa gheama + + + Randomize the theme + Tuaireamaich an t-ùrlar + + + Choose a theme + Tagh ùrlar + + + Randomize the map, theme and seed + Tuaireamaich am mapa, an t-ùrlar ’s an sìol + + + Randomize the theme and seed + Tuaireamaich an t-ùrlar ’s an sìol + + + Randomize the seed + Tuaireamaich an sìol + + + Click to randomize the map, theme and seed + Briog gus am mapa, an t-ùrlar is an sìol a thuaireamachadh + + + Click to randomize the theme and seed + Briog gus an t-ùrlar is an sìol a thuaireamachadh + + + Adjust the complexity of the generated map + Gleus iom-fhillteachd a’ mhapa a thèid a ghintinn + + + Adjust the distance between forts + Gleus an t-astar eadar na dùin + + + Click to edit + Briog gus a dheasachadh + HWNetServersModel @@ -617,7 +838,7 @@ HWNewNet The host was not found. Please check the host name and port settings. - Cha deach an t-òstair a lorg. Dearbhaich ainm an òstair agus roghainnean a' phuirt. + Cha deach an t-òstair a lorg. Dearbhaich ainm an òstair agus roghainnean a’ phuirt. Connection refused @@ -633,27 +854,23 @@ You got kicked - Fhuair thu a' bhog + Fhuair thu a’ bhròg %1 *** %2 has joined the room Thàinig %1 *** %2 a-steach dhan t-seòmar - %1 *** %2 has joined - - - %1 *** %2 has left (%3) - Dh'fhalbh %1 *** %2 (%3) + Dh’fhalbh %1 *** %2 (%3) %1 *** %2 has left - Dh'fhalbh %1 *** %2 + Dh’fhalbh %1 *** %2 User quit - Dh'fhàg an cleachdaiche an-seo + Dh’fhàg an cleachdaiche an-seo Remote host has closed connection @@ -661,7 +878,7 @@ The server is too old. Disconnecting now. - Tha am frithealaiche ro shean. 'Ga dhì-cheangal a-nis. + Tha am frithealaiche ro shean. ’Ga dhì-cheangal a-nis. Server authentication error @@ -677,7 +894,7 @@ To connect to the server, please log in. -If you don't have an account on www.hedgewars.org, +If you don't have an account on www.hedgewars.org, just enter your nickname. Log a-steach gus ceangal ris an fhrithealaiche. @@ -692,6 +909,10 @@ Password: Facal-faire: + + New Account + Cunntas ùr + HWUploadVideoDialog @@ -725,12 +946,9 @@ Search for a hat: Lorg ad: - - - KB - - SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It's recommended to update your freetype lib. - + + Choose a hat + Tagh ad @@ -752,7 +970,7 @@ Duration: %1m %2s - Faide: %1m %2d + Faide: %1m %2d Video: %1x%2 @@ -760,7 +978,16 @@ %1 fps - %1 fps + %1 fps + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS + @@ -771,6 +998,22 @@ + MinesTimeSpinBox + + Random + Air thuaiream + + + %1 seconds + + %1 second + %1 seconds + + + + + + PageAdmin Clear Accounts Cache @@ -790,7 +1033,7 @@ Latest version protocol number: - Àireamh a' phròtacail as ùire: + Àireamh a’ phròtacail as ùire: MOTD preview: @@ -814,7 +1057,7 @@ Expiration - Àm a dh'fhalbhas an ùine air + Àm a dh’fhalbhas an ùine air Reason @@ -834,26 +1077,61 @@ + PageCampaign + + Start fighting + Tòisich air sabaid + + + Team + Sgioba + + + Campaign + + + + Mission + + + + PageConnecting Connecting... - 'Ga cheangal... + ’Ga cheangal… PageDataDownload Loading, please wait. - 'Ga cheangal, fuirich ort. + ’Ga luchdadh, fuirich ort. This page requires an internet connection. - Tha an duilleag seo feumach air ceangal dhan eadar-lìn. + Tha an duilleag seo feumach air ceangal dhan eadar-lìn. Open packages directory Fosgail pasgan nam pacaidean + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -946,12 +1224,53 @@ Randomize this hedgehog's name - Thoir ainm air thuaiream air a' ghràineag seo + Thoir ainm air thuaiream air a’ ghràineag seo Random Team Sgioba air thuaiream + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Play a random example of this voice + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -969,31 +1288,67 @@ The best shot award was won by <b>%1</b> with <b>%2</b> pts. - Bhuannaich <b>%1</b> duais an losgaidh as fhearr le <b>%2</b> phuing.Bhuannaich <b>%1</b> duais an losgaidh as fhearr le <b>%2</b> phuing.Bhuannaich <b>%1</b> duais an losgaidh as fhearr le <b>%2</b> puingean.Bhuannaich <b>%1</b> duais an losgaidh as fhearr le <b>%2</b> puing. + + Bhuannaich <b>%1</b> duais an losgaidh as fhearr le <b>%2</b> phuing. + Bhuannaich <b>%1</b> duais an losgaidh as fhearr le <b>%2</b> phuing. + Bhuannaich <b>%1</b> duais an losgaidh as fhearr le <b>%2</b> puingean. + Bhuannaich <b>%1</b> duais an losgaidh as fhearr le <b>%2</b> puing. + The best killer is <b>%1</b> with <b>%2</b> kills in a turn. - Is <b>%1</b> am marbhaiche as fhearr le <b>%2</b> mharbhadh ann an cuairt.Is <b>%1</b> am marbhaiche as fhearr le <b>%2</b> mharbhadh ann an cuairt.Is <b>%1</b> am marbhaiche as fhearr le <b>%2</b> marbhaidhean ann an cuairt.Is <b>%1</b> am marbhaiche as fhearr le <b>%2</b> marbhadh ann an cuairt. + + Is <b>%1</b> am marbhaiche as fhearr le <b>%2</b> mharbhadh ann an cuairt. + Is <b>%1</b> am marbhaiche as fhearr le <b>%2</b> mharbhadh ann an cuairt. + Is <b>%1</b> am marbhaiche as fhearr le <b>%2</b> marbhaidhean ann an cuairt. + Is <b>%1</b> am marbhaiche as fhearr le <b>%2</b> marbhadh ann an cuairt. + A total of <b>%1</b> hedgehog(s) were killed during this round. - Chaidh <b>%1</b> ghràineag a mharbhadh uile gu lèir sa chuairt seo.Chaidh <b>%1</b> ghràineag a mharbhadh uile gu lèir sa chuairt seo.Chaidh <b>%1</b> gràineagan a mharbhadh uile gu lèir sa chuairt seo.Chaidh <b>%1</b> gràineag a mharbhadh uile gu lèir sa chuairt seo. + + Chaidh <b>%1</b> ghràineag a mharbhadh uile gu lèir sa chuairt seo. + Chaidh <b>%1</b> ghràineag a mharbhadh uile gu lèir sa chuairt seo. + Chaidh <b>%1</b> gràineagan a mharbhadh uile gu lèir sa chuairt seo. + Chaidh <b>%1</b> gràineag a mharbhadh uile gu lèir sa chuairt seo. + (%1 kill) - (%1 mharbhadh)(%1 mharbhadh)(%1 marbhaidhean)(%1 marbhadh) + Number of kills in stats screen, written after the team name + + (%1 mharbhadh) + (%1 mharbhadh) + (%1 marbhaidhean) + (%1 marbhadh) + <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - Bha <b>%1</b> dhen bheachd gum b' fheairrde e na gràineagan aige fhèin a mharbhadh le <b>%2</b> phuing.Bha <b>%1</b> dhen bheachd gum b' fheairrde e na gràineagan aige fhèin a mharbhadh le <b>%2</b> phuing.Bha <b>%1</b> dhen bheachd gum b' fheairrde e na gràineagan aige fhèin a mharbhadh le <b>%2</b> puingean.Bha <b>%1</b> dhen bheachd gum b' fheairrde e na gràineagan aige fhèin a mharbhadh le <b>%2</b> puing. + + Bha <b>%1</b> dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le <b>%2</b> phuing. + Bha <b>%1</b> dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le <b>%2</b> phuing. + Bha <b>%1</b> dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le <b>%2</b> puingean. + Bha <b>%1</b> dhen bheachd gum b’ fheairrde e na gràineagan aige fhèin a mharbhadh le <b>%2</b> puing. + <b>%1</b> killed <b>%2</b> of his own hedgehogs. - Mharbh <b>%1</b> <b>%2</b> dhe na gràineagan aige fhèin.Mharbh <b>%1</b> <b>%2</b> dhe na gràineagan aige fhèin.Mharbh <b>%1</b> <b>%2</b> dhe na gràineagan aige fhèin.Mharbh <b>%1</b> <b>%2</b> dhe na gràineagan aige fhèin. + + Mharbh <b>%1</b> <b>%2</b> dhe na gràineagan aige fhèin. + Mharbh <b>%1</b> <b>%2</b> dhe na gràineagan aige fhèin. + Mharbh <b>%1</b> <b>%2</b> dhe na gràineagan aige fhèin. + Mharbh <b>%1</b> <b>%2</b> dhe na gràineagan aige fhèin. + <b>%1</b> was scared and skipped turn <b>%2</b> times. - Thàinig an t-eagal air <b>%1</b> agus leig e seachad a chuairt <b>%2</b> turas.Thàinig an t-eagal air <b>%1</b> agus leig e seachad a chuairt <b>%2</b> thuras.Thàinig an t-eagal air <b>%1</b> agus leig e seachad a chuairt <b>%2</b> tursan.Thàinig an t-eagal air <b>%1</b> agus leig e seachad a chuairt <b>%2</b> turas. + + Thàinig an t-eagal air <b>%1</b> agus leig e seachad a chuairt <b>%2</b> turas. + Thàinig an t-eagal air <b>%1</b> agus leig e seachad a chuairt <b>%2</b> thuras. + Thàinig an t-eagal air <b>%1</b> agus leig e seachad a chuairt <b>%2</b> tursan. + Thàinig an t-eagal air <b>%1</b> agus leig e seachad a chuairt <b>%2</b> turas. + Play again @@ -1005,14 +1360,38 @@ (%1 %2) - (%1 %2)(%1 %2)(%1 %2)(%1 %2) + 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” + + (%1 %2) + (%1 %2) + (%1 %2) + (%1 %2) + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. + + + + + + PageInGame In game... - Sa gheama... + Sa gheama… @@ -1038,15 +1417,15 @@ Read about who is behind the Hedgewars Project - Leugh air cò tha air cùlaibh a' phròiseict Hedgewars + Leugh air cò tha air cùlaibh a’ phròiseict Hedgewars Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars - Fàg beachd an-seo mu dhuilgheadasan, molaidhean air feartan no innis dhuinn ciamar a tha Hedgewars a' chòrdadh riut + Fàg beachd an-seo mu dhuilgheadasan, molaidhean air gleusan no innis dhuinn ciamar a tha Hedgewars a’ chòrdadh riut Access the user created content downloadable from our website - Inntrig susbaint a rinn cleachdaichean 's a ghabhas luchdadh a-nuas on làrach-lìn againn + Inntrig susbaint a rinn cleachdaichean ’s a ghabhas luchdadh a-nuas on làrach-lìn againn Exit game @@ -1058,7 +1437,7 @@ Edit game preferences - Deasaich roghainnean a' gheama + Deasaich roghainnean a’ gheama Play a game across a local area network @@ -1089,18 +1468,18 @@ Edit game preferences - Deasaich roghainnean a' gheama + Deasaich roghainnean a’ gheama + + + Start fighting (requires at least 2 teams) + Tòisich air sabaid (feum air co-dhiù 2 sgioba) PageNetGame - Control - - - Edit game preferences - Deasaich roghainnean a' gheama + Deasaich roghainnean a’ gheama Start @@ -1114,6 +1493,22 @@ Room controls Uidheaman-smachd an t-seòmair + + Room name + Ainm an t-seòmair + + + Update the room name + Ùraich ainm an t-seòmair + + + Turn on the lightbulb to show the other players when you're ready to fight + Cuir am bolgan air gus sealltainn dha na cluicheadairean eile nuair a bhios tu deiseil ri sabaid + + + Start fighting (requires at least 2 teams) + Tòisich air sabaid (feum air co-dhiù 2 sgioba) + PageNetServer @@ -1178,19 +1573,19 @@ Proxy host - Òstair a' phrogsaidh + Òstair a’ phrogsaidh Proxy port - Port a' phrogsaidh + Port a’ phrogsaidh Proxy login - Logadh a-steach a' phrogsaidh + Logadh a-steach a’ phrogsaidh Proxy password - Facal-faire a' phrogsaidh + Facal-faire a’ phrogsaidh No proxy @@ -1214,7 +1609,7 @@ Reset to default - Ah-shuidhich air a' bhun-roghainn + Ath-shuidhich air a’ bhun-roghainn Reset all binds @@ -1266,7 +1661,7 @@ Game audio - Fuaim a' gheama + Fuaim a’ gheama Frontend audio @@ -1278,7 +1673,7 @@ Proxy settings - Roghainnean a' phrogsaidh + Roghainnean a’ phrogsaidh Miscellaneous @@ -1296,39 +1691,65 @@ Video recording options Roghainnean clàradh video + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo Rename dialog - Thoir ainm ùr air a' chòmhradh + Thoir ainm ùr air a’ chòmhradh Enter new file name: Cuir a-steach ainm an fhaidhle ùir: + + Play demo + Cluich demo + + + Play the selected demo + Cluich an demo a thagh thu + + + Load the selected game + Luchdaich an geama a thagh thu + PageRoomsList - Create - - - - Join - - - Admin features - Feartan rianachd - - - Room Name: - + Rianachd %1 players online - %1 chluicheadair air loidhne%1 chluicheadair air loidhne%1 cluicheadairean air loidhne%1 cluicheadair air loidhne + + %1 chluicheadair air loidhne + %1 chluicheadair air loidhne + %1 cluicheadairean air loidhne + %1 cluicheadair air loidhne + Search for a room: @@ -1355,11 +1776,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Dìon an dùn agad agus mill na nàimhdean, dà dhath sgioba air a char as motha! - - - Teams will start on opposite sides of the terrain, two team colours max! - Tòisichidh na sgiobaidhean taobh thall o chàch a chèile, dà dhath sgioba air a char as motha! + Dìon an dùn agad agus mill na nàimhdean, dà dhath sgioba air a char as motha! Land can not be destroyed! @@ -1383,21 +1800,13 @@ Share your opponents pain, share their damage - Co-roinn pian 's dochann nan nàimhdean + Co-roinn pian ’s dochann nan nàimhdean Your hogs are unable to move, put your artillery skills to the test Chan urrainn dha na gràineagan agad gluasad, cuir na sgilean làmhachais agad fo dheuchainn - Random - Air thuaiream - - - Seconds - Diog(an) - - New Ùr @@ -1407,7 +1816,7 @@ Order of play is random instead of in room order. - Tha òrdugh a' chluiche air thuaiream seach 'na òrdugh an t-seòmair. + Tha òrdugh a’ chluiche air thuaiream seach ’na òrdugh an t-seòmair. Play with a King. If he dies, your side dies. @@ -1439,7 +1848,7 @@ Attacking does not end your turn. - Cha chuir ionnsaigh crìoch air a' chuairt agad. + Cha chuir ionnsaigh crìoch air a’ chuairt agad. Weapons are reset to starting values each turn. @@ -1455,7 +1864,7 @@ Wind will affect almost everything. - Bidh buair aig a' ghaoth air cha mhòr a h-uile rud. + Bidh buaidh aig a’ ghaoth air cha mhòr a h-uile rud. Copy @@ -1463,7 +1872,7 @@ Teams in each clan take successive turns sharing their turn time. - Cluichidh buill sgioba fear mu seach, a' co-roinneadh ùine nan cuairtean aca. + Cluichidh buill sgioba fear mu seach, a’ co-roinneadh ùine nan cuairtean aca. Add an indestructible border around the terrain @@ -1471,7 +1880,7 @@ Add an indestructible border along the bottom - Cuir iomall nach gabh milleadh ris a' bhonn + Cuir iomall nach gabh milleadh ris a’ bhonn None (Default) @@ -1487,7 +1896,87 @@ Sea (Edges connect to sea) - Muir (ceanglaidh na h-oirean ris a' mhuir) + Muir (ceanglaidh na h-oirean ris a’ mhuir) + + + Each clan starts in its own part of the terrain. + Tòisichidh gach cinneadh air sgìre dha fhèin. + + + Overall damage and knockback in percent + Dochainn coitcheann agus bualadh air ais ann an ceudad + + + Turn time in seconds + Ùine na cuairte ann an diogan + + + Initial health of hedgehogs + Slàinte tùsail nan gràineag + + + How many rounds have to be played before Sudden Death begins + An àireamh dhe chuairtean a thèid a chluich mus tòisich am bàs obann + + + How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. + Dè cho fada a dh’èireas an t-uisge gach cuairt ri linn a’ bhàis obainn. Suidhich seo agus lughdachadh slàinte rè a’ bhàis obainn air 0 gus am bàs obann a chur à comas. + + + 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. + An uiread dhe shlàinte a chailleas na gràineagan gach cuairt ri linn a’ bhàis obainn, sìos gu ruige 1 shlàine. Suidhich seo agus èireadh an uisge rè a’ bhàis obainn air 0 gus am bàs obann a chur à comas. + + + Maximum rope length in percent + Faide as motha nan ròpannan ann an ceuded + + + Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. + An coltachd gu bheil creat a thuiteas ’na chreat slàinte. Bidh gach creat eile ’na chreat airm no acainn. + + + Likelihood of a crate dropping before a turn + An coltachd gun tuit creat ro thoiseach cuairte + + + Health bonus for collecting a health crate + Buannachd slàinte a gheibhear le togail creat slàinte + + + 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. + Tìmear spreadhaidh nam mèinnean. Tha an tìmear tuaireamach eadar 0 is 5 diogan. Bidh tìmear nam mèinnean adhair ceithir tursan nas luaithe na tìmear nam mèinnean coitcheann. + + + Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. + Cuibheas nam mèinnean a thèid a chur air mapa le eileanan meadhanach. Thèid an àireamh seo a sgèileadh airson nam mapaichean eile. + + + Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. + An coltachd nach spreadh mèinn. Chan bhi bhuaidh aig seo air mèinnean a chuireas gràineagan. + + + Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. + Cuibheas nam baraillean a thèid a chur air mapa le eileanan meadhanach. Thèid an àireamh seo a sgèileadh airson nam mapaichean eile. + + + Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. + Cuibheas nam mèinnean adhair a thèid a chur air mapa le eileanan meadhanach. Thèid an àireamh seo a sgèileadh airson nam mapaichean eile. + + + Affects the left and right boundaries of the map + Bidh buaidh aig seo air crìochan clì is deas a’ mhapa + + + Time you get after an attack + An ùine a gheibh thu às dèidh ionnsaighe + + + Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + Paramadair a bharrachd gus stoidhlichean geama a rèiteachadh. Tha a chiall a-rèir na stoidhle a chleachdas tu, thoir sùil air an docamaideadh. Fàg seo bàn mur eil thu cinnteach. + + + Name of this scheme + @@ -1513,7 +2002,7 @@ PageSinglePlayer Play a quick game against the computer with random settings - Cluich geama luath an aghaidh a' hoimpiutair le roghainnean air thuaiream + Cluich geama luath an aghaidh a’ choimpiutair le roghainnean air thuaiream Play a hotseat game against your friends, or AI teams @@ -1548,12 +2037,36 @@ Pick the mission or training to play - Tagh am misean no trèanadh airson cluiche + Tagh am misean no trèanadh airson cluiche Start fighting Tòisich air sabaid + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1567,19 +2080,24 @@ %1 bytes - %1 bhaidht%1 bhaidht%1 baidhtichean%1 baidht + + %1 bhaidht + %1 bhaidht + %1 baidhtichean + %1 baidht + (in progress...) - (a' dol air adhart...) + (a’ dol air adhart…) encoding - 'ga chòdachadh + ’ga chòdachadh uploading - 'ga luchdadh suas + ’ga luchdadh suas Date: %1 @@ -1594,7 +2112,7 @@ QAction Kick - Thoir a' bhròg dha + Thoir a’ bhròg dhaibh Info @@ -1602,7 +2120,7 @@ Restrict Joins - Cuingich a' bhallrachd + Cuingich a’ bhallrachd Restrict Team Additions @@ -1633,10 +2151,6 @@ Thoir air falbh o na caraidean - Update - - - Restrict Unregistered Players Join Cuingich cluicheadairean gun chlàradh @@ -1646,7 +2160,19 @@ Show games in-progress - Seall na geamannan a tha a' dol + Seall na geamannan a tha a’ dol + + + Show password protected + Seall le dìon facail-fhaire + + + Show join restricted + Seall le tighinn a-steach cuingichte + + + Delegate room control + @@ -1669,11 +2195,11 @@ Append date and time to record file name - Cuir ceann-là 's àm ri ainm faidhle a' chlàraidh + Cuir ceann-là ’s àm ri ainm faidhle a’ chlàraidh Show ammo menu tooltips - Seall gliocasan ann an clàr-taice a' chonnaidh + Seall gliocasan ann an clàr-taice a’ chonnaidh Save password @@ -1681,11 +2207,11 @@ Save account name and password - Sàbhail ainm a' chunntais 's am facal-faire + Sàbhail ainm a’ chunntais ’s am facal-faire Video is private - Tha a' video prìobhaideach + Tha a’ video prìobhaideach Record audio @@ -1693,7 +2219,7 @@ Use game resolution - Cleachd dùmhlachd-bhreacaidh a' gheama + Cleachd dùmhlachd-bhreacaidh a’ gheama Visual effects @@ -1755,6 +2281,14 @@ Enable translucent tags by default Cuir tagaichean trìd-shoilleir an comas o thùs + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -1763,10 +2297,6 @@ Daonna - Level - Leibheil - - (System default) (Bun-roghainn an t-siostaim) @@ -1834,6 +2364,34 @@ Green/Red grayscale Liath-sgèile uaine/dearg + + Computer (Level %1) + Coimpiutair (Leibheil %1) + + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -1855,7 +2413,7 @@ Game Modifiers - Atharraichearan a' gheama + Atharraichearan a’ gheama Basic Settings @@ -1885,10 +2443,6 @@ Mèinnean - Version - - - Weapons Airm @@ -1934,7 +2488,7 @@ Sudden Death Timeout - Bàs obann nuair a dh'fhalbhas an ùine + Crìoch ùine a’ bhàis obainn Scheme Name: @@ -1953,10 +2507,6 @@ Ainm - Type - Seòrsa - - Grave Uaigh @@ -1973,10 +2523,6 @@ Cànan - Explosives - Stuth spreadhaidh - - Quality Càileachd @@ -1990,19 +2536,19 @@ Sudden Death Water Rise - Bàs obann nuair a dh'fhàsas an t-uisge + Èireadh an uisge rè a’ bhàis obainn Sudden Death Health Decrease - Bàs obann le droch slàinte + Lughdachadh slàinte rè a’ bhàis obainn % Rope Length - % de dh'fhaide nan ropannan + % de dh’fhaide nan ròpannan Stereo rendering - Reandaradh stereo + Reandaradh stereo Style @@ -2013,24 +2559,20 @@ Sgeama - % Get Away Time - % a dh'ùine gus teicheadh - - There are videos that are currently being processed. Exiting now will abort them. Do you really want to quit? - Tha videothan 'gam pròiseasadh an-dràsta. -Sguiridh tu dheth ma dh'fhàgas tu an-seo. + Tha videothan ’gam pròiseasadh an-dràsta. +Sguiridh tu dheth ma dh’fhàgas tu an-seo. A bheil thu airson fàgail an-seo dha-rìribh? Please provide either the YouTube account name or the email address associated with the Google Account. - Cuir a-steach ainm a' chunntais agad air YouTube no an seòladh puist-d a tha co-cheangailte ris a' chunntas Google agad. + Cuir a-steach ainm a’ chunntais agad air YouTube no an seòladh puist-d a tha co-cheangailte ris a’ chunntas Google agad. Account name (or email): - Ainm a' chunntais (no post-d): + Ainm a’ chunntais (no post-d): Password: @@ -2038,11 +2580,11 @@ Video title: - Tiotal a' video: + Tiotal a’ video: Video description: - Tuairisgeul a' video: + Tuairisgeul a’ video: Tags (comma separated): @@ -2074,11 +2616,11 @@ Bitrate (Kbps) - Bitrate (Kbps) + Bitrate (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! - 'S e "obair 'ga dhèanamh" a tha san togail leasachaidh seo agus dh'fhaoidte nach eil e co-chòrdail ri tionndaidhean eile a' gheama agus gu bheil cuid a dh'fheartan briste no neo-choileanta! + ’S e “obair ’ga dhèanamh” a tha san togail leasachaidh seo agus dh’fhaoidte nach eil e co-chòrdail ri tionndaidhean eile a’ gheama agus gu bheil cuid a ghleusan briste no neo-choileanta! Fullscreen @@ -2110,11 +2652,11 @@ Revision - Lèirmheas + Lèirmheas This program is distributed under the %1 - Tha am prògram seo 'ga sgaoileadh fo cheadachas %1 + Tha am prògram seo ’ga sgaoileadh fo cheadachas %1 This setting will be effective at next restart. @@ -2126,7 +2668,7 @@ Displayed tags above hogs and translucent tags - Tagaichean a nochdas os cionn ghràineagan 's tagaichean trìd-shoilleir + Tagaichean a nochdas os cionn ghràineagan ’s tagaichean trìd-shoilleir World Edge @@ -2136,6 +2678,31 @@ Script parameter Paramadair an sgriobt + + Air Mines + Mèinnean adhair + + + Player + Cluicheadair + + + Barrels + Baraillean + + + % Retreat Time + % ùine cùlachaidh + + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2151,6 +2718,10 @@ anonymous gun ainm + + unnamed (%1) + + QMainWindow @@ -2171,7 +2742,7 @@ File association failed. - Dh'fhaillig le co-cheangal an fhaidhle. + Dh’fhàillig le co-cheangal an fhaidhle. Error while authenticating at google.com: @@ -2186,20 +2757,20 @@ Error while sending metadata to youtube.com: - Mearachd a' cur meata-dàta gu youtube.com: + Mearachd a’ cur meata-dàta gu youtube.com: Teams - Are you sure? - Sgiobaidhean - A bheil thu cinnteach? + Sgiobaidhean – A bheil thu cinnteach? Do you really want to delete the team '%1'? - A bheil thu airson an sgioba "%1" a sguabadh às dha-rìribh? + A bheil thu airson an sgioba “%1” a sguabadh às dha-rìribh? Cannot delete default scheme '%1'! - Chan urrainn dhut an sgeama tùsail "%1" a sguabadh às! + Chan urrainn dhut an sgeama tùsail “%1” a sguabadh às! Please select a record from the list @@ -2211,31 +2782,23 @@ Hedgewars - Error - Hedgewars - Mearachd + Hedgewars – Mearachd Hedgewars - Success - Hedgewars - Shoirbhich leis + Hedgewars – Shoirbhich leis All file associations have been set Chaidh gach co-cheangal faidhle a shuidheachadh - Cannot create directory %1 - - - - Unable to start the server: %1. - - - Video upload - Error - Luchdadh suas video - Mearachd + Luchdadh suas video – Mearachd Netgame - Error - Geama lìonraidh - Mearachd + Geama lìonraidh – Mearachd Please select a server from the list @@ -2247,23 +2810,23 @@ Record Play - Error - Cluiche clàraidh - Mearachd + Cluiche clàraidh – Mearachd Please select record from the list - Tagh clàradh on liosta + Tagh clàradh on liosta Cannot rename to - Cha ghabh ainm atharrachadh gu + Cha ghabh ainm atharrachadh gu Cannot delete file - Chan urrainn dhuinn am faidhle a sguabadh às + Chan urrainn dhuinn am faidhle a sguabadh às Room Name - Error - Ainm an t-seòmair - Mearachd + Ainm an t-seòmair – Mearachd Please select room from the list @@ -2271,7 +2834,7 @@ Room Name - Are you sure? - Ainm an t-seòmair - A bheil thu cinnteach? + Ainm an t-seòmair – A bheil thu cinnteach? The game you are trying to join has started. @@ -2281,27 +2844,32 @@ Schemes - Warning - Sgeamaichean - Rabhadh + Sgeamaichean – Rabhadh Schemes - Are you sure? - Sgeamaichean - A bheil thu cinnteach? + Sgeamaichean – A bheil thu cinnteach? Do you really want to delete the game scheme '%1'? - A bheil thu airson sgeama a' gheama "%1" a sguabadh às dha-rìribh? + A bheil thu airson sgeama a’ gheama “%1” a sguabadh às dha-rìribh? Videos - Are you sure? - Videothan - A bheil thu cinnteach? + Videothan – A bheil thu cinnteach? Do you really want to delete the video '%1'? - A bheil thu airson a' video "%1" a sguabadh às dha-rìribh? + A bheil thu airson a’ video “%1” a sguabadh às dha-rìribh? Do you really want to remove %1 file(s)? - A bheil thu airson %1 fhaidhle a sguabadh às dha-rìribh?A bheil thu airson %1 fhaidhle a sguabadh às dha-rìribh?A bheil thu airson %1 faidhlichean a sguabadh às dha-rìribh?A bheil thu airson %1 faidhle a sguabadh às dha-rìribh? + + A bheil thu airson %1 fhaidhle a sguabadh às dha-rìribh? + A bheil thu airson %1 fhaidhle a sguabadh às dha-rìribh? + A bheil thu airson %1 faidhlichean a sguabadh às dha-rìribh? + A bheil thu airson %1 faidhle a sguabadh às dha-rìribh? + Do you really want to cancel uploading %1? @@ -2313,39 +2881,39 @@ Cannot open '%1' for writing - Cha ghabh "%1" fosgladh airson sgrìobhadh ann + Cha ghabh “%1” fosgladh airson sgrìobhadh ann Cannot open '%1' for reading - Cha ghabh "%1" fosgladh airson a leughadh + Cha ghabh “%1” fosgladh airson a leughadh Cannot use the ammo '%1'! - Cha ghabh an connadh "%1" cleachdadh! + Cha ghabh an connadh “%1” cleachdadh! Weapons - Warning - Airm - Rabhadh + Airm – Rabhadh Cannot overwrite default weapon set '%1'! - Cha ghabh sgrìobhadh thairis air seata nan arm tùsail "%1"! + Cha ghabh sgrìobhadh thairis air seata nan arm tùsail “%1”! Cannot delete default weapon set '%1'! - Cha ghabh seata nan arm tùsail "%1" sguabadh às! + Cha ghabh seata nan arm tùsail “%1” sguabadh às! Weapons - Are you sure? - Airm - A bheil thu cinnteach? + Airm – A bheil thu cinnteach? Do you really want to delete the weapon set '%1'? - A bheil thu airson seata nan arm "%1" a sguabadh às dha-rìribh? + A bheil thu airson seata nan arm “%1” a sguabadh às dha-rìribh? Hedgewars - Nick not registered - Hedgewars - Far-ainm gun chlàradh + Hedgewars – Far-ainm gun chlàradh System Information Preview @@ -2365,11 +2933,11 @@ Hedgewars - Warning - Hedgewars - Rabhadh + Hedgewars – Rabhadh Hedgewars - Information - Hedgewars - Fiosrachadh + Hedgewars – Fiosrachadh Not all players are ready @@ -2381,6 +2949,32 @@ A bheil thu cinnteach gu bheil thu airson an geama seo a thòiseachadh? Chan eil a h-uile cluicheadair ullamh. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2425,7 +3019,7 @@ Go! - Siuthad! + Siuthad! Play demo @@ -2473,7 +3067,7 @@ Restore default coding parameters - Aisig paramadairean tùsail a' chòdachaidh + Aisig paramadairean tùsail a’ chòdachaidh Open the video directory in your system @@ -2481,15 +3075,15 @@ Play this video - Cluich a' video seo + Cluich a’ video seo Delete this video - Sguab às a' video seo + Sguab às a’ video seo Upload this video to your Youtube account - Luchdaich suas a' video seo dhan chunntas Youtube agad + Luchdaich suas a’ video seo dhan chunntas Youtube agad Reset @@ -2511,6 +3105,17 @@ Start private server Tòisich frithealaiche prìobhaideach + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2535,7 +3140,7 @@ RoomsListModel In progress - 'Ga dhèanamh + ’Ga dhèanamh Room Name @@ -2543,10 +3148,12 @@ C + Caption of the column for the number of connected clients in the list of rooms Cl. T + Caption of the column for the number of teams in the list of rooms Sg. @@ -2585,12 +3192,16 @@ Random Perlin Perlin tuaireamach + + Forts + Dùin + SeedPrompt The map seed is the basis for all random values generated by the game. - Tha sìol a' mhapa 'na bhunait airson gach luach air thuaiream a ghineas an geama. + Tha sìol a’ mhapa ’na bhunait airson gach luach air thuaiream a ghineas an geama. Cancel @@ -2604,6 +3215,10 @@ Close Dùin + + Seed + Sìol + SelWeaponWidget @@ -2624,12 +3239,20 @@ Dàlaichean - new - ùr - - - copy of %1 - lethbhreac de %1 + New + Ùr + + + New (%1) + Ùr (%1) + + + Copy of %1 + Lethbhreac dhe %1 + + + Copy of %1 (%2) + Lethbhreac dhe %1 (%2) @@ -2651,12 +3274,12 @@ We are very sorry for the inconvenience :( If this keeps happening, please click the '%2' button in the main menu! - Bhàsaich inneal a' gheama gun dùil. + Bhàsaich inneal a’ gheama gun dùil. (còd fàgail %1) Tha sinn glè dhuilich mun trioblaid seo :( -Ma thachras seo a-rithist 's a-rithist, briog air a' phutan "%2" sa phrìomh chlàr-taice! +Ma thachras seo a-rithist ’s a-rithist, briog air a’ phutan “%2” sa phrìomh chlàr-taice! @@ -2680,6 +3303,10 @@ Use selected theme Cleachd an t-ùrlar a thagh thu + + Choose a theme + Tagh ùrlar: + binds @@ -2716,12 +3343,8 @@ dèan suids - find hedgehog - - - ammo menu - clàr-taice a' chonnaidh + clàr-taice a’ chonnaidh slot 1 @@ -2785,11 +3408,11 @@ chat history - eachdraidh a' chabadaich + eachdraidh na cabadaich pause - cuir 'na stad + cuir ’na stad confirmation @@ -2849,7 +3472,7 @@ hedgehog info - fiosrachadh na gràineige + fiosrachadh na gràineige autocam / find hedgehog @@ -2859,6 +3482,11 @@ speed up replay luathaich an ath-chluiche + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -2883,7 +3511,7 @@ binds (descriptions) Traverse gaps and obstacles by jumping: - Leum thairis air beàrnan 's ribean: + Leum thairis air beàrnan ’s ribean: Fire your selected weapon or trigger an utility item: @@ -2906,16 +3534,12 @@ Suidhich an tìmear air boma no arm eile le tìmear: - Move the camera to the active hog: - - - Move the cursor or camera without using the mouse: - Gluais an cùrsair no an camara gun a bhith a' cleachdadh na luchaige: + Gluais an cùrsair no an camara gun a bhith a’ cleachdadh na luchaige: Modify the camera's zoom level: - Atharraich sùmadh a' chamara: + Atharraich sùmadh a’ chamara: Talk to your team or all participants: @@ -2923,11 +3547,11 @@ Pause, continue or leave your game: - Cuir an geama agad 'na stad, lean air no fàg e: + Cuir an geama agad ’na stad, lean air no fàg e: Modify the game's volume while playing: - Atharraich àirde fuaime a' gheama fhad 's a bhios tu a' cluich: + Atharraich àirde fuaime a’ gheama fhad ’s a bhios tu a’ cluich: Toggle fullscreen mode: @@ -2939,7 +3563,7 @@ Toggle labels above hedgehogs: - Toglaich na leubailean os cionn nan gràineagan: + Toglaich na leubailean os cionn nan gràineagan: Record video: @@ -2951,12 +3575,16 @@ Toggle automatic camera / refocus on active hedgehog: - Toglaich an camara fèin-obrachail / cuir am fòcas air a' ghràineag ghnìomhach a-rithist: + Toglaich an camara fèin-obrachail / cuir am fòcas air a’ ghràineag ghnìomhach a-rithist: Demo replay: Ath-chluiche an demo: + + Heads-up display: + + binds (keys) @@ -3305,7 +3933,7 @@ round in progress - tha cuairt a' dol + tha cuairt a’ dol restricted @@ -3349,7 +3977,7 @@ Nickname is already in use - Tha am far-ainm 'ga chleachdadh mar-thà + Tha am far-ainm ’ga chleachdadh mar-thà No checker rights @@ -3357,19 +3985,19 @@ Authentication failed - Dh'fhàillig leis an dearbhadh + Dh’fhàillig leis an dearbhadh 60 seconds cooldown after kick - Gabh air do shocair fad 60 diog às dèidh a' bhròg fhaighinn + Gabh air do shocair fad 60 diog às dèidh a’ bhròg fhaighinn kicked - fhuair thu a' bhròg + fhuair thu a’ bhròg Ping timeout - Dh'fhalbh an ùine air ping + Dh’fhalbh an ùine air ping bye @@ -3413,11 +4041,11 @@ Voting expired - Dh'fhalbh an ùine air a' bhòtadh + Dh’fhalbh an ùine air a’ bhòtadh kick - thoir a' bhròg + thoir a’ bhròg map @@ -3425,7 +4053,7 @@ pause - cuir 'na stad + cuir ’na stad Reconnected too fast @@ -3441,11 +4069,7 @@ Game messages flood detected - 1 - Mhothaich sinn air tuile teachdaireachdan a' gheama - 1 - - - Game messages flood detected - 2 - Mhothaich sinn air tuile teachdaireachdan a' gheama - 2 + Mhothaich sinn air tuile teachdaireachdan a’ gheama – 1 Warning! Joins flood protection activated @@ -3453,7 +4077,51 @@ There's no voting going on - Chan eil bhòtadh a' tachairt + Chan eil bhòtadh a’ tachairt + + + Your vote counted + Chaidh do bhòt a chunntadh + + + Pause toggled + Chaidh cur ’na stad a thoglachadh + + + new seed + sìol ùr + + + number of hedgehogs in team + uiread a ghràineagan san sgioba + + + /maxteams: specify number from 2 to 8 + /maxteams: sònraich àireamh eadar 2 is 8 + + + Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs + Àitheantan callvote a tha ri am faighinn: kick <far-ainm>, map <ainm>, pause, newseed, hedgehogs + + + callvote kick: specify nickname + callvote kick: sònraich far-ainm + + + callvote kick: no such user + callvote kick: chan eil an cleachdaiche seo ann + + + callvote map: no such map + callvote map: chan eil am mapa seo ann + + + callvote pause: no game in progress + callvote pause: chan eil geama ’ga chluich + + + callvote hedgehogs: specify number from 1 to 8 + callvote hedgehogs: sònraich àireamh eadar 1 is 8 - \ No newline at end of file + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_gl.ts --- a/share/hedgewars/Data/Locale/hedgewars_gl.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_gl.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -29,6 +100,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -69,14 +148,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -84,6 +155,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -355,10 +434,6 @@ Non se pode gardar a gravación no ficheiro %1 - DefaultTeam - - - Game aborted @@ -447,10 +522,6 @@ - This page requires an internet connection. - - - Guest @@ -463,11 +534,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. gl.txt @@ -834,15 +932,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -854,6 +953,20 @@ + MinesTimeSpinBox + + Random + Ao chou + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -917,6 +1030,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -930,13 +1062,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1035,6 +1179,47 @@ Random Team + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1073,20 +1258,7 @@ (%1 kill) - - - - - - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - - - - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + Number of kills in stats screen, written after the team name @@ -1109,6 +1281,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1423,6 +1610,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1501,7 +1709,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Defende o teu forte e elimina os inimigos, máximo dous bandos! + Defende o teu forte e elimina os inimigos, máximo dous bandos! Teams will start on opposite sides of the terrain, two team colours max! @@ -1711,6 +1919,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1761,10 +1973,6 @@ PageTraining - Pick the mission or training to play - - - Start fighting @@ -1776,6 +1984,30 @@ Select a mission! + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1881,6 +2113,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -1988,6 +2224,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2071,6 +2315,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2244,10 +2512,6 @@ - Stereo rendering - - - Sudden Death Water Rise @@ -2288,10 +2552,6 @@ - Bitrate (Kbps) - - - Style @@ -2332,14 +2592,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2375,6 +2627,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2390,6 +2651,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2483,20 +2748,8 @@ Introduce o nome da sala - Record Play - Error - - - Please select record from the list - Selecciona unha gravación da lista - - - Cannot rename to - - - - Cannot delete file - + Selecciona unha gravación da lista Room Name - Error @@ -2619,6 +2872,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2663,7 +2942,7 @@ Go! - Dálle! + Dálle! Play demo @@ -2722,10 +3001,6 @@ - Upload this video to your Youtube account - - - Cancel uploading @@ -2749,6 +3024,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2781,10 +3067,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -3104,10 +3392,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3115,6 +3399,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3195,7 +3484,7 @@ Toggle labels above hedgehogs: - Cambiar as etiquetas sobre os ourizos: + Cambiar as etiquetas sobre os ourizos: Record video: @@ -3213,6 +3502,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_hu.ts --- a/share/hedgewars/Data/Locale/hedgewars_hu.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_hu.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -29,6 +100,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -69,14 +148,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -84,6 +155,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -349,10 +428,6 @@ Nem sikerült menteni a %1 fájlba - DefaultTeam - - - Hedgewars Demo File File Types @@ -441,10 +516,6 @@ - This page requires an internet connection. - - - Guest @@ -457,11 +528,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. hu.txt @@ -828,15 +926,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -848,6 +947,19 @@ + MinesTimeSpinBox + + Random + Véletlen + + + %1 seconds + + + + + + PageAdmin Clear Accounts Cache @@ -911,6 +1023,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -924,13 +1055,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1029,6 +1172,47 @@ Random Team Véletlen csapat + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1064,18 +1248,7 @@ (%1 kill) - - - - - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - - - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + Number of kills in stats screen, written after the team name @@ -1096,6 +1269,19 @@ (%1 %2) + 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” + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1409,6 +1595,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1486,7 +1693,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Védd meg az erődöd, és pusztítsd el az ellenfelekét! Legfeljebb két csapatszín! + Védd meg az erődöd, és pusztítsd el az ellenfelekét! Legfeljebb két csapatszín! Teams will start on opposite sides of the terrain, two team colours max! @@ -1696,6 +1903,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1754,13 +1965,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1865,6 +2096,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -1972,6 +2207,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2055,6 +2298,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2222,10 +2489,6 @@ - Stereo rendering - - - Style @@ -2288,10 +2551,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2324,14 +2583,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2367,6 +2618,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2382,6 +2642,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2475,20 +2739,8 @@ Add meg a szoba nevét - Record Play - Error - - - Please select record from the list - Kérlek, válassz a listából - - - Cannot rename to - - - - Cannot delete file - + Kérlek, válassz a listából Room Name - Error @@ -2610,6 +2862,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2654,7 +2932,7 @@ Go! - Mehet! + Mehet! Play demo @@ -2717,10 +2995,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2740,6 +3014,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2772,10 +3057,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -3095,10 +3382,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3106,6 +3389,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3186,7 +3474,7 @@ Toggle labels above hedgehogs: - Sünik feletti címkék beállítása: + Sünik feletti címkék beállítása: Record video: @@ -3204,6 +3492,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_it.ts --- a/share/hedgewars/Data/Locale/hedgewars_it.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_it.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Compilatore sconosciuto + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + Questo programma è distribuito secondo i termini di %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -27,11 +98,19 @@ New - Nuovo + Nuovo Copy of %1 - + Copia di %1 + + + New (%1) + Nuovo (%1) + + + Copy of %1 (%2) + Copia di %1 (%2) @@ -74,11 +153,11 @@ Please, specify %1 - Per favore, specifica %1 + Per favore, specifica %1 nickname - soprannome + soprannome permanent @@ -86,6 +165,14 @@ Ban player + Espelli giocatore + + + Please specify an IP address. + + + + Please specify a nickname. @@ -120,15 +207,15 @@ If you found a bug, you can see if it's already been reported here: - Se trovi un baco, puoi vedere se è già conosciuto qui: + Se trovi un baco, puoi vedere se è già stato segnalato qui: Your email address is optional, but necessary if you want us to get back at you. - Il tuo indirizzo di posta elettronica è opzionale, ma potremmo volerti contattare. + Il tuo indirizzo di posta elettronica è facoltativo, ma potremmo volerti contattare. Feedback - Opinioni + Opinioni @@ -238,12 +325,12 @@ OPTION command-line - OPZIONI + OPTION CONNECTSTRING command-line - STRINGACONNESSIONE + CONNECTSTRING Options @@ -253,7 +340,7 @@ Display this help command-line - Visualizza questo messaggio di help + Visualizza questo messaggio di aiuto Custom path for configuration data and user data @@ -268,7 +355,7 @@ Hedgewars can use a %1 (e.g. "%2") to connect on start. command-line - Hedgewars può usare un %1 (per esempio "%2") per connettersi all'avvio. + Hedgewars può usare un %1 (per esempio "%2") per connettersi all'avvio. Malformed option argument: %1 @@ -328,7 +415,7 @@ Failed to save StyleSheet to %1 - Impossibile salvare il foglio di stile in %1! Errore interno! + Impossibile salvare il foglio di stile in %1 %1 has joined @@ -344,15 +431,15 @@ Chat log - + Log della chat Enter chat messages here and send them with [Enter] - + Scrivi qui i messaggi di chat e spediscili con [Invio] List of players - + Lista dei giocatori @@ -363,7 +450,7 @@ DefaultTeam - Squadra_Predefinita + Squadra_Predefinita Hedgewars Demo File @@ -393,7 +480,7 @@ No nickname supplied. - Nessun nome valido inserito. + Nessun soprannome inserito. Someone already uses your nickname %1 on the server. @@ -417,7 +504,7 @@ Password: Questo nome è registrato, e non hai specificato una password. -Se questo nome non è tuo, per favore registra un tuo nome a www.hedgewars.org +Se questo nome non è tuo, per favore registra un nome tuo su www.hedgewars.org Password: @@ -451,7 +538,7 @@ Try Again - Prova ancora + Riprova Hedgewars - Connection error @@ -465,7 +552,7 @@ This page requires an internet connection. - Questa pagina richiede una connessione a Internet. + Questa pagina richiede una connessione a Internet. Guest @@ -481,11 +568,38 @@ Questa stanza è protetta da password. Per piacere, inserisci la password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. it.txt @@ -515,7 +629,7 @@ HWHostPortDialog Connect to server - + Connetti al server @@ -554,7 +668,7 @@ Seed - Seed + Seme Map type: @@ -654,51 +768,51 @@ Forts - + Forti View and edit the seed, the source of randomness in the game - + Vedi e modifica il seme, l'elemento base della casualità del gioco Randomize the theme - + Tema casuale Choose a theme - + Scegli un tema Randomize the map, theme and seed - + Scegli casualmente mappa, tema e seme Randomize the theme and seed - + Scegli casualmente tema e seme Randomize the seed - + Seme casuale Click to randomize the map, theme and seed - + Premi per scegliere a caso la mappa, il tema e il seme Click to randomize the theme and seed - + Clicca per scegliere casualmente il tema e il seme Adjust the complexity of the generated map - + Perfeziona la complessità della mappa generata Adjust the distance between forts - + Perfeziona la distanza tra i forti Click to edit - + Clicca per modificare @@ -756,7 +870,7 @@ Remote host has closed connection - L'host remoto ha terminato la connessione. + L'host remoto ha terminato la connessione The server is too old. Disconnecting now. @@ -793,7 +907,7 @@ New Account - + Nuovo account @@ -830,7 +944,7 @@ Choose a hat - + Scegli un cappello @@ -852,7 +966,7 @@ Duration: %1m %2s - Durata: %1m %2s + Durata: %1m %2s Video: %1x%2 @@ -860,7 +974,16 @@ %1 fps - %1 fps + %1 fps + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS + @@ -871,6 +994,20 @@ + MinesTimeSpinBox + + Random + Casuale + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -934,6 +1071,25 @@ + PageCampaign + + Team + Squadra + + + Campaign + Campagna + + + Mission + Missione + + + Start fighting + Inizia combattimento + + + PageConnecting Connecting... @@ -948,12 +1104,28 @@ This page requires an internet connection. - Questa pagina richiede una connessione a Internet. + Questa pagina richiede una connessione a Internet. Open packages directory Apri la cartella dei pacchetti + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1052,6 +1224,47 @@ Random Team Squadra Casuale + + Play a random example of this voice + Riproduci esempio casuale della voce + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1070,8 +1283,8 @@ The best shot award was won by <b>%1</b> with <b>%2</b> pts. + Il premio per il miglior colpo è stato vinto da <b>%1</b> con <b>%2</b> punto. Il premio per il miglior colpo è stato vinto da <b>%1</b> con <b>%2</b> punti. - @@ -1084,12 +1297,13 @@ A total of <b>%1</b> hedgehog(s) were killed during this round. + <p>Durante questo round è stato ucciso <b>%1</b> riccio in totale.</p> <p>Durante questo round sono stati uccisi <b>%1</b> ricci in totale.</p> - <p>Un totale di <b>%1</b> è stato ucciso durante questo round.</p> (%1 kill) + Number of kills in stats screen, written after the team name (%1 uccisione) (%1 uccisioni) @@ -1097,14 +1311,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> ha pensato che fosse buona cosa sparare ai propri compagni di squadra con <b>%2</b> punto. <b>%1</b> ha pensato che fosse buona cosa sparare ai propri compagni di squadra con <b>%2</b> punti. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> ha ucciso <b>%2</b> dei suoi compagni di squadra. <b>%1</b> ha ucciso <b>%2</b> dei suoi compagni di squadra. @@ -1126,11 +1340,26 @@ (%1 %2) + 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” (%1 %2) (%1 %2) + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. + + + + + PageInGame @@ -1166,7 +1395,7 @@ Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars - Lascia un commento qui per segnalare problemi, suggerire nuove funzionalità o anche solo per il indicare il tuo livello di gradimento del gioco. + Lascia un commento qui per segnalare problemi, suggerire nuove funzionalità o anche solo per il indicare il tuo livello di gradimento del gioco Access the user created content downloadable from our website @@ -1217,7 +1446,7 @@ Start fighting (requires at least 2 teams) - + Inizia il combattimento (almeno 2 squadre) @@ -1240,19 +1469,19 @@ Room name - + Nome stanza Update the room name - + Aggiorna nome stanza Turn on the lightbulb to show the other players when you're ready to fight - + Accendi la lampadina per mostrare agli altri giocatori che sei pronto Start fighting (requires at least 2 teams) - + Inizia il combattimento (almeno 2 squadre) @@ -1436,6 +1665,27 @@ Video recording options Opzioni di registrazione video + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1449,15 +1699,15 @@ Play demo - Visualizza demo + Visualizza demo Play the selected demo - + Riproduci il demo selezionato Load the selected game - + Carica la partita selezionata @@ -1469,7 +1719,7 @@ %1 players online - 1 giocatore online + %1 giocatore online %1 giocatori online @@ -1506,7 +1756,7 @@ Your hogs are unable to move, put your artillery skills to the test - I tuoi ricci non possono muoversi, metti le tue abilità d'artigliere alla prova + I tuoi ricci non possono muoversi, metti alla prova le tue abilità d'artigliere Random @@ -1526,7 +1776,7 @@ Defend your fort and destroy the opponents, two team colours max! - Difendi il tuo fortino e distruggi i nemici, due colori di squadra al massimo! + Difendi il tuo fortino e distruggi i nemici, due colori di squadra al massimo! Teams will start on opposite sides of the terrain, two team colours max! @@ -1538,15 +1788,15 @@ Lower gravity - Gravità zero + Bassa gravità Assisted aiming with laser sight - Mira con più precisione grazie al mirino laser! + Mira con più precisione grazie al mirino laser All hogs have a personal forcefield - Tutti i ricci hanno un personale campo di forza + Tutti i ricci hanno un campo di forza personale Order of play is random instead of in room order. @@ -1578,7 +1828,7 @@ All (living) hedgehogs are fully restored at the end of turn - La vita di tutti i ricci rimasti vivi è resettata allo stato di partenza alla fine di ogni turno. + La vita di tutti i ricci rimasti vivi viene ripristinata alla fine di ogni turno Attacking does not end your turn. @@ -1590,7 +1840,7 @@ Each hedgehog has its own ammo. It does not share with the team. - Ogni riccio ha le sue armi che non condivide con la squadra. + Ogni riccio ha le prorie armi e non le condivide con la squadra. You will not have to worry about wind anymore. @@ -1626,7 +1876,7 @@ Bounce (Edges reflect) - Rimbalza (i bordi si riflettono) + Rimbalza (i bordi riflettono) Sea (Edges connect to sea) @@ -1634,79 +1884,83 @@ Each clan starts in its own part of the terrain. - + Ogni clan inizia dalla propria parte del terreno. Overall damage and knockback in percent - + Danni complessivi e perdite in percentuale Turn time in seconds - + Tempo del turno in secondi Initial health of hedgehogs - + Vita iniziale dei ricci How many rounds have to be played before Sudden Death begins - + Quanti turni devono essere giocati prima che inizi la Sudden Death How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. - + Quanto sale l'acqua ogni turno in Sudden Death. Imposta a 0 assieme alla decrescita della vita in Sudden Death per disabilitare la Sudden Death. 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. - + Quanta vita perdono i ricci per ogni turno in Sudden Death. Imposta a 0 assieme alla crescita delle acque in Sudden Death per disabilitare la Sudden Death. Maximum rope length in percent - + Lunghezza massima corde in percentuale Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. - + Probabilità che una cassa caduta sia una cassa di salute. Tutte le altre casse saranno armi o casse di utilità. Likelihood of a crate dropping before a turn - + Probabilità di caduta di una cassa prima di un turno Health bonus for collecting a health crate - + Bonus vita per cassa salute raccolta 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. - + Timer detonazione delle mine. Il timer casuale va da 0 a 5 secondi. Il timer delle mine aeree sarà un quarto del timer delle mine. Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. - + Numero medio di mine in una mappa isola di medie dimensioni. Il numero verrà scalato per le altre mappe. Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. - + Probabilità che una mina non scoppi. Non vale per le mine piazzate dagli hedgehogs. Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - + Numero medio di barili collocati in una mappa isola di medie dimensioni. Il numero verrà scalato per altre mappe. Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - + Numero medio di mine aeree collocate su una mappa isola di medie dimensioni. Il numero verrà scalato per altre mappe. Affects the left and right boundaries of the map - + Incide sui limiti destro e sinistro della mappa Time you get after an attack - + Tempo disponibile dopo aver attaccato Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. - + Parametri aggiuntivi per configurare gli stili di gioco. Il significato dipende dallo stile utilizzato, vedi la documentazione. In caso di dubbio, lasciare vuota. + + + Name of this scheme + Nome dello schema @@ -1736,7 +1990,7 @@ Play a hotseat game against your friends, or AI teams - Gioca una partira controlo un amico oppure contro il computer + Gioca una partira contro un amico oppure contro il computer Campaign Mode @@ -1767,12 +2021,36 @@ Pick the mission or training to play - Scegli la missione, sfida o addestramento da intraprendere + Scegli la missione, sfida o addestramento da intraprendere Start fighting Inizia combattimento + + Pick the training to play + Scegli l'allenamento da giocare + + + Pick the challenge to play + Scegli la sfida da giocare + + + Pick the scenario to play + Scegli lo scenario da giocare + + + Trainings + Allenamenti + + + Challenges + Sfide + + + Scenarios + Scenari + PageVideos @@ -1788,7 +2066,7 @@ %1 bytes %1 byte - %1 byte + %1 bytes @@ -1868,11 +2146,15 @@ Show password protected - + Mostra protetti da password Show join restricted - + Mostra ingresso limitato + + + Delegate room control + Delega il controllo della stanza @@ -1981,6 +2263,14 @@ Enable translucent tags by default Abilita i tag semitrasparenti in automatico + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2062,6 +2352,30 @@ Computer (Level %1) + Computer (livello %1) + + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS @@ -2228,7 +2542,7 @@ Stereo rendering - Resa stereo + Resa stereo Style @@ -2247,7 +2561,7 @@ Exiting now will abort them. Do you really want to quit? Ci sono video che stanno ancora venendo elaborati. -Uscire ora annullerà questo processo e conseguentemente i video non verrano salvati. +Uscire ora annullerà questo processo e i video non verrano salvati. Vuoi veramente uscire? @@ -2300,7 +2614,7 @@ Bitrate (Kbps) - Velocità (Kbps) + Velocità (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2336,11 +2650,11 @@ Revision - Revisione + Revisione This program is distributed under the %1 - Questo programma è distribuito secondo i termini di %1 + Questo programma è distribuito secondo i termini di %1 This setting will be effective at next restart. @@ -2364,18 +2678,27 @@ Air Mines - + Mine aeree Player - + Giocatore Barrels - + Barili % Retreat Time + % Tempo di ritirata + + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second @@ -2393,6 +2716,10 @@ anonymous anonimo + + unnamed (%1) + + QMainWindow @@ -2479,19 +2806,19 @@ Record Play - Error - Registrazione gioco - Errore + Registrazione gioco - Errore Please select record from the list - Seleziona un record dalla lista + Seleziona un record dalla lista Cannot rename to - Impossibile rinominare a + Impossibile rinominare a Cannot delete file - Impossibile cancellare il file + Impossibile cancellare il file Room Name - Error @@ -2534,7 +2861,7 @@ Do you really want to remove %1 file(s)? - Vuoi davvero cancellare il file? + Vuoi davvero cancellare %1 file? Vuoi davvero cancellare %1 file? @@ -2616,6 +2943,32 @@ Sei sicuro che vuoi iniziare il gioco? Non tutti i giocatori sono pronti. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2628,7 +2981,7 @@ QPushButton Go! - Gioca! + Gioca! default @@ -2724,7 +3077,7 @@ Upload this video to your Youtube account - Cariva questo video nel tuo account Youtube + Cariva questo video nel tuo account Youtube Reset @@ -2746,6 +3099,17 @@ Start private server Avvia un server privato + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2778,10 +3142,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -2822,7 +3188,7 @@ Forts - + Forti @@ -2845,7 +3211,7 @@ Seed - Seed + Seme @@ -2876,19 +3242,19 @@ New - Nuovo + Nuovo New (%1) - + Nuovo (%1) Copy of %1 - + Copia di %1 Copy of %1 (%2) - + Copia di %1 (%2) @@ -2941,7 +3307,7 @@ Choose a theme - + Scegli un tema @@ -3108,7 +3474,7 @@ hedgehog info - informazioni riccio + informazioni riccio autocam / find hedgehog @@ -3118,6 +3484,11 @@ speed up replay aumenta velocità replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3194,7 +3565,7 @@ Toggle labels above hedgehogs: - Cambia le etichette sui ricci: + Cambia le etichette sui ricci: Record video: @@ -3212,6 +3583,10 @@ Demo replay: Vizualizza demo: + + Heads-up display: + + binds (keys) @@ -3712,47 +4087,47 @@ Your vote counted - + Voto conteggiato Pause toggled - + Pausa attivata new seed - + nuovo seme number of hedgehogs in team - + Numero di hedgehogs nella squadra /maxteams: specify number from 2 to 8 - + /maxteams: specifica numero da 2 a 8 Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs - + Comandi callvote disponibili: kick <nickname>, map <name>, pause, newseed, hedgehogs callvote kick: specify nickname - + callvote kick: specifica nickname callvote kick: no such user - + callvote kick: nessun utente callvote map: no such map - + callvote map: nessuna mappa callvote pause: no game in progress - + callvote pause: nessun gioco in corso callvote hedgehogs: specify number from 1 to 8 - + callvote hedgehogs: specifica numero da 2 a 8 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_ja.ts --- a/share/hedgewars/Data/Locale/hedgewars_ja.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_ja.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -73,12 +152,8 @@ 警報メッセージ - Please, specify %1 - - - nickname - ニックネーム + ニックネーム permanent @@ -88,6 +163,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -353,10 +436,6 @@ ファイル%1に保存することができません - DefaultTeam - - - Hedgewars Demo File File Types @@ -445,10 +524,6 @@ - This page requires an internet connection. - - - Guest @@ -461,11 +536,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. ja.txt @@ -832,15 +934,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -852,6 +955,19 @@ + MinesTimeSpinBox + + Random + + + + %1 seconds + + + + + + PageAdmin Clear Accounts Cache @@ -915,6 +1031,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -928,13 +1063,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1033,6 +1180,47 @@ Random Team + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1068,18 +1256,7 @@ (%1 kill) - - - - - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - - - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + Number of kills in stats screen, written after the team name @@ -1100,6 +1277,19 @@ (%1 %2) + 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” + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1413,6 +1603,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1485,10 +1696,6 @@ PageScheme - Defend your fort and destroy the opponents, two team colours max! - - - Land can not be destroyed! @@ -1684,6 +1891,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1742,13 +1953,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1853,6 +2084,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -1960,6 +2195,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2043,6 +2286,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2202,10 +2469,6 @@ - Stereo rendering - - - Style @@ -2268,10 +2531,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2304,14 +2563,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2347,6 +2598,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2362,6 +2622,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2455,20 +2719,8 @@ ルーム名を入力してください - Record Play - Error - - - Please select record from the list - 録画を選択下さい - - - Cannot rename to - - - - Cannot delete file - + 録画を選択下さい Room Name - Error @@ -2590,6 +2842,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2634,7 +2912,7 @@ Go! - GO! + GO! Play demo @@ -2697,10 +2975,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2720,6 +2994,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2752,10 +3037,12 @@ C + Caption of the column for the number of connected clients in the list of rooms T + Caption of the column for the number of teams in the list of rooms @@ -3079,10 +3366,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3090,6 +3373,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3165,10 +3453,6 @@ - Toggle labels above hedgehogs: - - - Record video: @@ -3184,6 +3468,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_ko.ts --- a/share/hedgewars/Data/Locale/hedgewars_ko.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_ko.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -25,6 +96,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -65,14 +144,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -80,6 +151,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -345,10 +424,6 @@ - DefaultTeam - - - Hedgewars Demo File File Types @@ -437,10 +512,6 @@ - This page requires an internet connection. - - - Guest @@ -453,11 +524,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. ko.txt @@ -813,15 +911,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -833,6 +932,19 @@ + MinesTimeSpinBox + + Random + + + + %1 seconds + + + + + + PageAdmin Clear Accounts Cache @@ -896,6 +1008,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -909,13 +1040,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1014,6 +1157,47 @@ Random Team + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1049,18 +1233,7 @@ (%1 kill) - - - - - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - - - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + Number of kills in stats screen, written after the team name @@ -1081,6 +1254,19 @@ (%1 %2) + 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” + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1390,6 +1576,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1450,10 +1657,6 @@ PageScheme - Defend your fort and destroy the opponents, two team colours max! - - - Land can not be destroyed! @@ -1649,6 +1852,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1707,13 +1914,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1814,6 +2041,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -1921,6 +2152,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2000,6 +2239,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2155,10 +2418,6 @@ - Stereo rendering - - - Style @@ -2221,10 +2480,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2257,14 +2512,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2300,6 +2547,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2315,6 +2571,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2400,22 +2660,6 @@ - Record Play - Error - - - - Please select record from the list - - - - Cannot rename to - - - - Cannot delete file - - - Room Name - Error @@ -2535,6 +2779,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2578,10 +2848,6 @@ - Go! - - - Play demo @@ -2642,10 +2908,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2665,6 +2927,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2697,10 +2970,12 @@ C + Caption of the column for the number of connected clients in the list of rooms T + Caption of the column for the number of teams in the list of rooms @@ -3012,10 +3287,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3023,6 +3294,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3098,10 +3374,6 @@ - Toggle labels above hedgehogs: - - - Record video: @@ -3117,6 +3389,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_lt.ts --- a/share/hedgewars/Data/Locale/hedgewars_lt.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_lt.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,13 +1,101 @@ - + About - + + Hedgewars %1 + %1 contains Hedgewars' version number + + + + + Revision %1 (%2) + + + + + Visit our homepage: %1 + + + + + This program is distributed under the %1. + + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + Unknown Compiler + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -20,15 +108,25 @@ AmmoSchemeModel - + New - + + New (%1) + + + + Copy of %1 + + + Copy of %1 (%2) + + BanDialog @@ -39,7 +137,6 @@ - IP @@ -84,25 +181,25 @@ - + + Please specify an IP address. + + + + + Please specify a nickname. + + + + Warning - - - Please, specify %1 - - - - - nickname - - DataManager - + Use Default @@ -145,7 +242,7 @@ - + Send Feedback @@ -261,67 +358,67 @@ - + Cannot create directory %1 - - Usage - command-line - - - - - OPTION - command-line - - - - - - CONNECTSTRING - command-line - - - - - Options - command-line - - - - - Display this help - command-line - - - - Custom path for configuration data and user data + Usage command-line - Custom path to the game data folder + OPTION command-line + + CONNECTSTRING + command-line + + + + + Options + command-line + + + + + Display this help + command-line + + + + + Custom path for configuration data and user data + command-line + + + + + Custom path to the game data folder + command-line + + + + Hedgewars can use a %1 (e.g. "%2") to connect on start. command-line - + Malformed option argument: %1 command-line - + Unknown option argument: %1 command-line @@ -361,67 +458,67 @@ - + %1 has joined - + %1 has left - + %1 has left (%2) - + %1 has been removed from your ignore list - + %1 has been added to your ignore list - + %1 has been removed from your friends list - + %1 has been added to your friends list - + Stylesheet imported from %1 - + Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset! - + Couldn't read %1 - + StyleSheet discarded - + StyleSheet saved to %1 - + Failed to save StyleSheet to %1 @@ -429,52 +526,64 @@ HWForm - - DefaultTeam - - - - + Game aborted - + Nickname - - + + No nickname supplied. - + Someone already uses your nickname %1 on the server. Please pick another nickname: - - - - + + + + Guest - + + Team 1 + + + + %1's Team - + + Team %1 + Default team name + + + + + Computer %1 + Default computer team name + + + + Hedgewars - Nick registered - + This nick is registered, and you haven't specified a password. If this nick isn't yours, please register your own nick at www.hedgewars.org @@ -483,100 +592,110 @@ - + Your nickname is not registered. To prevent someone else from using it, please register it at www.hedgewars.org - + Your password wasn't saved either. - - + + Hedgewars - Empty nickname - + Hedgewars - Wrong password - + You entered a wrong password. - + Room password - + The room is protected with password. Please, enter the password: - + Try Again - + Hedgewars - Connection error - + You reconnected too fast. Please wait a few seconds and try again. - - + + Cannot save record to file %1 - + Hedgewars Demo File File Types - + Hedgewars Save File File Types - + Demo name - + Demo name: - - This page requires an internet connection. + + Unknown network error (possibly missing SSL library). + + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + + Internal error: Reply object is invalid. HWGame - + A Fatal ERROR occured! - The game engine had to stop. We are very sorry for the inconvenience :( @@ -588,13 +707,14 @@ - + en.txt + 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. lt.txt - + Cannot open demofile %1 @@ -913,7 +1033,7 @@ - + Quit reason: @@ -996,7 +1116,7 @@ KeyBinder - + Category @@ -1004,27 +1124,28 @@ LibavInteraction - - Duration: %1m %2s - - - - + Video: %1x%2 - - %1 fps - - - - + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + + %1 FPS + + + + Audio: - + unknown @@ -1032,12 +1153,29 @@ MapModel - + No description available. + MinesTimeSpinBox + + + Random + + + + + %1 seconds + + + + + + + + PageAdmin @@ -1116,6 +1254,30 @@ + PageCampaign + + + + Start fighting + + + + + Team + + + + + Campaign + + + + + Mission + + + + PageConnecting @@ -1126,18 +1288,33 @@ PageDataDownload - + + Load the start page + + + + Open packages directory - + Loading, please wait. - - This page requires an internet connection. + + Unknown network error (possibly missing SSL library). + + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + + Internal error: Reply object is invalid. @@ -1214,55 +1391,106 @@ PageEditTeam - + Select an action to choose a custom key bind for this team - + Use my default - + Reset all binds - - General - - - + General + + + + Custom Controls - - Hat - - - + Hat + + + + Name - + This hedgehog's name - + Randomize this hedgehog's name - + + Random Hats + + + + + Random Names + + + + Random Team + + + Randomize the team name + + + + + Randomize the grave + + + + + Randomize the flag + + + + + Play a random example of this voice + + + + + Randomize the voice + + + + + Randomize the fort + + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + + %1 (%2) + + PageGameStats @@ -1273,7 +1501,7 @@ - + Health graph @@ -1293,7 +1521,7 @@ - + The best shot award was won by <b>%1</b> with <b>%2</b> pts. @@ -1302,7 +1530,7 @@ - + The best killer is <b>%1</b> with <b>%2</b> kills in a turn. @@ -1311,7 +1539,7 @@ - + A total of <b>%1</b> hedgehog(s) were killed during this round. @@ -1320,8 +1548,9 @@ - + (%1 kill) + Number of kills in stats screen, written after the team name @@ -1329,8 +1558,9 @@ - + (%1 %2) + 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” @@ -1338,8 +1568,8 @@ - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. @@ -1347,8 +1577,8 @@ - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1356,7 +1586,7 @@ - + <b>%1</b> was scared and skipped turn <b>%2</b> times. @@ -1457,17 +1687,17 @@ PageMultiplayer - + Edit game preferences - + Start - + Start fighting (requires at least 2 teams) @@ -1531,216 +1761,243 @@ PageOptions - + Select an action to change what key controls it - + Reset to default - + Reset all binds - - + + Game - + Graphics - + Audio - + Controls - + Video Recording - + Network - + Advanced - + Teams - + New team - + Edit team - + Delete team - + You can't edit teams from team selection. Go back to main menu to add, edit or delete teams. - + Schemes - + New scheme - + Edit scheme - + Delete scheme - + Weapons - + New weapon set - + Edit weapon set - + Delete weapon set - + + + x + 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 + + + + Frontend - + Custom colors - + Reset to default colors - + Game audio - + Frontend audio - + Account - + Proxy settings - + Proxy host - + Proxy port - + Proxy login - + Proxy password - + No proxy - + System proxy settings - + Socks5 proxy - + HTTP proxy - + Miscellaneous - + + MISSING LANGUAGE NAME [%1] + + + + Updates - + Check for updates - + + Check now + + + + Video recording options + + + Can't delete last team + + + + + You can't delete the last team! + + PagePlayDemo @@ -1798,12 +2055,12 @@ - + Open server administration page - + %1 players online @@ -1815,252 +2072,252 @@ PageScheme - - Defend your fort and destroy the opponents, two team colours max! + + Land can not be destroyed! + + + + + Add an indestructible border around the terrain - Land can not be destroyed! - - - - - Add an indestructible border around the terrain - - - - Lower gravity + + Assisted aiming with laser sight + + + + + All hogs have a personal forcefield + + + + + All (living) hedgehogs are fully restored at the end of turn + + + + + Gain 80% of the damage you do back in health + + + + + Share your opponents pain, share their damage + + + + + Your hogs are unable to move, put your artillery skills to the test + + + - Assisted aiming with laser sight - - - - - All hogs have a personal forcefield - - - - - All (living) hedgehogs are fully restored at the end of turn - - - - - Gain 80% of the damage you do back in health - - - - - Share your opponents pain, share their damage - - - - - Your hogs are unable to move, put your artillery skills to the test + Order of play is random instead of in room order. + + + + + Play with a King. If he dies, your side dies. - Order of play is random instead of in room order. - - - - - Play with a King. If he dies, your side dies. - - - - Take turns placing your hedgehogs before the start of play. - + Ammo is shared between all teams that share a colour. + + Disable girders when generating random maps. + + + - Disable girders when generating random maps. - - - - Disable land objects when generating random maps. - + AI respawns on death. - - Attacking does not end your turn. - - - + Attacking does not end your turn. + + + + Weapons are reset to starting values each turn. - + Each hedgehog has its own ammo. It does not share with the team. + + You will not have to worry about wind anymore. + + + - You will not have to worry about wind anymore. - - - - Wind will affect almost everything. - - Teams in each clan take successive turns sharing their turn time. - - - - - Add an indestructible border along the bottom - - - + Teams in each clan take successive turns sharing their turn time. + + + + + Add an indestructible border along the bottom + + + + Each clan starts in its own part of the terrain. + + Overall damage and knockback in percent + + + + + Turn time in seconds + + + + + Initial health of hedgehogs + + + + + How many rounds have to be played before Sudden Death begins + + + - Overall damage and knockback in percent + How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. - Turn time in seconds + 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. - Initial health of hedgehogs + Maximum rope length in percent - How many rounds have to be played before Sudden Death begins + Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. - How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. + Likelihood of a crate dropping before a turn - 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. + Health bonus for collecting a health crate - Maximum rope length in percent + 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. - Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. + Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. - Likelihood of a crate dropping before a turn + Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. - Health bonus for collecting a health crate + Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - 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. + Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. + Affects the left and right boundaries of the map - Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. + Time you get after an attack - Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - - - - - Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - - - - - Affects the left and right boundaries of the map - - - - - Time you get after an attack - - - - Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. - + None (Default) - + Wrap (World wraps) - + Bounce (Edges reflect) - + Sea (Edges connect to sea) - + + Name of this scheme + + + + Copy - + New - + Delete @@ -2124,22 +2381,48 @@ PageTraining - - Pick the mission or training to play + + Pick the training to play + + + + + Pick the challenge to play + Pick the scenario to play + + + + + Trainings + + + + + Challenges + + + + + Scenarios + + + + + Start fighting - + No description available - + Select a mission! @@ -2210,28 +2493,33 @@ - Follow + Delegate room control - - Ignore + Follow - + + Ignore + + + + + Add friend - + Unignore - + Remove friend @@ -2274,115 +2562,125 @@ QCheckBox - + Show ammo menu tooltips - + Alternative damage show - + Team - - Enable team tags by default - - - + Enable team tags by default + + + + Hog - - Enable hedgehog tags by default - - - + Enable hedgehog tags by default + + + + Health - - Enable health tags by default - - - + Enable health tags by default + + + + Translucent - + Enable translucent tags by default - + Visual effects - - + + Enable visual effects such as animated menu transitions and falling stars + + + + + Sound - + In-game sound effects - - + + Music - + In-game music - + Frontend sound effects - + Frontend music - + Append date and time to record file name - + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + + + Check for updates at startup - + Fullscreen - + Show FPS - + Save password @@ -2397,12 +2695,12 @@ - + Record audio - + Use game resolution @@ -2410,97 +2708,127 @@ QComboBox - + Human - + Computer (Level %1) - + Community - + (System default) - + Disabled - Red/Cyan - - - - - Cyan/Red - - - - - Red/Blue + Stereoscopy creates an illusion of depth when you wear 3D glasses. - Blue/Red + Red/Cyan - Red/Green + Cyan/Red + Red/Blue + + + + + Blue/Red + + + + + Red/Green + + + + Green/Red + + Side-by-side + + + + + Top-Bottom + + + + + 24 FPS + + + + + 25 FPS + + + + + 30 FPS + + + + + 50 FPS + + + + + 60 FPS + + + + + Red/Cyan grayscale + + + + + Cyan/Red grayscale + + + + + Red/Blue grayscale + + + - Side-by-side + Blue/Red grayscale - Top-Bottom - - - - - Red/Cyan grayscale - - - - - Cyan/Red grayscale - - - - - Red/Blue grayscale - - - - - Blue/Red grayscale - - - - Red/Green grayscale - + Green/Red grayscale @@ -2508,17 +2836,17 @@ QGroupBox - + Team Members - + Team Settings - + Fort @@ -2538,7 +2866,7 @@ - + Playing teams @@ -2556,16 +2884,6 @@ QLabel - - Revision - - - - - This program is distributed under the %1 - - - Style @@ -2591,27 +2909,27 @@ - + Name - + Player - + Grave - + Flag - + Voice @@ -2637,157 +2955,163 @@ - + Locale - + Nickname - + + Stereoscopy + + + + This setting will be effective at next restart. - + Resolution - + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + + + Quality - + Fullscreen - + Fullscreen Resolution - + Windowed Resolution - - Stereo rendering - - - - + Displayed tags above hogs and translucent tags - + Initial sound volume - + FPS limit - + Damage Modifier - + Turn Time - + Initial Health - + Sudden Death Timeout - + Sudden Death Water Rise - + Sudden Death Health Decrease - + % Rope Length - + Crate Drops - + % Health Crates - + Health in Crates - + Mines Time - + Mines - + % Dud Mines - + Barrels - + % Retreat Time - + Air Mines - + World Edge - + Script parameter - + Scheme Name: @@ -2854,46 +3178,46 @@ - + Format - + Audio codec - + Video codec - + Framerate - - - Bitrate (Kbps) - - QLineEdit - + unnamed + + unnamed (%1) + + + - + hedgehog %1 - + anonymous @@ -2909,101 +3233,138 @@ QMessageBox - + Teams - Are you sure? - + Do you really want to delete the team '%1'? - - + + Teams - Name already taken + + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + + Cannot delete default scheme '%1'! - + Please select a record from the list - + Hedgewars - Nick not registered - + Unable to start server - + Connection to server is lost - + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Not all players are ready - + Are you sure you want to start this game? Not all players are ready. - + Hedgewars - Error - + System Information Preview - - + + Failed to generate captcha - + Failed to download captcha - + Please fill out all fields. Email is optional. - - + + Hedgewars - Success - + All file associations have been set - + File association failed. + + + + Error + + + Please select a file from the list. + + + + + Cannot rename file to %1. + + + + + Cannot delete file %1. + + + Cannot use the ammo '%1'! @@ -3048,62 +3409,38 @@ - - - - - Record Play - Error - - - - - - Please select record from the list - - - - - Cannot rename to - - - - - Cannot delete file - - - - + Room Name - Error - + Please select room from the list - - Room Name - Are you sure? - - - + Room Name - Are you sure? + + + + The game you are trying to join has started. Do you still want to join the room? - + Schemes - Warning - + Schemes - Are you sure? - + Do you really want to delete the game scheme '%1'? @@ -3152,28 +3489,28 @@ - - + + Weapons - Warning - + Cannot overwrite default weapon set '%1'! - + Cannot delete default weapon set '%1'! - + Weapons - Are you sure? - + Do you really want to delete the weapon set '%1'? @@ -3191,8 +3528,8 @@ QObject - - + + No description available @@ -3216,12 +3553,6 @@ - - - Go! - - - Start server @@ -3262,7 +3593,9 @@ + + Start @@ -3272,7 +3605,7 @@ - + Associate file extensions @@ -3304,12 +3637,12 @@ - + Set default options - + Restore default coding parameters @@ -3347,7 +3680,7 @@ - Upload this video to your Youtube account + Upload this video to your YouTube account @@ -3357,6 +3690,14 @@ + QSpinBox + + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + + + RoomNamePrompt @@ -3383,72 +3724,74 @@ RoomsListModel - + In progress - + Room Name C - - - - - T + Caption of the column for the number of connected clients in the list of rooms - Owner + T + Caption of the column for the number of teams in the list of rooms - Map + Owner - Script + Map - Rules + Script + Rules + + + + Weapons - - Random Map - - - - Random Maze + Random Map - Random Perlin + Random Maze - Hand-drawn + Random Perlin + Hand-drawn + + + + Forts @@ -3504,22 +3847,22 @@ - + New - + New (%1) - + Copy of %1 - + Copy of %1 (%2) @@ -3551,7 +3894,7 @@ TeamSelWidget - + At least two teams are required to play! @@ -3791,12 +4134,13 @@ - - hedgehog info - - - - + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + + + record @@ -3907,12 +4251,12 @@ - - Toggle labels above hedgehogs: - - - - + + Heads-up display: + + + + Record video: @@ -3957,7 +4301,7 @@ - + Keyboard @@ -4375,57 +4719,57 @@ - + You already have voted - + Your vote counted - + Voting closed - + Pause toggled - + New voting started - + Voting expired - + kick - + map - + pause - + new seed - + number of hedgehogs in team @@ -4475,112 +4819,112 @@ + + Nickname already chosen + + + + + Illegal nickname + + + + + Protocol already known + + + + + Bad number + + + + + Nickname is already in use + + + + + No checker rights + + + + + Authentication failed + + + + + 60 seconds cooldown after kick + + + + + kicked + + + + + Reconnected too fast + + + + + Ping timeout + + + + + bye + + + - Nickname already chosen + No such room - Illegal nickname + Room version incompatible to your hedgewars version - Protocol already known + Joining restricted - Bad number + Registered users only - Nickname is already in use - - - - - No checker rights - - - - - Authentication failed - - - - - 60 seconds cooldown after kick - - - - - kicked + You are banned in this room + + + + + Warning! Chat flood protection activated + + + + + Excess flood + + + + + Game messages flood detected - 1 + + + + + Warning! Joins flood protection activated - Reconnected too fast - - - - - Ping timeout - - - - - bye - - - - - No such room - - - - - Room version incompatible to your hedgewars version - - - - - Joining restricted - - - - - Registered users only - - - - - You are banned in this room - - - - - Warning! Chat flood protection activated - - - - - Excess flood - - - - - Game messages flood detected - 1 - - - - - Warning! Joins flood protection activated - - - - There's no voting going on diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_ms.ts --- a/share/hedgewars/Data/Locale/hedgewars_ms.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_ms.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,13 +1,101 @@ - + About - + + Hedgewars %1 + %1 contains Hedgewars' version number + + + + + Revision %1 (%2) + + + + + Visit our homepage: %1 + + + + + This program is distributed under the %1. + + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + Unknown Compiler + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -20,15 +108,25 @@ AmmoSchemeModel - + New - + + New (%1) + + + + Copy of %1 + + + Copy of %1 (%2) + + BanDialog @@ -39,7 +137,6 @@ - IP @@ -84,25 +181,25 @@ - + + Please specify an IP address. + + + + + Please specify a nickname. + + + + Warning - - - Please, specify %1 - - - - - nickname - - DataManager - + Use Default @@ -145,7 +242,7 @@ - + Send Feedback @@ -249,67 +346,67 @@ - + Cannot create directory %1 - - Usage - command-line - - - - - OPTION - command-line - - - - - - CONNECTSTRING - command-line - - - - - Options - command-line - - - - - Display this help - command-line - - - - Custom path for configuration data and user data + Usage command-line - Custom path to the game data folder + OPTION command-line + + CONNECTSTRING + command-line + + + + + Options + command-line + + + + + Display this help + command-line + + + + + Custom path for configuration data and user data + command-line + + + + + Custom path to the game data folder + command-line + + + + Hedgewars can use a %1 (e.g. "%2") to connect on start. command-line - + Malformed option argument: %1 command-line - + Unknown option argument: %1 command-line @@ -349,67 +446,67 @@ - + %1 has joined - + %1 has left - + %1 has left (%2) - + %1 has been removed from your ignore list - + %1 has been added to your ignore list - + %1 has been removed from your friends list - + %1 has been added to your friends list - + Stylesheet imported from %1 - + Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset! - + Couldn't read %1 - + StyleSheet discarded - + StyleSheet saved to %1 - + Failed to save StyleSheet to %1 @@ -417,35 +514,47 @@ HWForm - - - - + + + + Guest - - DefaultTeam - - - - + + Team 1 + + + + %1's Team - + + Team %1 + Default team name + + + + + Computer %1 + Default computer team name + + + + Game aborted - + Hedgewars - Nick registered - + This nick is registered, and you haven't specified a password. If this nick isn't yours, please register your own nick at www.hedgewars.org @@ -454,117 +563,127 @@ - + Your nickname is not registered. To prevent someone else from using it, please register it at www.hedgewars.org - + Your password wasn't saved either. - + Nickname - + Someone already uses your nickname %1 on the server. Please pick another nickname: - - + + No nickname supplied. - - + + Hedgewars - Empty nickname - + Hedgewars - Wrong password - + You entered a wrong password. - + Room password - + The room is protected with password. Please, enter the password: - + Try Again - + Hedgewars - Connection error - + You reconnected too fast. Please wait a few seconds and try again. - - + + Cannot save record to file %1 - + Hedgewars Demo File File Types - + Hedgewars Save File File Types - + Demo name - + Demo name: - - This page requires an internet connection. + + Unknown network error (possibly missing SSL library). + + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + + Internal error: Reply object is invalid. HWGame - + A Fatal ERROR occured! - The game engine had to stop. We are very sorry for the inconvenience :( @@ -576,13 +695,14 @@ - + en.txt + 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. ms.txt - + Cannot open demofile %1 @@ -845,7 +965,7 @@ HWNewNet - + Quit reason: @@ -984,7 +1104,7 @@ KeyBinder - + Category @@ -992,27 +1112,28 @@ LibavInteraction - - Duration: %1m %2s - - - - + Video: %1x%2 - - %1 fps - - - - + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + + %1 FPS + + + + Audio: - + unknown @@ -1020,12 +1141,27 @@ MapModel - + No description available. + MinesTimeSpinBox + + + Random + + + + + %1 seconds + + + + + + PageAdmin @@ -1104,6 +1240,30 @@ + PageCampaign + + + + Start fighting + + + + + Team + + + + + Campaign + + + + + Mission + + + + PageConnecting @@ -1114,18 +1274,33 @@ PageDataDownload - + + Load the start page + + + + Open packages directory - + Loading, please wait. - - This page requires an internet connection. + + Unknown network error (possibly missing SSL library). + + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + + Internal error: Reply object is invalid. @@ -1202,55 +1377,106 @@ PageEditTeam - + Select an action to choose a custom key bind for this team - + Use my default - + Reset all binds - - General - - - + General + + + + Custom Controls - - Hat - - - + Hat + + + + Name - + This hedgehog's name - + Randomize this hedgehog's name - + + Random Hats + + + + + Random Names + + + + Random Team + + + Randomize the team name + + + + + Randomize the grave + + + + + Randomize the flag + + + + + Play a random example of this voice + + + + + Randomize the voice + + + + + Randomize the fort + + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + + %1 (%2) + + PageGameStats @@ -1261,7 +1487,7 @@ - + Health graph @@ -1281,56 +1507,58 @@ - + The best shot award was won by <b>%1</b> with <b>%2</b> pts. - + The best killer is <b>%1</b> with <b>%2</b> kills in a turn. - + A total of <b>%1</b> hedgehog(s) were killed during this round. - + (%1 kill) + Number of kills in stats screen, written after the team name - + (%1 %2) + 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” - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. - + <b>%1</b> was scared and skipped turn <b>%2</b> times. @@ -1429,17 +1657,17 @@ PageMultiplayer - + Edit game preferences - + Start - + Start fighting (requires at least 2 teams) @@ -1503,216 +1731,243 @@ PageOptions - + Select an action to change what key controls it - + Reset to default - + Reset all binds - - + + Game - + Graphics - + Audio - + Controls - + Video Recording - + Network - + Advanced - + Teams - + New team - + Edit team - + Delete team - + You can't edit teams from team selection. Go back to main menu to add, edit or delete teams. - + Schemes - + New scheme - + Edit scheme - + Delete scheme - + Weapons - + New weapon set - + Edit weapon set - + Delete weapon set - + + + x + 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 + + + + Frontend - + Custom colors - + Reset to default colors - + Game audio - + Frontend audio - + Account - + Proxy settings - + Proxy host - + Proxy port - + Proxy login - + Proxy password - + No proxy - + System proxy settings - + Socks5 proxy - + HTTP proxy - + Miscellaneous - + + MISSING LANGUAGE NAME [%1] + + + + Updates - + Check for updates - + + Check now + + + + Video recording options + + + Can't delete last team + + + + + You can't delete the last team! + + PagePlayDemo @@ -1770,12 +2025,12 @@ - + Open server administration page - + %1 players online @@ -1785,252 +2040,252 @@ PageScheme - - Defend your fort and destroy the opponents, two team colours max! + + Land can not be destroyed! + + + + + Add an indestructible border around the terrain - Land can not be destroyed! - - - - - Add an indestructible border around the terrain - - - - Lower gravity + + Assisted aiming with laser sight + + + + + All hogs have a personal forcefield + + + + + All (living) hedgehogs are fully restored at the end of turn + + + + + Gain 80% of the damage you do back in health + + + + + Share your opponents pain, share their damage + + + + + Your hogs are unable to move, put your artillery skills to the test + + + - Assisted aiming with laser sight - - - - - All hogs have a personal forcefield - - - - - All (living) hedgehogs are fully restored at the end of turn - - - - - Gain 80% of the damage you do back in health - - - - - Share your opponents pain, share their damage - - - - - Your hogs are unable to move, put your artillery skills to the test + Order of play is random instead of in room order. + + + + + Play with a King. If he dies, your side dies. - Order of play is random instead of in room order. - - - - - Play with a King. If he dies, your side dies. - - - - Take turns placing your hedgehogs before the start of play. - + Ammo is shared between all teams that share a colour. + + Disable girders when generating random maps. + + + - Disable girders when generating random maps. - - - - Disable land objects when generating random maps. - + AI respawns on death. - - Attacking does not end your turn. - - - + Attacking does not end your turn. + + + + Weapons are reset to starting values each turn. - + Each hedgehog has its own ammo. It does not share with the team. + + You will not have to worry about wind anymore. + + + - You will not have to worry about wind anymore. - - - - Wind will affect almost everything. - - Teams in each clan take successive turns sharing their turn time. - - - - - Add an indestructible border along the bottom - - - + Teams in each clan take successive turns sharing their turn time. + + + + + Add an indestructible border along the bottom + + + + Each clan starts in its own part of the terrain. + + Overall damage and knockback in percent + + + + + Turn time in seconds + + + + + Initial health of hedgehogs + + + + + How many rounds have to be played before Sudden Death begins + + + - Overall damage and knockback in percent + How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. - Turn time in seconds + 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. - Initial health of hedgehogs + Maximum rope length in percent - How many rounds have to be played before Sudden Death begins + Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. - How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. + Likelihood of a crate dropping before a turn - 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. + Health bonus for collecting a health crate - Maximum rope length in percent + 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. - Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. + Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. - Likelihood of a crate dropping before a turn + Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. - Health bonus for collecting a health crate + Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - 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. + Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. + Affects the left and right boundaries of the map - Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. + Time you get after an attack - Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - - - - - Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - - - - - Affects the left and right boundaries of the map - - - - - Time you get after an attack - - - - Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. - + None (Default) - + Wrap (World wraps) - + Bounce (Edges reflect) - + Sea (Edges connect to sea) - + + Name of this scheme + + + + Copy - + New - + Delete @@ -2094,22 +2349,48 @@ PageTraining - - Pick the mission or training to play + + Pick the training to play + + + + + Pick the challenge to play + Pick the scenario to play + + + + + Trainings + + + + + Challenges + + + + + Scenarios + + + + + Start fighting - + No description available - + Select a mission! @@ -2193,28 +2474,33 @@ - Follow + Delegate room control - - Ignore + Follow - + + Ignore + + + + + Add friend - + Unignore - + Remove friend @@ -2243,7 +2529,7 @@ QCheckBox - + Save password @@ -2258,119 +2544,129 @@ - + Check for updates at startup - + Fullscreen - + Alternative damage show - + Show FPS - + Show ammo menu tooltips - + Team - - Enable team tags by default - - - + Enable team tags by default + + + + Hog - - Enable hedgehog tags by default - - - + Enable hedgehog tags by default + + + + Health - - Enable health tags by default - - - + Enable health tags by default + + + + Translucent - + Enable translucent tags by default - + Visual effects - - + + Enable visual effects such as animated menu transitions and falling stars + + + + + Sound - + In-game sound effects - - + + Music - + In-game music - + Frontend sound effects - + Frontend music - + Append date and time to record file name - + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + + + Record audio - + Use game resolution @@ -2378,97 +2674,127 @@ QComboBox - + Human - + Computer (Level %1) - + Community - + (System default) - + Disabled - Red/Cyan - - - - - Cyan/Red - - - - - Red/Blue + Stereoscopy creates an illusion of depth when you wear 3D glasses. - Blue/Red + Red/Cyan - Red/Green + Cyan/Red + Red/Blue + + + + + Blue/Red + + + + + Red/Green + + + + Green/Red + + Side-by-side + + + + + Top-Bottom + + + + + 24 FPS + + + + + 25 FPS + + + + + 30 FPS + + + + + 50 FPS + + + + + 60 FPS + + + + + Red/Cyan grayscale + + + + + Cyan/Red grayscale + + + + + Red/Blue grayscale + + + - Side-by-side + Blue/Red grayscale - Top-Bottom - - - - - Red/Cyan grayscale - - - - - Cyan/Red grayscale - - - - - Red/Blue grayscale - - - - - Blue/Red grayscale - - - - Red/Green grayscale - + Green/Red grayscale @@ -2476,17 +2802,17 @@ QGroupBox - + Team Members - + Team Settings - + Fort @@ -2516,7 +2842,7 @@ - + Playing teams @@ -2571,27 +2897,27 @@ - + Name - + Player - + Grave - + Flag - + Voice @@ -2647,196 +2973,187 @@ - + Locale - + Nickname - + + Stereoscopy + + + + This setting will be effective at next restart. - + Resolution - + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + + + Quality - + Fullscreen - + Fullscreen Resolution - + Windowed Resolution - - Stereo rendering - - - - + Displayed tags above hogs and translucent tags - + Initial sound volume - + FPS limit - + Damage Modifier - + Turn Time - + Initial Health - + Sudden Death Timeout - + Sudden Death Water Rise - + Sudden Death Health Decrease - + % Rope Length - + Crate Drops - + % Health Crates - + Health in Crates - + Mines Time - + Mines - + % Dud Mines - + Barrels - + % Retreat Time - + Air Mines - + World Edge - + Script parameter - + Scheme Name: - + Format - + Audio codec - + Video codec - + Framerate - - Bitrate (Kbps) - - - - - Revision - - - - - This program is distributed under the %1 - - - Style @@ -2850,18 +3167,23 @@ QLineEdit - + unnamed + + unnamed (%1) + + + - + hedgehog %1 - + anonymous @@ -2877,92 +3199,109 @@ QMessageBox - + Teams - Are you sure? - + Do you really want to delete the team '%1'? - - + + Teams - Name already taken + + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + + Cannot delete default scheme '%1'! - + Please select a record from the list - + Hedgewars - Nick not registered - + Unable to start server - + Connection to server is lost - + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Not all players are ready - + Are you sure you want to start this game? Not all players are ready. - + Hedgewars - Error - + System Information Preview - - + + Failed to generate captcha - + Failed to download captcha - + Please fill out all fields. Email is optional. - - + + Hedgewars - Success - + All file associations have been set - + File association failed. @@ -3006,62 +3345,38 @@ - - - - - Record Play - Error - - - - - - Please select record from the list - - - - - Cannot rename to - - - - - Cannot delete file - - - - + Room Name - Error - + Please select room from the list - - Room Name - Are you sure? - - - + Room Name - Are you sure? + + + + The game you are trying to join has started. Do you still want to join the room? - + Schemes - Warning - + Schemes - Are you sure? - + Do you really want to delete the game scheme '%1'? @@ -3108,38 +3423,58 @@ + + + + Error + + + Please select a file from the list. + + + + + Cannot rename file to %1. + + + + + Cannot delete file %1. + + + Cannot use the ammo '%1'! - - + + Weapons - Warning - + Cannot overwrite default weapon set '%1'! - + Cannot delete default weapon set '%1'! - + Weapons - Are you sure? - + Do you really want to delete the weapon set '%1'? @@ -3157,8 +3492,8 @@ QObject - - + + No description available @@ -3187,12 +3522,6 @@ - - - Go! - - - Connect @@ -3233,7 +3562,9 @@ + + Start @@ -3243,7 +3574,7 @@ - + Associate file extensions @@ -3270,12 +3601,12 @@ - + Set default options - + Restore default coding parameters @@ -3313,7 +3644,7 @@ - Upload this video to your Youtube account + Upload this video to your YouTube account @@ -3323,6 +3654,14 @@ + QSpinBox + + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + + + RoomNamePrompt @@ -3349,72 +3688,74 @@ RoomsListModel - + In progress - + Room Name C - - - - - T + Caption of the column for the number of connected clients in the list of rooms - Owner + T + Caption of the column for the number of teams in the list of rooms - Map + Owner - Script + Map - Rules + Script + Rules + + + + Weapons - - Random Map - - - - Random Maze + Random Map - Random Perlin + Random Maze - Hand-drawn + Random Perlin + Hand-drawn + + + + Forts @@ -3470,22 +3811,22 @@ - + New - + New (%1) - + Copy of %1 - + Copy of %1 (%2) @@ -3517,7 +3858,7 @@ TeamSelWidget - + At least two teams are required to play! @@ -3757,12 +4098,13 @@ - - hedgehog info - - - - + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + + + record @@ -3873,12 +4215,12 @@ - - Toggle labels above hedgehogs: - - - - + + Heads-up display: + + + + Record video: @@ -4241,7 +4583,7 @@ - + Keyboard @@ -4341,57 +4683,57 @@ - + You already have voted - + Your vote counted - + Voting closed - + Pause toggled - + New voting started - + Voting expired - + kick - + map - + pause - + new seed - + number of hedgehogs in team @@ -4441,112 +4783,112 @@ + + Nickname already chosen + + + + + Illegal nickname + + + + + Protocol already known + + + + + Bad number + + + + + Nickname is already in use + + + + + No checker rights + + + + + Authentication failed + + + + + 60 seconds cooldown after kick + + + + + kicked + + + + + Reconnected too fast + + + + + Ping timeout + + + + + bye + + + - Nickname already chosen + No such room - Illegal nickname + Room version incompatible to your hedgewars version - Protocol already known + Joining restricted - Bad number + Registered users only - Nickname is already in use - - - - - No checker rights - - - - - Authentication failed - - - - - 60 seconds cooldown after kick - - - - - kicked + You are banned in this room + + + + + Warning! Chat flood protection activated + + + + + Excess flood + + + + + Game messages flood detected - 1 + + + + + Warning! Joins flood protection activated - Reconnected too fast - - - - - Ping timeout - - - - - bye - - - - - No such room - - - - - Room version incompatible to your hedgewars version - - - - - Joining restricted - - - - - Registered users only - - - - - You are banned in this room - - - - - Warning! Chat flood protection activated - - - - - Excess flood - - - - - Game messages flood detected - 1 - - - - - Warning! Joins flood protection activated - - - - There's no voting going on diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_nl.ts --- a/share/hedgewars/Data/Locale/hedgewars_nl.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_nl.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -25,6 +96,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -65,14 +144,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -80,6 +151,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -351,10 +430,6 @@ - DefaultTeam - - - Hedgewars Demo File File Types @@ -443,10 +518,6 @@ - This page requires an internet connection. - - - Guest @@ -459,11 +530,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. @@ -819,15 +917,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -839,6 +938,20 @@ + MinesTimeSpinBox + + Random + + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -902,6 +1015,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -915,13 +1047,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1020,6 +1164,47 @@ Random Team + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1058,20 +1243,7 @@ (%1 kill) - - - - - - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - - - - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + Number of kills in stats screen, written after the team name @@ -1094,6 +1266,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1404,6 +1591,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1465,10 +1673,6 @@ PageScheme - Defend your fort and destroy the opponents, two team colours max! - - - Land can not be destroyed! @@ -1664,6 +1868,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1722,13 +1930,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1830,6 +2058,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -1937,6 +2169,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2016,6 +2256,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2171,10 +2435,6 @@ - Stereo rendering - - - Style @@ -2237,10 +2497,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2273,14 +2529,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2316,6 +2564,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2331,6 +2588,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2416,22 +2677,6 @@ - Record Play - Error - - - - Please select record from the list - - - - Cannot rename to - - - - Cannot delete file - - - Room Name - Error @@ -2552,6 +2797,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2595,10 +2866,6 @@ - Go! - - - Play demo @@ -2659,10 +2926,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2682,6 +2945,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2714,10 +2988,12 @@ C + Caption of the column for the number of connected clients in the list of rooms T + Caption of the column for the number of teams in the list of rooms @@ -3029,10 +3305,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3040,6 +3312,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3115,10 +3392,6 @@ - Toggle labels above hedgehogs: - - - Record video: @@ -3134,6 +3407,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_pl.ts --- a/share/hedgewars/Data/Locale/hedgewars_pl.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Nieznany kompilator + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + Rewizja %1 (%2) + + + Visit our homepage: %1 + Odwiedź naszą stronę domową: %1 + + + This program is distributed under the %1. + Ten program jest rozpowszechniany na licencji %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + GNU GPL v2 + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + Wersje zależności: + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + AbstractPage @@ -31,11 +102,19 @@ New - Nowy + Nowy Copy of %1 - + Kopia %1 + + + New (%1) + Nowy (%1) + + + Copy of %1 (%2) + Kopia %1 (%2) @@ -70,7 +149,7 @@ you know why - Wiesz za co + wiesz za dlaczego Warning @@ -78,11 +157,11 @@ Please, specify %1 - Proszę, opisz %1 + Proszę, opisz %1 nickname - ksywka + ksywka permanent @@ -92,6 +171,14 @@ Ban player Banuj gracza + + Please specify an IP address. + Podaj adres IP. + + + Please specify a nickname. + Podaj nick. + DataManager @@ -112,7 +199,7 @@ Send Feedback - Wyśłij opinię + Wyślij opinię We are always happy about suggestions, ideas, or bug reports. @@ -237,6 +324,64 @@ Failed to open data directory: %1 +Please check your installation! + Nie można otworzyć katalogu z danymi: +%1 +Sprawdź poprawność instalacji! + + + Usage + command-line + Użycie + + + OPTION + command-line + OPCJA + + + CONNECTSTRING + command-line + CONNECTSTRING + + + Options + command-line + Opcje + + + Display this help + command-line + Wyświetl tę pomoc + + + Custom path for configuration data and user data + command-line + Własna ścieżka do konfiguracji i danych użytkownika + + + Custom path to the game data folder + command-line + Własna ścieżka do folderu danych gry + + + Hedgewars can use a %1 (e.g. "%2") to connect on start. + command-line + Hedgewars może użyć %1 (np. "%2") by połączyć się na starcie. + + + Malformed option argument: %1 + command-line + Niepoprawny argument: %1 + + + Unknown option argument: %1 + command-line + Nieznany argument: %1 + + + Failed to open data directory: +%1 Please check your installation! Nie można otworzyć katalogu z danymi: @@ -244,56 +389,6 @@ Sprawdź poprawność instalacji! - - Usage - command-line - - - - OPTION - command-line - - - - CONNECTSTRING - command-line - - - - Options - command-line - - - - Display this help - command-line - - - - Custom path for configuration data and user data - command-line - - - - Custom path to the game data folder - command-line - - - - Hedgewars can use a %1 (e.g. "%2") to connect on start. - command-line - - - - Malformed option argument: %1 - command-line - - - - Unknown option argument: %1 - command-line - - HWAskQuitDialog @@ -358,15 +453,15 @@ Chat log - + Dziennik czatu Enter chat messages here and send them with [Enter] - + Tutaj wpisz wiadomości czatu i wyślij je wciskając [Enter] List of players - + Lista graczy @@ -377,7 +472,7 @@ DefaultTeam - DomyślnaDrużyna + DomyślnaDrużyna Hedgewars Demo File @@ -425,14 +520,10 @@ This nick is registered, and you haven't specified a password. - If this nick isn't yours, please register your own nick at www.hedgewars.org - Password: - Ten nick jest zarejestrowany i musisz podać hasło. - + Ten nick jest zarejestrowany i musisz podać hasło. Jeżeli ten nick nie jest twój, zarejestrój własny na www.hedgewars.org - Hasło: @@ -445,10 +536,8 @@ - Your password wasn't saved either. - - + Twoje hasło nie zostało zapisane. @@ -479,7 +568,7 @@ This page requires an internet connection. - Ta strona wymaga połączenia z internetem. + Ta strona wymaga połączenia z internetem. Guest @@ -495,11 +584,58 @@ Ten pokój jest chroniony hasłem Podaj hasło: + + Team 1 + Drużyna 1 + + + Team %1 + Default team name + Drużyna %1 + + + Computer %1 + Default computer team name + Komputer %1 + + + Unknown network error (possibly missing SSL library). + Nieznany błąd sieci (możliwy brak biblioteki SSL). + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + Ta funkcja wymaga połączenia z internetem, a ty nie jesteś online (kod błędu: %1) + + + Internal error: Reply object is invalid. + Wewnętrzny błąd: Obiekt odpowiedz jest niepoprawny. + + + This nick is registered, and you haven't specified a password. + +If this nick isn't yours, please register your own nick at www.hedgewars.org + +Password: + Ten nick jest zarejestrowany i musisz podać hasło. + +Jeżeli ten nick nie jest twój, zarejestrój własny na www.hedgewars.org + +Hasło: + + + + +Your password wasn't saved either. + + +Twoje hasło nie zostało zapisane. + HWGame en.txt + 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. pl.txt @@ -508,6 +644,18 @@ A Fatal ERROR occured! - The game engine had to stop. +We are very sorry for the inconvenience :( +If this keeps happening, please click the '%1' button in the main menu! +Last two engine messages: +%2 + Wystąpił fatalny BŁĄD! - Silnik gry musiał się zatrzymać. +Bardzo nam przykro z powodu niedogodności :( +Jeśli to będzie się powtarzać, wciśnij przycisk "%1" w menu głównym!! +Dwie ostatnie wiadomości silnika: +%2 + + + A Fatal ERROR occured! - The game engine had to stop. We are very sorry for the inconvenience :( @@ -515,7 +663,14 @@ Last two engine messages: %2 - + Wystąpił fatalny BŁĄD! - Silnik gry musiał się zatrzymać. + +Bardzo nam przykro z powodu niedogodności :( + +Jeśli to będzie się powtarzać, wciśnij przycisk "%1" w menu głównym!! + +Dwie ostatnie wiadomości silnika: +%2 @@ -653,7 +808,7 @@ Random perlin - + Losowy perlin Style: @@ -665,47 +820,47 @@ View and edit the seed, the source of randomness in the game - + Zobacz i edytuj ziarno, źródło losowości w grze Randomize the theme - + Wylosuj motyw Choose a theme - Wybierz motyw + Wybierz motyw Randomize the map, theme and seed - + Losuje mapę, motyw i ziarno Randomize the theme and seed - + Losuje motyw i ziarno Randomize the seed - + Losuje ziarno Click to randomize the map, theme and seed - + Kliknij, aby wygenerować losową mapę, motyw i ziarno Click to randomize the theme and seed - + Kliknij, aby wylosować motyw i ziarno Adjust the complexity of the generated map - + Dostosuj poziom złożoności generowanych map Adjust the distance between forts - + Dostosuj odległość pomiędzy forami Click to edit - + Kliknij aby edytować @@ -775,7 +930,7 @@ Server authentication error - + Błąd uwierzytelniania serwera @@ -786,11 +941,9 @@ To connect to the server, please log in. - If you don't have an account on www.hedgewars.org, just enter your nickname. - Zaloguj się by połączyć się z serwerem. - + Zaloguj się by połączyć się z serwerem. Jeśli nie masz konta na www.hedgewars.org, po prostu wpisz swój nick. @@ -806,6 +959,16 @@ New Account Nowe konto + + To connect to the server, please log in. + +If you don't have an account on www.hedgewars.org, +just enter your nickname. + Zaloguj się by połączyć się z serwerem. + +Jeśli nie masz konta na www.hedgewars.org, +po prostu wpisz swój nick. + HWUploadVideoDialog @@ -863,7 +1026,8 @@ Duration: %1m %2s - Długość: %1m %2s + Długość: %1m %2s + Video: %1x%2, @@ -883,15 +1047,20 @@ Duration: %1m %2s - Czas trwania: %1m %2s + Czas trwania: %1m %2s Video: %1x%2 - - - - %1 fps - + Wideo: %1x%2 + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + Długość: %1min %2s + + + %1 FPS + %1 FPS @@ -902,10 +1071,25 @@ + MinesTimeSpinBox + + Random + Losowo + + + %1 seconds + + %1 sekunda + %1 sekundy + %1 sekund + + + + PageAdmin Clear Accounts Cache - Wyczyść pamięć podręczną + Wyczyść pamięć podręczną kont Fetch data @@ -965,6 +1149,25 @@ + PageCampaign + + Team + Drużyna + + + Campaign + Kampania + + + Mission + Misja + + + Start fighting + Zacznij bitwę + + + PageConnecting Connecting... @@ -979,12 +1182,28 @@ This page requires an internet connection. - Ta strona wymaga połączenia z internetem. + Ta strona wymaga połączenia z internetem. Open packages directory Otwórz katalog z dodatkami + + Load the start page + Wczytaj stronę główną + + + Unknown network error (possibly missing SSL library). + Nieznany błąd sieci (możliwy brak biblioteki SSL). + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + Ta funkcja wymaga połączenia z internetem, a ty nie jesteś online (kod błędu: %1) + + + Internal error: Reply object is invalid. + Wewnętrzny błąd: Obiekt odpowiedz jest niepoprawny. + PageDrawMap @@ -1038,7 +1257,7 @@ Optimize - + Optymalizuj @@ -1081,7 +1300,48 @@ Random Team - Losowa Drużyna + Losowa drużyna + + + Play a random example of this voice + Zagraj losową próbkę tego głosu + + + Random Hats + Losowe czapki + + + Random Names + Losowe imiona + + + Randomize the team name + Wylosuj nazwę drużyny + + + Randomize the grave + Wylosuj grób + + + Randomize the flag + Wylosuj flagę + + + Randomize the voice + Wylosuj głos + + + Randomize the fort + Wylosuj fort + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + CPU %1 + + + %1 (%2) + %1 (%2) @@ -1101,9 +1361,9 @@ The best shot award was won by <b>%1</b> with <b>%2</b> pts. - Największe obrażenia (<b>%2</b> pkt.) zadał <b>%1</b>. - - + Zwycięzcą nagrody na najlepszy strzał jest <b>%1</b> z <b>%2</b> punktem. + Zwycięzcą nagrody na najlepszy strzał jest <b>%1</b> z <b>%2</b> punktami. + Zwycięzcą nagrody na najlepszy strzał jest <b>%1</b> z <b>%2</b> punktami. @@ -1124,27 +1384,20 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 zabity jeż) (%1 zabite jeże) (%1 zabitych jeży) - + <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - <b>%1</b> przyjaźni się z wrogiem i zabrał swojej drużynie <b>%2</b> pkt. życia. - <b>%1</b> przyjaźni się z wrogiem i zabrał swojej drużynie <b>%2</b> pkt. życia. - <b>%1</b> przyjaźni się z wrogiem i zabrał swojej drużynie <b>%2</b> pkt. życia. - - - + <b>%1</b> myśleli, że dobrze jest strzelać do swoich na <b>%2</b> pkt. + + <b>%1</b> killed <b>%2</b> of his own hedgehogs. - - <b>%1</b> zabił <b>%2</b> swojego jeża - <b>%1</b> zabił <b>%2</b> swoje jeże - <b>%1</b> zabił <b>%2</b> swoich jeży - + <b>%1</b> zabili <b>%2</b> swoich jeży. <b>%1</b> was scared and skipped turn <b>%2</b> times. @@ -1164,10 +1417,27 @@ (%1 %2) - - - - + 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” + + (%1 %2) + (%1 %2) + (%1 %2) + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + <b>%1</b> myśleli, że dobrze jest strzelać do swoich jeży i zadali sobie <b>%2</b> punkt obrażeń. + <b>%1</b> myśleli, że dobrze jest strzelać do swoich jeży i zadali sobie <b>%2</b> punkty obrażeń. + <b>%1</b> myśleli, że dobrze jest strzelać do swoich jeży i zadali sobie <b>%2</b> punktów obrażeń. + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. + + <b>%1</b> zabili <b>%2</b> swojego jeża. + <b>%1</b> zabili <b>%2</b> swoje jeże. + <b>%1</b> zabili <b>%2</b> swoich jeży. @@ -1256,7 +1526,7 @@ Start fighting (requires at least 2 teams) - + Zacznij bitwę (wymaga co najmniej 2 drużyn) @@ -1283,19 +1553,19 @@ Room name - + Nazwa pokoju Update the room name - + Zmień nazwę pokoju Turn on the lightbulb to show the other players when you're ready to fight - + Zapal żarówkę, by pokazać innym graczom, kiedy będziesz gotowy Start fighting (requires at least 2 teams) - + Zacznij bitwę (wymaga co najmniej 2 drużyn) @@ -1479,6 +1749,27 @@ Video recording options Ustawienia nagrywania + + x + 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 + x + + + MISSING LANGUAGE NAME [%1] + BRAKUJĄCA NAZWA JĘZYKA [%1] + + + Check now + Sprawdź teraz + + + Can't delete last team + Nie można usunąć ostatniej drużyny + + + You can't delete the last team! + Nie możesz usunąć ostatniej drużyny! + PagePlayDemo @@ -1492,15 +1783,15 @@ Play demo - Odtwarzaj demo + Odtwórz demo Play the selected demo - + Odtwórz wybrane demo Load the selected game - + Wczytaj wybraną grę @@ -1582,7 +1873,7 @@ Defend your fort and destroy the opponents, two team colours max! - Broń swojego fortu i zniszcz przeciwników. Maksymalnie dwa kolory drużyn! + Broń swojego fortu i zniszcz przeciwników. Maksymalnie dwa kolory drużyn! Teams will start on opposite sides of the terrain, two team colours max! @@ -1710,79 +2001,83 @@ Each clan starts in its own part of the terrain. - Każda drużyna zaczyna na swojej części planszy + Każda drużyna zaczyna na swojej części planszy. Overall damage and knockback in percent - + Ogólne obrażenia i odrzut w procentach Turn time in seconds - + Czas tury w sekundach Initial health of hedgehogs - + Początkowe zdrowie jeży How many rounds have to be played before Sudden Death begins - + Ile tur musi zostać rozegranych, zanim zacznie się Nagła Śmierć How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. - + Ile podwyższa się woda na turę w Nagłej Śmierci. Ustaw na zero razem ze Zmniejszeniem Zdrowa w Nagłej Śmierci, by wyłączyć Nagłą Śmierć. 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. - + Ile zdrowia tracą jeże co turę w Nagłej Śmierci, aż do 1 zdrowia. Ustaw na zero razem z Podwyższeniem Wody w Nagłej Śmierci, by wyłączyć Nagłą Śmierć. Maximum rope length in percent - + Maksymalna długość liny w procentach Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. - + Prawdopodobieństwo, że zrzucona skrzynia będzie skrzynią ze zdrowiem. Wszystkie inne skrzynie będą z broniami lub narzędziami. Likelihood of a crate dropping before a turn - + Prawdopodobieństwo zrzutu skrzyni przed turą Health bonus for collecting a health crate - + Bonus zdrowia po zebraniu skrzyni ze zdrowiem 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. - + Czas detonacji min. Losowy czas leży pomiędzy 0 i 5 sekund. Czas min powietrznych będzie ćwiartką tego czasu. Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. - + Średnia ilość min do położenia na mapie średniej wielkości. Ten numer skaluje się z dla innych map. Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. - + Prawdopodobieństwo, że mina będzie niewybuchem. Nie wpływa na miny postawione przez jeże. Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - + Średnia ilość beczek do położenia na mapie średniej wielkości. Ten numer skaluje się z dla innych map. Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - + Średnia ilość min powietrznych do położenia na mapie średniej wielkości. Ten numer skaluje się z dla innych map. Affects the left and right boundaries of the map - + Wpływa na lewą i prawą granicę mapy Time you get after an attack - + Czas, który otrzymujesz po ataku Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. - + Dodatkowy parametr do konfiguracji stylów gry. Znaczenie zależy od użytego stylu, odnieś się do dokumentacji. W razie wątpliwości, pozostaw puste. + + + Name of this scheme + Nazwa tego schematu @@ -1843,12 +2138,36 @@ Pick the mission or training to play - Wybierz misje w którą chcesz zagrać + Wybierz misje w którą chcesz zagrać Start fighting Start + + Pick the training to play + Wybierz trening do rozegrania + + + Pick the challenge to play + Wybierz wyzwanie do rozegrania + + + Pick the scenario to play + Wybierz scenariusz do rozegrania + + + Trainings + Treningi + + + Challenges + Wyzwania + + + Scenarios + Scenariusze + PageVideos @@ -1883,12 +2202,14 @@ Date: %1 - Data: %1 + Data: %1 + Size: %1 - Rozmiar: %1 + Rozmiar: %1 + Date: %1 @@ -1965,6 +2286,10 @@ Show join restricted Pokaż bez możliwości dołączenia + + Delegate room control + Oddeleguj zarządzanie pokojem + QCheckBox @@ -2072,6 +2397,14 @@ Enable translucent tags by default Przezroczystość informacji nad jeżami + + Enable visual effects such as animated menu transitions and falling stars + Włącz efekty wizualne, takie jak animowane menu i spadające gwiazdy + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + Jeśli włączone, Hedgewars dodaje datę i czas w formacie "RRRR-MM-DD_gg-mm" do automatycznie utworzonych demo. + QComboBox @@ -2165,7 +2498,31 @@ Computer (Level %1) - + Komputer (Poziom %1) + + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + Stereoskopia tworzy iluzję głębi, kiedy założysz okulary 3D. + + + 24 FPS + 24 FPS + + + 25 FPS + 25 FPS + + + 30 FPS + 30 FPS + + + 50 FPS + 50 FPS + + + 60 FPS + 60 FPS @@ -2211,7 +2568,7 @@ QLabel Weapons - Uzbrojenie + Bronie Host: @@ -2339,7 +2696,7 @@ Stereo rendering - Wyświetlanie w 3D + Wyświetlanie w 3D Style @@ -2415,7 +2772,7 @@ Bitrate (Kbps) - Bitrate (Kbps) + Bitrate (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2443,7 +2800,7 @@ Send system information - Wyśłij informacje o systemie + Wyślij informacje o systemie Type the security code: @@ -2451,11 +2808,11 @@ Revision - Wersja + Wersja This program is distributed under the %1 - Ten program jest rozpowszechniany na licencji %1 + Ten program jest rozpowszechniany na licencji %1 This setting will be effective at next restart. @@ -2463,7 +2820,7 @@ Tip: %1 - + Porada: %1 Displayed tags above hogs and translucent tags @@ -2475,23 +2832,32 @@ Script parameter - + Parametr skryptu Air Mines - Miny powietrzne + Miny powietrzne Player - + Gracz Barrels - + Beczki % Retreat Time - + % czasu odwrotu + + + Stereoscopy + Stereoskopia + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + Bitrate (Kibit/s) @@ -2508,6 +2874,10 @@ anonymous anonimowy + + unnamed (%1) + nienazwany (%1) + QMainWindow @@ -2537,7 +2907,8 @@ Error while authenticating at google.com: - Błąd logowania na google.com: + Błąd uwierzytelniania na google.com: + Login or password is incorrect @@ -2546,7 +2917,8 @@ Error while sending metadata to youtube.com: - Błąd w trakcie wysyłania danych do Youtube: + Błąd w trakcie wysyłania danych do Youtube: + Teams - Are you sure? @@ -2591,11 +2963,9 @@ Failed to open data directory: %1 - Please check your installation! Nie można otworzyć katalogu z danymi: %1 - Sprawdź poprawność instalacji! @@ -2632,19 +3002,19 @@ Record Play - Error - Nagraj grę - Błąd + Nagraj grę - Błąd Please select record from the list - Wybierz nagranie z listy + Wybierz nagranie z listy Cannot rename to - Nie można zmienić nazwy na + Nie można zmienić nazwy na Cannot delete file - Nie można usunąc pliku + Nie można usunąc pliku Room Name - Error @@ -2770,19 +3140,53 @@ Jesteś pewien, że chcesz rozpocząc grę? Nie wszyscy gracze są gotowi. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. +Current number of hedgehogs: %1 + Przykro nam, w Hedgewars nie można grać z więcej niż 48 jeżami. Spróbuj jeszcze raz z mniejszą liczbą jeży. +Aktualna liczba jeży: %1 + + + Teams - Name already taken + Drużyny - Nazwa już zajęta + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + Nazwa drużyny "%1" jest już zajęta, więc twoja drużyna została przemianowana na "%2". + + + Please select a file from the list. + Wybierz plik z listy. + + + Cannot rename file to %1. + Nie można zmienić nazwy pliku na %1. + + + Cannot delete file %1. + Nie można usunąć pliku %1. + + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + Przykro nam, w Hedgewars nie można grać z więcej niż 48 jeżami. Spróbuj jeszcze raz z mniejszą liczbą jeży. + +Aktualna liczba jeży: %1 + QObject No description available - Brak opisu + Brak opisu QPushButton Go! - Start! + Start! default @@ -2878,7 +3282,7 @@ Upload this video to your Youtube account - Wyślij to wideo na konto Youtube + Wyślij to wideo na konto Youtube Reset @@ -2900,6 +3304,17 @@ Start private server Uruchom prywatny serwer + + Upload this video to your YouTube account + Prześlij to wideo na swoje konto YouTube + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + Podaj bitrate nagranych filmów jako wielokrotność 1024 bitów na sekundę + RoomNamePrompt @@ -2917,7 +3332,7 @@ set password - + ustaw hasło @@ -2932,10 +3347,12 @@ C + Caption of the column for the number of connected clients in the list of rooms Kli T + Caption of the column for the number of teams in the list of rooms Druż @@ -2968,15 +3385,15 @@ Script - + Skrypt Random Perlin - + Losowy Perlin Forts - Forty + Forty @@ -2999,7 +3416,7 @@ Seed - Ziarno + Ziarno @@ -3030,19 +3447,19 @@ New - Nowy + Nowy New (%1) - + Nowy (%1) Copy of %1 - + Kopia %1 Copy of %1 (%2) - + Kopia %1 (%2) @@ -3060,18 +3477,33 @@ The game engine died unexpectedly! (exit code %1) +We are very sorry for the inconvenience :( +If this keeps happening, please click the '%2' button in the main menu! + Silnik gry niespodziewanie umarł! +(kod błędu %1) +Bardzo nam przykro z powodu tej niedogodności. +Jeśli to będzie się powtarzać, wciśnij przycisk "%2" w menu głównym! + + + The game engine died unexpectedly! +(exit code %1) We are very sorry for the inconvenience :( If this keeps happening, please click the '%2' button in the main menu! - + Silnik gry niespodziewanie umarł! +(kod błędu %1) + +Bardzo nam przykro z powodu tej niedogodności. + +Jeśli to będzie się powtarzać, wciśnij przycisk "%2" w menu głównym! TeamSelWidget At least two teams are required to play! - Do rozpoczęcia gry potrzeba dwóch druzyn! + Do rozpoczęcia gry potrzeba co najmniej dwóch drużyn! @@ -3268,16 +3700,21 @@ hedgehog info - informacje o jeżu + informacje o jeżu autocam / find hedgehog - + autokamera / znajdź jeża speed up replay przyśpiesz powtórkę + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + przełącz paski drużyn + binds (categories) @@ -3358,7 +3795,7 @@ Toggle labels above hedgehogs: - Zmień szczegółowość opisów nad jeżami: + Zmień szczegółowość opisów nad jeżami: Record video: @@ -3370,11 +3807,15 @@ Toggle automatic camera / refocus on active hedgehog: - + Przełącz automatyczną kamerę / skup się na aktywnym jeżu: Demo replay: - + Powtórz demo: + + + Heads-up display: + Wyświetl interfejs: @@ -3700,219 +4141,219 @@ server Restricted - + Zabronione Not room master - + Nie jesteś mistrzem pokoju Corrupted hedgehogs info - + Uszkodzone informacje o jeżach too many teams - + zbyt wiele drużyn too many hedgehogs - + zbyt wiele jeży There's already a team with same name in the list - + Na liście jest już drużyna z tą nazwą round in progress - + w trakcie rundy restricted - + zabronione REMOVE_TEAM: no such team - + USUWANIE_DRUŻYNY: nie ma takiej drużyny Not team owner! - + Nie jesteś właścicielem drużyny! Less than two clans! - + Mniej niż dwa klany! Illegal room name - + Niepoprawna nazwa pokoju Room with such name already exists - + Pokój z taką nazwą już istnieje Nickname already chosen - + Nick już wybrany Illegal nickname - + Niepoprawny nick Protocol already known - + Protokół już znany Bad number - + Zły numer Nickname is already in use - + Ten nick jest już zajęty No checker rights - + Brak praw kontrolera Authentication failed - + Uwierzytelnianie się nie powiodło 60 seconds cooldown after kick - + Opóźnienie 60 sekund po wyrzuceniu kicked - + wyrzucony Ping timeout - + Przekroczono czas Pingu bye - + pa No such room - + Nie ma takiego pokoju Room version incompatible to your hedgewars version - + Wersja pokoju niekompatybilna z twoją wersją Hedgewars Joining restricted - + Dołączanie zabronione Registered users only - + Tylko zarejestrowani gracze You are banned in this room - + Jesteś zbanowany w tym pokoju Empty config entry - + Pusty wpis konfiguracjy You already have voted - + Już głosowałeś Voting closed - + Głosowanie zamknięte New voting started - + Nowe głosowanie rozpoczęte Voting expired - + Głosowanie przedawnione kick - + wyrzuć map - + mapa pause - pauza + pauza Reconnected too fast - + Za szybko dołączono ponownie Warning! Chat flood protection activated - + Ostrzeżenie! Ochrona przez zalaniem czatu aktywowana Excess flood - + Nadmierne pisanie Game messages flood detected - 1 - + Wykryto zalanie wiadomościami gry - 1 Warning! Joins flood protection activated - + Ostrzeżenie! Ochrona przez zalaniem dołączeniami aktywowana There's no voting going on - + Nie ma żadnego głosowania w trakcie Your vote counted - + Twój głos został policzony Pause toggled - + Pauza przełączona new seed - + nowe ziarno number of hedgehogs in team - + liczba jeży w drużynie /maxteams: specify number from 2 to 8 - + /maxteams: podaj liczbę od 2 do 8 Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs - + Dostępne komendy callvote: kick <nick>, map <nazwa>, pauza, newseed, hedgehogs callvote kick: specify nickname - + callvote kick: podaj nick callvote kick: no such user - + callvote kick: nie ma takiego użytkownika callvote map: no such map - + callvote map: nie ma takiej mapy callvote pause: no game in progress - + callvote pause: nie trwa żaden mecz callvote hedgehogs: specify number from 1 to 8 - + callvote hedgehogs: podaj liczbę od 1 do 8 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_pt_BR.ts --- a/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Compilador desconhecido + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + Este programa é distribuído sob a %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -74,11 +153,11 @@ Please, specify %1 - Por favor, especifique %1 + Por favor, especifique %1 nickname - apelido + apelido permanent @@ -88,6 +167,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -363,7 +450,7 @@ DefaultTeam - EquipePadrão + EquipePadrão Hedgewars Demo File @@ -465,7 +552,7 @@ This page requires an internet connection. - Esta página exige uma conexão com a Internet. + Esta página exige uma conexão com a Internet. Guest @@ -480,11 +567,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. pt_BR.txt @@ -868,15 +982,16 @@ desconhecido - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -888,6 +1003,20 @@ + MinesTimeSpinBox + + Random + Aleatório + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -951,6 +1080,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + Começar a luta + + + PageConnecting Connecting... @@ -965,12 +1113,28 @@ This page requires an internet connection. - Esta página exige uma conexão à Internet. + Esta página exige uma conexão à Internet. Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1069,6 +1233,47 @@ Random Team Equipe aleatória + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1107,6 +1312,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 morte) (%1 mortes) @@ -1114,14 +1320,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> pensou que era bom atirar na sua própria equipe totalizando <b>%2</b> ponto. <b>%1</b> pensou que era bom atirar na sua própria equipe totalizando <b>%2</b> pontos. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> matou <b>%2</b> dos próprios ouriços. <b>%1</b> matou <b>%2</b> dos próprios ouriços. @@ -1143,6 +1349,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1457,6 +1678,27 @@ Video recording options Opções de gravação de vídeo + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1579,7 +1821,7 @@ Defend your fort and destroy the opponents, two team colours max! - Proteja seu forte e destrua os oponentes, 2 cores de equipes no máximo! + Proteja seu forte e destrua os oponentes, 2 cores de equipes no máximo! Teams will start on opposite sides of the terrain, two team colours max! @@ -1761,6 +2003,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1820,12 +2066,36 @@ Pick the mission or training to play - Escolha uma missão ou treino para jogar + Escolha uma missão ou treino para jogar Start fighting Começar a luta + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1941,6 +2211,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2048,6 +2322,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2143,6 +2425,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2315,7 +2621,7 @@ Stereo rendering - Renderização em estéreo + Renderização em estéreo Style @@ -2387,7 +2693,7 @@ Bitrate (Kbps) - Taxa de bits (kbps) + Taxa de bits (kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2423,11 +2729,11 @@ Revision - Revisão + Revisão This program is distributed under the %1 - Este programa é distribuído sob a %1 + Este programa é distribuído sob a %1 This setting will be effective at next restart. @@ -2465,6 +2771,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2480,6 +2795,10 @@ anonymous anônimo + + unnamed (%1) + + QMainWindow @@ -2578,19 +2897,19 @@ Record Play - Error - Gravação de jogo - Erro + Gravação de jogo - Erro Please select record from the list - Selecione uma gravação da lista + Selecione uma gravação da lista Cannot rename to - Não é possível renomear para + Não é possível renomear para Cannot delete file - Não é possível excluir o arquivo + Não é possível excluir o arquivo Room Name - Error @@ -2715,6 +3034,32 @@ Tem certeza de que deseja iniciar este jogo? Nem todos os jogadores estão prontos. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2727,7 +3072,7 @@ QPushButton Go! - Avançar! + Avançar! default @@ -2823,7 +3168,7 @@ Upload this video to your Youtube account - Enviar este vídeo para sua conta do YouTube + Enviar este vídeo para sua conta do YouTube Reset @@ -2845,6 +3190,17 @@ Start private server Iniciar servidor privado + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2877,10 +3233,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms E @@ -3213,7 +3571,7 @@ hedgehog info - informações do ouriço + informações do ouriço autocam / find hedgehog @@ -3223,6 +3581,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3303,7 +3666,7 @@ Toggle labels above hedgehogs: - Alternar os rótulos sobre os ouriços: + Alternar os rótulos sobre os ouriços: Record video: @@ -3321,6 +3684,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_pt_PT.ts --- a/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Compilador Desconhecido + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + Este programa é distribuído sob a %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -74,11 +153,11 @@ Please, specify %1 - Por favor, especifica %1 + Por favor, especifica %1 nickname - utilizador + utilizador permanent @@ -88,6 +167,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -367,7 +454,7 @@ DefaultTeam - EquipaPorOmissão + EquipaPorOmissão Hedgewars Demo File @@ -469,7 +556,7 @@ This page requires an internet connection. - Esta página requer ligação à internet + Esta página requer ligação à internet Guest @@ -484,11 +571,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. pt_PT.txt @@ -876,15 +990,16 @@ desconhecido - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -896,6 +1011,20 @@ + MinesTimeSpinBox + + Random + Aleatório + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -959,6 +1088,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + Começar a batalha + + + PageConnecting Connecting... @@ -973,12 +1121,28 @@ This page requires an internet connection. - Esta página requer ligação à internet. + Esta página requer ligação à internet. Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1077,6 +1241,47 @@ Random Team Gerar Equipa Aleatória + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1115,6 +1320,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 morto) (%1 mortos) @@ -1122,14 +1328,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> axou que seria divertido atacar a sua própria equipa causando <b>%2</b> ponto de dano. <b>%1</b> axou que seria divertido atacar a sua própria equipa causando um total de <b>%2</b> pontos de dano. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> matou <b>%2</b> ouriço da sua própria equipa. <b>%1</b> matou <b>%2</b> ouriços da sua própria equipa. @@ -1151,6 +1357,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1461,6 +1682,27 @@ Video recording options Opções de criação de vídeo + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1535,7 +1777,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Defende o teu forte e destrói os oponentes, duas cores de equipa no máximo! + Defende o teu forte e destrói os oponentes, duas cores de equipa no máximo! Teams will start on opposite sides of the terrain, two team colours max! @@ -1745,6 +1987,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1804,12 +2050,36 @@ Pick the mission or training to play - Seleciona uma missão ou treino para jogar + Seleciona uma missão ou treino para jogar Start fighting Começar a batalha + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1925,6 +2195,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2032,6 +2306,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2119,6 +2401,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2287,7 +2593,7 @@ Stereo rendering - Renderização estereoscópica + Renderização estereoscópica Style @@ -2359,7 +2665,7 @@ Bitrate (Kbps) - Bitrate (Kbps) + Bitrate (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2395,11 +2701,11 @@ Revision - Revisão + Revisão This program is distributed under the %1 - Este programa é distribuído sob a %1 + Este programa é distribuído sob a %1 This setting will be effective at next restart. @@ -2437,6 +2743,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2452,6 +2767,10 @@ anonymous anónimo + + unnamed (%1) + + QMainWindow @@ -2578,19 +2897,19 @@ Record Play - Error - Record Play - Erro + Record Play - Erro Please select record from the list - Por favor seleciona uma gravação da lista + Por favor seleciona uma gravação da lista Cannot rename to - Não é possível renomear para + Não é possível renomear para Cannot delete file - Não é possível apagar o ficheiro + Não é possível apagar o ficheiro Room Name - Error @@ -2719,6 +3038,32 @@ Tens a certeza que queres iniciar este jogo? Nem todos os jogadores estão prontos. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2763,7 +3108,7 @@ Go! - Começar! + Começar! Play demo @@ -2827,7 +3172,7 @@ Upload this video to your Youtube account - Enviar este vídeo para a tua conta do Youtube + Enviar este vídeo para a tua conta do Youtube Reset @@ -2849,6 +3194,17 @@ Start private server Iniciar o servidor privado + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2881,10 +3237,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms E @@ -3217,7 +3575,7 @@ hedgehog info - informação do ouriço + informação do ouriço autocam / find hedgehog @@ -3227,6 +3585,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3307,7 +3670,7 @@ Toggle labels above hedgehogs: - Alterar as etiquetas acima dos ouriços: + Alterar as etiquetas acima dos ouriços: Record video: @@ -3325,6 +3688,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_ro.ts --- a/share/hedgewars/Data/Locale/hedgewars_ro.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_ro.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -29,6 +100,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -69,14 +148,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -84,6 +155,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -362,7 +441,7 @@ DefaultTeam - Default Team + Default Team Hedgewars Demo File @@ -453,10 +532,6 @@ - This page requires an internet connection. - - - Guest @@ -469,11 +544,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. en.txt @@ -840,15 +942,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -860,6 +963,21 @@ + MinesTimeSpinBox + + Random + Random + + + %1 seconds + + + + + + + + PageAdmin Clear Accounts Cache @@ -923,6 +1041,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -936,13 +1073,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1041,6 +1190,47 @@ Random Team Random Team + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1082,6 +1272,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 kill) (%1 kills) @@ -1089,22 +1280,6 @@ - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - - - - - - - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. - - - - - - - <b>%1</b> was scared and skipped turn <b>%2</b> times. <b>%1</b> was scared and skipped turn <b>%2</b> time. @@ -1122,6 +1297,23 @@ (%1 %2) + 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” + + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1437,6 +1629,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1512,7 +1725,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Defend your fort and destroy the opponents, two team colours max! + Defend your fort and destroy the opponents, two team colours max! Teams will start on opposite sides of the terrain, two team colours max! @@ -1722,6 +1935,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1780,13 +1997,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1893,6 +2130,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2000,6 +2241,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2083,6 +2332,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2250,10 +2523,6 @@ - Stereo rendering - - - Style @@ -2316,10 +2585,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2352,14 +2617,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2395,6 +2652,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2410,6 +2676,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2503,20 +2773,8 @@ Please enter room name - Record Play - Error - - - Please select record from the list - Please select record from the list - - - Cannot rename to - - - - Cannot delete file - + Please select record from the list Room Name - Error @@ -2641,6 +2899,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2685,7 +2969,7 @@ Go! - Go! + Go! Play demo @@ -2744,10 +3028,6 @@ - Upload this video to your Youtube account - - - Cancel uploading @@ -2771,6 +3051,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2803,10 +3094,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -3126,10 +3419,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3137,6 +3426,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3217,7 +3511,7 @@ Toggle labels above hedgehogs: - Toggle labels above hedgehogs: + Toggle labels above hedgehogs: Record video: @@ -3235,6 +3529,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_ru.ts --- a/share/hedgewars/Data/Locale/hedgewars_ru.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_ru.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Неизвестный компилятор + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + Ревизия %1 (%2) + + + Visit our homepage: %1 + Посетите нашу домашнюю страничку: %1 + + + This program is distributed under the %1. + Эта программа распространяется на условиях лицензии %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + Версии зависимостей: + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -31,11 +102,19 @@ New - Новая + Новая Copy of %1 - + Копия %1 + + + New (%1) + Новая (%1) + + + Copy of %1 (%2) + Копия %1 (%2) @@ -78,11 +157,11 @@ Please, specify %1 - Пожалуйста, укажите %1 + Пожалуйста, укажите %1 nickname - псевдоним + псевдоним permanent @@ -92,6 +171,14 @@ Ban player + + Please specify an IP address. + Укажите IP адрес + + + Please specify a nickname. + Укажите псевдоним + DataManager @@ -132,7 +219,7 @@ Feedback - Отзыв + Отзыв @@ -247,7 +334,7 @@ Usage command-line - + Использование OPTION @@ -358,15 +445,15 @@ Chat log - + Журнал разговора Enter chat messages here and send them with [Enter] - + Введите сообщение и отправьте его нажатием клавиши [Ввод] List of players - + Список игроков @@ -377,7 +464,7 @@ DefaultTeam - Команда по умолчанию + Команда по умолчанию Hedgewars Demo File @@ -477,7 +564,7 @@ This page requires an internet connection. - Для этой страницы нужно соединение с интернетом. + Для этой страницы нужно соединение с интернетом. Guest @@ -493,11 +580,38 @@ Эта комната защищена паролем. Пожалуйста, введите пароль: + + Team 1 + Команда 1 + + + Team %1 + Default team name + Команда %1 + + + Computer %1 + Default computer team name + Компьютер %1 + + + Unknown network error (possibly missing SSL library). + Неизвестная ошибка сети (возможно, отсутствует библиотека SSL) + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + Эта возможность требует соединения с интернетом, но вы, похоже, не подключены (номер ошибки %1) + + + Internal error: Reply object is invalid. + Внутренняя ошибка: невалидный ответ + HWGame en.txt + 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. ru.txt @@ -513,14 +627,21 @@ Last two engine messages: %2 - + Произошла фатальная ошибка! - Движку игры пришлось остановить работу . + +Мы очень сожалеем о произошедем :( + +Если это продолжает происходить, нажмите кнопку '%1' в главном меню! + +Последние два сообщения от движка: +%2 HWHostPortDialog Connect to server - + Подключиться к серверу @@ -659,11 +780,11 @@ Forts - + Форты View and edit the seed, the source of randomness in the game - + Просмотр и изменение зерна - источника случайности в игре Randomize the theme @@ -671,7 +792,7 @@ Choose a theme - + Выберите тему Randomize the map, theme and seed @@ -703,7 +824,7 @@ Click to edit - + Нажмите для изменения @@ -802,7 +923,7 @@ New Account - + Новая учётная запись @@ -839,7 +960,7 @@ Choose a hat - + Выберите шапку @@ -881,7 +1002,7 @@ Duration: %1m %2s - Длительность: %1мин %2сек + Длительность: %1мин %2сек Video: %1x%2 @@ -889,6 +1010,15 @@ %1 fps + %1 кадров/сек + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + Длительность: %1 мин %2 сек + + + %1 FPS %1 кадров/сек @@ -900,6 +1030,21 @@ + MinesTimeSpinBox + + Random + Случайно + + + %1 seconds + + %1 секунда + %1 секунды + %1 секунд + + + + PageAdmin Clear Accounts Cache @@ -963,6 +1108,25 @@ + PageCampaign + + Team + Команда + + + Campaign + Кампания + + + Mission + Миссия + + + Start fighting + Начать битву + + + PageConnecting Connecting... @@ -977,12 +1141,28 @@ This page requires an internet connection. - Для этой страницы нужно соединение с интернетом. + Для этой страницы нужно соединение с интернетом. Open packages directory Открыть папку с пакетами + + Load the start page + Загрузить начальную страницу + + + Unknown network error (possibly missing SSL library). + Неизвестная ошибка сети (возможно, отсутствует библиотека SSL). + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + Эта возможность требует соединения с интернетом, но вы, похоже, не подключены (номер ошибки %1). + + + Internal error: Reply object is invalid. + Внутренняя ошибка: невалидный ответ. + PageDrawMap @@ -1081,6 +1261,47 @@ Random Team Случайная команда + + Play a random example of this voice + + + + Random Hats + Случайные шапки + + + Random Names + Случайные имена + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1122,6 +1343,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 убийство) (%1 убийства) @@ -1130,7 +1352,7 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> посчитал нужным подстрелить друзей на <b>%2</b> пункт урона. <b>%1</b> посчитал нужным подстрелить друзей на <b>%2</b> пункта урона. <b>%1</b> посчитал нужным подстрелить друзей на <b>%2</b> пунктов урона. @@ -1138,7 +1360,7 @@ <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> убил <b>%2</b> союзника. <b>%1</b> убил <b>%2</b> союзников. <b>%1</b> убил <b>%2</b> союзников. @@ -1162,6 +1384,23 @@ (%1 %2) + 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” + + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1254,7 +1493,7 @@ Start fighting (requires at least 2 teams) - + Начать битву (требуется по меньшей мере 2 команды) @@ -1281,11 +1520,11 @@ Room name - + Название Update the room name - + Обновить название комнаты Turn on the lightbulb to show the other players when you're ready to fight @@ -1293,7 +1532,7 @@ Start fighting (requires at least 2 teams) - + Начать битву (требуется по меньшей мере 2 команды) @@ -1477,6 +1716,27 @@ Video recording options Настройки видео + + x + 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 + × + + + MISSING LANGUAGE NAME [%1] + + + + Check now + Проверить сейчас + + + Can't delete last team + Нельзя удалять последнюю команду + + + You can't delete the last team! + Нельзя удалять последнюю команду! + PagePlayDemo @@ -1490,15 +1750,15 @@ Play demo - Играть демку + Играть запись Play the selected demo - + Играть выделенную запись Load the selected game - + Загрузить выделенную игру @@ -1600,7 +1860,7 @@ Defend your fort and destroy the opponents, two team colours max! - Защищай свой форт и уничтожай форт оппонента, два цвета команды на карте! + Защищай свой форт и уничтожай форт оппонента, два цвета команды на карте! Teams will start on opposite sides of the terrain, two team colours max! @@ -1716,7 +1976,7 @@ Turn time in seconds - + Время хода в секундах Initial health of hedgehogs @@ -1736,7 +1996,7 @@ Maximum rope length in percent - + Максимальная длина верёвки в процентах Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. @@ -1782,6 +2042,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1841,12 +2105,36 @@ Pick the mission or training to play - Выберите миссию или тренировку + Выберите миссию или тренировку Start fighting Начать битву + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + Сценарии + PageVideos @@ -1963,6 +2251,10 @@ Show join restricted + + Delegate room control + Передать управление комнатой + QCheckBox @@ -2070,6 +2362,14 @@ Enable translucent tags by default Включить прозрачность ярлыков по умолчанию + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2165,6 +2465,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2337,7 +2661,7 @@ Stereo rendering - Стереоизображение + Стереоизображение Style @@ -2412,10 +2736,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2448,14 +2768,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2491,6 +2803,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2506,6 +2827,10 @@ anonymous аноним + + unnamed (%1) + безымянный (%1) + QMainWindow @@ -2599,20 +2924,12 @@ Введите название комнаты - Record Play - Error - - - Please select record from the list - Выберите запись из списка - - - Cannot rename to - + Выберите запись из списка Cannot delete file - Не могу удалить файл + Не могу удалить файл Room Name - Error @@ -2738,6 +3055,32 @@ Вы действительно хотите запустить игру? Не все игроки готовы. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2758,7 +3101,7 @@ Go! - Вперёд! + Вперёд! Start @@ -2834,7 +3177,7 @@ Open the video directory in your system - + Открыть папку с видеозаписями Play this video @@ -2846,7 +3189,7 @@ Upload this video to your Youtube account - Отправить на YouTube + Отправить на YouTube Reset @@ -2868,6 +3211,17 @@ Start private server + + Upload this video to your YouTube account + Отправить на YouTube + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2900,10 +3254,12 @@ C + Caption of the column for the number of connected clients in the list of rooms И T + Caption of the column for the number of teams in the list of rooms К @@ -2944,7 +3300,7 @@ Forts - + Форты @@ -2967,7 +3323,7 @@ Seed - Зерно + Зерно @@ -3002,31 +3358,32 @@ New - Новая + Новая New (%1) - + Новая (%1) Copy of %1 - + Копия %1 Copy of %1 (%2) - + Копия %1 (%2) TCPBase Unable to start server at %1. - + Ошибка запуска сервера %1. Unable to run engine at %1 Error code: %2 - + Ошибка запуска сервера %1 +Код ошибки: %2 The game engine died unexpectedly! @@ -3035,7 +3392,12 @@ We are very sorry for the inconvenience :( If this keeps happening, please click the '%2' button in the main menu! - + Движок игры неожиданно упал! . +(код выхода %1) + +Мы очень сожалеем о произошедем :( + +Если это продолжает происходить, нажмите кнопку '%2' в главном меню! @@ -3068,7 +3430,7 @@ Choose a theme - + Выберите тему @@ -3239,7 +3601,7 @@ hedgehog info - информация о еже + информация о еже autocam / find hedgehog @@ -3249,6 +3611,11 @@ speed up replay ускорить проигрывание + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3329,7 +3696,7 @@ Toggle labels above hedgehogs: - Переключение меток над ежами: + Переключение меток над ежами: Record video: @@ -3347,6 +3714,10 @@ Demo replay: + + Heads-up display: + + binds (keys) @@ -3735,7 +4106,7 @@ Nickname is already in use - + Псевдоним уже используется No checker rights @@ -3743,7 +4114,7 @@ Authentication failed - + Ошибка аутентификации 60 seconds cooldown after kick @@ -3819,7 +4190,7 @@ Reconnected too fast - + Слишком быстрое переподключение Warning! Chat flood protection activated @@ -3843,7 +4214,7 @@ Your vote counted - + Ваш голос учтён Pause toggled diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_sk.ts --- a/share/hedgewars/Data/Locale/hedgewars_sk.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_sk.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -73,14 +152,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -88,6 +159,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -373,7 +452,7 @@ DefaultTeam - VýchodzíTím + VýchodzíTím Hedgewars Demo File @@ -464,10 +543,6 @@ - This page requires an internet connection. - - - Guest @@ -480,11 +555,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. sk.txt @@ -864,15 +966,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -884,6 +987,21 @@ + MinesTimeSpinBox + + Random + Náhodné + + + %1 seconds + + + + + + + + PageAdmin Clear Accounts Cache @@ -947,6 +1065,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + Začať boj + + + PageConnecting Connecting... @@ -960,13 +1097,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1065,6 +1214,47 @@ Random Team Náhodný tím + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1106,6 +1296,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 zabitie) (%1 zabitia) @@ -1114,7 +1305,7 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> sa nazdával, že je vhodné strieľať po svojich a získal tak <b>%2</b> bod. <b>%1</b> sa nazdával, že je vhodné strieľať po svojich a získal tak <b>%2</b> body. <b>%1</b> sa nazdával, že je vhodné strieľať po svojich a získal tak <b>%2</b> bodov. @@ -1122,7 +1313,7 @@ <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> zabil <b>%2</b> svojho druha. <b>%1</b> zabil <b>%2</b> svojich druhov. <b>%1</b> zabil <b>%2</b> svojich druhov. @@ -1146,6 +1337,23 @@ (%1 %2) + 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” + + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1461,6 +1669,27 @@ Video recording options Voľby nahrávania videa + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1580,7 +1809,7 @@ Defend your fort and destroy the opponents, two team colours max! - Ubráňte pevnosť a zničte nepriateľov, maximálne dve tímové farby! + Ubráňte pevnosť a zničte nepriateľov, maximálne dve tímové farby! Teams will start on opposite sides of the terrain, two team colours max! @@ -1762,6 +1991,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1821,12 +2054,36 @@ Pick the mission or training to play - Vyberte si misiu alebo tréning + Vyberte si misiu alebo tréning Start fighting Začať boj + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1933,6 +2190,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2040,6 +2301,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2135,6 +2404,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2307,7 +2600,7 @@ Stereo rendering - Zobrazenie stereo + Zobrazenie stereo Style @@ -2381,7 +2674,7 @@ Bitrate (Kbps) - Bitový tok (Kbps) + Bitový tok (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2416,14 +2709,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2459,6 +2744,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2474,6 +2768,10 @@ anonymous anonymný + + unnamed (%1) + + QMainWindow @@ -2594,19 +2892,19 @@ Record Play - Error - Prehrávanie záznamu - Chyba + Prehrávanie záznamu - Chyba Please select record from the list - Prosím, vyberte záznam zo zoznamu + Prosím, vyberte záznam zo zoznamu Cannot rename to - Nepodarilo sa premenovať na + Nepodarilo sa premenovať na Cannot delete file - Nepodarilo sa vymazať súbor + Nepodarilo sa vymazať súbor Room Name - Error @@ -2731,6 +3029,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2743,7 +3067,7 @@ QPushButton Go! - Choď! + Choď! default @@ -2839,7 +3163,7 @@ Upload this video to your Youtube account - Uploadovať video na váš účet YouTube + Uploadovať video na váš účet YouTube Reset @@ -2861,6 +3185,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2893,10 +3228,12 @@ C + Caption of the column for the number of connected clients in the list of rooms C T + Caption of the column for the number of teams in the list of rooms T @@ -3220,10 +3557,6 @@ nahrať - hedgehog info - - - autocam / find hedgehog @@ -3231,6 +3564,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3311,7 +3649,7 @@ Toggle labels above hedgehogs: - Prepnúť nápisy nad ježkami: + Prepnúť nápisy nad ježkami: Record video: @@ -3329,6 +3667,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_sv.ts --- a/share/hedgewars/Data/Locale/hedgewars_sv.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_sv.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -73,14 +152,6 @@ - Please, specify %1 - - - - nickname - - - permanent @@ -88,6 +159,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -364,7 +443,7 @@ DefaultTeam - Standardlag + Standardlag Hedgewars Demo File @@ -455,10 +534,6 @@ - This page requires an internet connection. - - - Guest @@ -471,11 +546,38 @@ Please, enter the password: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. sv.txt @@ -842,15 +944,16 @@ - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -862,6 +965,20 @@ + MinesTimeSpinBox + + Random + Slumpad + + + %1 seconds + + + + + + + PageAdmin Clear Accounts Cache @@ -925,6 +1042,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + + + + PageConnecting Connecting... @@ -938,13 +1074,25 @@ - This page requires an internet connection. - - - Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1043,6 +1191,47 @@ Random Team Slumpat lag + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1081,6 +1270,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 död) (%1 döda) @@ -1088,14 +1278,14 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> tyckte att det var bra att sjuta sina egna igelkottar med <b>%2</b> poäng. <b>%1</b> tyckte att det var bra att sjuta sina egna igelkottar med <b>%2</b> poäng. <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> dödade <b>%2</b> av sina egna igelkottar. <b>%1</b> dödade <b>%2</b> av sina egna igelkottar. @@ -1117,6 +1307,21 @@ (%1 %2) + 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” + + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1431,6 +1636,27 @@ Video recording options + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1549,7 +1775,7 @@ Defend your fort and destroy the opponents, two team colours max! - Skydda ditt fort och förstör motståndarens, två lagfärger max! + Skydda ditt fort och förstör motståndarens, två lagfärger max! Teams will start on opposite sides of the terrain, two team colours max! @@ -1731,6 +1957,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1789,13 +2019,33 @@ - Pick the mission or training to play - - - Start fighting + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1901,6 +2151,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2008,6 +2262,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2103,6 +2365,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2275,7 +2561,7 @@ Stereo rendering - Stereorendering + Stereorendering Style @@ -2344,10 +2630,6 @@ - Bitrate (Kbps) - - - This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2380,14 +2662,6 @@ - Revision - - - - This program is distributed under the %1 - - - This setting will be effective at next restart. @@ -2423,6 +2697,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2438,6 +2721,10 @@ anonymous + + unnamed (%1) + + QMainWindow @@ -2531,20 +2818,8 @@ Skriv in rummets namn - Record Play - Error - - - Please select record from the list - Välj inspelning från listan - - - Cannot rename to - - - - Cannot delete file - + Välj inspelning från listan Room Name - Error @@ -2668,6 +2943,32 @@ Not all players are ready. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2680,7 +2981,7 @@ QPushButton Go! - Kör! + Kör! default @@ -2775,10 +3076,6 @@ - Upload this video to your Youtube account - - - Reset @@ -2798,6 +3095,17 @@ Start private server + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2830,10 +3138,12 @@ C + Caption of the column for the number of connected clients in the list of rooms A T + Caption of the column for the number of teams in the list of rooms L @@ -3157,10 +3467,6 @@ - hedgehog info - - - autocam / find hedgehog @@ -3168,6 +3474,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3248,7 +3559,7 @@ Toggle labels above hedgehogs: - Visa etiketter över igelkottar: + Visa etiketter över igelkottar: Record video: @@ -3266,6 +3577,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_tr_TR.ts --- a/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Bilinmeyen Derleyici + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + Bu program %1. altında dağıtılmaktadır + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -74,11 +153,11 @@ Please, specify %1 - Lütfen %1 belirtin + Lütfen %1 belirtin nickname - takmaad + takmaad permanent @@ -88,6 +167,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -373,7 +460,7 @@ DefaultTeam - VarsayılanTakım + VarsayılanTakım Hedgewars Demo File @@ -486,7 +573,29 @@ - This page requires an internet connection. + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. @@ -494,6 +603,7 @@ HWGame en.txt + 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. tr.txt @@ -881,15 +991,16 @@ bilinmiyor - Duration: %1m %2s - - - Video: %1x%2 - %1 fps + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS @@ -901,6 +1012,19 @@ + MinesTimeSpinBox + + Random + Rastgele + + + %1 seconds + + + + + + PageAdmin Clear Accounts Cache @@ -964,6 +1088,25 @@ + PageCampaign + + Team + + + + Campaign + + + + Mission + + + + Start fighting + Dövüşe başla + + + PageConnecting Connecting... @@ -981,7 +1124,19 @@ - This page requires an internet connection. + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. @@ -1082,6 +1237,47 @@ Random Team Rastgele Takım + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1117,19 +1313,20 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 öldürme) <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> kendi kirpilerini <b>%2</b> puanla vurmanın güzel olduğunu düşündü <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> kendi <b>%2</b> kirpisini öldürdü @@ -1149,6 +1346,19 @@ (%1 %2) + 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” + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1462,6 +1672,27 @@ Video recording options Video kayıt seçenekleri + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1543,7 +1774,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Kaleni koru ve düşmanları yok et, en fazla iki takım rengi! + Kaleni koru ve düşmanları yok et, en fazla iki takım rengi! Teams will start on opposite sides of the terrain, two team colours max! @@ -1753,6 +1984,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1812,12 +2047,36 @@ Pick the mission or training to play - Oynamak üzere bir görev veya eğitim seç + Oynamak üzere bir görev veya eğitim seç Start fighting Dövüşe başla + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1936,6 +2195,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2043,6 +2306,14 @@ Enable translucent tags by default + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2130,6 +2401,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2302,7 +2597,7 @@ Stereo rendering - Stereo hazırlama + Stereo hazırlama Style @@ -2374,7 +2669,7 @@ Bitrate (Kbps) - Bit oranı (Kbps) + Bit oranı (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2410,11 +2705,11 @@ Revision - Gözden Geçirme + Gözden Geçirme This program is distributed under the %1 - Bu program %1 altında dağıtılmaktadır + Bu program %1 altında dağıtılmaktadır This setting will be effective at next restart. @@ -2452,6 +2747,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2467,6 +2771,10 @@ anonymous anonim + + unnamed (%1) + + QMainWindow @@ -2587,19 +2895,19 @@ Record Play - Error - Oyunu Kaydet - Hata + Oyunu Kaydet - Hata Please select record from the list - Lütfen listeden kaydı seç + Lütfen listeden kaydı seç Cannot rename to - Adlandırma başarısız: + Adlandırma başarısız: Cannot delete file - Dosya silinemedi: + Dosya silinemedi: Room Name - Error @@ -2727,6 +3035,32 @@ Oyunu başlatmak istiyor musunuz? Tüm oyuncular hazır değil. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2771,7 +3105,7 @@ Go! - Hadi! + Hadi! Play demo @@ -2835,7 +3169,7 @@ Upload this video to your Youtube account - Bu videoyu Youtube hesabıma yükle + Bu videoyu Youtube hesabıma yükle Reset @@ -2861,6 +3195,17 @@ Click to copy your unique server URL to your clipboard. Send this link to your friends and they will be able to join you. + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2893,10 +3238,12 @@ C + Caption of the column for the number of connected clients in the list of rooms K T + Caption of the column for the number of teams in the list of rooms T @@ -3229,7 +3576,7 @@ hedgehog info - kirpi bilgisi + kirpi bilgisi autocam / find hedgehog @@ -3239,6 +3586,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3319,7 +3671,7 @@ Toggle labels above hedgehogs: - Kirpilerin üzerindeki etiketleri aç/kapat + Kirpilerin üzerindeki etiketleri aç/kapat Record video: @@ -3337,6 +3689,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_uk.ts --- a/share/hedgewars/Data/Locale/hedgewars_uk.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_uk.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler Невідомий компілятор + + Hedgewars %1 + %1 contains Hedgewars' version number + Hedgewars %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + Ця програма поширюється згідно з %1. + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -74,11 +153,11 @@ Please, specify %1 - Будь ласка, вкажіть %1 + Будь ласка, вкажіть %1 nickname - ім'я + ім'я permanent @@ -88,6 +167,14 @@ Ban player + + Please specify an IP address. + + + + Please specify a nickname. + + DataManager @@ -373,7 +460,7 @@ DefaultTeam - Команда за замовчуванням + Команда за замовчуванням Hedgewars Demo File @@ -475,7 +562,7 @@ This page requires an internet connection. - Сторінка потребує з'єднання з інтернетом. + Сторінка потребує з'єднання з інтернетом. Guest @@ -491,11 +578,38 @@ Кімната захищена паролем. Будь ласка, введіть пароль: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. uk.txt @@ -866,7 +980,7 @@ Duration: %1m %2s - Тривалість: %1хв %2с + Тривалість: %1хв %2с Video: %1x%2 @@ -874,7 +988,16 @@ %1 fps - %1 fps + %1 fps + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS + @@ -885,6 +1008,21 @@ + MinesTimeSpinBox + + Random + + + + %1 seconds + + + + + + + + PageAdmin Clear Accounts Cache @@ -948,6 +1086,25 @@ + PageCampaign + + Team + Команда + + + Campaign + + + + Mission + + + + Start fighting + Розпочати бій + + + PageConnecting Connecting... @@ -962,12 +1119,28 @@ This page requires an internet connection. - Ця сторінка потребує з'єднання з інтернетом. + Ця сторінка потребує з'єднання з інтернетом. Open packages directory + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1066,6 +1239,47 @@ Random Team Випадкова Команда + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1107,6 +1321,7 @@ (%1 kill) + Number of kills in stats screen, written after the team name (%1 вбивство) (%1 вбивства) @@ -1115,7 +1330,7 @@ <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b> обстріляв напарників на <b>%2</b> пункт нанесених втрат. <b>%1</b> обстріляв напарників на <b>%2</b> пункти нанесених втрат. <b>%1</b> обстріляв напарників на <b>%2</b> пунктів нанесених втрат. @@ -1123,7 +1338,7 @@ <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b> вбив <b>%2</b> їжака зі своєї команди. <b>%1</b> вбив <b>%2</b> їжаків зі своєї команди. <b>%1</b> вбив <b>%2</b> їжаків зі своєї команди. @@ -1147,12 +1362,29 @@ (%1 %2) + 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” (%1 %2) + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. + + + + + + PageInGame @@ -1462,6 +1694,27 @@ Video recording options Параметри запису відео + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1553,7 +1806,7 @@ PageScheme Defend your fort and destroy the opponents, two team colours max! - Захисти свій форт та знищ суперників, команди максимум двох кольорів! + Захисти свій форт та знищ суперників, команди максимум двох кольорів! Teams will start on opposite sides of the terrain, two team colours max! @@ -1763,6 +2016,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1822,12 +2079,36 @@ Pick the mission or training to play - Виберіть місію або навчання для гри + Виберіть місію або навчання для гри Start fighting Розпочати бій + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1934,6 +2215,10 @@ Show join restricted + + Delegate room control + + QCheckBox @@ -2041,6 +2326,14 @@ Enable translucent tags by default Ввімкнути напівпрозорі теги + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2136,6 +2429,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2308,7 +2625,7 @@ Stereo rendering - Стерео рендеринг + Стерео рендеринг Style @@ -2380,7 +2697,7 @@ Bitrate (Kbps) - Бітрейт (Kbps) + Бітрейт (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2416,11 +2733,11 @@ Revision - Ревізія + Ревізія This program is distributed under the %1 - Ця програма поширюється згідно з %1 + Ця програма поширюється згідно з %1 This setting will be effective at next restart. @@ -2458,6 +2775,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2473,6 +2799,10 @@ anonymous анонімус + + unnamed (%1) + + QMainWindow @@ -2569,19 +2899,19 @@ Record Play - Error - Відтворення запису - Помилка + Відтворення запису - Помилка Please select record from the list - Виберіть запис зі списку + Виберіть запис зі списку Cannot rename to - Неможливо перейменувати на + Неможливо перейменувати на Cannot delete file - Неможливо видалити файл + Неможливо видалити файл Room Name - Error @@ -2707,6 +3037,32 @@ Ви дійсно хочете розпочати цю гру? Не всі гравці готові. + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2751,7 +3107,7 @@ Go! - Вперед! + Вперед! Play demo @@ -2815,7 +3171,7 @@ Upload this video to your Youtube account - Відіслати це відео на ваш акаунт Youtube + Відіслати це відео на ваш акаунт Youtube Reset @@ -2837,6 +3193,17 @@ Start private server Запутити приватний сервер + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2869,10 +3236,12 @@ C + Caption of the column for the number of connected clients in the list of rooms Кл T + Caption of the column for the number of teams in the list of rooms Км @@ -3198,7 +3567,7 @@ hedgehog info - про їжака + про їжака autocam / find hedgehog @@ -3208,6 +3577,11 @@ speed up replay + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3288,7 +3662,7 @@ Toggle labels above hedgehogs: - Перемикання надписів над їжаками: + Перемикання надписів над їжаками: Record video: @@ -3306,6 +3680,10 @@ Demo replay: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_zh_CN.ts --- a/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,13 +1,101 @@ - + About - + + Hedgewars %1 + %1 contains Hedgewars' version number + 刺猬大作战 %1 + + + + Revision %1 (%2) + + + + + Visit our homepage: %1 + + + + + This program is distributed under the %1. + + + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + Unknown Compiler + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -24,15 +112,25 @@ - + New 新游戏 - + + New (%1) + + + + Copy of %1 + + + Copy of %1 (%2) + + BanDialog @@ -43,7 +141,6 @@ - IP IP @@ -88,25 +185,25 @@ - + + Please specify an IP address. + + + + + Please specify a nickname. + + + + Warning - - - Please, specify %1 - - - - - nickname - - DataManager - + Use Default @@ -149,7 +246,7 @@ 取消 - + Send Feedback @@ -253,67 +350,67 @@ - + Cannot create directory %1 - - Usage - command-line - - - - - OPTION - command-line - - - - - - CONNECTSTRING - command-line - - - - - Options - command-line - - - - - Display this help - command-line - - - - Custom path for configuration data and user data + Usage command-line - Custom path to the game data folder + OPTION command-line + + CONNECTSTRING + command-line + + + + + Options + command-line + + + + + Display this help + command-line + + + + + Custom path for configuration data and user data + command-line + + + + + Custom path to the game data folder + command-line + + + + Hedgewars can use a %1 (e.g. "%2") to connect on start. command-line - + Malformed option argument: %1 command-line - + Unknown option argument: %1 command-line @@ -353,67 +450,67 @@ - + %1 has joined - + %1 has left - + %1 has left (%2) - + %1 has been removed from your ignore list - + %1 has been added to your ignore list - + %1 has been removed from your friends list - + %1 has been added to your friends list - + Stylesheet imported from %1 - + Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset! - + Couldn't read %1 - + StyleSheet discarded - + StyleSheet saved to %1 - + Failed to save StyleSheet to %1 @@ -421,35 +518,47 @@ HWForm - - - - + + + + Guest - - DefaultTeam - - - - + + Team 1 + + + + %1's Team - + + Team %1 + Default team name + + + + + Computer %1 + Default computer team name + + + + Game aborted - + Hedgewars - Nick registered - + This nick is registered, and you haven't specified a password. If this nick isn't yours, please register your own nick at www.hedgewars.org @@ -458,109 +567,119 @@ - + Your nickname is not registered. To prevent someone else from using it, please register it at www.hedgewars.org - + Your password wasn't saved either. - + Nickname - + Someone already uses your nickname %1 on the server. Please pick another nickname: - - + + No nickname supplied. - - + + Hedgewars - Empty nickname - + Hedgewars - Wrong password - + You entered a wrong password. - + Room password - + The room is protected with password. Please, enter the password: - + Try Again - + Hedgewars - Connection error - + You reconnected too fast. Please wait a few seconds and try again. - + Hedgewars Demo File File Types - + Hedgewars Save File File Types - + Demo name - + Demo name: - - This page requires an internet connection. - - - - - + + Unknown network error (possibly missing SSL library). + + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + + Internal error: Reply object is invalid. + + + + + Cannot save record to file %1 无法录入文件 %1 @@ -568,7 +687,7 @@ HWGame - + A Fatal ERROR occured! - The game engine had to stop. We are very sorry for the inconvenience :( @@ -580,13 +699,14 @@ - + en.txt + 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. zh_CN.txt - + Cannot open demofile %1 DEMO %1 打不开 @@ -895,7 +1015,7 @@ - + Quit reason: 退出原因: @@ -995,7 +1115,7 @@ KeyBinder - + Category @@ -1003,27 +1123,28 @@ LibavInteraction - - Duration: %1m %2s - - - - + Video: %1x%2 - - %1 fps - - - - + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + + %1 FPS + + + + Audio: - + unknown @@ -1031,12 +1152,27 @@ MapModel - + No description available. + MinesTimeSpinBox + + + Random + + + + + %1 seconds + + + + + + PageAdmin @@ -1115,6 +1251,30 @@ + PageCampaign + + + + Start fighting + + + + + Team + + + + + Campaign + + + + + Mission + + + + PageConnecting @@ -1125,18 +1285,33 @@ PageDataDownload - + + Load the start page + + + + Open packages directory - + Loading, please wait. - - This page requires an internet connection. + + Unknown network error (possibly missing SSL library). + + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + + Internal error: Reply object is invalid. @@ -1213,55 +1388,106 @@ PageEditTeam - + Select an action to choose a custom key bind for this team - + Use my default - + Reset all binds - - General - 常规 - - + General + 常规 + + + Custom Controls - - Hat - - - + Hat + + + + Name - + This hedgehog's name - + Randomize this hedgehog's name - + + Random Hats + + + + + Random Names + + + + Random Team + + + Randomize the team name + + + + + Randomize the grave + + + + + Randomize the flag + + + + + Play a random example of this voice + + + + + Randomize the voice + + + + + Randomize the fort + + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + + %1 (%2) + + PageGameStats @@ -1272,7 +1498,7 @@ - + Health graph @@ -1292,56 +1518,58 @@ 保存 - + The best shot award was won by <b>%1</b> with <b>%2</b> pts. - + The best killer is <b>%1</b> with <b>%2</b> kills in a turn. - + A total of <b>%1</b> hedgehog(s) were killed during this round. - + (%1 kill) + Number of kills in stats screen, written after the team name - + (%1 %2) + 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” - - <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. - - <b>%1</b> killed <b>%2</b> of his own hedgehogs. + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. - + <b>%1</b> was scared and skipped turn <b>%2</b> times. @@ -1440,17 +1668,17 @@ PageMultiplayer - + Edit game preferences - + Start 开始 - + Start fighting (requires at least 2 teams) @@ -1518,216 +1746,243 @@ PageOptions - + Select an action to change what key controls it - + Reset to default - + Reset all binds - - + + Game - + Graphics - + Audio - + Controls - + Video Recording - + Network - + Advanced 进阶 - + Teams 队伍 - + New team 新队伍 - + Edit team 修改队伍设定 - + Delete team - + You can't edit teams from team selection. Go back to main menu to add, edit or delete teams. - + Schemes - + New scheme - + Edit scheme - + Delete scheme - + Weapons 武器 - + New weapon set - + Edit weapon set - + Delete weapon set - + + + x + 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 + + + + Frontend - + Custom colors - + Reset to default colors - + Game audio - + Frontend audio - + Account - + Proxy settings - + Proxy host - + Proxy port - + Proxy login - + Proxy password - + No proxy - + System proxy settings - + Socks5 proxy - + HTTP proxy - + Miscellaneous - + + MISSING LANGUAGE NAME [%1] + + + + Updates - + Check for updates - + + Check now + + + + Video recording options + + + Can't delete last team + + + + + You can't delete the last team! + + PagePlayDemo @@ -1780,7 +2035,7 @@ - + Open server administration page @@ -1793,7 +2048,7 @@ 加入 - + %1 players online @@ -1808,252 +2063,252 @@ PageScheme - - Defend your fort and destroy the opponents, two team colours max! + + Land can not be destroyed! + + + + + Add an indestructible border around the terrain - Land can not be destroyed! - - - - - Add an indestructible border around the terrain - - - - Lower gravity + + Assisted aiming with laser sight + + + + + All hogs have a personal forcefield + + + + + All (living) hedgehogs are fully restored at the end of turn + + + + + Gain 80% of the damage you do back in health + + + + + Share your opponents pain, share their damage + + + + + Your hogs are unable to move, put your artillery skills to the test + + + - Assisted aiming with laser sight - - - - - All hogs have a personal forcefield - - - - - All (living) hedgehogs are fully restored at the end of turn - - - - - Gain 80% of the damage you do back in health - - - - - Share your opponents pain, share their damage - - - - - Your hogs are unable to move, put your artillery skills to the test + Order of play is random instead of in room order. + + + + + Play with a King. If he dies, your side dies. - Order of play is random instead of in room order. - - - - - Play with a King. If he dies, your side dies. - - - - Take turns placing your hedgehogs before the start of play. - + Ammo is shared between all teams that share a colour. + + Disable girders when generating random maps. + + + - Disable girders when generating random maps. - - - - Disable land objects when generating random maps. - + AI respawns on death. - - Attacking does not end your turn. - - - + Attacking does not end your turn. + + + + Weapons are reset to starting values each turn. - + Each hedgehog has its own ammo. It does not share with the team. + + You will not have to worry about wind anymore. + + + - You will not have to worry about wind anymore. - - - - Wind will affect almost everything. - - Teams in each clan take successive turns sharing their turn time. - - - - - Add an indestructible border along the bottom - - - + Teams in each clan take successive turns sharing their turn time. + + + + + Add an indestructible border along the bottom + + + + Each clan starts in its own part of the terrain. + + Overall damage and knockback in percent + + + + + Turn time in seconds + + + + + Initial health of hedgehogs + + + + + How many rounds have to be played before Sudden Death begins + + + - Overall damage and knockback in percent + How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. - Turn time in seconds + 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. - Initial health of hedgehogs + Maximum rope length in percent - How many rounds have to be played before Sudden Death begins + Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. - How much the water rises per turn while in Sudden Death. Set to 0 along with Sudden Death Health Decrease to disable Sudden Death. + Likelihood of a crate dropping before a turn - 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. + Health bonus for collecting a health crate - Maximum rope length in percent + 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. - Likelihood of a dropped crate being a health crate. All other crates will be weapon or utility crates. + Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. - Likelihood of a crate dropping before a turn + Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. - Health bonus for collecting a health crate + Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - 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. + Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - Average number of mines to be placed a medium-sized island map. This number will be scaled for other maps. + Affects the left and right boundaries of the map - Likelihood of a mine being a dud. Does not affect mines placed by hedgehogs. + Time you get after an attack - Average number of barrels to be placed a medium-sized island map. This number will be scaled for other maps. - - - - - Average number of air mines to be placed a medium-sized island map. This number will be scaled for other maps. - - - - - Affects the left and right boundaries of the map - - - - - Time you get after an attack - - - - Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. - + None (Default) - + Wrap (World wraps) - + Bounce (Edges reflect) - + Sea (Edges connect to sea) - + + Name of this scheme + + + + Copy - + New 新游戏 - + Delete 删除 @@ -2117,22 +2372,48 @@ PageTraining - - Pick the mission or training to play + + Pick the training to play + + + + + Pick the challenge to play + Pick the scenario to play + + + + + Trainings + + + + + Challenges + + + + + Scenarios + + + + + Start fighting - + No description available - + Select a mission! @@ -2220,28 +2501,33 @@ - Follow + Delegate room control - - Ignore + Follow - + + Ignore + + + + + Add friend - + Unignore - + Remove friend @@ -2269,115 +2555,125 @@ QCheckBox - + Fullscreen 游戏全屏幕 - + Show FPS 显示帧率 (FPS) - + Alternative damage show 另一种伤害显示方式 - + Team - - Enable team tags by default - - - + Enable team tags by default + + + + Hog - - Enable hedgehog tags by default - - - + Enable hedgehog tags by default + + + + Health - - Enable health tags by default - - - + Enable health tags by default + + + + Translucent - + Enable translucent tags by default - + Visual effects - - + + Enable visual effects such as animated menu transitions and falling stars + + + + + Sound - + In-game sound effects - - + + Music - + In-game music - + Frontend sound effects - + Frontend music - + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + + + Check for updates at startup - + Show ammo menu tooltips - + Append date and time to record file name 记录名称中包含具体时间日期 - + Save password @@ -2392,12 +2688,12 @@ - + Record audio - + Use game resolution @@ -2405,17 +2701,17 @@ QComboBox - + Human 玩家 - + Computer (Level %1) - + Community @@ -2424,82 +2720,112 @@ Lv 级别 - + (System default) - + Disabled - Red/Cyan - - - - - Cyan/Red - - - - - Red/Blue + Stereoscopy creates an illusion of depth when you wear 3D glasses. - Blue/Red + Red/Cyan - Red/Green + Cyan/Red + Red/Blue + + + + + Blue/Red + + + + + Red/Green + + + + Green/Red + + Side-by-side + + + + + Top-Bottom + + + + + 24 FPS + + + + + 25 FPS + + + + + 30 FPS + + + + + 50 FPS + + + + + 60 FPS + + + + + Red/Cyan grayscale + + + + + Cyan/Red grayscale + + + + + Red/Blue grayscale + + + - Side-by-side + Blue/Red grayscale - Top-Bottom - - - - - Red/Cyan grayscale - - - - - Cyan/Red grayscale - - - - - Red/Blue grayscale - - - - - Blue/Red grayscale - - - - Red/Green grayscale - + Green/Red grayscale @@ -2507,22 +2833,22 @@ QGroupBox - + Team Members 成员 - + Team Settings - + Fort 城堡模式 - + Playing teams 玩家队伍 @@ -2555,71 +2881,67 @@ QLabel - + Locale - + Nickname - + + Stereoscopy + + + + Displayed tags above hogs and translucent tags - + This setting will be effective at next restart. - + Resolution 分辨率 - + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + + + Quality - + Fullscreen 游戏全屏幕 - + Fullscreen Resolution - + Windowed Resolution - - Stereo rendering - - - - + FPS limit FPS 上限 - - Revision - - - - - This program is distributed under the %1 - - - Server name: 服务器名: @@ -2649,102 +2971,102 @@ 版本 - + Initial sound volume 初始音量 - + Damage Modifier 伤害修改 - + Turn Time 回合时间 - + Initial Health 初始生命值 - + Sudden Death Timeout 死亡模式倒计时 - + Sudden Death Water Rise - + Sudden Death Health Decrease - + % Rope Length - + % Health Crates - + Health in Crates - + Mines Time - + Mines - + % Dud Mines - + Barrels - + % Retreat Time - + Air Mines - + World Edge - + Script parameter - + Scheme Name: 设置名称: - + Crate Drops 箱子降落 @@ -2786,27 +3108,27 @@ - + Name - + Player - + Grave - + Flag - + Voice @@ -2847,31 +3169,26 @@ - + Format - + Audio codec - + Video codec - + Framerate - - Bitrate (Kbps) - - - Style @@ -2885,18 +3202,23 @@ QLineEdit - + unnamed 无名 + + unnamed (%1) + + + - + hedgehog %1 - + anonymous @@ -2912,102 +3234,139 @@ QMessageBox + + + + Error 错误 + + + Please select a file from the list. + + + + + Cannot rename file to %1. + + + + + Cannot delete file %1. + + + Cannot use the ammo '%1'! - + Teams - Are you sure? - + Do you really want to delete the team '%1'? - - + + Teams - Name already taken + + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + + Cannot delete default scheme '%1'! - + Please select a record from the list - + Hedgewars - Nick not registered - + Unable to start server - + Connection to server is lost 服务器连接丢失 - + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Not all players are ready - + Are you sure you want to start this game? Not all players are ready. - + Hedgewars - Error - + System Information Preview - - + + Failed to generate captcha - + Failed to download captcha - + Please fill out all fields. Email is optional. - - + + Hedgewars - Success - + All file associations have been set - + File association failed. @@ -3051,62 +3410,38 @@ - - - - - Record Play - Error - - - - - - Please select record from the list - - - - - Cannot rename to - - - - - Cannot delete file - - - - + Room Name - Error - + Please select room from the list - - Room Name - Are you sure? - - - + Room Name - Are you sure? + + + + The game you are trying to join has started. Do you still want to join the room? - + Schemes - Warning - + Schemes - Are you sure? - + Do you really want to delete the game scheme '%1'? @@ -3153,28 +3488,28 @@ - - + + Weapons - Warning - + Cannot overwrite default weapon set '%1'! - + Cannot delete default weapon set '%1'! - + Weapons - Are you sure? - + Do you really want to delete the weapon set '%1'? @@ -3192,8 +3527,8 @@ QObject - - + + No description available @@ -3211,10 +3546,8 @@ 连接 - - Go! - 上场! + 上场! @@ -3237,7 +3570,9 @@ + + Start 开始 @@ -3300,17 +3635,17 @@ - + Associate file extensions - + Set default options - + Restore default coding parameters @@ -3348,7 +3683,7 @@ - Upload this video to your Youtube account + Upload this video to your YouTube account @@ -3358,6 +3693,14 @@ + QSpinBox + + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + + + RoomNamePrompt @@ -3384,72 +3727,74 @@ RoomsListModel - + In progress - + Room Name C - - - - - T + Caption of the column for the number of connected clients in the list of rooms - Owner + T + Caption of the column for the number of teams in the list of rooms - Map - 地图 + Owner + - Script - + Map + 地图 - Rules + Script + Rules + + + + Weapons 武器 - - Random Map - - - - Random Maze + Random Map - Random Perlin + Random Maze - Hand-drawn + Random Perlin + Hand-drawn + + + + Forts @@ -3505,22 +3850,22 @@ - + New 新游戏 - + New (%1) - + Copy of %1 - + Copy of %1 (%2) @@ -3556,7 +3901,7 @@ TeamSelWidget - + At least two teams are required to play! @@ -3731,12 +4076,13 @@ - - hedgehog info - - - - + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + + + record @@ -3916,12 +4262,12 @@ - - Toggle labels above hedgehogs: - - - - + + Heads-up display: + + + + Record video: @@ -4284,7 +4630,7 @@ - + Keyboard @@ -4384,57 +4730,57 @@ - + You already have voted - + Your vote counted - + Voting closed - + Pause toggled - + New voting started - + Voting expired - + kick - + map - + pause 暂停 - + new seed - + number of hedgehogs in team @@ -4484,112 +4830,112 @@ + + Nickname already chosen + + + + + Illegal nickname + + + + + Protocol already known + + + + + Bad number + + + + + Nickname is already in use + + + + + No checker rights + + + + + Authentication failed + + + + + 60 seconds cooldown after kick + + + + + kicked + + + + + Reconnected too fast + + + + + Ping timeout + + + + + bye + + + - Nickname already chosen + No such room - Illegal nickname + Room version incompatible to your hedgewars version - Protocol already known + Joining restricted - Bad number + Registered users only - Nickname is already in use - - - - - No checker rights - - - - - Authentication failed - - - - - 60 seconds cooldown after kick - - - - - kicked + You are banned in this room + + + + + Warning! Chat flood protection activated + + + + + Excess flood + + + + + Game messages flood detected - 1 + + + + + Warning! Joins flood protection activated - Reconnected too fast - - - - - Ping timeout - - - - - bye - - - - - No such room - - - - - Room version incompatible to your hedgewars version - - - - - Joining restricted - - - - - Registered users only - - - - - You are banned in this room - - - - - Warning! Chat flood protection activated - - - - - Excess flood - - - - - Game messages flood detected - 1 - - - - - Warning! Joins flood protection activated - - - - There's no voting going on diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hedgewars_zh_TW.ts --- a/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts Sun Dec 17 00:09:24 2017 +0100 @@ -1,12 +1,83 @@ - + About Unknown Compiler 未知的編譯器 + + Hedgewars %1 + %1 contains Hedgewars' version number + 刺蝟大作戰 %1 + + + Revision %1 (%2) + + + + Visit our homepage: %1 + + + + This program is distributed under the %1. + 此程序使用%1.釋出 + + + GNU GPL v2 + Short for “GNU General Public License version 2” + + + + Dependency versions: + For the version numbers of Hedgewars' software dependencies + + + + <a href="https://gcc.gnu.org">GCC</a>: %1 + + + + <a href="https://www.libsdl.org/">SDL2</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_mixer</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_net</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_image</a>: %1.%2.%3 + + + + <a href="https://www.libsdl.org/">SDL2_ttf</a>: %1.%2.%3 + + + + <a href="https://www.qt.io/developers/">Qt</a>: %1 + + + + <a href="https://libav.org">libavcodec</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavformat</a>: %1.%2.%3 + + + + <a href="https://libav.org">libavutil</a>: %1.%2.%3 + + + + <a href="https://icculus.org/physfs/">PhysFS</a>: %1.%2.%3 + + AbstractPage @@ -33,6 +104,14 @@ Copy of %1 + + New (%1) + + + + Copy of %1 (%2) + + BanDialog @@ -74,11 +153,11 @@ Please, specify %1 - 請指定%1 + 請指定%1 nickname - 暱稱 + 暱稱 permanent @@ -86,6 +165,14 @@ Ban player + 封鎖玩家 + + + Please specify an IP address. + + + + Please specify a nickname. @@ -260,7 +347,7 @@ Hedgewars can use a %1 (e.g. "%2") to connect on start. command-line - 啟動刺蝟大作戰能使用%1(例如 "%2")來連線 + 啟動刺蝟大作戰能使用%1(例如 "%2")來連線。 Malformed option argument: %1 @@ -355,7 +442,7 @@ DefaultTeam - 預設隊伍 + 預設隊伍 Hedgewars Demo File @@ -453,7 +540,7 @@ This page requires an internet connection. - 此頁面需要連接網際網路。 + 此頁面需要連接網際網路。 Guest @@ -469,11 +556,38 @@ 房間使用密碼保護 請輸入密碼: + + Team 1 + + + + Team %1 + Default team name + + + + Computer %1 + Default computer team name + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + HWGame en.txt + 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. zh_TW.txt @@ -500,7 +614,7 @@ HWHostPortDialog Connect to server - + 連線到伺服器 @@ -651,7 +765,7 @@ Choose a theme - + 選擇一個主題 Randomize the map, theme and seed @@ -769,7 +883,7 @@ just enter your nickname. 要連接到伺服器,請登錄。 -如果你在www.hedgewars.org沒有一個的帳號, +如果你在www.hedgewars.org沒有一個的帳戶, 只需輸入你的暱稱。 @@ -782,7 +896,7 @@ New Account - + 新帳戶 @@ -819,7 +933,7 @@ Choose a hat - + 選擇一頂帽子 @@ -848,7 +962,7 @@ Duration: %1m %2s - 持續時間:%1分 %2秒 + 持續時間:%1分 %2秒 Video: %1x%2 @@ -856,7 +970,16 @@ %1 fps - %1 FPS + %1 FPS + + + Duration: %1min %2s + Duration in minutes and seconds (SI units) + + + + %1 FPS + @@ -867,6 +990,19 @@ + MinesTimeSpinBox + + Random + 隨機 + + + %1 seconds + + + + + + PageAdmin Clear Accounts Cache @@ -930,6 +1066,25 @@ + PageCampaign + + Team + 隊伍 + + + Campaign + + + + Mission + + + + Start fighting + 開始戰鬥 + + + PageConnecting Connecting... @@ -944,12 +1099,28 @@ This page requires an internet connection. - 此頁面需要連接網際網路。 + 此頁面需要連接網際網路。 Open packages directory 打開組件目錄 + + Load the start page + + + + Unknown network error (possibly missing SSL library). + + + + This feature requires an Internet connection, but you don't appear to be online (error code: %1). + + + + Internal error: Reply object is invalid. + + PageDrawMap @@ -1048,6 +1219,47 @@ Random Team 隨機隊伍分配 + + Play a random example of this voice + + + + Random Hats + + + + Random Names + + + + Randomize the team name + + + + Randomize the grave + + + + Randomize the flag + + + + Randomize the voice + + + + Randomize the fort + + + + CPU %1 + Name of a flag for computer-controlled enemies. %1 is replaced with the computer level + + + + %1 (%2) + + PageGameStats @@ -1057,7 +1269,7 @@ Health graph - 生命圖 + 生命走勢 Ranking @@ -1066,7 +1278,7 @@ The best shot award was won by <b>%1</b> with <b>%2</b> pts. - <b>%1%n</b>的<b>%2</b>傷害獲得最佳攻擊獎。 + <b>%1</b>的<b>%2</b>傷害獲得最佳攻擊獎。 @@ -1083,19 +1295,20 @@ (%1 kill) + Number of kills in stats screen, written after the team name <b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts. - + <b>%1</b>認為攻擊自己的刺猬<b>%2</b>傷害是很好的。 <b>%1</b> killed <b>%2</b> of his own hedgehogs. - + <b>%1</b>殺了<b>%2</b>隻自己的刺蝟。 @@ -1115,6 +1328,19 @@ (%1 %2) + 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” + + + + + + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. + + + + + + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1428,6 +1654,27 @@ Video recording options 視頻錄製選項 + + x + 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 + + + + MISSING LANGUAGE NAME [%1] + + + + Check now + + + + Can't delete last team + + + + You can't delete the last team! + + PagePlayDemo @@ -1533,7 +1780,7 @@ Defend your fort and destroy the opponents, two team colours max! - 保衛你的堡壘,破壞對手的,努力吧! + 保衛你的堡壘,破壞對手的,努力吧! Teams will start on opposite sides of the terrain, two team colours max! @@ -1613,7 +1860,7 @@ Teams in each clan take successive turns sharing their turn time. - 同一顏色的每個隊伍採取連續輪流分享他們的回合時間。 + 同樣顏色的任意一隊伍每回合都可動作,但回合時間需共享。 Add an indestructible border around the terrain @@ -1715,6 +1962,10 @@ Additional parameter to configure game styles. The meaning depends on the used style, refer to the documentation. When in doubt, leave it empty. + + Name of this scheme + + PageSelectWeapon @@ -1774,12 +2025,36 @@ Pick the mission or training to play - 選擇要玩的任務或培訓 + 選擇要玩的任務或培訓 Start fighting 開始戰鬥 + + Pick the training to play + + + + Pick the challenge to play + + + + Pick the scenario to play + + + + Trainings + + + + Challenges + + + + Scenarios + + PageVideos @@ -1878,10 +2153,14 @@ Show password protected - + 顯示有密碼保護的 Show join restricted + 顯示有加入限制的 + + + Delegate room control @@ -1991,6 +2270,14 @@ Enable translucent tags by default 預設啟用半透明顯示 + + Enable visual effects such as animated menu transitions and falling stars + + + + If enabled, Hedgewars adds the date and time in the form "YYYY-MM-DD_hh-mm" for automatically created demos. + + QComboBox @@ -2074,6 +2361,30 @@ Computer (Level %1) + + Stereoscopy creates an illusion of depth when you wear 3D glasses. + + + + 24 FPS + + + + 25 FPS + + + + 30 FPS + + + + 50 FPS + + + + 60 FPS + + QGroupBox @@ -2242,7 +2553,7 @@ Stereo rendering - 立體渲染 + 立體渲染 Style @@ -2314,7 +2625,7 @@ Bitrate (Kbps) - 位元速率 (Kbps) + 位元速率 (Kbps) This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete! @@ -2350,11 +2661,11 @@ Revision - 版本 + 版本 This program is distributed under the %1 - 此程序使用%1釋出 + 此程序使用%1釋出 This setting will be effective at next restart. @@ -2378,7 +2689,7 @@ Air Mines - + 浮空雷 Player @@ -2392,6 +2703,15 @@ % Retreat Time + + Stereoscopy + + + + Bitrate (Kibit/s) + “Kibit/s” is the symbol for 1024 bits per second + + QLineEdit @@ -2407,6 +2727,10 @@ anonymous 匿名 + + unnamed (%1) + + QMainWindow @@ -2501,19 +2825,19 @@ Record Play - Error - 記錄播放 - 錯誤 + 記錄播放 - 錯誤 Please select record from the list - 請從列表選擇記錄 + 請從列表選擇記錄 Cannot rename to - 不能改名 + 不能改名 Cannot delete file - 不能刪除檔案 + 不能刪除檔案 Room Name - Error @@ -2637,6 +2961,32 @@ 你確定要啟動這個遊戲嗎? 並不是所有的玩家都準備就緒。 + + Sorry, Hedgewars can't be played with more than 48 hedgehogs. Please try again with fewer hedgehogs. + +Current number of hedgehogs: %1 + + + + Teams - Name already taken + + + + The team name '%1' is already taken, so your team has been renamed to '%2'. + + + + Please select a file from the list. + + + + Cannot rename file to %1. + + + + Cannot delete file %1. + + QObject @@ -2657,7 +3007,7 @@ Go! - 出場! + 出場! Start @@ -2745,7 +3095,7 @@ Upload this video to your Youtube account - 上傳視頻到你的YouTube帳戶 + 上傳視頻到你的YouTube帳戶 Reset @@ -2767,6 +3117,17 @@ Start private server 啟動私人伺服器 + + Upload this video to your YouTube account + + + + + QSpinBox + + Specify the bitrate of recorded videos as a multiple of 1024 bits per second + + RoomNamePrompt @@ -2799,10 +3160,12 @@ C + Caption of the column for the number of connected clients in the list of rooms 人數 T + Caption of the column for the number of teams in the list of rooms 隊伍 @@ -2962,7 +3325,7 @@ Choose a theme - + 選擇一個主題 @@ -3133,7 +3496,7 @@ hedgehog info - 刺蝟資訊 + 刺蝟資訊 autocam / find hedgehog @@ -3143,6 +3506,11 @@ speed up replay 加速播放 + + toggle team bars + This refers to the team info bars (name/flag/health) of all teams. These are shown at the bottom center of the screen + + binds (categories) @@ -3223,7 +3591,7 @@ Toggle labels above hedgehogs: - 切換刺蝟頭上標籤的顯示方式: + 切換刺蝟頭上標籤的顯示方式: Record video: @@ -3241,6 +3609,10 @@ Demo replay: 播放演示: + + Heads-up display: + + binds (keys) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/hu.txt --- a/share/hedgewars/Data/Locale/hu.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/hu.txt Sun Dec 17 00:09:24 2017 +0100 @@ -43,7 +43,7 @@ 00:40=Molotov koktél 00:41=Madárka -01:00=Mindent bele! +; 01:00=Loading … 01:01=Döntetlen 01:02=%1 nyert! 01:03=Hangerő %1% @@ -202,11 +202,11 @@ 02:02=Sünik, előre! 02:02=Szedd őket miszlikbe! -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 nyert! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Döntetlen ; New health crate 02:05=Egy kis segítség! @@ -430,12 +430,12 @@ ; Game goal strings 05:00=Játék módok 05:01=Az alábbi szabályok érvényesek: -05:02=Erődök: Védd meg a sajátod, pusztítsd el az ellenfeledet! +05:02=Király elhelyezése: Válassz egy védett helyet, ahova lerakod őfelségét 05:03=Alacsony gravitáció: Vigyázz, hova lépsz! 05:04=Sérthetetlenség: A sünök (majdnem) sérthetetlenek 05:05=Vámpírizmus: A sünök visszagyógyulnak a sebzések arányában 05:06=Karma: A sünök is sérülnek az általuk okozott sebek által -05:07=Óvd Őfelségét: Ne hagyd a királyt meghalni!|Király elhelyezése: Válassz egy védett helyet, ahova lerakod őfelségét +05:07=Óvd Őfelségét: Ne hagyd a királyt meghalni! 05:08=Sünök Lerakása: A játék kezdete előtt te választod ki a kezdőhelyet 05:09=Tüzérség: A sünök nem mozoghatnak 05:10=Lebonthatatlan talaj:A legtöbb fegyver nem tudja szétrobbantani a földet diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/it.lua --- a/share/hedgewars/Data/Locale/it.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/it.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,1154 +1,2625 @@ locale = { ["!!!"] = "!!!", - ["???"] = "???", ["..."] = "...", - [":("] = ":(", ["011101000"] = "011101000", ["011101001"] = "011101001", --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant --- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant + ["-1 to anyone for a suicide"] = "-1 a chiunque per essersi suicidato", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant ["30 minutes later..."] = "30 minuti più tardi...", +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "Circa un mese fa, è arrivato un cyborg e ci ha detto che siete voi i cannibali!", - ["Accuracy Bonus!"] = "Bonus Precisione!", +-- ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Accuracy Bonus! +15 points"] = "", -- Space_Invasion +-- ["Accuracy bonus: +%d points"] = "", -- Basic_Training_-_Sniper_Rifle ["Ace"] = "Asso", - ["Achievement Unlocked"] = "Archivio Sbloccato", +-- ["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", ["Actually, you aren't worthy of life! Take this..."] = "In realtà, non siete degni di vivere! Prendete questo...", ["A cy-what?"] = "Un cy-cosa?", --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen ["Adventurous"] = "Avventuroso", --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy ["Africa"] = "Africa", --- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood --- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 + ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "Dopo che Leaks A Lot ha tradito la sua tribù, si è unito ai cannibali..", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 + ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "Dopo lo shock causato dalla spia nemica, Leaks A Lot e Nuvola Densa andarono a caccia per rilassarsi.", -- A_Classic_Fairytale:shadow +-- ["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!"] = "Ancora colla storia dei 'cannibali'!", --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode - ["a Hedgewars challenge"] = "una sfida Hedgewars", +-- ["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 - ["Aiming Practice"] = "Pratica la tua mira", --- ["Air Attack"] = "", -- Construction_Mode --- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome + ["Aiming Practice"] = "Allena la tua mira", +-- ["Aiming practice"] = "", -- TargetPractice + ["Air Attack"] = "Attacco aereo", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor + ["A leap in a leap"] = "Un salto in un salto", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen ["A little gift from the cyborgs"] = "Un piccolo regalo dai cyborg", - ["All gone...everything!"] = "E' finito... tutto!", --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW + ["All gone...everything!"] = "E' tutto... andato!", +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen ["All right, we just need to get to the other side of the island!"] = "Va bene, dobbiamo solo raggiungere l'altro lato dell'isola!", +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen ["All walls touched!"] = "Tutti i muri toccati!", - ["Ammo Depleted!"] = "Munizioni scarse!", - ["ammo extended!"] = "Munizioni aggiuntive!", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler ["Ammo is reset at the end of your turn."] = "Le munizioni si azzeranno alla fine del tuo turno", - ["Ammo Maniac!"] = "Maniaco delle munizioni!", - ["Ammo"] = "Munizioni", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion ["And how am I alive?!"] = "E com'è che sono vivo?!", --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood ["And so it began..."] = "E così ebbe inizio...", +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen ["...and so the cyborgs took over the world..."] = "... e così i cyborg conquistarono il mondo...", ["And so they discovered that cyborgs weren't invulnerable..."] = "E così scoprirono che i cyborg non erano invulnerabili...", --- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen + ["And where's all the weed?"] = "E dov'è tutta l'erba?", -- A_Classic_Fairytale:dragon ["And you believed me? Oh, god, that's cute!"] = "E mi credi? Oddio, che bello!", - --- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor + ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "Anno 1032: [L'esplosione genererà una forte spinta ~ Ad ampio raggio, non influenzerà i ricci vicino al bersaglio]", -- Continental_supplies ["Antarctica"] = "Antartico", --- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies --- ["Area"] = "", -- Continental_supplies - ["Are we there yet?"] = "Siamo già lì?", + ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "Estate antartica: - Ti darà una trave/palla di fango e due pistole sinusoidali/portali ogni quattro turni", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- + ["Area"] = "Area", -- Continental_supplies + ["Are we there yet?"] = "Siamo già qui?", ["Are you accusing me of something?"] = "Mi stai accusando di qualcosa?", +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen ["Are you saying that many of us have died for your entertainment?"] = "Stai dicendo che molti di noi sono morti per il tuo divertimento?", --- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen + ["Artur Detour"] = "Artur Detour", -- A_Classic_Fairytale:queen ["As a reward for your performance, here's some new technology!"] = "Come ricompensa per le tue prestazioni, ecco della tecnologia nuova!", --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW ["Asia"] = "Asia", +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 ["Assault Team"] = "Squadra d'assalto", - ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "Siccome ci sono poche munizioni, potreste voler riutilizzare le corde intanto che siete a mezz'aria.|", --- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood - ["As you can see, there is no way to get on the other side!"] = "Come potete vedere, non c'è modo di andare dall'altra parte!", - ["Attack From Rope"] = "Attacco dalla corda", +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon + ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "Dopo aver completato la sfida, Leaks A Lot ha messo piede a terra.", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 + ["As you can see, there is no way to get on the other side!"] = "Come puoi vedere, non c'è modo di andare dall'altra parte!", +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 ["Australia"] = "Australia", ["Available points remaining: "] = "Punti disponibili rimasti: ", --- ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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...", - ["[Backspace]"] = "[Cancella]", --- ["Backstab"] = "", -- A_Classic_Fairytale:backstab --- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil + ["Backstab"] = "Backstab", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal + ["Bad Team"] = "Cattiva squadra", -- User_Mission_-_The_Great_Escape +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- ["Bamboo Thicket"] = "Boschetto di Bambù", - ["Barrel Eater!"] = "Mangiatore di Barili!", +-- ["Barrel Eater"] = "", -- Tumbler ["Barrel Launcher"] = "Lanciatore di Barili", --- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["Barrel Launcher selected!"] = "", -- Tumbler +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor + ["Barrel Placement Mode"] = "Modalità di piazzamento barili", -- Construction_Mode ["Baseballbat"] = "Mazza da baseball", +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Lancia delle palline ai tuoi nemici|e spingili in acqua!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Manda (colpendoli) i tuoi nemici|in acqua attraverso i canestri laterali!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Addestramento sull'utilizzo del Bazooka", --- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 + ["Beep Loopers"] = "Loop di beep", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Tempo migliore per squadra: ", - ["Best Team Times: "] = "Tempi della squadra migliore: ", - ["Beware, though! If you are slow, you die!"] = "Attenzione, comunque! Se siete lenti, morirete!", --- ["Bio-Filter"] = "", -- Construction_Mode - ["Biomechanic Team"] = "Squadra biomeccanica", --- ["Birdy"] = "", -- Construction_Mode --- ["Blender"] = "", -- A_Classic_Fairytale:family --- ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab --- ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow --- ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow - ["Bloody Rookies"] = "Reclute Sanguinose", --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy --- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings --- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab --- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "KABOOM!", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey + ["Beware, though! If you are slow, you die!"] = "Attenzione però! Se sei lento morirai!", +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode + ["Bio-Filter"] = "Bio-filtro", -- Construction_Mode + ["Biomechanic Team"] = "Biomeccanici", +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- + ["Blender"] = "Miscelatore", -- A_Classic_Fairytale:family + ["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 +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh + ["Bone Jackson"] = "Jackson Ossa", -- A_Classic_Fairytale:backstab + ["Bonely"] = "", -- A_Classic_Fairytale:shadow +-- ["Bones"] = "", -- +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion ["Boom!"] = "Kaboom!", - ["Boss defeated!"] = "Boss sconfitto!", - ["Boss Slayer!"] = "Boss Uccisore!", --- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey --- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow --- ["Brainila"] = "", -- A_Classic_Fairytale:united --- ["Brain Stu"] = "", -- A_Classic_Fairytale:united --- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab --- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- + ["Brain Blower"] = "Aria al cervello", -- A_Classic_Fairytale:journey + ["Brainiac"] = "Brainiac", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow + ["Brainila"] = "Brainila", -- A_Classic_Fairytale:united + ["Brain Stu"] = "Brain Stu", -- A_Classic_Fairytale:united + ["Brain Teaser"] = "Rompicapo", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 + ["Brutal Lily"] = "Brutale Lilly", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil ["Brutus"] = "Bruto", --- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode + ["Build a fortress and destroy your enemy."] = "Costruisci una fortezza e distruggi il tuo nemico.", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer ["Build a track and race."] = "Costruisci una pista e corri.", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode ["Bullseye"] = "Bersaglio", -- A_Classic_Fairytale:dragon - ["But it proved to be no easy task!"] = "Ma si è dimostrato essere un compito non facile!", +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- + ["But it proved to be no easy task!"] = "Ma si è dimostrato essere un compito difficile!", +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final ["But that's impossible!"] = "Ma è impossibile!", ["But the ones alive are stronger in their heart!"] = "Ma i vivi sono più forti nel loro cuore!", +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen ["But...we died!"] = "Ma... siamo morti!", ["But where can we go?"] = "Ma dove possiamo andare?", +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen ["But why would they help us?"] = "Ma perché dovrebbero aiutarci?", ["But you're cannibals. It's what you do."] = "Ma voi siete cannibali. E' quello che fate.", ["But you said you'd let her go!"] = "Avete detto che l'avreste lasciata andare!", --- ["Cake"] = "", -- Construction_Mode --- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- + ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "Chiamami Beep! Beh, perché sono una così bella... persona!", -- A_Classic_Fairytale:family ["Cannibals"] = "Cannibali", ["Cannibal Sentry"] = "Sentinella cannibale", ["Cannibals?! You're the cannibals!"] = "Cannibali? Voi siete i cannibali!", - ["CAPTURE THE FLAG"] = "Cattura la Bandiera", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Incauto", --- ["Carol"] = "", -- A_Classic_Fairytale:family + ["Carol"] = "Carol", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa ["CHALLENGE COMPLETE"] = "SFIDA COMPLETATA", - ["Change Weapon"] = "Cambia Arma", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor ["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...", --- ["Cleaver"] = "", -- Construction_Mode --- ["Cleaver Placement Mode"] = "", -- Construction_Mode --- ["Climber"] = "", -- ClimbHome --- ["Climb Home"] = "", -- ClimbHome --- ["Clowns"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- + ["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 + ["Clowns"] = "Clown", -- User_Mission_-_Nobody_Laugh +-- ["Cluck-cluck time: [Fire an egg ~ Sabotages and cures poison ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies ["Clumsy"] = "Goffo", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb ["Cluster Bomb Training"] = "Addestramento bomba a grappolo", - ["Codename: Teamwork"] = "Nome in Codice: Lavoro di Squadra", ["Collateral Damage"] = "Danno collaterale", ["Collateral Damage II"] = "Danno collaterale II", --- ["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 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 crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood --- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood --- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge + ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen + ["Come closer, so that your training may continue!"] = "Avvicinati, in modo che l'allenamento possa iniziare!", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor + ["Compete to use as few planes as possible!"] = "Usa meno aerei possibile per vincere!", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Completa la pista più veloce che puoi!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen ["Configuration accepted."] = "Configurazione accettata", +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 ["Congratulations!"] = "Complimenti!", ["Congratulations"] = "Complimenti", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Complimenti! Hai distrutto tutti gli obiettivi|entro il tempo previsto.", --- ["CONSTRUCTION MODE"] = "", -- Construction_Mode --- ["Construction Station"] = "", -- Construction_Mode --- ["Continental supplies"] = "", -- Continental_supplies +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos + ["CONSTRUCTION MODE"] = "MODALITA' COSTRUZIONE", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode + ["Construction Station"] = "Stazione di costruzione", -- Construction_Mode + ["Continental supplies"] = "Forniture continentali", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Ottieni il controllo dei pilastri per guadagnare punti.", --- ["Core"] = "", -- Construction_Mode --- ["Corporationals"] = "", -- A_Classic_Fairytale:queen --- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow - ["Corpse Thrower"] = "Lanciatore di cadaveri", --- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode --- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- + ["Corporationals"] = "Societarie", -- A_Classic_Fairytale:queen + ["Corpsemonger"] = "Mangiacadaveri", -- A_Classic_Fairytale:shadow + ["Corpse Thrower"] = "Lancia cadaveri", + ["Cost"] = "Costo", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion + ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Impero Cibernetico", ["Cyborg. It's what the aliens call themselves."] = "Cyborg. E' come gli alieni chiamano loro stessi.", --- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab + ["Dahmer"] = "Dahmer", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE!"] = "ACCIDENTI, RECLUTA!", ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "MALEDIZIONE, RECLUTA! VIA DALLA MIA TESTA!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Anatroccoli Pericolosi", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Peso morto", --- ["Decrease"] = "", -- Continental_supplies --- ["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 +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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"] = "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!", --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor ["Demolition is fun!"] = "Demolire è divertente!", --- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow - ["Depleted Kamikaze!"] = "Kamikaze Esaurito!", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 --- ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood - ["Destroy invaders to score points."] = "Distruggi gli invasori per guadagnare dei punti.", --- ["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 +-- ["Demo"] = "", -- The_Specialists + ["Dense Cloud must have already told them everything..."] = "Nuvola Densa deve già avergli detto tutto...", -- A_Classic_Fairytale:shadow + ["Dense Cloud"] = "Nuvola Densa", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 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?", +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen ["Did you see him coming?"] = "L'hai visto arrivare?", ["Did you warn the village?"] = "Hai avvisato il villaggio?", ["Die, die, die!"] = "Muori, muori, muori!", --- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Difficulty: "] = "", -- Continental_supplies +-- ["Difficulty: Easy"] = "", -- A_Classic_Fairytale:first_blood +-- ["Difficulty: Hard"] = "", -- A_Classic_Fairytale:first_blood +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW + ["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 +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 ["Do not laugh, inexperienced one, for he speaks the truth!"] = "Non ridere, pivello, perché lui dice la verità!", --- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood - ["DOUBLE KILL"] = "DOPPIA UCCISIONE", + ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "Non lasciarti ingannare dalle sue parole, giovane! Ti colpirà alla schiena non appena ti allontani!", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen ["Double Kill!"] = "Doppia Uccisione!", +-- ["Double kill!"] = "", -- Mutant +-- ["Do you have any idea how bad an exploding arrow hurts?"] = "", -- A_Classic_Fairytale:queen ["Do you have any idea how valuable grass is?"] = "Hai una pallida idea di quanto vale l'erba?", +-- ["Do you have any idea what it's like in the village for a woman?"] = "", -- A_Classic_Fairytale:queen +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen ["Do you think you're some kind of god?"] = "Pensi di essere un qualche dio?", --- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode --- ["Drills"] = "", -- A_Classic_Fairytale:backstab --- ["Drill Strike"] = "", -- Construction_Mode - ["Drone Hunter!"] = "Cacciatore di Droni!", --- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - + ["Dragon's Lair"] = "Tana del drago", -- A_Classic_Fairytale:dragon +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- + ["Drills"] = "Trapani", -- A_Classic_Fairytale:backstab + ["Drill Strike"] = "Colpo con trapani!", -- Construction_Mode +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion + ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "Lascia una bomba: [Rilascia un vento eroico che si trasforma una bomba all'impatto", -- Continental_supplies +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Affogato", --- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family --- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey --- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab --- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- + ["Dude, all the plants are gone!"] = "Ehi, tutte le piante sono andate!", -- A_Classic_Fairytale:family + ["Dude, can you see Ramon and Spiky?"] = "Ehi, riesci a vedere Ramon e Spiky?", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil + ["Dude, that's so cool!"] = "Ehi, è così figo!", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen + ["Dude, we really need a new shaman..."] = "Ehi, abbiamo davvero bisogno di un nuovo sciamano...", -- A_Classic_Fairytale:shadow ["Dude, what's this place?!"] = "Ehi, cos'è questo posto?", ["Dude, where are we?"] = "Ehi, dove siamo?", --- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab + ["Dude, wow! I just had the weirdest high!"] = "Ehi, wow! E' stato stranissimo!", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor ["Duration"] = "Durata", --- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode --- ["Each turn is only ONE SECOND!"] = "", -- Frenzy +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 + ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "Tempesta di polvere: [15 danni a tutti i nemici nel cerchio]", -- Continental_supplies +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 + ["Each turn is only ONE SECOND!"] = "Ogni turno è di solo UN SECONDO!", -- Frenzy ["Each turn you get 1-3 random weapons"] = "In ogni turno hai da 1 a 3 armi casuali", ["Each turn you get one random weapon"] = "In ogno turno hai una sola arma casuale", --- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 + ["Eagle Eye: [Blink to the impact ~ One shot]"] = "Occhio di falco: [Lampeggia all'impatto ~ Un colpo]", -- Continental_supplies ["Eagle Eye"] = "Occhio di falco", --- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil --- ["Elderbot"] = "", -- A_Classic_Fairytale:family --- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Elimina tutti i nemici", + ["Ear Sniffer"] = "Annusaorecchie", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 + ["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 enemy hogs and take their weapons."] = "Elimina i ricci nemici e prendi le loro armi", - ["Eliminate Poison before the time runs out"] = "Elimina Veleno prima che il tempo finisca", - ["Eliminate the Blue Team"] = "Elimina la Squadra Blu", - ["Eliminate the enemy before the time runs out"] = "Elimina il nemico prima che il tempo scada", +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Elimina l'Unità 3378 |- La Resistenza Finale deve sopravvivere", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge ["Elmo"] = "Elmo", +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion ["Energetic Engineer"] = "Ingegnere Energetico", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Spero che tu gradisca una nuotata...", - ["[Enter]"] = "[Enter]", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- ["Europe"] = "Europa", --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 ["Everyone knows this."] = "Lo sanno tutti.", --- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon --- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy --- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode --- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey --- ["Family Reunion"] = "", -- A_Classic_Fairytale:family + ["Every single time!"] = "Ogni volta!", -- A_Classic_Fairytale:dragon + ["Everything looks OK..."] = "Sembra tutto OK...", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil + ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 + ["Eye Chewer"] = "Mangia Occhi", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- + ["Family Reunion"] = "Riunione familiare", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Giro migliore: ", ["Feeble Resistance"] = "Resistenza Finale", --- ["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 --- ["Fell From Heaven"] = "", -- 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 --- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family --- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion --- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united --- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings --- ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon --- ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood - - ["Fire"] = "Fuoco", + ["Fell From Grace"] = "Caduto in disgrazia", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "Scesa dal Cielo è la migliore! Caduta dal Cielo è la più grande!", -- A_Classic_Fairytale:family + ["Fell From Heaven"] = "Scesa dal Cielo", -- 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 + ["Femur Lover"] = "Ama Tibia", -- A_Classic_Fairytale:shadow +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion + ["Fiery Water"] = "Acqua Ardente", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 + ["Filthy Blue"] = "Blu Sporco", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler ["First aid kits?!"] = "Kit di pronto soccorso?!", --- ["FIRST BLOOD MUTATES"] = "", -- Mutant ["First Blood"] = "Primo sangue", +-- ["First killer will mutate"] = "", -- Mutant ["First Steps"] = "Primi passi", +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Bandiera catturata!", ["Flag respawned!"] = "Bandiera restituita!", ["Flag returned!"] = "Bandiera recuperata!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Le bandiere saranno piazzate nel luogo in cui le squadre finiscono il loro primo turno.", ["Flamer"] = "Incendiario", --- ["Flamethrower"] = "", -- Construction_Mode --- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - --- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW --- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode --- ["FRENZY"] = "", -- Frenzy +-- ["Flamer selected!"] = "", -- Tumbler + ["Flaming Worm"] = "Verme infuocato", -- A_Classic_Fairytale:backstab +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 + ["Flesh for Brainz"] = "Carne per Brainz", -- A_Classic_Fairytale:journey +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh + ["Free Dense Cloud and continue the mission!"] = "Libera Nuvola Densa e continua la missione!", -- A_Classic_Fairytale:journey + ["FRENZY"] = "FRENESIA", -- Frenzy ["Friendly Fire!"] = "Fuoco Amico!", - ["fuel extended!"] = "carburante aggiuntivo!", - ["GAME BEGUN!!!"] = "IL GIOCO E' INIZIATO!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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?!"] = "", -- A_Classic_Fairytale:enemy --- ["GasBomb"] = "", -- Continental_supplies --- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen --- ["General information"] = "", -- Continental_supplies --- ["Generates power."] = "", -- Construction_Mode --- ["Generator"] = "", -- Construction_Mode --- ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey + ["Game? Was this a game to you?!"] = "Gioco? Era un gioco per te?", -- A_Classic_Fairytale:enemy +-- ["Gangsters"] = "", -- + ["GasBomb"] = "Bomba a gas", -- Continental_supplies + ["Gas Gargler"] = "Gas-garismo", -- A_Classic_Fairytale:queen +-- ["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"] = "Informazioni generali", -- Continental_supplies +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 +-- ["Generator: Generates energy."] = "", -- Construction_Mode + ["Generator"] = "Generatore", -- Construction_Mode + ["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"] = "", -- A_Classic_Fairytale:first_blood - ["Get out of there!"] = "Fuori di lì!", --- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood --- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope --- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family - ["GG!"] = "GG!", --- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab --- ["Girder"] = "", -- Construction_Mode --- ["Girder Placement Mode"] = "", -- Construction_Mode --- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Goal", + ["Get on the head of the mole"] = "Raggiungi la testa della talpa", -- 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 + ["Get the crate on the other side of the island!|"] = "Prendi la cassa dall'altra parte dell'isola!|", -- A_Classic_Fairytale:journey +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope + ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "Salva i tuoi compagni dalla prigione naturale e salva la principessa!|Suggerimento: Trapanare dei fori dovrebbe risolvere tutto.|Suggerimento: Può essere furbo posizionare una trave prima di iniziare a trapanare.|Suggerimento: Tutti i tuoi ricci devono essere al di sopra dell'altezza segnata!|Suggerimento: Leaks a Lot deve essere molto vicino alla principessa!", -- A_Classic_Fairytale:family +-- ["Giggles"] = "", -- + ["Gimme Bones"] = "Datemi Ossa", -- A_Classic_Fairytale:backstab +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor + ["Girder Placement Mode"] = "Modalità posizionamento trave", -- Construction_Mode + ["Girder"] = "Trave", -- Construction_Mode +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor + ["Glark"] = "Bagliore", -- A_Classic_Fairytale:shadow +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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!"] = "", -- A_Classic_Fairytale:united --- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey + ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 + ["Good luck...or else!"] = "In bocca al lupo... o altro!", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Buona fortuna!", ["Good so far!"] = "Molto bene finora!", ["Good to go!"] = "Vai!!", --- ["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 + ["Go on top of the flower"] = "Vai in cima al fiore", -- A_Classic_Fairytale:first_blood + ["Go, quick!"] = "Vai, veloce!", -- A_Classic_Fairytale:backstab + ["Gorkij"] = "Gorkij", -- A_Classic_Fairytale:journey + ["Go surf!"] = "Fai surf!", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "COLPITO!!", - ["Grab Mines/Explosives"] = "Afferra Mine/Esplosivi", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity --- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow --- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope --- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - --- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow - ["Greetings, "] = "Saluti, ", --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 --- ["Grenade Training"] = "", -- Basic_Training_-_Grenade --- ["Grenadiers"] = "", -- Basic_Training_-_Grenade --- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity + ["Great choice, Steve! Mind if I call you that?"] = "Ottima scelta! Ricordi cosa ti ho detto?", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal + ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "Ottimo lavoro! Ora colpisci con la mazza da baseball! Suggerimento: Puoi cambiare arma con 'Tasto Destro'!", -- Basic_Training_-_Rope + ["Great! You will be contacted soon for assistance."] = "Ottimo! Sarai contattato presto per assistenza.", -- A_Classic_Fairytale:shadow +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge + ["Green lipstick bullet: [Poisonous, deals no damage]"] = "Proiettile rossetto verde: [velenoso, nessun danno]", -- Continental_supplies + ["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 + ["Grenade Training"] = "Allenamento granate", -- Basic_Training_-_Grenade + ["Grenadiers"] = "Granatieri", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- + ["Guys, do you think there's more of them?"] = "Ragazzi, pensate ce ne siano ancora?", -- A_Classic_Fairytale:backstab + ["Haha!"] = "Ahah!", ["HAHA!"] = "AHAH!", - ["Haha!"] = "Ahah!", +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["Hahahaha!"] = "Ahahahah!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Haha, allora questa pioggia ha DAVVERO qualcosa di strano!", --- ["Hammer"] = "", -- Construction_Mode, Continental_supplies +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen + ["Hammer"] = "Martello", -- Construction_Mode, Continental_supplies ["Hannibal"] = "Annibale", - [" Hapless Hogs left!"] = "Ricci Sfortunati rimanenti!", + [" Hapless Hogs left!"] = " Ricci Sfortunati rimanenti!", ["Hapless Hogs"] = "Ricci Sfortunati", --- [" HAS MUTATED"] = "", -- Mutant --- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen --- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow --- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy --- ["Healing Station"] = "", -- Construction_Mode --- ["Health Crate Placement Mode"] = "", -- Construction_Mode - ["Health crates extend your time."] = "Le casse salute estendono il tuo tempo", --- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 + ["Hatless Jerry"] = "Jerry Senzacappello", -- A_Classic_Fairytale:queen + ["Have no illusions, your tribe is dead, indifferent of your choice."] = "Non illuderti, la tua tribù è morta, la tua scelta è irrilevante", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 + ["Have we ever attacked you first?"] = "Vi abbiamo mai attaccati prima?", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode + ["Healing Station"] = "Stazione di cura", -- Construction_Mode +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor + ["Health Crate Placement Mode"] = "Modalità posizionamento cassa della salute", -- Construction_Mode +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove + ["Heavy Cannfantry"] = "Fanteria pesante", -- A_Classic_Fairytale:united ["Heavy"] = "Pesante", --- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy --- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Pallacanestro", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen + ["Hedge-cogs"] = "Ingrana-ricci", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- + ["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 will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer ["Hedgibal Lecter"] = "Riccibal Lecter", +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Beh, alla fine non piove così forte.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode - ["Hello again, "] = "Salve di nuovo, ", --- ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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!", --- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood --- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey --- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab --- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family --- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape + ["He moves like an eagle in the sky."] = "Si muove come un'aquila nel cielo.", -- A_Classic_Fairytale:first_blood + ["He must be in the village already."] = "Dev'essere già al villaggio", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- + ["Here, let me help you!"] = "Ora ti faccio vedere...", -- A_Classic_Fairytale:backstab + ["Here, let me help you save her!"] = "Eccomi, permettimi di aiutarti a salvarla", -- A_Classic_Fairytale:family + ["Here...pick your weapon!"] = "Ecco... prendi la tua arma", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer + ["Hero Team"] = "Team Eroi", -- User_Mission_-_The_Great_Escape ["He's so brave..."] = "E' così coraggioso...", --- ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab --- ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab --- ["Hey guys!"] = "", -- A_Classic_Fairytale:united --- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander --- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey --- ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey +-- ["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, 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! 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 +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion + ["Hightime"] = "Tempo massimo", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["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: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "Suggerimento: potresti voler rimanere nascosto e prendere tutte le casse...|", -- A_Classic_Fairytale:journey ["His arms are so strong!"] = "Le sue braccia sono così forti!", - ["Hit Combo!"] = "Hit Combo!", --- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen + ["Hmmm...actually...I didn't either."] = "Hmmm... in realtà... neanche io.", -- A_Classic_Fairytale:enemy +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal ["Hmmm...it's a draw. How unfortunate!"] = "Mmm... è un pareggio. Che sfortunato!", ["Hmmm..."] = "Mmmmm...", --- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood + ["Hmmm...perhaps a little more time will help."] = "Hmmm... forse un po 'più tempo aiuterà.", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 ["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!", - ["HOLY SHYTE!"] = "SANTA POLENTA!", --- ["Homing Bee"] = "", -- Construction_Mode --- ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy +-- ["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 +-- ["Holy shit!"] = "", -- Mutant + ["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à!!!", --- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family --- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey --- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon --- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united --- ["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 --- [" HP"] = "", -- Mutant +-- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- + ["Hostage Situation"] = "Situazione degli ostaggi", -- A_Classic_Fairytale:family + ["How can I ever repay you for saving my life?"] = "Come potrò mai ripagarvi per avermi salvato la vita?", -- A_Classic_Fairytale:journey + ["How come in a village full of warriors, it's up to me to save it?"] = "Com'è che in un villaggio pieno di guerrieri tocca a me salvarlo?", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen + ["How difficult would you like it to be?"] = "Quanto ti piacerebbe essere me?", -- A_Classic_Fairytale:first_blood +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united + ["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 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Cacciatore", --- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab --- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 + ["I believe there's more of them."] = "Credo che ce ne siano altri.", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen + ["I can see you have been training diligently."] = "Vedo che ti stai allenando diligentemente", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil ["I can't believe it worked!"] = "Non posso credere che abbia funzionato!", ["I can't believe this!"] = "Non posso crederci!", ["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!", --- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family --- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey --- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope --- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab --- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab --- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood --- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab --- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united --- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow --- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey --- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow --- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow +-- ["Ice Jake"] = "", -- A_Space_Adventure:ice01 + ["I could just teleport myself there..."] = "Potrei teletrasportarmi lì...", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor + ["I'd better get going myself."] = "Mi piacerebbe lasciarmi andare.", -- A_Classic_Fairytale:journey + ["I didn't until about a month ago."] = "Non l'ho fatto fino a circa un mese fa.", -- A_Classic_Fairytale:enemy +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen + ["I feel something...a place! They will arrive near the circles!"] = "Sento qualcosa... un posto! Arriveranno vicino ai cerchi!", -- A_Classic_Fairytale:backstab + ["If only I had a way..."] = "Se solo avessi un modo...", -- A_Classic_Fairytale:backstab + ["If only I were given a chance to explain my being here..."] = "Se solo avessi la possibilità di spiegare come mai sono qui...", -- A_Classic_Fairytale:first_blood + ["I forgot that she's the daughter of the chief, too..."] = "Ho dimenticato che è anche la figlia del capo...", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final + ["If they try coming here, they can have a taste of my delicious knuckles!"] = "Se provano a venire qui, assaggeranno i miei aculei!", -- A_Classic_Fairytale:united + ["If you agree to provide the information we need, you will be spared!"] = "Se fornirai informazioni necessarie verrai risparmiato!", -- A_Classic_Fairytale:shadow + ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "Se riesci a prendere la cassa abbastanza velocemente, la tua amata \"principessa\" potrà essere libera.", -- A_Classic_Fairytale:journey + ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "Se decidi di aiutarci, però, non avremo più bisogno di trovare un nuovo governatore per l'isola", -- A_Classic_Fairytale:shadow + ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "Se sei bloccato, usa la Desert Eagle o riavvia la missione!|", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 + ["If you know what I mean..."] = "Se sai cosa intendo...", -- A_Classic_Fairytale:shadow ["If you say so..."] = "Se lo dici tu...", --- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon --- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow --- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos + ["I guess you'll have to kill them."] = "Immagino che dovrai ucciderli...", -- A_Classic_Fairytale:dragon + ["I have come to make you an offering..."] = "Sono venuto a farti un'offerta...", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen + ["I have no idea where that mole disappeared...Can you see it?"] = "Non ho idea di dove sia scomparsa la talpa... la vedi?", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 ["I have to follow that alien."] = "Devo seguire quell'alieno.", --- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow --- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood --- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab --- ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family --- ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey --- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow --- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood --- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab + ["I have to get back to the village!"] = "Devo tornare al villaggio!", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 + ["I hope you are prepared for a small challenge, young one."] = "Spero che sia pronto per una piccola sfida, giovane.", -- A_Classic_Fairytale:first_blood + ["I just don't want to sink to your level."] = "Semplicemente non voglio scendere al tuo livello.", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos + ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos + ["I'll hold them off while you return to the village!"] = "Li tratterò mentre torni al villaggio!", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen + ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "Immagina quei bersagli come i lupi che hanno ucciso i tuoi genitori! Sfoga la tua rabbia su di loro!", -- A_Classic_Fairytale:first_blood + ["I'm...alive? How? Why?"] = "Sono...vivo? Come? Perchè?", -- A_Classic_Fairytale:backstab ["I'm a ninja."] = "Sono un ninja.", --- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab --- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood + ["I marked the place of their arrival. You're welcome!"] = "Ho segnato il luogo del loro arrivo. Prego!", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 + ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "Sono certo che questo è un malinteso, compagni ricci!", -- A_Classic_Fairytale:first_blood ["I mean, none of you ceased to live."] = "Voglio dire, nessuno di voi ha cessato di vivere.", -- A_Classic_Fairytale:enemy ["I'm getting old for this!"] = "Sto diventando vecchio per queste cose!", ["I'm getting thirsty..."] = "Ho sete...", - ["I'm here to help you rescue her."] = "Sono qui per aiutarvi a salvarla.", - ["I'm not sure about that!"] = "Non sono sicuro di quello!", --- ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil + ["I'm here to help you rescue her."] = "Sono qui per aiutarti a salvarla.", +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen + ["I'm not sure about that!"] = "Non ne sono così sicuro!", + ["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 ["I'm so scared!"] = "Ho tanta paura!", --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen ["Incredible..."] = "Incredibile...", +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace ["I need to find the others!"] = "Devo trovare gli altri!", --- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey + ["I need to get to the other side of this island, fast!"] = "Devo arrivare all'altro lato di questa isola, velocemente!", -- A_Classic_Fairytale:journey ["I need to move the tribe!"] = "Devo spostare la tribù!", ["I need to prevent their arrival!"] = "Devo prevenire il loro arrivo!", ["I need to warn the others."] = "Devo avvisare gli altri.", --- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant + ["In fact, you are the only one that's been acting strangely."] = "Infatti, tu sei l'unico che ha agito in modo strano.", -- A_Classic_Fairytale:backstab +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Istruttore", +-- ["Insufficient Power"] = "", -- Construction_Mode ["Interesting idea, haha!"] = "Idea interessante, ahah!", --- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab --- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "invasori distrutti", + ["Interesting! Last time you said you killed a cannibal!"] = "Interessante! L'ultima volta hai detto di aver ucciso un cannibale!", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 + ["In the meantime, take these and return to your \"friend\"!"] = "Nel frattempo, prendi questi e torna dal tuo \"amico\"!", -- A_Classic_Fairytale:shadow +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode ["Invasion"] = "Invasione", --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen ["I saw it with my own eyes!"] = "L'ho visto coi miei occhi!", ["I see..."] = "Capisco...", --- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood --- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood --- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab --- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon + ["I see you have already taken the leap of faith."] = "Vedo che hai già fatto il salto della fede.", -- A_Classic_Fairytale:first_blood + ["I see you would like his punishment to be more...personal..."] = "Vedo che ti piacerebbe che la sua punizione fosse più... personale...", -- A_Classic_Fairytale:first_blood + ["I sense another wave of cannibals heading my way!"] = "Sento un'altra ondata di cannibali sulla mia strada!", -- A_Classic_Fairytale:backstab + ["I sense another wave of cannibals heading our way!"] = "Sento un'altra ondata di cannibali sulla mia strada!", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 ["I shouldn't have drunk that last pint."] = "Non avrei dovuto bere l'ultima pinta.", ["Is this place in my head?"] = "Questo posto è nella mia testa?", --- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon - ["I think we are safe here."] = "Penso che qui siamo al sicuro.", --- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow --- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy - ["It is time to practice your fighting skills."] = "E' ora di mettere in pratica le vostre abilità di combattimento.", +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- + ["It doesn't matter. I won't let that alien hurt my daughter!"] = "Non importa. Non lascerò che l'alieno ferisca mia figlia!", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil + ["I think we are safe here."] = "Qui dovremmo essere al sicuro.", + ["I thought their shaman died when he tried our medicine!"] = "Pensavo che il loro sciamano fosse morto provando la nostra medicina!", -- A_Classic_Fairytale:shadow + ["It is called 'Hogs of Steel'."] = "Si chiama 'Hogs of Steel'.", -- A_Classic_Fairytale:enemy + ["It is time to practice your fighting skills."] = "E' ora di mettere in pratica le tue abilità di combattimento.", ["It must be a childhood trauma..."] = "Dev'essere un trauma infantile...", --- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab + ["It must be the aliens' deed."] = "Dev'esser stata opera degli alieni.", -- A_Classic_Fairytale:backstab ["It must be the aliens!"] = "Devono essere gli alieni!", --- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy --- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab + ["It must be the cyborgs again!"] = "Devono essere ancora i cyborg!", -- A_Classic_Fairytale:enemy + ["I told you, I just found them."] = "Te l'ho detto, le ho semplicemente trovate...", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Almeno il SUDDEN DEATH arriverà tra 99 turni...", --- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon --- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family --- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil + ["It's always up to women to clear up the mess men created!"] = "E' sempre compito delle donne chiarire i problemi creati dagli uomini!", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen + ["It's a shame, I forgot how to do that!"] = "Ho dimenticato come farlo, che vergogna!", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion + ["It's impossible to communicate with the spirits without a shaman."] = "E' impossibile comunicare con gli spiriti senza uno sciamano.", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer ["It's over..."] = "E' finita...", --- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey --- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen + ["It's time you learned that your actions have consequences!"] = "È tempo che tu capisca che le tue azioni hanno conseguenze!", -- A_Classic_Fairytale:journey + ["It's worth more than wood!"] = "Vale più del legno!", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil ["It wants our brains!"] = "Vuole i nostri cervelli!", --- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab --- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united --- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey --- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon --- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow --- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family --- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen + ["It was not a dream, unwise one!"] = "Non era un sogno, sciocco!", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 + ["I've seen this before. They just appear out of thin air."] = "L'ho visto prima. Appaiono appena fuori dalla nebbia", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 + ["I want to play a game..."] = "Voglio fare un gioco...", -- A_Classic_Fairytale:journey + ["I want to see how it handles this!"] = "Voglio vedere come gestisci questa!", -- A_Classic_Fairytale:backstab +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon + ["I wonder where Dense Cloud is..."] = "Mi chiedo dove sia Nuvola Densa...", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow + ["I wonder why I'm so angry all the time..."] = "Mi chiedo perchè sono sempre così arrabbiato...", -- A_Classic_Fairytale:family + ["I won't let you kill her!"] = "Non lascerò che tu la uccida!", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 ["Jack"] = "Giacomo", +-- ["Jason"] = "", -- ["Jeremiah"] = "Geremia", +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 ["John"] = "Giovanni", +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- ["Judas"] = "Giuda", +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Il salto è disattivato", --- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy --- ["Just on a walk."] = "", -- A_Classic_Fairytale:united --- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family --- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "Kamikaze Esperto!", + ["Just kidding, none of you have died!"] = "Scherzavo, nessuno di voi è morto!", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen + ["Just on a walk."] = "Solo una passeggiata.", -- A_Classic_Fairytale:united + ["Just wait till I get my hands on that trauma! ARGH!"] = "Basta aspettare finché non sistemo questo trauma! ARGH!", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion + ["Kamikaze"] = "Kamikaze", -- Construction_Mode ["Keep it up!"] = "Mantienilo al sicuro!", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- ["Kerguelen"] = "Kerguelen", +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab ["Killing spree!"] = "Furia Omicida!", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 ["KILL IT!"] = "UCCIDILO!", - ["KILLS"] = "UCCISIONI", --- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon --- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["Kills: %d"] = "", -- Space_Invasion + ["Kill the aliens!"] = "Uccidi gli alieni!", -- A_Classic_Fairytale:dragon + ["Kill the cannibal!"] = "Uccidi il cannibale!", -- A_Classic_Fairytale:first_blood +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion ["Last Target!"] = "Ultimo Obiettivo!", --- ["Leader"] = "", -- A_Classic_Fairytale:enemy --- ["Leaderbot"] = "", -- A_Classic_Fairytale:queen --- ["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 --- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey --- ["Led Heart"] = "", -- A_Classic_Fairytale:queen --- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "Shift Sinistro", --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies --- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey --- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey --- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow --- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey --- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab --- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab --- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab --- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 + ["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 + ["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 + ["Leaks A Lot must survive!"] = "Leaks A Lot deve sopravvivere!", -- A_Classic_Fairytale:journey + ["Led Heart"] = "Cuore Saggio", -- A_Classic_Fairytale:queen + ["Lee"] = "Lee", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies + ["Let me test your skills a little, will you?"] = "Fammi verificare le tue capacità un istante, ok?", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 + ["Let's go home!"] = "Andiamo a casa!", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW + ["Let's head back to the village!"] = "Torniamo indietro al villaggio!", -- A_Classic_Fairytale:shadow + ["Let's see what your comrade does now!"] = "Vediamo cosa fa il tuo compagno ora!", -- A_Classic_Fairytale:journey + ["Let's show those cannibals what we're made of!"] = "Mostriamo a quei cannibali di che pasta siamo fatti!", -- A_Classic_Fairytale:backstab + ["Let them have a taste of my fury!"] = "Lascia che assaggino la mia furia!", -- A_Classic_Fairytale:backstab + ["Let us help, too!"] = "Lascia che ti aiutiamo anche noi!", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- + ["Light Cannfantry"] = "Fanteria Leggera", -- A_Classic_Fairytale:united +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Recluta, Attenzione!!", --- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow + ["Little did they know that this hunt will mark them forever..."] = "Non sapevano ancora che questa caccia li avrebbe segnati per sempre...", -- A_Classic_Fairytale:shadow ["Lively Lifeguard"] = "Bagnino Vivace", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- Continental_supplies --- ["Lonely Hog"] = "", -- ClimbHome --- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy --- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant --- ["Made it!"] = "", -- ClimbHome --- ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies --- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab --- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant --- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab --- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy +-- ["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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion + ["Luckily, I've managed to snatch some of them."] = "Fortunatamente, sono riuscito a rubarne qualcuna", -- A_Classic_Fairytale:united +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- + ["Made it!"] = "Fatto!", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer + ["May the spirits aid you in all your quests!"] = "Che gli spiriti ti aiutino nelle tue avventure!", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion + ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "Medicina: [Spara qualche medicina esplosiva che guarisce tutti i ricci colpiti dall'esplosione]", -- Continental_supplies +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["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 Eater!"] = "Mangiatore di Mine!", --- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Timer delle mine:", --- ["Mine Strike"] = "", -- Construction_Mode +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor + ["Mine Placement Mode"] = "Modalità posizionamento mine", -- Construction_Mode +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey + ["Mine Strike"] = "Strike di mine", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "MISSIONE COMPLETATA CON SUCCESSO", - ["MISSION SUCCESS"] = "MISSIONE COMPLETATA", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- ["Molotov"] = "Molotov", --- ["MONSTER KILL"] = "", -- Mutant --- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["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 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Movimenti: [Su], [Giù], [Sinistra], [Destra]", --- ["Mudball"] = "", -- Construction_Mode - ["Multi-shot!"] = "Colpi multipli!", --- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant --- ["Mutant"] = "", -- Mutant --- ["Nade Boy"] = "", -- Basic_Training_-_Grenade --- ["Name"] = "", -- A_Classic_Fairytale:queen +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion + ["Muriel"] = "Muriel ", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Muscle Dissolver"] = "Dissolvi-muscoli", -- A_Classic_Fairytale:shadow +-- ["Mushroom Kingdom"] = "", -- + ["Mutant"] = "Mutante", -- Mutant +-- ["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", --- ["Nancy Screw"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen --- ["Napalm"] = "", -- Construction_Mode --- ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies --- ["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 - ["New Barrels Per Turn"] = "Nuovi Barili ad Ogni Turno", - ["NEW CLAN RECORD: "] = "NUOVO RECORD DEL CLAN: ", + ["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: [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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "Nuovo giro migliore: ", - ["New Mines Per Turn"] = "Nuove Mine ad Ogni Turno", - ["NEW RACE RECORD: "] = "NUOVO RACE RECORD: ", - ["Newton's Hammock"] = "Newton e l'Amaca", --- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon --- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy --- ["Nilarian"] = "", -- A_Classic_Fairytale:queen --- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh --- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow --- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey --- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey --- ["NomNom"] = "", -- A_Classic_Fairytale:united --- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow --- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey --- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant --- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos + ["Nicely done, meatbags!"] = "Ben fatto, ammasso di carne", -- A_Classic_Fairytale:enemy +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 + ["Nice work!"] = "Bel lavoro!", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon + ["Nilarian"] = "Nilarian", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- + ["Nobody Laugh"] = "Nessuno Ride", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 + ["No, I came back to help you out..."] = "No, torno indietro per aiutarti...", -- A_Classic_Fairytale:shadow + ["No...I wonder where they disappeared?!"] = "No... mi chiedo dove siano spariti?!", -- A_Classic_Fairytale:journey + ["Nom-Nom"] = "Nom-Nom", -- A_Classic_Fairytale:journey + ["NomNom"] = "NomNom", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 + ["Nope. It was one fast mole, that's for sure."] = "No. Era una talpa veloce, sicuramente!", -- A_Classic_Fairytale:shadow + ["No! Please, help me!"] = "No! Per favore, aiutami!", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor + ["NORMAL"] = "NORMALE", -- Continental_supplies +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor + ["North America"] = "Nord America", -- Continental_supplies +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "NON CI SONO ABBASTANZA PUNTI!", --- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion + ["Not now, Fiery Water!"] = "Non ora, Acqua Ardente", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Partita (quasi) amichevole", --- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow --- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united --- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope --- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey --- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow --- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon --- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode --- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow --- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon --- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family --- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey --- ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood --- ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab + ["Not you again! My head still hurts from last time!"] = "Di nuovo tu! Mi fa ancora male la testa dall'ultima volta!", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer + ["No, we made sure of that!"] = "No, siamo stati attenti!", -- A_Classic_Fairytale:united + ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "Ora trova il bersaglio successivo! |Suggerimento: Di solito perdi salute cadendo, quindi fai attenzione!", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 + ["No! What have I done?! What have YOU done?!"] = "No! Cosa ho fatto?! Cosa TU hai fatto?!", -- A_Classic_Fairytale:journey + ["No. Where did he come from?"] = "No. Da dove è sbucato?", -- A_Classic_Fairytale:shadow + ["Now how do I get on the other side?!"] = "E ora come arrivo dall'altra parte?!", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 + ["No. You and the rest of the tribe are safer there!"] = "No. Tu e il resto della tribù sarete più al sicuro qui!", -- A_Classic_Fairytale:backstab +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode + ["Obliterate them!|Hint: You might want to take cover..."] = "Toglieteli!|Suggerimento: potresti voler trovare copertura...", -- A_Classic_Fairytale:shadow + ["Obstacle course"] = "Corsa a ostacoli", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen + ["Of course I have to save her. What did I expect?!"] = "Naturalmente devo salvarla. Cosa credevo?!", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 + ["OH, COME ON!"] = "OH, FORZA!", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 +-- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["Oh no! Time's up! Just try again."] = "Oh no! Tempo scaduto! Prova ancora!", --- ["Oh no! You failed! Just try again."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab --- ["Olive"] = "", -- A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- + ["Olive"] = "Oliva", -- A_Classic_Fairytale:united ["Omnivore"] = "Onnivoro", --- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant --- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood --- ["on Skip"] = "", -- Continental_supplies --- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united --- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Operazione Sub", + ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "C'era una volta un'isola con grandi risorse naturali, dove vivevano due tribù sempre in guerra...", -- A_Classic_Fairytale:first_blood +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer + ["Oops...I dropped them."] = "Oops... Mi sono cadute.", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 + ["Open that crate and we will continue!"] = "Apri quella cassa e continuiamo!", -- A_Classic_Fairytale:first_blood ["Opposing Team: "] = "Squadra Nemica: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity --- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen --- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy --- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Riccio Patetico #%d", +-- ["Orange"] = "", -- + ["Orlando Boom!"] = "Orlando Boom!", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity + ["Other kills don't give you points."] = "Le altre uccisioni non ti daranno punti.", -- Mutant +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome + ["Our tribe, our beautiful island!"] = "La nostra tribù, la nostra bella isola!", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 + ["Parachute"] = "Paracadute", -- Continental_supplies +-- ["Patches"] = "", -- ["Pathetic Resistance"] = "Resistenza Patetica", --- ["Penguin roar: [Deal 15 damage + 15% 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 +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - --- ["Per team weapons"] = "", -- Continental_supplies --- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow --- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh + ["Per team weapons"] = "Armi per team", -- Continental_supplies + ["Pfew! That was close!"] = "Pfff! Era vicino!", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor + ["Piano Strike"] = "Strike con il piano", -- Construction_Mode +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor ["Place more waypoints using the 'Air Attack' weapon."] = "Piazza più punti usando l'Attacco Aereo", --- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer --- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["POINTS"] = "", -- Mutant +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag + ["Planes Used:"] = "Aerei usati:", -- User_Mission_-_RCPlane_Challenge + ["Planes Used"] = "Aerei usati", -- User_Mission_-_RCPlane_Challenge +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos + ["Play with me!"] = "Gioca con me!", -- A_Classic_Fairytale:shadow +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW + ["Please, stop releasing your \"smoke signals\"!"] = "Per favore, smetti di fare i tuoi \"segnali di fumo\"!", -- A_Classic_Fairytale:shadow +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- Battalion ["points"] = "punti", +-- ["point(s)"] = "", -- TargetPractice, Mutant +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 ["Poison"] = "Veleno", --- ["Population"] = "", -- Continental_supplies --- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "Potenza Rimasta", +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant + ["Population"] = "Popolazione", -- Continental_supplies +-- ["Porkey"] = "", -- + ["Portal hint: one goes to the destination, and one is the entrance.|"] = "Suggerimento portale: uno è la destinazione, uno è l'ingresso.|", -- A_Classic_Fairytale:dragon +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos ["Prepare yourself"] = "Preparati", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW --- ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW ["Press [Precise] to skip intro"] = "Premi [Mirino di Precisione] per saltare l'intro", --- ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb --- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow - ["Race complexity limit reached."] = "Raggiunto il limite di complessità della corsa.", +-- ["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 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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory + ["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 +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer +-- ["Racer"] = "", -- Racer ["RACER"] = "RACER", --- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion --- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united --- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity --- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow --- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode --- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab --- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab --- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope --- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies --- ["Respawner"] = "", -- Construction_Mode --- ["Resurrector"] = "", -- Construction_Mode --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace + ["Rachel"] = "Rachel", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW + ["Raging Buffalo"] = "Bufalo rabbioso", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- + ["Ramon"] = "Ramon", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal + ["RC Plane"] = "Aereo RC", -- Construction_Mode +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 + ["Really?! You thought you could harm me with your little toys?"] = "Veramente?! Pensavi avresti potuto danneggiarmi con i tuoi piccoli giocattoli?", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final + ["Reflector Shield"] = "Corazza Riflettente", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode + ["Regurgitator"] = "Rigurgitatore", -- A_Classic_Fairytale:backstab + ["Reinforcements"] = "Rinforzi", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos + ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "Ricorda: la corda si piega solo sugli oggetti, se non colpisce niente resta dritta!", -- Basic_Training_-_Rope + ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "Ricorda, animale patetico: un giorno rimpiangerai la tua fedeltà cieca!", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow --- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome --- ["Rope Training"] = "", -- Basic_Training_-_Rope --- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow - ["Round Limit:"] = "Limite del Round: ", - ["Round Limit"] = "Limite del Round", - ["Rounds Complete: "] = "Round Completati: ", - ["Rounds Complete"] = "Round Completati", --- ["Rubber Band"] = "", -- Construction_Mode --- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "REGOLE DEL GIOCO (Premi ESC per visualizzarle)", --- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - --- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united --- ["Salvation"] = "", -- A_Classic_Fairytale:family --- ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon +-- ["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 +-- ["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 +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope + ["Rope Training"] = "Allenamento corde", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- + ["Rot Molester"] = "Molestatore Marcio", -- A_Classic_Fairytale:shadow +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor + ["Rubber Placement Mode"] = "Modalità posizionamento banda elsatica", -- Construction_Mode +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- + ["Rusty Joe"] = "Joe arrugginito", -- A_Classic_Fairytale:queen +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer + ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "Sabotaggio/fiamma: [Sabota tutti ricci nel cerchio e dà ~ 1 danno OPPURE Dà fuoco un cluster in aria]", -- Continental_supplies +-- ["Saint"] = "", -- HedgeEditor, The_Specialists + ["Salivaslurper"] = "Mangiasaliva", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- + ["Salvation"] = "Salvezza", -- A_Classic_Fairytale:family + ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 ["Save as many hapless hogs as possible!"] = "Salva più ricci sfortunati che puoi!", --- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow --- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family --- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey --- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["Score"] = "", -- Mutant - ["SCORE"] = "PUNTEGGIO", - - ["sec"] = "sec", --- ["Seduction"] = "", -- Continental_supplies --- ["Seems like every time you take a \"walk\", the enemy find us!"] = "", -- A_Classic_Fairytale:backstab --- ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood + ["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 + ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "Salva la principessa! Tutti i tuoi ricci devono sopravvivere!|Suggerimento: uccidi i prima cyborg prima! Utilizza le munizioni con molta attenzione! |Suggerimento: Potresti risparmiare una trave per coprirti!", -- A_Classic_Fairytale:family + ["Save the princess by collecting the crate in under 12 turns!"] = "Salva la principessa prendendo la cassa entro 12 turni!", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 ["See ya!"] = "Ci vediamo!", --- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon --- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood + ["Segmentation Paul"] = "Il Segmentato Paul", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor + ["Select continent!"] = "Scegli il continente!", -- Continental_supplies ["selected!"] = "selezionato!", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey --- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "Scudo ricaricato! Potenza +30", - ["Shield Depleted"] = "Scudo Esaurito", +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge + ["... share your beauty with the world every morning, my princess!"] = "...condividi ogni mattina la tua bellezza con il mondo, principessa!", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- + ["She's behind that tall thingy."] = "È dietro quella cosa alta.", -- A_Classic_Fairytale:family +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Lo scudo è stato completamente ricaricato!", - ["Shield Master!"] = "Maestro di scudo!", - ["Shield Miser!"] = "Povero scudo!", - ["Shield OFF:"] = "Scudo OFF:", - ["Shield ON:"] = "Scudo ON:", - ["Shield Seeker!"] = "Cercatore di Scudi!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 --- ["Shotgun"] = "", - ["Shotgun Team"] = "Squadra Shotgun", - ["Shotgun Training"] = "Addestramento sull'utilizzo del Fucile a Pompa", +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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", ["shots remaining."] = "colpi rimasti.", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Stupido", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Affondato", --- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s è fuori dal campo e la squadra %d|prende una penalità!| |Punteggio:", - ["%s is out and Team %d|scored a point!| |Score:"] = "%s è fuori dal campo e la squadra %d|guadagna un punto!| |Puntuación:", --- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy --- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy --- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy --- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion + ["Sirius Lee"] = "L'onesto Lee", -- A_Classic_Fairytale:enemy +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- + ["Slippery"] = "Scivoloso", -- A_Classic_Fairytale:journey +-- ["Slot %d: %s"] = "", -- Frenzy + ["Slot keys save time! (F1-F10 by default)"] = "Tasti slot fanno risparmiare tempo! (F1-F10 predefiniti)", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW + ["Smith 0.97"] = "Smith 0.97", -- A_Classic_Fairytale:enemy + ["Smith 0.98"] = "Smith 0.98", -- A_Classic_Fairytale:enemy + ["Smith 0.99a"] = "Smith 0.99a", -- A_Classic_Fairytale:enemy + ["Smith 0.99b"] = "Smith 0.99b", -- A_Classic_Fairytale:enemy + ["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 skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists + ["Sniper Rifle"] = "Fucile di precisione", -- Continental_supplies ["Sniper Training"] = "Addestramento sull'utilizzo del Fucile di Precisione", ["Sniperz"] = "Cecchini", --- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies --- ["South America"] = "", -- Continental_supplies --- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW --- ["Special Weapons:"] = "", -- Continental_supplies --- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["Spleenlover"] = "", -- A_Classic_Fairytale:united +-- ["So, as promised I have brought you where I think that the device you are looking for is hidden."] = "", -- A_Space_Adventure:fruit02 +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- + ["South America"] = "Sud America", -- Continental_supplies + ["So? What will it be?"] = "Quindi? Cosa sarà?", -- A_Classic_Fairytale:shadow +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion + ["Special Weapons:"] = "Armi speciali:", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- + ["Spiky Cheese"] = "Formaggio Spinoso", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW + ["Spleenlover"] = "Ama-milze", -- A_Classic_Fairytale:united ["Sponge"] = "Spugna", ["Spooky Tree"] = "Albero Stregato", --- ["Sprite Placement Mode"] = "", -- Construction_Mode --- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["s|"] = "s|", - ["s"] = "s", - ["STATUS UPDATE"] = "STATUS AGGIORNATO", --- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen --- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood --- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Sticky Mine"] = "", -- Continental_supplies --- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode --- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - --- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- Construction_Mode --- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW --- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW --- ["Surfer! +15 points!"] = "", -- Space_Invasion --- ["Surfer!"] = "", -- WxW --- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow --- ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood --- ["switch"] = "", -- Continental_supplies +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor + ["Sprite Placement Mode"] = "Modalità posizionamento folletto", -- Construction_Mode + ["Sprite Testing Mode"] = "Modalità test folletto", -- Construction_Mode +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 + ["Steel Eye"] = "Occhio d'Accaio", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer + ["Step By Step"] = "Passo dopo passo", -- A_Classic_Fairytale:first_blood + ["Steve"] = "Steve", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Sticky Mine"] = "Mina appiccicosa", -- Continental_supplies +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor + ["Sticky Mine Placement Mode"] = "Modalità posizionamento mina appiccicosa", -- Construction_Mode +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion + ["Stronglings"] = "Stronglings", -- A_Classic_Fairytale:shadow + ["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 + ["Sundaland"] = "Sundaland", -- Continental_supplies +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode + ["Support Station"] = "Stazione di Supporto", -- Construction_Mode +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW + ["Surfer! +15 points!"] = "Surfista! +15 punti!", -- Space_Invasion + ["Surfer!"] = "Surfista", -- WxW + ["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 +-- ["%s violated the “All But Last” rule and will be penalized."] = "", -- WxW +-- ["%s violated the “Kill The Leader” rule and will be penalized."] = "", -- WxW +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer ["Switched to "] = "Cambiato in", --- ["Switch Hog"] = "", -- Construction_Mode --- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode --- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode --- ["Target Placement Mode"] = "", -- Construction_Mode + ["Switch Hog"] = "Scambia riccio", -- Construction_Mode + ["switch"] = "scambio", -- Continental_supplies +-- ["Switch: Toggle crate radar"] = "", -- WxW + ["Syntax Errol"] = "Ellole di Sintassi", -- A_Classic_Fairytale:dragon +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- + ["Talk about mixed signals..."] = "Devo recuperare le casse...", -- A_Classic_Fairytale:dragon +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor + ["Target Placement Mode"] = "Modalità posizionamento target", -- Construction_Mode +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Squadra %d: ", - ["Team Scores"] = "Punteggi della Squadra", --- ["Teleporation Node"] = "", -- Construction_Mode --- ["Teleportation Mode"] = "", -- Construction_Mode --- ["Teleportation Node"] = "", -- Construction_Mode --- ["Teleport"] = "", -- Construction_Mode, Frenzy --- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon --- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode + ["Teleportation Node"] = "Nodo Teletrasporto", -- Construction_Mode + ["Teleport hint: just use the mouse to select the destination!"] = "Suggerimento teletrasporto: usa il mouse per impostare la destinazione!", -- A_Classic_Fairytale:dragon + ["Teleport"] = "Teletrasporto", -- Construction_Mode, Frenzy + ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "Teletrasporto non riuscito. Teletrasportati all'interno di una sfera d'influenza di un teletrasporto del clan", -- Construction_Mode +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil ["Thanks!"] = "Grazie!", +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 ["Thank you, my hero!"] = "Grazie, mio eroe!", --- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey --- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey --- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united --- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy --- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab + ["Thank you, oh, thank you, Leaks A Lot!"] = "Grazie, oh, grazie Leaks A Lot!", -- A_Classic_Fairytale:journey + ["Thank you, oh, thank you, my heroes!"] = "Grazie, oh, grazie miei eroi!", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 + ["That is, indeed, very weird..."] = "Questo è molto strano...", -- A_Classic_Fairytale:united + ["That makes it almost invaluable!"] = "Questo lo rende quasi indispensabile!", -- A_Classic_Fairytale:enemy + ["That ought to show them!"] = "Bisogna usare le maniere forti!", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil ["That's for my father!"] = "Questo è per mio padre!", --- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow + ["That shaman sure knows what he's doing!"] = "Quello sciamano sa sicuramente quello che fa!", -- A_Classic_Fairytale:shadow ["That Sinking Feeling"] = "Quella Sensazione di Affogare...", --- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy --- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family - ["That was just mean!"] = "E' semplicemente penoso!", - ["That was pointless."] = "Era senza senso.", --- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant --- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood --- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united --- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen + ["That's not our problem!"] = "Non è un nostro problema!", -- A_Classic_Fairytale:enemy + ["That's typical of you!"] = "Questo è tipico vostro!", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen + ["That was just mean!"] = "Era solo un tirchio!", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 + ["The answer is...entertaintment. You'll see what I mean."] = "La risposta è... per divertimento. Vedrai cosa intendo.", -- A_Classic_Fairytale:backstab +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 + ["The Bull's Eye"] = "Occhio di Toro", -- A_Classic_Fairytale:first_blood + ["The caves are well hidden, they won't find us there!"] = "Le grotte sono ben nascoste, non ci troveranno qui!", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 + ["The Crate Frenzy"] = "Cassa Frenetica", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- ["The Dilemma"] = "Il dilemma", --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Il nemico si sta nascondendo dietro a quella papera!", --- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy --- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant + ["The Enemy Of My Enemy"] = "Il nemico del mio nemico", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 + ["The First Blood"] = "Il primo sangue", -- A_Classic_Fairytale:first_blood + ["The First Encounter"] = "Il primo incontro", -- A_Classic_Fairytale:shadow +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "La bandiera verrà restituita alla fine del turno.", --- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab --- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode --- ["The guardian"] = "", -- A_Classic_Fairytale:shadow --- ["The Individualist"] = "", -- A_Classic_Fairytale:shadow --- ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united --- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey --- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood --- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey --- ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant --- ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling + ["The food bites back"] = "La preda è predatore", -- A_Classic_Fairytale:backstab + ["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 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 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 +-- ["The Iron Curtain"] = "", -- + ["The Journey Back"] = "Ritorno a casa", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen + ["The Leap of Faith"] = "Il salto della fede", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos + ["The Moonwalk"] = "Camminata sulla luna", -- A_Classic_Fairytale:journey + ["The Mutant has super-weapons and a lot of health."] = "Il Mutante ha super-armi e un sacco di vita.", -- 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 next one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope --- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow --- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant --- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode --- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab --- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey --- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey --- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey --- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood --- ["The Savior"] = "", -- A_Classic_Fairytale:journey --- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab --- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow --- ["The Showdown"] = "", -- A_Classic_Fairytale:shadow --- ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood +-- ["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 one is pretty hard! |Tip: You have to do multiple swings!"] = "Il prossimo è piuttosto difficile! |Suggerimento: devi fare più oscillazioni", -- Basic_Training_-_Rope + ["Then how do they keep appearing?"] = "Allora perchè continuano ad apparire?", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen + ["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 +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion + ["There are a variety of structures available to aid you."] = "Ci sono diverse strutture disponibili per aiutarti.", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 + ["There must be a spy among us!"] = "Dev'esserci una spia tra noi!", -- A_Classic_Fairytale:backstab + ["There's more of them? When did they become so hungry?"] = "Ce ne sono altri? Quando sono diventati così affamati?", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united + ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "Niente mi soddisfa più che vederti condividere la tua bellezza con il mondo ogni mattina, mia principessa!", -- A_Classic_Fairytale:journey + ["There's nothing more satisfying to us than seeing you share your beauty..."] = "Niente ci soddisfa più che vederti condividere la tua bellezza... ", -- A_Classic_Fairytale:journey + ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "Niente ci soddisfa più che vederti condividere la tua bellezza con il mondo ogni mattina, principessa!", -- A_Classic_Fairytale:journey + ["The Rising"] = "L'alba", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 + ["The Savior"] = "Il salvatore", -- A_Classic_Fairytale:journey + ["These primitive people are so funny!"] = "Questi primitivi sono così divertenti!", -- A_Classic_Fairytale:backstab + ["The Shadow Falls"] = "Le Shadow Falls", -- A_Classic_Fairytale:shadow + ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood --- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood --- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey --- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood --- ["The Union"] = "", -- A_Classic_Fairytale:enemy --- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey --- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow --- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood --- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood --- ["The what?!"] = "", -- A_Classic_Fairytale:dragon --- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood --- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion --- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united --- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy --- ["They never learn"] = "", -- A_Classic_Fairytale:journey --- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy --- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy --- ["Thighlicker"] = "", -- A_Classic_Fairytale:united --- ["This is it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood --- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy --- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon --- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow --- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab + ["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 team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 + ["The Torment"] = "La tormenta", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 + ["The Tunnel Maker"] = "Creatore di Tunnel", -- A_Classic_Fairytale:journey + ["The Ultimate Weapon"] = "Arma definitiva", -- A_Classic_Fairytale:first_blood + ["The Union"] = "L'unione", -- A_Classic_Fairytale:enemy + ["The village, unprepared, was destroyed by the cyborgs..."] = "Il villaggio, impreparato, è stato distrutto dai cyborg", -- A_Classic_Fairytale:journey + ["The walk of Fame"] = "La Walk of Fame", -- A_Classic_Fairytale:shadow + ["The wasted youth"] = "Gioventù bruciata", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen + ["The weapon in that last crate was bestowed upon us by the ancients!"] = "L'arma nell'ultima cassa ci è stata conferita dagli antichi!", -- A_Classic_Fairytale:first_blood + ["The what?!"] = "Il cosa?!", -- A_Classic_Fairytale:dragon + ["The wind whispers that you are ready to become familiar with tools, now..."] = "Il vento mi sussurra che ora sei pronto ad usare le attrezzature...", -- A_Classic_Fairytale:first_blood + ["They are all waiting back in the village, haha."] = "Stanno tutti aspettando al villaggio, ahah.", -- A_Classic_Fairytale:enemy +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion + ["They have weapons we've never seen before!"] = "Hanno armi mai viste prima!", -- A_Classic_Fairytale:united + ["They keep appearing like this. It's weird!"] = "Continuano ad apparire così. Strano!", -- A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united + ["They must be trying to weaken us!"] = "Staranno provando ad indebolirci!", -- A_Classic_Fairytale:enemy + ["They never learn"] = "Non imparano mai", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen + ["They told us to wear these clothes. They said that this is the newest trend."] = "Ci hanno detto di indossare questi abiti. Hanno detto che questa è l'ultima moda.", -- A_Classic_Fairytale:enemy + ["They've been manipulating us all this time!"] = "Ci hanno manipolato per tutto il tempo!", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- + ["Thighlicker"] = "Lanciacoscia", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "Andiamo! E' giunto il momento di impressionare Scesa dal Cielo...", -- A_Classic_Fairytale:first_blood + ["This island is the only place left on Earth with grass on it!"] = "Quest'isola è l'unico posto rimasto sulla Terra con dell'erba!", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 + ["This is typical!"] = "Tipico!", -- A_Classic_Fairytale:dragon + ["This must be some kind of sorcery!"] = "Dev'essere qualche tipo di stregoneria!", -- A_Classic_Fairytale:shadow + ["This must be the caves!"] = "Queste devono essere le grotte!", -- A_Classic_Fairytale:backstab ["This one's tricky."] = "Questo è molto complesso.", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Questa pioggia ha qualcosa di strano...", --- ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy --- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["Timed Kamikaze!"] = "Kamikaze a Tempo!", - ["Time Extended!"] = "Tempo Prolungato!", - ["Time Extension"] = "Prolungamento di Tempo", - ["TIME: "] = "TEMPO: ", --- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Scudo Manuale", --- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey --- ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow --- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon --- ["To the caves..."] = "", -- A_Classic_Fairytale:united +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- + ["Those aliens are destroying the island!"] = "Questi alieni stanno distruggendo l'isola!", -- A_Classic_Fairytale:family +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies + ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "Suggerimento: la fisica delle corde è diversa rispetto al mondo reale, usala a tuo vantaggio!", -- Basic_Training_-_Rope +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 + ["To help you, of course!"] = "Per aiutarti, ovviamente!", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 + ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "PISTA COMPLETATA", - - ["training"] = "addestramento", +-- ["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", +-- ["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 ["Tribe"] = "Tribù", ["TrophyRace"] = "TrophyRace", --- ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", - ["Tumbling Time Extended!"] = "Tempo di Caduta Prolungato!", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Tempo del Turno", --- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey --- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow --- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant --- ["Under Construction"] = "", -- A_Classic_Fairytale:shadow --- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon --- ["Unique new weapons"] = "", -- Continental_supplies --- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family --- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos + ["Two little hogs cooperating, getting past obstacles..."] = "Due piccoli ricci che si aiutano tra loro nonostante i vecchi attriti...", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- + ["Uhm...I met one of them and took his weapons."] = "Uhm... ho incontrato uno e ho preso le sue armi.", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen + ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos + ["Unexpected Igor"] = "Igor l'inaspettato", -- A_Classic_Fairytale:dragon + ["Unique new weapons"] = "Nuove armi uniche", -- Continental_supplies + ["Unit 0x0007"] = "Unità 0x0007", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- + ["Unit 334a$7%;.*"] = "Unità 334a$7%;.*", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Unità 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- ["Unit 835"] = "Unità 835", --- ["United We Stand"] = "", -- A_Classic_Fairytale:united +-- ["Unit 883"] = "", -- + ["United We Stand"] = "Sempre Uniti", -- A_Classic_Fairytale:united ["Unit"] = "Unità", - ["Unlimited Attacks"] = "Attacchi Illimitati", --- ["Unlucky Sods"] = "", -- User_Mission_-_Rope_Knock_Challenge + ["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!", --- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood --- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon --- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood + ["Unsuspecting Louts"] = "Zotici insospettabili", -- User_Mission_-_Rope_Knock_Challenge +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge + ["Use it wisely!"] = "Usala con saggezza.", -- A_Classic_Fairytale:dragon + ["Use it with precaution!"] = "Usala con attenzione!", -- A_Classic_Fairytale:first_blood ["User Challenge"] = "Sfida Utente", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode --- ["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 rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Use your ready time to think."] = "", -- Frenzy +-- ["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 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 + ["Use the rope to get on the head of the mole, young one!"] = "Usa la corda per raggiungere la testa della talpa, ragazzo!", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos + ["Use the rope to knock your enemies to their doom."] = "Usa la corda per mandare i tuoi nemici al loro destino.", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 + ["Use your ready time to think."] = "Usa il tempo di preparazione per pensare", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Usa la tua corda per raggiungere il traguardo il più velocemente possibile!", --- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode --- ["Vedgies"] = "", -- A_Classic_Fairytale:journey --- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy --- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor + ["Utility Crate Placement Mode"] = "Modalità piazzamento casse attrezzatura", -- Construction_Mode +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion + ["Vedgies"] = "Vegetali", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- + ["Vegan Jack"] = "Il vegano Jack", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen +-- ["Victory Condition: Collect"] = "", -- HedgeEditor +-- ["Victory Condition: Destroy"] = "", -- HedgeEditor +-- ["Victory for %s!"] = "", -- Capture_the_Flag ["Victory for the "] = "La vittoria è di ", --- ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW --- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode + ["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 +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- + ["Wannabe Flyboys"] = "Volatori speranzosi", -- User_Mission_-_RCPlane_Challenge + ["Wannabe Shoppsta"] = "Shopper speranzosi", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 + ["Watch your steps, young one!"] = "Stai attento, ragazzo!", -- A_Classic_Fairytale:first_blood +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Punto piazzato.", - ["Way-Points Remaining"] = "Punti Da Piazzare Rimasti", --- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow --- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood --- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode --- ["Weapon Filter"] = "", -- Construction_Mode --- ["weaponschemes"] = "", -- Continental_supplies +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer + ["Weaklings"] = "Weaklings", -- A_Classic_Fairytale:shadow + ["We all know what happens when you get frightened..."] = "Sappiamo tutti cosa succede quando sei spaventato...", -- A_Classic_Fairytale:first_blood +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor + ["Weapon Crate Placement Mode"] = "Modalità posizionamento cassa armi", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode + ["Weapon Filter"] = "Filtro Armi", -- Construction_Mode + ["weaponschemes"] = "Schemi armi", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion ["Weapons Reset"] = "Armi Azzerate", --- ["Weapons reset."] = "", -- Highlander --- ["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 --- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy --- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey --- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy --- ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united --- ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy --- ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 + ["We can't hold them up much longer!"] = "Non possiamo trattenerli anacora a lungo!", -- A_Classic_Fairytale:united + ["We can't let them take over our little island!"] = "Non possiamo lasciare che si prendano la nostra piccola isola!", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen + ["We have no time to waste..."] = "Non abbiamo tempo da perdere", -- A_Classic_Fairytale:journey + ["We have nowhere else to live!"] = "Non abbiamo altro posto dove vivere!", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "Benvenuto Leaks A Lot!", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos ["Well done."] = "Ben fatto.", --- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy + ["We'll give you a problem then!"] = "Ti daremo dei problemi allora!", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 ["We'll spare your life for now!"] = "Ti risparmieremo la vita per ora!", --- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon --- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey --- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy --- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab --- ["We need to move!"] = "", -- A_Classic_Fairytale:united --- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab --- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow --- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil + ["Well, that was a waste of time."] = "Beh, è stata una perdita di tempo.", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos + ["Well, well! Isn't that the cutest thing you've ever seen?"] = "Bene, bene! Non è la cosa più tenera che abbiate mai visto?", -- A_Classic_Fairytale:journey + ["Well, yes. This was a cyborg television show."] = "Beh, si. Questo era uno show televisivo dei cyborg", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen + ["We made sure noone followed us!"] = "Ci eravamo assicurati che neeessuno ci seguisse!", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen + ["We need to move!"] = "Dobbiamo muoverci!", -- A_Classic_Fairytale:united + ["We need to prevent their arrival!"] = "Dobbiamo prevenire il loro arrivo!", -- A_Classic_Fairytale:backstab + ["We need to warn the village."] = "Dobbiamo avvisare il villaggio.", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos + ["We should head back to the village now."] = "Ora dovremmo tornare al villaggio.", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen ["We were trying to save her and we got lost."] = "Stavamo cercando di salvarla e ci siamo persi.", +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen ["We won't let you hurt her!"] = "Non vi lasceremo farle del male!", --- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood --- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen + ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "Cosa?! Un cannibale? Qui? Non c'è tempo da perdere! Vieni, sei pronto.", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen + ["What a douche!"] = "Che doccia!", -- A_Classic_Fairytale:enemy ["What am I gonna...eat, yo?"] = "Cosa mengerò... te?", - ["What are you doing at a distance so great, young one?"] = "Cosa state facendo a questa enorme distanza, voi?", + ["What are you doing at a distance so great, young one?"] = "Cosa stai facendo così lontano ragazzo?", ["What are you doing? Let her go!"] = "Cosa state facendo? Lasciatela andare!", --- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow --- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon --- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab --- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood --- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab --- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab + ["What a ride!"] = "Che cavalcata!", -- A_Classic_Fairytale:shadow + ["What a strange cave!"] = "Che strana grotta!", -- A_Classic_Fairytale:dragon + ["What a strange feeling!"] = "Che strana sensazione!", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen + ["What do my faulty eyes observe? A spy!"] = "Cosa vedono i miei poveri occhi? Una spia!", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 + ["Whatever floats your boat..."] = "Su qualunque cosa galleggi la tua nave...", -- A_Classic_Fairytale:shadow +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab + ["What? Here? How did they find us?!"] = "Cosa? Qui? Come ci hanno trovati?", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen ["What is this place?"] = "Cos'è questo posto?", --- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab --- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy --- ["When?"] = "", -- A_Classic_Fairytale:enemy --- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon --- ["Where are all these crates coming from?!"] = "", -- A_Classic_Fairytale:shadow +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen + ["What shall we do with the traitor?"] = "Cosa dovremmo fare con il traditore?", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen + ["WHAT?! You're the ones attacking us!"] = "COSA!? Voi siete quelli che ci stanno attaccando!", -- A_Classic_Fairytale:enemy + ["When I find it..."] = "Quando lo trovo...", -- A_Classic_Fairytale:dragon + ["When?"] = "Quando?", -- A_Classic_Fairytale:enemy + ["Where are all these crates coming from?!"] = "Da dove vengono tutte queste casse?!", -- A_Classic_Fairytale:shadow ["Where are they?!"] = "Dove sono loro?!", ["Where did that alien run?"] = "Dov'è corso quell'alieno?", --- ["Where did you get the exploding apples and the magic bow that shoots many arrows?"] = "", -- A_Classic_Fairytale:shadow - ["Where did you get the exploding apples?"] = "Dove avete preso le mele explosive?", --- ["Where did you get the magic bow that shoots many arrows?"] = "", -- A_Classic_Fairytale:shadow --- ["Where did you get the weapons in the forest, Dense Cloud?"] = "", -- A_Classic_Fairytale:backstab + ["Where did you get the exploding apples and the magic bow that shoots many arrows?"] = "Dove hai preso quelle mele esplosive e l'arco magico che spara molte frecce?", -- A_Classic_Fairytale:shadow + ["Where did you get the exploding apples?"] = "Dove hai preso quelle mele esplosive?", + ["Where did you get the magic bow that shoots many arrows?"] = "Dove hai preso l'arco magico che spara molte frecce?", -- A_Classic_Fairytale:shadow + ["Where did you get the weapons in the forest, Dense Cloud?"] = "Nuvola Densa, dove hai trovato le armi nella foresta?", -- A_Classic_Fairytale:backstab ["Where do you get that?!"] = "Dove avete preso quello?!", ["Where have you been?!"] = "Dove siete stati?!", ["Where have you been?"] = "Dove siete stati?", --- ["Whip"] = "", -- Construction_Mode +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen ["Why are you doing this?"] = "Perché stai facendo questo?", - ["Why are you helping us, uhm...?"] = "Perché ci stai aiutando, mmm...?", --- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family --- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood + ["Why are you helping us, uhm...?"] = "Perché ci stai aiutando, coso...?", + ["Why can't he just let her go?!"] = "Perchè non possono semplicemente lasciarla andare?", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen + ["Why do men keep hurting me?"] = "Perchè gli uomini continuano ad infastidirmi?", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen ["Why do you not like me?"] = "Perché non ti piaccio?", --- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy + ["Why do you want to take over our island?"] = "Perchè volete prendervi la nostra isola?", -- A_Classic_Fairytale:enemy ["Why me?!"] = "Perché io?!", - ["! Why?!"] = "! Perché?!", - ["? Why?"] = "? Perché?", - ["Why "] = "Perché ", --- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab --- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies --- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen + ["Why would they do this?"] = "Perchè dovrebbero farlo?", -- A_Classic_Fairytale:backstab + ["- Will Get 1-3 random weapons"] = "- Otterra 1-3 armi casuali", -- Continental_supplies + ["- Will give you a parachute every second turn."] = "- Ti daremo un paracadute ogni secondo turno", -- Continental_supplies ["Will this ever end?"] = "Finirà mai?", - ["WINNER IS "] = "IL VINCITORE E' ", - ["WINNING TIME: "] = "TEMPO VINCENTE: ", --- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon --- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer + ["Wise Oak"] = "Quercia saggia", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "Con Nuvola Densa nella terra delle ombre, sono l'unica speranza del villaggio ...", -- A_Classic_Fairytale:journey +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon + ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "Non preoccuparti, è un animale pacifico! Non c'è ragione di avere paura...", -- A_Classic_Fairytale:first_blood ["Wow, what a dream!"] = "Wow, che sogno!", +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- ["Y3K1337"] = "Y3K1337", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow ["Yay, we won!"] = "Sì, abbiamo vinto!", ["Y Chwiliad"] = "Y Cwhiliad", -- A_Classic_Fairytale:dragon --- ["Yeah...I think it's a 'he', lol."] = "", -- A_Classic_Fairytale:shadow + ["Yeah...I think it's a 'he', lol."] = "Si... penso che sia un 'lui', ahahah.", -- A_Classic_Fairytale:shadow ["Yeah, sure! I died. Hillarious!"] = "Sì, davvero! Sono morto! Divertente!", -- A_Classic_Fairytale:backstab ["Yeah, take that!"] = "Sì, prendilo!", -- A_Classic_Fairytale:dragon ["Yeah? Watcha gonna do? Cry?"] = "Sì? Cosa pensate di fare? Piangere?", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen ["Yes!"] = "Sì!", - ["Yes, yeees! You are now ready to enter the real world!"] = "S^, sìì! Ora siete pronti per entrare nel mondo reale!", + ["Yes, yeees! You are now ready to enter the real world!"] = "Si, sii! Ora siete pronti per entrare nel mondo reale!", +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen ["Yo, dude, we're here, too!"] = "Ehi, tu, ci siamo anche noi, qui!", --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome --- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow --- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy - ["! You bastards!"] = "! Bastardi!", --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal --- ["You couldn't possibly believe that after refusing my offer I'd just let you go!"] = "", -- A_Classic_Fairytale:journey +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome + ["You are given the chance to turn your life around..."] = "Ti viene data la possibilità di trasformare la tua vita...", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos + ["You are playing with our lives here!"] = "Stai giocando con le nostre vite!", -- A_Classic_Fairytale:enemy +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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..."] = "", -- A_Classic_Fairytale:journey + ["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 did not make it in time, try again!"] = "Non hai fatto in tempo, prova ancora!", --- ["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 been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope --- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united --- ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey --- ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab --- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy - ["You have "] = "Hai ", --- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy --- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab --- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood --- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["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 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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..."] = "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 beaten the challenge!"] = "", -- ClimbHome + ["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 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 + ["You have finally figured it out!"] = "Hai finalmente capito!", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice + ["You have kidnapped our whole tribe!"] = "Hai rapito tutta la nostra tribù!", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory + ["You have killed an innocent hedgehog!"] = "Hai ucciso un riccio innocente!", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge + ["You have proven yourself worthy to see our most ancient secret!"] = "Hai dimostrato di essere degno di vedere il nostro segreto più antico!", -- A_Classic_Fairytale:first_blood + ["You have proven yourselves worthy!"] = "Hai dimostrato di essere degno!", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "Hai guadagnato un PUNTO!!", - ["You have to destroy 12 targets in 180 seconds"] = "Devi distruggere 12 bersagli in 180 secondi", --- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy --- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab --- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow --- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab --- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab --- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab --- ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos + ["You have won the game by proving true cooperative skills!"] = "Hai vinto il gioco dimostrando vere capacità di cooperazione!", -- A_Classic_Fairytale:enemy + ["You just appeared out of thin air!"] = "Sei appena apparso fuori dalla nebbia!", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen + ["You just committed suicide..."] = "Ti sei appena suicidato...", -- A_Classic_Fairytale:shadow + ["You killed my father, you monster!"] = "Hai ucciso mio padre, mostro!", -- A_Classic_Fairytale:backstab + ["You know...taking a stroll."] = "Sai... fare una passeggiata.", -- A_Classic_Fairytale:backstab + ["You know what? I don't even regret anything!"] = "Sai un cosa? Non rimpiango nulla!", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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!", --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode --- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy --- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab --- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united --- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy --- ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow - ["You're...alive!? But we saw you die!"] = "Sei...vivo!? Ma noi ti abbiamo visto morire!", +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag + ["You meatbags are pretty slow, you know!"] = "Ammasso di carne, sei piuttosto lento!", -- A_Classic_Fairytale:enemy + ["You might want to find a way to instantly kill arriving cannibals!"] = "Potresti voler trovare un modo per uccidere subito i cannibali che arrivano!", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen + ["Young one, you are telling us that they can instantly change location without a shaman?"] = "Ragazzo, ci stai dicendo che possono cambiare posizione istantaneamente senza uno sciamano?", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer + ["You probably know what to do next..."] = "Probabilmente sai già cosa fare...", -- A_Classic_Fairytale:first_blood +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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!", ["You're a pathetic liar!"] = "Sei un patetico bugiardo!", ["You're funny!"] = "Sei divertente!", --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope --- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow --- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab --- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen + ["You're pathetic! You are not worthy of my attention..."] = "Sei patetico! Non meriti nemmeno la mia attenzione...", -- A_Classic_Fairytale:shadow + ["You're probably wondering why I bought you back..."] = "Probabilmente stai chiedendo perché ti ho riportato indietro...", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen + ["You're terrorizing the forest...We won't catch anything like this!"] = "Stai terrorizzando la foresta ... non prenderemo niente così!", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome ["Your hogs must survive!"] = "I vostri ricci devono sopravvivere!", --- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "Hai salvato", --- ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy + ["Your movement skills will be evaluated now."] = "Ora valutiamo le tue capacità di movimento.", -- A_Classic_Fairytale:first_blood +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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 recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies +-- ["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!"] = "", -- A_Classic_Fairytale:family + ["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"] = "", -- ["Zealandia"] = "Zealandia", - ["'Zooka Team"] = "Squadra 'Zooka", +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal + ["'Zooka Team"] = "Squadra Zooka", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard ["Zork"] = "Zork", - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/it.txt --- a/share/hedgewars/Data/Locale/it.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/it.txt Sun Dec 17 00:09:24 2017 +0100 @@ -59,7 +59,7 @@ 00:55=Raggio congelatore 00:56=Mannarino -01:00=Combattiamo! +; 01:00=Loading … 01:01=Round in parità 01:02=%1 vince! 01:03=Volume %1% @@ -234,11 +234,11 @@ 02:02=Preparatevi alla gloria! 02:02=Forza e coraggio, che la vita è un passaggio! -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 vince! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=Round in parità ; New health crate 02:05=Pronto soccorso in arrivo! @@ -519,12 +519,12 @@ ; Game goal strings 05:00=Modalità di Gioco 05:01=Si applicano le seguenti regole -05:02=Fortino: Difendi la tua fortezza; annienta i nemici! +05:02=Piazza il Re: Scegli un punto di partenza protetto per il tuo Re 05:03=Bassa Gravità: Guarda dove metti i piedi 05:04=Invulnerabilità: I ricci sono (quasi) invulnerabili 05:05=Vampirismo: I ricci verranno curati dell'equivalente del danno che provocano 05:06=Karma: I ricci verranno danneggiati dell'equivalente del danno provocato -05:07=Proteggi il Re: Non lasciar morire il tuo Re!|Piazza il Re: Scegli un punto di partenza protetto per il tuo Re +05:07=Proteggi il Re: Non lasciar morire il tuo Re! 05:08=Piazza Ricci: Piazza i tuoi ricci prima dell'inizio del gioco 05:09=Artiglieria: I ricci non possono camminare per cambiare posizione 05:10=Terreno Indistruttibile: La maggior parte delle armi non distruggono il terreno diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/ja.txt --- a/share/hedgewars/Data/Locale/ja.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/ja.txt Sun Dec 17 00:09:24 2017 +0100 @@ -57,7 +57,7 @@ ; 00:54=構造 00:54=土地スプレー -01:00=ヨシ、ファイト! +; 01:00=Loading … 01:01=ドロー! 01:02=%1 勝った! 01:03=音量 %1% @@ -246,11 +246,11 @@ 02:02=恐れを持っていません! 02:02=勇気をだして征服される -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 勝った! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=ドロー! ; New health crate 02:05=救援物資が入って来る! @@ -529,12 +529,12 @@ ; Game goal strings 05:00=ゲームモード 05:01=次の規則が適用されます -05:02=砦:あなたの要塞を守り、敵を打ち負かす! +05:02=場所キング:あなたの王のために保護された出発点をピック 05:03=低重力:足元に気をつけて 05:04=不死身:豚は不死身(ほぼ)です。 05:05=吸血鬼:豚は、ダメージのために癒される 05:06=カルマ:豚は、ダメージのために破損します。 -05:07=キングを保護する:あなたの王が死んではいけない|場所キング:あなたの王のために保護された出発点をピック +05:07=キングを保護する:あなたの王が死んではいけない 05:08=場所のハリネズミ:ゲームが起動する前に、豚を置きます 05:09=砲兵:豚の位置を変更するには、歩くことができない 05:10=不滅の地形:ほとんどの武器は地形を破壊することはありません diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/ko.lua --- a/share/hedgewars/Data/Locale/ko.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/ko.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { --- [":("] = "", -- ["!!!"] = "", -- ["..."] = "", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy --- ["Accuracy Bonus!"] = "", +-- ["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 Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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 +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome -- ["Aiming Practice"] = "", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW --- ["Ammo"] = "", --- ["Ammo Depleted!"] = "", --- ["ammo extended!"] = "", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler -- ["Ammo is reset at the end of your turn."] = "", --- ["Ammo Maniac!"] = "", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies -- ["Available points remaining: "] = "", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball -- ["Bat balls at your enemies and|push them into the sea!"] = "", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- -- ["Bat your opponents through the|baskets and out of the map!"] = "", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 -- ["Bazooka Training"] = "", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen -- ["Best laps per team: "] = "", --- ["Best Team Times: "] = "", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow --- ["BOOM!"] = "", +-- ["Bones"] = "", -- -- ["Boom!"] = "", --- ["Boss defeated!"] = "", --- ["Boss Slayer!"] = "", +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer -- ["Build a track and race."] = "", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy --- ["CAPTURE THE FLAG"] = "", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard -- ["Careless"] = "", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Change Weapon"] = "", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb --- ["Codename: Teamwork"] = "", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos -- ["Complete the track as fast as you can!"] = "", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations!"] = "", -- ["Congratulations"] = "", -- Basic_Training_-_Rope --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope -- ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control -- ["Control pillars to score points."] = "", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- -- ["Cybernetic Empire"] = "", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- -- ["DAMMIT, ROOKIE!"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion -- ["Dangerous Ducklings"] = "", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 -- ["Deadweight"] = "", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor -- ["Demolition is fun!"] = "", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow --- ["Depleted Kamikaze!"] = "", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode --- ["Drone Hunter!"] = "", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer -- ["Drowner"] = "", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy -- ["Each turn you get 1-3 random weapons"] = "", -- ["Each turn you get one random weapon"] = "", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape --- ["Eliminate all enemies"] = "", -- ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle --- ["Eliminate enemy hogs and take their weapons."] = "", -- Highlander --- ["Eliminate Poison before the time runs out"] = "", --- ["Eliminate the Blue Team"] = "", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists -- ["Enjoy the swim..."] = "", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family -- ["Fastest lap: "] = "", -- ["Feeble Resistance"] = "", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 --- ["Fire"] = "", - +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- -- ["Flag captured!"] = "", -- ["Flag respawned!"] = "", -- ["Flag returned!"] = "", --- ["Flags, and their home base will be placed where each team ends their first turn."] = "", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", --- ["fuel extended!"] = "", --- ["GAME BEGUN!!!"] = "", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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 +-- ["Gangsters"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow --- ["Goal"] = "", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey -- ["Good luck out there!"] = "", -- ["Good so far!"] = "", @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 -- ["GOTCHA!"] = "", --- ["Grab Mines/Explosives"] = "", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen -- ["Hahahaha!"] = "", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen -- ["Haha, now THAT would be something!"] = "", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil -- ["Hapless Hogs"] = "", -- [" Hapless Hogs left!"] = "", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode --- ["Health crates extend your time."] = "", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy"] = "", -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - --- ["Hedgewars-Basketball"] = "", --- ["Hedgewars-Knockball"] = "", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 -- ["Heh, it's not that bad."] = "", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hit Combo!"] = "", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm..."] = "", -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen -- ["Hunter"] = "", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer -- ["Instructor"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow --- ["invaders destroyed"] = "", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,539 +1040,1291 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode -- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- -- ["Jumping is disabled"] = "", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode --- ["Kamikaze Expert!"] = "", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion -- ["Keep it up!"] = "", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood --- ["KILLS"] = "", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["[Left Shift]"] = "", --- ["left shift"] = "", -- Continental_supplies --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 -- ["Listen up, maggot!!"] = "", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode --- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 SUCCESS"] = "", +-- ["Mission failure in %d s"] = "", -- Big_Armory +-- ["Mission lost!"] = "", -- Basic_Training_-_Grenade -- ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 -- ["Movement: [Up], [Down], [Left], [Right]"] = "", --- ["Mudball"] = "", -- Construction_Mode --- ["Multi-shot!"] = "", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 --- ["New Barrels Per Turn"] = "", --- ["NEW CLAN RECORD: "] = "", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer -- ["NEW fastest lap: "] = "", --- ["New Mines Per Turn"] = "", --- ["NEW RACE RECORD: "] = "", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen -- ["NOT ENOUGH WAYPOINTS"] = "", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab -- ["Not So Friendly Match"] = "", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood --- ["Operation Diver"] = "", -- ["Opposing Team: "] = "", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies --- ["Pathetic Hog #%d"] = "", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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"] = "", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["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"] = "", -- Mutant +-- ["point(s)"] = "", -- TargetPractice, Mutant -- ["Poison"] = "", +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal --- ["Power Remaining"] = "", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos -- ["Prepare yourself"] = "", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW -- ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow --- ["Race complexity limit reached."] = "", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", --- ["Round Limit"] = "", --- ["Rounds Complete: "] = "", --- ["Rounds Complete"] = "", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant --- ["RULES OF THE GAME [Press ESC to view]"] = "", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 -- ["Save as many hapless hogs as possible!"] = "", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["SCORE"] = "", --- ["Score"] = "", -- Mutant - --- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["s"] = "", -- GaudyRacer, Space_Invasion +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family --- ["Shield boosted! +30 power"] = "", --- ["Shield Depleted"] = "", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion -- ["Shield is fully recharged!"] = "", --- ["Shield Master!"] = "", --- ["Shield Miser!"] = "", --- ["Shield OFF:"] = "", --- ["Shield ON:"] = "", --- ["Shield Seeker!"] = "", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 --- ["Shotgun Team"] = "", --- ["Shotgun Training"] = "", -- ["shots remaining."] = "", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil -- ["Silly"] = "", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode -- ["Sinky"] = "", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy --- ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball --- ["%s is out and Team %d|scored a point!| |Score:"] = "", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion -- ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united -- ["Sponge"] = "", -- ["Spooky Tree"] = "", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies -- ["Switched to "] = "", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- -- ["Team %d: "] = "", --- ["Team Scores"] = "", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow -- ["That Sinking Feeling"] = "", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["That was pointless."] = "", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon -- ["The enemy is hiding out on yonder ducky!"] = "", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 -- ["The flag will respawn next round."] = "", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos -- ["This rain is really something..."] = "", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family --- ["TIME: "] = "", --- ["Timed Kamikaze!"] = "", --- ["Time Extended!"] = "", --- ["Time Extension"] = "", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope --- ["Toggle Shield"] = "", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab -- ["TrophyRace"] = "", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 -- ["T_T"] = "", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon --- ["Turn Time"] = "", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit"] = "", -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united -- ["Unit 3378"] = "", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- -- ["Unit 835"] = "", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united -- ["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!"] = "", -- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood -- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa -- ["Use your rope to get from start to finish as fast as you can!"] = "", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor -- ["Waypoint placed."] = "", --- ["Way-Points Remaining"] = "", +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion -- ["Weapons Reset"] = "", --- ["Weapons reset."] = "", -- Highlander +-- ["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 -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos -- ["Well done."] = "", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1035,13 +2332,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1055,31 +2361,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant --- ["WINNING TIME: "] = "", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1087,68 +2401,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 -- ["You have SCORED!!"] = "", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood --- ["You saved"] = "", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal -- ["'Zooka Team"] = "", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/ko.txt --- a/share/hedgewars/Data/Locale/ko.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/ko.txt Sun Dec 17 00:09:24 2017 +0100 @@ -51,7 +51,7 @@ 00:48=망치 00:49=소생시키기 -01:00=시~작! +; 01:00=Loading … 01:01=무승부 01:02=%1 승리! 01:03=음량 %1% @@ -77,11 +77,11 @@ ; Round starts 02:02=시~작! -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +02:03=%1 승리! -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +02:04=무승부 ; New health crate 02:05=구급상자! @@ -212,12 +212,12 @@ ; Game goal strings 05:00=게임 수정 모드 05:01=이 규칙은 제정할 것입니다. -05:02=성 공격 모드 +05:02=킹을 배치함: Pick a protected starting point for your King 05:03=저중력 05:04=정복 불능 05:05=흡혈귀: Hogs will be healed for the damage dealt 05:06=카르마: Hogs will be damaged for the damage dealt -05:07=킹 모드: Don't let your king die!|킹을 배치함: Pick a protected starting point for your King +05:07=킹 모드: Don't let your king die! 05:08=고슴도치를 배치하기 05:09=움직이지 못함 05:10=굳은 지반: Most weapons won't destroy terrain diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/lt.lua --- a/share/hedgewars/Data/Locale/lt.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/lt.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { - [":("] = ":(", ["!!!"] = "!!!", ["..."] = "...", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Taiklumo Bonusas!", +-- ["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 Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["A Hedgewars minigame"] = "", -- Capture_the_Flag ["a Hedgewars mini-game"] = "Eþiu karu mini þaidimas", -- Space_Invasion, The_Specialists --- ["a Hedgewars tag game"] = "", -- Mutant --- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Taiklumo Treniruotë", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW - ["Ammo Depleted!"] = "Nusodrintojo Kulkos!", --- ["ammo extended!"] = "", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler -- ["Ammo is reset at the end of your turn."] = "", - ["Ammo"] = "Kulkos", - ["Ammo Maniac!"] = "Kulku Maniakas!", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies ["Available points remaining: "] = "Pajamumu taðku liko: ", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Dauþk is kamuoliu i savo prieðus|ir nustumk juos i jûra!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Dauþk savo obonentus pro kaðes|ir ið þemëlapio!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Bazukos Treniruotë", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Geriausi ratai per komanda: ", - ["Best Team Times: "] = "Geriausios komandos laikai: ", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "BOOM!", +-- ["Bones"] = "", -- ["Boom!"] = "Boom!", - ["Boss defeated!"] = "Bosas Nugalëtas!", - ["Boss Slayer!"] = "Bosu Þudikas!", +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer -- ["Build a track and race."] = "", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "Pagriebk Vëliava", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Neatsargus", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Change Weapon"] = "", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "Durnelis", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Kodas: Komandinis Darbas", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Apvaryk trasa taip greitai kaip gali!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope ["Congratulations!"] = "Sveikinu!", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Sveikinu! Tu pradanginai visus taikinius|per leista laika.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Valdyk stulpus ir gausi taðku.", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Kibernetinë Karalystë", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "PO VELNIU EILINI NULIPK MAN NUO GALVOS!", ["DAMMIT, ROOKIE!"] = "PO VELNIU EILINI!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Pavojingos Antis", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Dedveitas", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor -- ["Demolition is fun!"] = "", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow - ["Depleted Kamikaze!"] = "Nusodrintojo Kamikaze!", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Sunaikink Isiverþëjus Ir Gauk Taðku.", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode - ["Drone Hunter!"] = "Drone Medþiotojas!", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Skendëjas", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy ["Each turn you get 1-3 random weapons"] = "Kekviena Eile Gausi 1-3 Atsitiktiniu Ginklu", ["Each turn you get one random weapon"] = "Kekviena Eile Gausi Po Viena Atsitiktini Ginkla", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Nugalëk Visus Prieðus", ["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 enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "Sunaikink Nuodus kol nepasibaigë laikas", - ["Eliminate the Blue Team"] = "Sunaikink Mëlyna komanda", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Sunaikink Tipa 3378 |- Silpnaus atsparumo tvirtovë turi iðlikti", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Pasimëgauk Rlaukimu...", - ["[Enter]"] = "[ENTER"], +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Greièiausias Ratas: ", ["Feeble Resistance"] = "Silpnaus Atsparumo Tvirtovë", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 - - ["Fire"] = "Ugnis", +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Vëliava Pagrobta!", ["Flag respawned!"] = "Vëliava Atsigavo!", ["Flag returned!"] = "Vëliava Sugraþinta!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Vëliavos, Ir Ju Bazës Bus Padëtos Kur Kekviena Komanda Pabaigs Ëjima.", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", --- ["fuel extended!"] = "", - ["GAME BEGUN!!!"] = "Þaidimas Prasidëjo!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Ðaunu!", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Sëkmës Tau Ten!", -- ["Good so far!"] = "", @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "Prigavau!", --- ["Grab Mines/Explosives"] = "", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["Hahahaha!"] = "Hahahaha!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Haha, na tai jau butu kaþkas!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil [" Hapless Hogs left!"] = " Nelaimingu Eþiu Liko!", ["Hapless Hogs"] = "Nelaimingi Eþiai", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode --- ["Health crates extend your time."] = "", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "Sunku", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Eþiukaru-Krepðinis", - ["Hedgewars-Knockball"] = "Eþiukaru-Trenktaskamuolys", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Heh,nëra taip blogai.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood - ["Hit Combo!"] = "Pataikimo Bonusas!", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy ["Hmmm..."] = "Hmmm...", --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Medþiotojas", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Instruktorius", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "isiverþëjai sunaikinti", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,539 +1040,1291 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Geras dalykas kad MARAS dar po 99 eiliu...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Ðokimas ira iðjungtas", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "Kamikazes Ekspertas!", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion -- ["Keep it up!"] = "", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood - ["KILLS"] = "Nuþudymai", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "[Kairis Shiftas"], --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Paklausyk eilini!!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Minu Laikas:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "Misija Buvo Ivykdita", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "Misija Pavyko", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Judëjimas: [I Virðu, [I Apaèia], [I Kaire], [I Deðine]"], --- ["Mudball"] = "", -- Construction_Mode - ["Multi-shot!"] = "Dvigubas-Ðuvis!", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 --- ["New Barrels Per Turn"] = "", - ["NEW CLAN RECORD: "] = "Naujas Klano Rekordas: ", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "Naujas Greièiausias Ratas: ", --- ["New Mines Per Turn"] = "", - ["NEW RACE RECORD: "] = "Naujas Lenktyniu Rekordas: ", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "Neuþtenka Kelio Taðku", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Ne Toks Jau Ir Draugiðkas Turnyras", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Operacijos Vairuotojas", ["Opposing Team: "] = "Pasiprieðinanti Komanda: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Niekam Tikes Eþys #%d", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["POINTS"] = "", -- Mutant +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- 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 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "Jëgos Liko", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos -- ["Prepare yourself"] = "", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow - ["Race complexity limit reached."] = "Lenktyniu Sudëtingumo Limitas Pasiektas.", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", - ["Round Limit"] = "Raundu Limitas", --- ["Rounds Complete: "] = "", - ["Rounds Complete"] = "Raundai Ivykditi", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "ÞAIDIMO TAISYKLES [Spausk ESC Kad Parodytu"], +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["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!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["Score"] = "", -- Mutant - ["SCORE"] = "Taðkai", - - ["sec"] = "sek", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Iki!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "Skydas Pagerintas! +30 jëga", - ["Shield Depleted"] = "Skydas Nusodrintas", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Skydas Pilnai Pakrautas!", - ["Shield Master!"] = "Skydu Profas!", - ["Shield Miser!"] = "Skydu Ðykðtuolis!", - ["Shield OFF:"] = "Skydas Iðjungtas:", - ["Shield ON:"] = "Skydas Ijungtas:", - ["Shield Seeker!"] = "Skydo Ieðkotojas!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Ðratinio Ðautuvo Komanda", - ["Shotgun Training"] = "Ðratinio Ðautuvo Treniruotë", -- ["shots remaining."] = "", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Durnelis", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Paskenduolis", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s Iðkrito ir komanda %d|gavo bausme!| |Score:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s Iðkrito ir komanda %d|gavo taðka!| |Score:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united ["Sponge"] = "Kempinë", ["Spooky Tree"] = "Baisusis Medis", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["s|"] = "s|", - ["s"] = "s", -- GaudyRacer, Space_Invasion - ["STATUS UPDATE"] = "Bûsenos Atnaujinimas", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies ["Switched to "] = "Pakeistas i ", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Komanda %d: ", - ["Team Scores"] = "Komandos Taðkai", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow ["That Sinking Feeling"] = "Tas Skendimo Jausmas", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "Tai Buvo Beprasmiðka.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Prieðas pasislëpes ant kitos anties!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Vëliava atsigaus kita raunda.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Ðis lietus tikrai kaþkas...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["Timed Kamikaze!"] = "Laikina Kamikaze!", - ["Time Extended!"] = "Laikas Prailgintas!", --- ["Time Extension"] = "", - ["TIME: "] = "Laikas: ", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Perjungti i skyda", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "Trasa Ivykdita", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "Trophëju Trasa", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Eilës Laikas", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit"] = "", -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Tipas 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- -- ["Unit 835"] = "", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united +-- ["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 --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood ["User Challenge"] = "Vartotojo Iðukis", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Naudok virve kad nusigautum nuo starto iki finiðo taip greitai kaip gali!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Kelio Taðkas Pasiektas.", --- ["Way-Points Remaining"] = "", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion ["Weapons Reset"] = "Ginklai Atgaivinti", --- ["Weapons reset."] = "", -- Highlander +-- ["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 -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos -- ["Well done."] = "", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1035,13 +2332,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1055,31 +2361,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant - ["WINNING TIME: "] = "Laimëjimo Laikas: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1087,68 +2401,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "Tu gavai TAÐKU!!", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "Tu uþsisavinai", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "'Zukos Komanda", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/lt.txt --- a/share/hedgewars/Data/Locale/lt.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/lt.txt Sun Dec 17 00:09:24 2017 +0100 @@ -60,7 +60,7 @@ 00:56=Cleaver 00:57=Trintukas -01:00=Kaukimės! +; 01:00=Loading … 01:01=Lygiosios 01:02=%1 Laimėjo! 01:03=Garsas %1% @@ -248,11 +248,11 @@ 02:02=Nebijok! 02:02=Būk drąsus ir laimėk -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=%1 Laimėjo! -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Lygiosios ; New Health Crate 02:05=Atskrenda pagalba! @@ -508,12 +508,12 @@ ; Game goal strings 05:00=Žaidimo režimai 05:01=Taikomos šios taisyklės -05:02=Fortai: Gink savo fortą; nugalėk savo priešus! +05:02=Padėk karaliui: Pasirink apginta pradžios poziciją savo karaliui 05:03=Maža gravitacija: Žiūrėk kur eini! 05:04=Nemirtingumas: Ežiai yra (beveik) nemirtingi 05:05=Vampirizmas: Ežiai bus pagydyti su žala, kurią jie padaro 05:06=Karma: Priešo ežiai nukentės taip pat kaip ir tavo -05:07=Apgink Karalių: Neleisk savo karaliui mirti!|Padėk karaliui: Pasirink apginta pradžios poziciją savo karaliui +05:07=Apgink Karalių: Neleisk savo karaliui mirti! 05:08=Padėk ežius: Padėk savo ežius prieš žaidimą 05:09=Artilerija: Ežiai negali vaikščioti 05:10=Nesunaikinoma Vietovė: Dauguma ginklų nesunaikins vietovės @@ -527,4 +527,4 @@ 05:18=Nesibaigiančios atakos 05:19=Ginklai atstatomi, kai baigi eilę 05:20=Ginklai nesidalinami tarp ežių -05:21=Komandinis Režimas: Komandos klane visi juda po eilę|Pasidalintas laikas: Komandos klane pasidalina laiku \ No newline at end of file +05:21=Komandinis Režimas: Komandos klane visi juda po eilę|Pasidalintas laikas: Komandos klane pasidalina laiku diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/missions_de.txt --- a/share/hedgewars/Data/Locale/missions_de.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/missions_de.txt Sun Dec 17 00:09:24 2017 +0100 @@ -4,57 +4,57 @@ Basic_Training_-_Grenade.name=Grundlagentraining: Granate Basic_Training_-_Grenade.desc="Vergiss nicht: Stift ziehen UND werfen!" -Basic_Training_-_Shotgun.name=Grundlagentraining: Schrotflinte -Basic_Training_-_Shotgun.desc="Zuerst schießen, dann fragen!" - -Basic_Training_-_Sniper_Rifle.name=Grundlagentraining: Scharfschützengewehr +Basic_Training_-_Sniper_Rifle.name=Zielübung: Scharfschützengewehr Basic_Training_-_Sniper_Rifle.desc="Peng, Kopfschuss!" -Basic_Training_-_Cluster_Bomb.name=Grundlagentraining: Splittergranate -Basic_Training_-_Cluster_Bomb.desc="Jemand braucht eine heiße Dusche!" - Basic_Training_-_Rope.name=Grundlagentraining: Seil Basic_Training_-_Rope.desc="Raus da und schwing!" Basic_Training_-_Flying_Saucer.name=Grundlagentraining: Fliegende Untertasse Basic_Training_-_Flying_Saucer.desc="Du willst also ausgerechnet Astronaut werden, wie? Dann lern erstmal fliegen!" -User_Mission_-_Dangerous_Ducklings.name=Mission: Gefährliche Entchen +User_Mission_-_Dangerous_Ducklings.name=Gefährliche Entchen User_Mission_-_Dangerous_Ducklings.desc="Nun gut, Rekrut! Es ist Zeit, dass du das im Grundlagentraining Gelernte in die Tag umsetzt!" -User_Mission_-_Diver.name=Mission: Taucher +User_Mission_-_Diver.name=Taucher User_Mission_-_Diver.desc="Diese amphibische Angriffstrategie ist schwieriger, als sie aussieht." -User_Mission_-_Teamwork.name=Mission: Teamwork +User_Mission_-_Teamwork.name=Teamwork User_Mission_-_Teamwork.desc="Ab und zu … tut Liebe weh." -User_Mission_-_Spooky_Tree.name=Mission: Spukiger Baum +User_Mission_-_Teamwork_2.name=Teamwork 2 +User_Mission_-_Teamwork_2.desc="Benutze deine Teamfähigkeiten, um den kybernetischen Feind erneut zu besiegen!" + +User_Mission_-_Spooky_Tree.name=Spukiger Baum User_Mission_-_Spooky_Tree.desc="Viele Kisten hier draußen. Ich hoffe jedenfalls, dass dieser Vogel hier nicht hungrig wird." -User_Mission_-_Bamboo_Thicket.name=Mission: Bambusdickicht +User_Mission_-_Bamboo_Thicket.name=Bambusdickicht User_Mission_-_Bamboo_Thicket.desc="Tod von oben." -User_Mission_-_That_Sinking_Feeling.name=Mission: Land unter +User_Mission_-_That_Sinking_Feeling.name=Land unter User_Mission_-_That_Sinking_Feeling.desc="Hier steht einen das Wasser ganz schön schnell bis zum Halse. Viele sind hieran gescheitert. Kannst du alle Igel retten?" -User_Mission_-_Newton_and_the_Hammock.name=Mission: Newton und die Hängematte +User_Mission_-_Newton_and_the_Hammock.name=Newton und die Hängematte User_Mission_-_Newton_and_the_Hammock.desc="Nicht vergessen, Igelinge: Die Geschwindigkeit eines Körpers bleibt konstant, es sei denn, es wirkt eine äußere Kraft auf ihn ein!" -User_Mission_-_The_Great_Escape.name=Mission: Gesprengte Ketten +User_Mission_-_The_Great_Escape.name=Gesprengte Ketten User_Mission_-_The_Great_Escape.desc="Glaubst du, dass du mich einsperren könnest?" -User_Mission_-_Rope_Knock_Challenge.name=Herausforderung: Seilschubsen +User_Mission_-_Rope_Knock_Challenge.name=Seilschubsen User_Mission_-_Rope_Knock_Challenge.desc="Sieh! Hinter dir!" -User_Mission_-_Nobody_Laugh.name=Mission: Niemand darf lachen +User_Mission_-_Nobody_Laugh.name=Niemand darf lachen User_Mission_-_Nobody_Laugh.desc="Das ist kein Witz!" -User_Mission_-_RCPlane_Challenge.name=Herausforderung: Funkflugzeug +User_Mission_-_RCPlane_Challenge.name=Funkflugzeugsherausforderung User_Mission_-_RCPlane_Challenge.desc="Bist wohl ziemlich eingebildet, was, Flieger?" -portal.name=Mission: Knifflige Portalherausforderung +portal.name=Knifflige Portalherausforderung portal.desc="Benutze das Portalgerät, um dich schnell und weit zu bewegen; benutze es zum Töten; benutze es mit Vorsicht!" +Big_Armory.name=Großes Arsenal +Big_Armory.desc="Du bist alleine, hast ein volles Arsenal und musst 8 Igel besiegen, bevor die Zeit abläuft." + Target_Practice_-_Bazooka_easy.name=Zielübung: Bazooka (einfach) Target_Practice_-_Bazooka_easy.desc="Nun gut, Soldat: Zerstör einfach die Zielscheiben so schnell, wie du kannst!" @@ -76,15 +76,15 @@ Target_Practice_-_Grenade_hard.name=Zielübung: Granate (schwer) Target_Practice_-_Grenade_hard.desc="Das ist nichts für Grünschnäbel! Wir werden die Zielscheiben an ein paar wirklich knifflige Stellen platzieren." -ClimbHome.name=Herausforderung: Nach Hause klettern +ClimbHome.name=Nach Hause klettern ClimbHome.desc="Du bist weit von Zuhause weg und das Wasser steigt ständig. Klettere so hoch, wie du kannst!" -Challenge_-_Speed_Shoppa_-_Hedgelove.name=Herausforderung: Seilliebe +Challenge_-_Speed_Shoppa_-_Hedgelove.name=Zeitrennen: Seilliebe Challenge_-_Speed_Shoppa_-_Hedgelove.desc="Zeig deine Liebe zum Seilschwingen, sammle ein paar wenige Kisten auf dieser kleinen Karte ein." -Challenge_-_Speed_Shoppa_-_Ropes.name=Herausforderung: Seile und Kisten +Challenge_-_Speed_Shoppa_-_Ropes.name=Zeitrennen: Seile und Kisten Challenge_-_Speed_Shoppa_-_Ropes.desc="Nimm dein Seil, und sammle alle Kisten auf dieser mittelgroßen Karte ein." -Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Herausforderung: Der Kunde ist König +Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Zeitrennen: Der Kunde ist König Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Zeig, dass du dem Titel eines Königs würdig bist und sammle alle Kisten so schnell wie möglich mit deinem Seil auf dieser großen Karte ein." diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/missions_en.txt --- a/share/hedgewars/Data/Locale/missions_en.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/missions_en.txt Sun Dec 17 00:09:24 2017 +0100 @@ -4,55 +4,55 @@ Basic_Training_-_Grenade.name=Basic Grenade Training Basic_Training_-_Grenade.desc="Remember, you pull the pin out AND throw!" -Basic_Training_-_Cluster_Bomb.name=Basic Cluster Bomb Training -Basic_Training_-_Cluster_Bomb.desc="Someone needs hot shower!" - -Basic_Training_-_Shotgun.name=Basic Shotgun Training -Basic_Training_-_Shotgun.desc="Shoot first, ask questions later!" - -Basic_Training_-_Sniper_Rifle.name=Basic Sniper Rifle Training -Basic_Training_-_Sniper_Rifle.desc="Boom, headshot!" - Basic_Training_-_Rope.name=Basic Rope Training Basic_Training_-_Rope.desc="Get out there and swing!" Basic_Training_-_Flying_Saucer.name=Basic Flying Saucer Training Basic_Training_-_Flying_Saucer.desc="So you really want to become an astronaut, eh? You should learn how to fly first!" -User_Mission_-_Dangerous_Ducklings.name=Mission: Dangerous Ducklings +User_Mission_-_Dangerous_Ducklings.name=Dangerous Ducklings User_Mission_-_Dangerous_Ducklings.desc="Alright, rookie! Time to put what we learned in Basic Training into practice!" -User_Mission_-_Diver.name=Mission: Diver +User_Mission_-_Diver.name=Diver User_Mission_-_Diver.desc="This 'amphibious assault' thing is harder than it looks..." -User_Mission_-_Teamwork.name=Mission: Teamwork +User_Mission_-_Teamwork.name=Teamwork User_Mission_-_Teamwork.desc="Sometimes, love hurts." -User_Mission_-_Spooky_Tree.name=Mission: Spooky Tree +User_Mission_-_Teamwork_2.name=Teamwork 2 +User_Mission_-_Teamwork_2.desc="Use your teamwork skills to defeat the cybernetic enemy once again!" + +User_Mission_-_Spooky_Tree.name=Spooky Tree User_Mission_-_Spooky_Tree.desc="Lots of crates out here. I sure hope that bird ain't feeling hungry." -User_Mission_-_Bamboo_Thicket.name=Mission: Bamboo Thicket +User_Mission_-_Bamboo_Thicket.name=Bamboo Thicket User_Mission_-_Bamboo_Thicket.desc="Death comes from above." -User_Mission_-_That_Sinking_Feeling.name=Mission: That Sinking Feeling +User_Mission_-_That_Sinking_Feeling.name=That Sinking Feeling User_Mission_-_That_Sinking_Feeling.desc="The water is rising rapidly and time is limited. Many have tried and failed. Can you save them all?" -User_Mission_-_Newton_and_the_Hammock.name=Mission: Newton and the Hammock +User_Mission_-_Newton_and_the_Hammock.name=Newton and the Hammock User_Mission_-_Newton_and_the_Hammock.desc="Remember hoglets: The velocity of a body remains constant unless the body is acted upon by an external force!" -User_Mission_-_The_Great_Escape.name=Mission: The Great Escape +User_Mission_-_The_Great_Escape.name=The Great Escape User_Mission_-_The_Great_Escape.desc="You think you can cage me!?" -User_Mission_-_Rope_Knock_Challenge.name=Challenge: Rope Knocking +User_Mission_-_Rope_Knock_Challenge.name=Rope Knocking User_Mission_-_Rope_Knock_Challenge.desc="Look behind you!" -User_Mission_-_Nobody_Laugh.name=Mission: Nobody Laugh +User_Mission_-_Nobody_Laugh.name=Nobody Laugh User_Mission_-_Nobody_Laugh.desc="This ain't no joke." -User_Mission_-_RCPlane_Challenge.name=Challenge: RC Plane +User_Mission_-_RCPlane_Challenge.name=RC Plane Challenge User_Mission_-_RCPlane_Challenge.desc="Feeling pretty confident, eh, flyboy?" -portal.name=Mission: Portal Mind Challenge +Big_Armory.name=Big Armory +Big_Armory.desc="You are alone, have a full armory and must defeat 8 hedgehogs before the time runs out." + +ClimbHome.name=Climb Home +ClimbHome.desc="You are far away from home and the water is rising. Climb as high as you can!" + +portal.name=Portal Mind Challenge portal.desc="Use the portal to move fast and far, use it to kill, use it with caution!" Target_Practice_-_Bazooka_easy.name=Target Practice: Bazooka (easy) @@ -67,6 +67,9 @@ Target_Practice_-_Shotgun.name=Target Practice: Shotgun Target_Practice_-_Shotgun.desc="Shoot first, ask questions later!" +Basic_Training_-_Sniper_Rifle.name=Target Practice: Sniper Rifle +Basic_Training_-_Sniper_Rifle.desc="Boom, headshot!" + Target_Practice_-_Homing_Bee.name=Target Practice: Homing Bee Target_Practice_-_Homing_Bee.desc="Using the homing bee is trickier than it seems." @@ -76,11 +79,11 @@ Target_Practice_-_Grenade_hard.name=Target Practice: Grenade (hard) Target_Practice_-_Grenade_hard.desc="This is nothing for greenhorns! We will place the targets at some really tricky positions." -Challenge_-_Speed_Shoppa_-_Hedgelove.name=Challenge: Shoppa Love +Challenge_-_Speed_Shoppa_-_Hedgelove.name=Time Trial: Shoppa Love Challenge_-_Speed_Shoppa_-_Hedgelove.desc="Show your love to rope and collect a few crates on a small map." -Challenge_-_Speed_Shoppa_-_Ropes.name=Challenge: Ropes and Crates +Challenge_-_Speed_Shoppa_-_Ropes.name=Time Trial: Ropes and Crates Challenge_-_Speed_Shoppa_-_Ropes.desc="Take your rope and collect all crates on this medium-sized map." -Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Challenge: The Customer is King +Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Time Trial: The Customer is King Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Show you're worthy of a true king and collect all crates as fast as possible on this large map." diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/missions_gd.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Locale/missions_gd.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,86 @@ +Basic_Training_-_Bazooka.name=Trèanadh bazooka bunasach +Basic_Training_-_Bazooka.desc="Cleachd a’ ghaoth gus do cuideachadh!" + +Basic_Training_-_Grenade.name=Trèanadh durcain-spreadhaidh bunasach +Basic_Training_-_Grenade.desc="Cuimhnich gun tog thu a’ phrìne agus ’s ann gun tilg thu e!" + +Basic_Training_-_Cluster_Bomb.name=Trèanadh boma sgapaidh bunasach +Basic_Training_-_Cluster_Bomb.desc="Tha fras teth a dhìth air cuideigin!" + +Basic_Training_-_Shotgun.name=Trèanadh gunna-froise bunasach +Basic_Training_-_Shotgun.desc="Loisg an toiseach is faighnich ceistean an uairsin!" + +Basic_Training_-_Sniper_Rifle.name=Trèanadh isneach fàtha bunasach +Basic_Training_-_Sniper_Rifle.desc="Air an ceann!" + +Basic_Training_-_Rope.name=Trèanadh ròpa bunasach +Basic_Training_-_Rope.desc="Dìreach mar dhreallag!" + +Basic_Training_-_Flying_Saucer.name=Trèanadh soithich-itealaich bunasach +Basic_Training_-_Flying_Saucer.desc="An ann gu bheil thu airson bhith ’nad speuradair? Bu chòir dhut itealaich ionnsachadh an toiseach!" + +User_Mission_-_Dangerous_Ducklings.name=Misean: Lachagan cunnartach +User_Mission_-_Dangerous_Ducklings.desc="Nise, a’ ghlas-laoich! Thàinig an t-àm gus na dh’ionnsaich thu san trèanadh bhunasach a chur gu feum!" + +User_Mission_-_Diver.name=Misean: Tumadh +User_Mission_-_Diver.desc="Tha an ionnsaigh “muir-thìreach” seo nas doirbhe na robh tu an dùil…" + +User_Mission_-_Teamwork.name=Misean: Obair còmhla +User_Mission_-_Teamwork.desc="Nì gaol do leònadh aig amannan." + +User_Mission_-_Spooky_Tree.name=Misean: Craobh rògach +User_Mission_-_Spooky_Tree.desc="Tha iomadh creat ann a sheo. Tha mi ’n dòchas nach eil an t-acras air an eun ud." + +User_Mission_-_Bamboo_Thicket.name=Misean: Badan bambù +User_Mission_-_Bamboo_Thicket.desc="’S ann oirnne a thig a’ bhàs." + +User_Mission_-_That_Sinking_Feeling.name=Misean: Fo uallach +User_Mission_-_That_Sinking_Feeling.desc="Tha an t-uisge ag èirigh gu luath agus chan eil mòran ùine ann. Dh’fheuch mòran ris ’s nach deach leotha. An sàbhail thu iad uile?" + +User_Mission_-_Newton_and_the_Hammock.name=Misean: Newton ’s an leabaidh-chrochte +User_Mission_-_Newton_and_the_Hammock.desc="Cuimhnichibh a ghràineagaibh: Mairidh luaths oibseict mar a tha e gus an doir forsa on taobh a-muigh buaidh air!" + +User_Mission_-_The_Great_Escape.name=Misean: An Teicheadh Mòr +User_Mission_-_The_Great_Escape.desc="Cha chum sibhse fo ghreim mi!" + +User_Mission_-_Rope_Knock_Challenge.name=Dùbhlan: Gnogag ròpa +User_Mission_-_Rope_Knock_Challenge.desc="Seall air do chùlaibh!" + +User_Mission_-_Nobody_Laugh.name=Misean: Na dèanaibh magadh orm +User_Mission_-_Nobody_Laugh.desc="Cò an culaidh-mhagaidh?" + +User_Mission_-_RCPlane_Challenge.name=Dùbhlan: Itealan le smachd chèin +User_Mission_-_RCPlane_Challenge.desc="A’ faireachdainn bragail, a ghille?" + +portal.name=Misean: Dùbhlan nan doras +portal.desc="Cleachd an tele-phortadh sgiobalta a ghluasad luath ’s farsaing, cleachd e a chum marbhaidh, cleachd e gu cùramach!" + +Target_Practice_-_Bazooka_easy.name=Cleachdadh amais: Bazooka (furasta) +Target_Practice_-_Bazooka_easy.desc="Nise, a ghaisgich, mill na h-amasan ud cho luath ’s a ghabhas!" + +Target_Practice_-_Bazooka_hard.name=Cleachdadh amais: Bazooka (doirbh) +Target_Practice_-_Bazooka_hard.desc="Am buail thu na h-amasan nuair a bhios iad fad air falbh?" + +Target_Practice_-_Cluster_Bomb.name=Cleachdadh amais: Boma sgapaidh +Target_Practice_-_Cluster_Bomb.desc="Tha cuideigin feumach air fras theth!" + +Target_Practice_-_Shotgun.name=Cleachdadh amais: Gunna-froise +Target_Practice_-_Shotgun.desc="Loisg an toiseach, ceasnaich an uairsin!" + +Target_Practice_-_Homing_Bee.name=Cleachdadh amais: Seillean-amasaidh +Target_Practice_-_Homing_Bee.desc="Tha cleachdadh an t-seillein-amasaidh nas duilghe na shaoileadh tu." + +Target_Practice_-_Grenade_easy.name=Cleachdadh amais: Durcan-spreadhaidh (furasta) +Target_Practice_-_Grenade_easy.desc="Ciad trèanadh air an durcan-spreadhaidh do ghlas-laoich." + +Target_Practice_-_Grenade_hard.name=Cleachdadh amais: Durcan-spreadhaidh (doirbh) +Target_Practice_-_Grenade_hard.desc="Cha dèan thu a’ chùis air ach le beagan eòlais agad! Cuiridh sinn na h-amasan air àitichean a tha doirbh a ruigsinn." + +Challenge_-_Speed_Shoppa_-_Hedgelove.name=Dùbhlan: Togail nan creat +Challenge_-_Speed_Shoppa_-_Hedgelove.desc="Seall dhuinn dè cho deidheil ’s a tha thu air creataichean a thogail le ròpa air mapa beag." + +Challenge_-_Speed_Shoppa_-_Ropes.name=Dùbhlan: Ròpannan is creataichean +Challenge_-_Speed_Shoppa_-_Ropes.desc="Cleachd an ròpa agad ’s tog a h-uile creat on mhapa mheadhanach seo." + +Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Dùbhlan: Greim dòigheil air an ròpa +Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Seall dè cho math ’s a tha thu air creataichean a thogail gu luath air a’ mhapa mhòr seo." diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/missions_pl.txt --- a/share/hedgewars/Data/Locale/missions_pl.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/missions_pl.txt Sun Dec 17 00:09:24 2017 +0100 @@ -84,3 +84,13 @@ Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Wyzwanie: Klient nasz Pan Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Pokaż, że to ty tu rządzisz! Zbierz wszystkie skrzynki najszybciej jak potrafisz na rozległej mapie." + +User_Mission_-_Teamwork_2.name=Kryptonim: Praca zespołowa 2 +User_Mission_-_Teamwork_2.desc="Użyj swoich zdolności zespołowych, by pokonać cybernetycznego wroga jeszcze raz!" + +Big_Armory.name=Kryptonim: Wielka zbrojownia +Big_Armory.desc="Jesteś sam, masz pełną zbrojownię i musisz pokonać 8 jeży, zanim skończy się czas." + +ClimbHome.name=Kryptonim: Wspinaczka do domu +ClimbHome.desc="Jesteś daleko od domu, a woda się podwyższa. Wspinaj się najwyżej jak potrafisz!" + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/nl.txt --- a/share/hedgewars/Data/Locale/nl.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/nl.txt Sun Dec 17 00:09:24 2017 +0100 @@ -52,7 +52,7 @@ 00:49=Resurrector 00:50=Drill Strike -01:00=Let's fight! +; 01:00=Loading … 01:01=Round draw 01:02=%1 wins! 01:03=Volume %1% @@ -232,11 +232,11 @@ 02:02=Have no fear! 02:02=Be brave and conquer -; Round ends (win; unused atm) -02:03=... +; Round ends and team/clan (%1) wins +;02:03=... -; Round ends (draw; unused atm) -02:04=... +; Round ends in a draw +;02:04=... ; New health crate 02:05=Incoming aid! @@ -488,12 +488,12 @@ ; Game goal strings 05:00=Game Modes 05:01=The following rules apply -05:02=Forts: Defend your fortress; vanquish your enemies! +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!|Place the King: Pick a protected starting point for your King +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 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/pl.lua --- a/share/hedgewars/Data/Locale/pl.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/pl.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,1154 +1,2626 @@ locale = { - [":("] = ":(", ["!!!"] = "!!!", ["..."] = "...", --- ["011101000"] = "", -- A_Classic_Fairytale:dragon --- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant --- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant --- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow --- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Bonus za celność", --- ["Ace"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge - ["Achievement Unlocked"] = "Zdobyłeś Osiągnięcie!", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler --- ["A Classic Fairytale"] = "", -- A_Classic_Fairytale:first_blood --- ["???"] = "", -- A_Classic_Fairytale:backstab --- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow --- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode --- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy --- ["Africa"] = "", -- Continental_supplies --- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood --- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow --- ["Again with the 'cannibals' thing!"] = "", -- A_Classic_Fairytale:enemy --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge - ["a Hedgewars mini-game"] = "Mini gra", -- Space_Invasion, The_Specialists --- ["a Hedgewars tag game"] = "", -- Mutant --- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome - ["Aiming Practice"] = "Potrenuj celność", --- ["Air Attack"] = "", -- Construction_Mode --- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood --- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow --- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode --- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey --- ["All walls touched!"] = "", -- WxW - ["Ammo"] = "Amunicja", - ["Ammo Depleted!"] = "Koniec amunicji!", --- ["ammo extended!"] = "", + ["011101000"] = "011101000", -- A_Classic_Fairytale:dragon + ["011101001"] = "011101001", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united + ["+1 barrel!"] = "+1 beczka!", -- Tumbler + ["%.1fs"] = "%.1fs", -- Racer, TechRacer + ["%.1f seconds were remaining."] = "%.1f sekund pozostało.", -- Basic_Training_-_Bazooka + ["+1 Grenade"] = "+1 granat", -- Basic_Training_-_Flying_Saucer + ["+1 mine!"] = "+1 mina!", -- Tumbler + ["-1 point"] = "-1 punkt", -- Mutant + ["+1 point"] = "+1 punkt", -- Mutant + ["-1 to anyone for a suicide"] = "-1 dla każdego za samobójstwo", -- Mutant + ["+1 to the Bottom Feeder for killing anyone"] = "+1 dla Pasożyta za zabicie kogokolwiek", -- Mutant + ["+1 to the Mutant for killing anyone"] = "+1 dla Mutanta za zabicie kogokolwiek", -- Mutant + ["+2 for becoming the Mutant"] = "+2 za zostanie Mutantem", -- Mutant + ["30 minutes later..."] = "30 minut później...", -- A_Classic_Fairytale:shadow + ["5 additional enemies will be spawned during the game."] = "5 dodatkowych wrogów pojawi się podczas gry.", -- A_Space_Adventure:fruit01 + ["5 Deadly Hogs"] = "5 Zabójczych Jeży", -- A_Space_Adventure:death02 + ["6 more seconds added to the clock"] = "6 sekund dodano do zegara", -- A_Space_Adventure:ice02 + ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "Jakiś rok temu przybył do nas cyborg i powiedział nam, że jesteście kanibalami!", -- A_Classic_Fairytale:enemy + ["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 + ["Actually, you aren't worthy of life! Take this..."] = "Właściwie, nie zasługujesz by żyć! Przyjmij to...", -- A_Classic_Fairytale:shadow + ["A cy-what?"] = "Cy-co?", -- A_Classic_Fairytale:enemy + ["Add %d"] = "Dodaj %d", -- HedgeEditor + ["Admit what?"] = "Przyznać co?", -- A_Classic_Fairytale:queen + ["Adventurous"] = "Awanturniczy", -- A_Classic_Fairytale:journey + ["A frenetic Hedgewars mini-game"] = "Szalona mini-gra Hedgewars", -- Frenzy + ["Africa"] = "Afryka", -- Continental_supplies + ["A frozen adventure"] = "Zamrożona przygoda", -- A_Space_Adventure:ice01 + ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "Po tym, jak Spory Przeciek zdradził swoje plemię, dołączył do kanibali...", -- A_Classic_Fairytale:first_blood + ["After that incident he went underground and started working on his plan to steal the device."] = "Po tym incydencie, zeszedł pod ziemię i zaczął pracować nad swoim planem, by ukraść urządzenie.", -- A_Space_Adventure:moon02 + ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "Po szoku spowodowanym wrogim szpiegiem, Spory Przeciek i Gęsta Chmura poszli łowić, by się zrelaksować.", -- A_Classic_Fairytale:shadow + ["After you left the moon, my other loyal minions came and resurrected me so I could complete my master plan."] = "Po tym jak opuściłeś księżyc, moi lojalni poddani przyszli i ożywili mnie, żebym mógł ukończyć mój plan.", -- A_Space_Adventure:death01 + ["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 + ["Aiming Practice"] = "Ćwiczenie celności", + ["Aiming practice"] = "Ćwiczenie celności", -- TargetPractice + ["Air Attack"] = "Nalot", -- Construction_Mode + ["Air General"] = "Powietrzny Generał", -- Battalion + ["Air Mine Placement Mode"] = "Tryb Ustawiania Min Powietrznych", -- HedgeEditor + ["AIR MINE PLACEMENT MODE"] = "TRYB USTAWIANIA MIN POWIETRZNYCH", -- HedgeEditor + ["A leap in a leap"] = "Skok w skoku", -- A_Classic_Fairytale:first_blood + ["Alex"] = "Aleks", -- + ["Alien! I wish to be moved!"] = "Obcy! Życzę sobie być przeniesiona!", -- A_Classic_Fairytale:queen + ["A little gift from the cyborgs"] = "Mały prezent od cyborgów", -- A_Classic_Fairytale:shadow + ["Al.Kaholic"] = "Al.Kaholik", -- + ["All But Last"] = "Wszyscy Oprócz Ostatniego", -- WxW + ["All But Last: You must not solely attack the team with the least health"] = "Wszyscy Oprócz Ostatniego: Nie możesz wyłącznie atakować drużyny z najmiejszą ilością zdrowia", -- WxW + ["All gone...everything!"] = "Wszystko przepadło... wszystko!", -- A_Classic_Fairytale:enemy + ["Allies"] = "Sprzymierzeńcy", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 + ["All right, I'll admit it!"] = "No dobrze, przyznam to!", -- A_Classic_Fairytale:queen + ["All right, we just need to get to the other side of the island!"] = "No dobrze, musimy tylko dostać się na drugą stronę wyspy!", -- A_Classic_Fairytale:journey + ["All right, you got me!"] = "No dobrze, masz mnie!", -- A_Classic_Fairytale:queen + ["All the other places are protected by our flight-inhibiting weapons."] = "Wszystkie inne miejsca są chronine przez nasze bronie przeciwlotnicze.", -- A_Space_Adventure:fruit01 + ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "Wszyscy piloci spodków marzą, by przyjść tu pewnego dnia i zmierzyć się z najlepszymi!", -- A_Space_Adventure:ice02 + ["All they do is sit around and judge us!"] = "Wszystko co robią to siedzą sobie i nas osądzają!", -- A_Classic_Fairytale:queen + ["All this to please our beloved “elders” … hick …"] = "Wszysyko to, by zadowolić naszych ukochanych \"starszych\" ... hyp ...", -- A_Classic_Fairytale:queen + ["All walls touched!"] = "Wszystkie ściany dotknięte!", -- WxW + ["All you do is take long walks when everyone else works."] = "Wszystko co robisz to bierzesz długie spacery, kiedy każdy inny pracuje.", -- A_Classic_Fairytale:queen + ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "Powinieneś również wiedzieć, że jedynym miejscem, w którym możesz latać, jest część tego obszaru najbardziej po lewej.", -- A_Space_Adventure:fruit01 + ["Always being considered weak and fragile."] = "Zawsze uzażany za słabego i kruchego.", -- A_Classic_Fairytale:queen + ["Amazing! I was never beaten in a race before!"] = "Niesamowite! Nigdy wcześniej nie zostałem pokonany w wyścigu!", -- A_Space_Adventure:moon02 + ["Ammo: %d"] = "Amunicja: %d", -- Tumbler + ["Ammo depleted!"] = "Amunicja wyczerpana!", -- Space_Invasion ["Ammo is reset at the end of your turn."] = "Amunicja jest resetowana przy końcu tury.", - ["Ammo Maniac!"] = "Nabojowy Maniak!", --- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood --- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood --- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow --- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey --- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon --- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey --- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - --- ["Antarctica"] = "", -- Continental_supplies --- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies --- ["Area"] = "", -- Continental_supplies --- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow --- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab --- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy --- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen --- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW --- ["Asia"] = "", -- Continental_supplies --- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon --- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood --- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW --- ["Australia"] = "", -- Continental_supplies + ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "Limit amunicji: jeże nie mogą", -- Highlander + ["Ammo Maniac! +5 points!"] = "Maniak amunicji! +5 punktów!", -- Space_Invasion + ["And how am I alive?!"] = "Jak to ja żyję?!", -- A_Classic_Fairytale:enemy + ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "A ja właśnie zapomniałem punktu kontrolnego mojej misji. Świetnie, po prosti świetnie!", -- A_Space_Adventure:cosmos + ["… and I think they are up to something. Something bad!"] = "... a ja myślę, że coś knują. Coś złego!", -- A_Classic_Fairytale:epil + ["Andrey"] = "Andrzej", -- + ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "I zdarzyło się, że Sporemu Przeciekowi nie udało się ukończyć zadania! Wylądował, pod presją wstydu...", -- A_Classic_Fairytale:first_blood + ["And so it began..."] = "A więc się zaczeło...", -- A_Classic_Fairytale:first_blood + ["And so the cyborgs took over the island."] = "I tak cyborgi przejęły wyspę.", -- A_Classic_Fairytale:queen + ["...and so the cyborgs took over the world..."] = "...i tak cyborgi przejęły władzę nad światem...", -- A_Classic_Fairytale:shadow + ["And so they discovered that cyborgs weren't invulnerable..."] = "I tak odkryli, że cyborgi nie były niezniszczalne...", -- A_Classic_Fairytale:journey + ["… and then I took a stroll …"] = "...i wtedy udałem się na przechadzkę...", -- A_Classic_Fairytale:epil + ["And what do they do in the meantime? Nothing!"] = "I co robią w międzyczasie? Nic!", -- A_Classic_Fairytale:queen + ["And where's all the weed?"] = "I gdzie jest całe zioło?", -- A_Classic_Fairytale:dragon + ["And you believed me? Oh, god, that's cute!"] = "A ty mi wierzyłeś? O boże, to słodkie!", -- A_Classic_Fairytale:journey + ["An experimental (and buggy!) editing tool for missions and more"] = "Eksperymentalne (i zbugowane!) narzędzie do edycji misji i więcej", -- HedgeEditor + ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "Anno 1032: [Eksplozja będzie miała silny odrzut ~ Szeroki zasięg, nie wpłynie na jeże blisko celu]", -- Continental_supplies + ["Antarctica"] = "Antarktyda", -- Continental_supplies + ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "Antarktyczne lato: Zapewni ci jedną belkę/kulę błotną i dwie sinusoidalne giwery/portale co każde cztery tury.", -- Continental_supplies + ["Anti-Gravity Device Part (+1)"] = "Część Urządzenia Antygrawitacyjnego (+1)", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 + ["Anton"] = "Antoni", -- + ["An unexpected event!"] = "Nieoczekiwane wydarzenie!", -- A_Space_Adventure:cosmos + ["Anyway, the aliens accept me for who I am."] = "Tak czy inaczej, obcy akceptuję mnie takiego, jaki jestem.", -- A_Classic_Fairytale:queen + ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "Losowy jeż odziedziczy bronie jego poległych członków zespołu.", -- A_Space_Adventure:death02 + ["Arashi"] = "Araszi", -- + ["Area"] = "Obszar", -- Continental_supplies + ["Are we there yet?"] = "Już dotarliśmy?", -- A_Classic_Fairytale:shadow + ["Are you accusing me of something?"] = "Czy ty o coś mnie oskarżasz?", -- A_Classic_Fairytale:backstab + ["Are you helping the aliens?"] = "Czy ty pomagasz obcym?", -- A_Classic_Fairytale:queen + ["Are you saying that many of us have died for your entertainment?"] = "Mówisz, że wielu z nas umarło dla twojej rozrywki?", -- A_Classic_Fairytale:enemy + ["Argh, the boredom!"] = "Argh, ta nuda!", -- A_Classic_Fairytale:queen + ["Artur Detour"] = "Artur Objazd", -- A_Classic_Fairytale:queen + ["As a reward for your performance, here's some new technology!"] = "Jako nagrodę za twoje osiągnięcie, masz tu trochę nowej technologii.", -- A_Classic_Fairytale:dragon + ["Ash"] = "Asz", -- + ["A Shoppa minigame"] = "Minigra Shoppa", -- WxW + ["Asia"] = "Azja", -- Continental_supplies + ["A smuggler! Prepare for battle"] = "Przemytnik! Przygotuj się na bitwę", -- A_Space_Adventure:desert01 + ["A Space Adventure"] = "Kosmiczna przygoda", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 + ["Assault Team"] = "Drużyna Szturmowa", -- A_Classic_Fairytale:backstab + ["Asteroid"] = "Asteroida", -- Big_Armory + ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "Jako iż amunicja jest rzadka, możesz chcieć używać liny wielokrotnie w powietrzu.", -- A_Classic_Fairytale:dragon + ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "Gdy wyzwanie było ukończone, Spory Przeciek postawił stopę na ziemi...", -- A_Classic_Fairytale:first_blood + ["As you are more experienced, I want you to lead them to battle."] = "Ponieważ jesteś bardziej doświadczony, chcę żebyś poprowadził ich na bitwę.", -- A_Space_Adventure:fruit01 + ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "Jak widzisz, przeżyłem nasze ostatnie spotkanie i miałem czas, by uknuć mój genialny plan!", -- A_Space_Adventure:death01 + ["As you can see, there is no way to get on the other side!"] = "Jak widzisz, nie ma sposobu, by dostać się na drugą stronę!", -- A_Classic_Fairytale:dragon + ["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 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 the assassins before they attack back"] = "Zaatakuj zabójców, zanim oni zaatakują", -- 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 + ["Australia"] = "Australia", -- Continental_supplies ["Available points remaining: "] = "Pozostały następujące punkty: ", --- ["Back Breaker"] = "", -- A_Classic_Fairytale:backstab --- ["Back in the village, after telling the villagers about the threat..."] = "", -- A_Classic_Fairytale:united --- ["[Backspace]"] = "", --- ["Backstab"] = "", -- A_Classic_Fairytale:backstab --- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode --- ["Bamboo Thicket"] = "", - ["Barrel Eater!"] = "Pożeracz Beczek!", + ["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 + ["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 + ["Backstab"] = "Zdrada", -- A_Classic_Fairytale:backstab + ["Bacon"] = "Bekon", -- + ["Bad Guy"] = "Zły Koleś", -- User_Mission_-_The_Great_Escape + ["Badmad"] = "Zływściekły", -- portal + ["Bad Team"] = "Zła Drużyna", -- User_Mission_-_The_Great_Escape + ["Bad timing"] = "Złe wyczucie czasu", -- A_Space_Adventure:fruit01 + ["Baggy"] = "Woruś", -- + ["Balrog"] = "Balrog", -- + ["Bamboo Thicket"] = "Bambusowy Gąszcz", + ["Barrel Eater"] = "Pożeracz Beczek", -- Tumbler + ["Barrel Launcher selected!"] = "Wybrano Wyrzutnię Beczek!", -- Tumbler ["Barrel Launcher"] = "Wyrzutnia Beczek", --- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode --- ["Baseballbat"] = "", -- Continental_supplies + ["Barrel Placement Mode"] = "Tryb Stawiania Beczek", -- Construction_Mode + ["BARREL PLACEMENT MODE"] = "TRYB STAWIANIA BECZEK", -- HedgeEditor + ["Baseballbat"] = "Kij bejsbolwy", -- Continental_supplies + ["Baseball Bat with Ball"] = "Kij bejsbolowy z piłką", -- Knockball + ["Base damage has been modified to 12 per shot."] = "Podstawowe obrażenia zostały zmodyfikowane do 12 na strzał.", -- Battalion + ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "Bazując na tym, co się nauczyłeś, zniszcz cel na belce i jak zawsze, wyląduj bezpiecznie!", -- Basic_Training_-_Flying_Saucer + ["Basically this is a combination of diving and launching."] = "W zasadzie jest to połączenie nurkowania i wystrzeliwania.", -- Basic_Training_-_Flying_Saucer + ["Basketball"] = "Koszykówka", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Uderzaj piłkami w swoich przeciwników|i strącaj ich do wody!", + ["Battalion"] = "Batalion", -- Battalion + ["Battle Starts Now!"] = "Bitwa zaczyna się teraz!", -- A_Space_Adventure:fruit01 + ["Batty"] = "Kijek", -- ["Bat your opponents through the|baskets and out of the map!"] = "Uderzaj swoich przeciwników|wyrzucając przez kosz, poza mapę!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Trening bazooki", --- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen + ["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 + ["Be careful, your fuel is limited from now on!"] = "Uważaj, od teraz twoje paliwo jest ograniczone!", -- Basic_Training_-_Flying_Saucer + ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "Uważaj, twoje gadżety nie zadziałają w strefie bandytów. Powinieneś zdobyć lodową spluwę.", -- A_Space_Adventure:ice01 + ["Beep Loopers"] = "Zapętlacze Brzęczków", -- A_Classic_Fairytale:queen + ["Beginner"] = "Początkujący", -- User_Mission_-_RCPlane_Challenge + ["Behind these trees on the east side there is Secret Base 17."] = "Za drzewami na wschodniej stronie, leży Sekretna Baza 17.", -- A_Space_Adventure:cosmos + ["Below-average pilot"] = "Niedoświadczony pilot", -- User_Mission_-_RCPlane_Challenge + ["Besides, why would I choose certain death?"] = "Poza tym, czemu miałbym wybrać pewną śmierć?", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Najszybsze okrążenie drużyny: ", - ["Best Team Times: "] = "Najlepszy czas zespołów", --- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon --- ["Bio-Filter"] = "", -- Construction_Mode --- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode --- ["Blender"] = "", -- A_Classic_Fairytale:family --- ["Bloodpie"] = "", -- A_Classic_Fairytale:backstab --- ["Bloodrocutor"] = "", -- A_Classic_Fairytale:shadow --- ["Bloodsucker"] = "", -- A_Classic_Fairytale:shadow - ["Bloody Rookies"] = "Żółtodzioby", --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy --- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings --- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab --- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "BUM!", + ["Best team times: "] = "Najlepsze czasy drużyny: ", -- Racer, TechRacer + ["Better luck next time!"] = "Więcej szczęścia następnym razem!", -- ClimbHome + ["Beware, any damage taken will stay until you complete the moon's main mission"] = "Uważaj, jakiekolwiek otrzymane obrażenia zostaną, aż ukończysz księżycową misję", -- A_Space_Adventure:cosmos + ["Beware of mines: They explode after 3 seconds."] = "Uważaj na miny: Wybuchają po 3 sekundach.", -- A_Classic_Fairytale:journey + ["Beware of mines: They explode after 5 seconds."] = "Uważaj na miny: Wybuchają po 5 sekundach.", -- A_Classic_Fairytale:journey + ["Beware, though! If you are slow, you die!"] = "Uważaj jednak! Jeśli będziesz wolny, umrzesz!", -- A_Classic_Fairytale:dragon + ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "Uważaj jednak! Wielu przemytników często przychodzi przeszukiwać te tunele i przegrzebywać jakiekolwiek cenne przedmioty uda im się znaleźć.", -- A_Space_Adventure:desert01 + ["Beware, though, you will only be able to move slowly through the water."] = "Uważaj jednak, w wodzie będziesz mógł się poruszać tylko powoli.", -- Basic_Training_-_Flying_Saucer + ["Big Armory"] = "Wielka Zbrojownia", -- Big_Armory + ["Billy Frost"] = "Billy Mróz", -- A_Space_Adventure:ice01 + ["Bingo"] = "Bingo", -- + ["Bio-Filter: Aggressively removes enemies."] = "Bio-filtr: Agresywnie usuwa wrogów.", -- Construction_Mode + ["Bio-Filter"] = "Bio-filtr", -- Construction_Mode + ["Biomechanic Team"] = "Biomechaniczna Drużyna", -- A_Classic_Fairytale:family + ["Bitter"] = "Gorzki", -- + ["Blanka"] = "Blanka", -- + ["Blender"] = "Blender", -- A_Classic_Fairytale:family + ["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 + ["Bobo"] = "Bobo", -- User_Mission_-_Nobody_Laugh + ["Bone Jackson"] = "Bone Jackson", -- A_Classic_Fairytale:backstab + ["Bonely"] = "Kościany", -- A_Classic_Fairytale:shadow + ["Bones"] = "Kości", -- + ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "BUM! BUM! BUM! %s są mistrzami zniszczenia z %d zniszczonymi najeźdźcami.", -- Space_Invasion ["Boom!"] = "BUM!", - ["Boss defeated!"] = "Boss pokonany!", - ["Boss Slayer!"] = "Pogromca bossów", --- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey --- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow --- ["Brainila"] = "", -- A_Classic_Fairytale:united --- ["Brain Stu"] = "", -- A_Classic_Fairytale:united --- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab --- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil --- ["Brutus"] = "", -- A_Classic_Fairytale:backstab --- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode + ["Boom! %s has destroyed %d invaders."] = "Bum! %s zniszczyli %d najeźdźców.", -- Space_Invasion + ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "BUM! %s naprawdę nie lubili najeźdźców, więc zdecydowali się zniszczyć aż %d z nich.", -- Space_Invasion + ["Boris"] = "Borys", -- A_Space_Adventure:moon01 + ["Boss defeated! +30 points!"] = "Szef pokonany! +30 punktów!", -- Space_Invasion + ["Boss Slayer! +25 points!"] = "Pogromca Szefów! +25 punktów!", -- Space_Invasion + ["Both Barrels"] = "Obie Beczki", -- + ["Both your hedgehogs must survive."] = "Oba twoje jeże muszą przeżyć.", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork + ["Bottom Feeder"] = "Pasożyt", -- Mutant + ["Bouncy Girder: [4]"] = "Odbijająca Belka: [4]", -- HedgeEditor + ["Bouncy Land: [4]"] = "Odbijający Teren: [4]", -- HedgeEditor + ["Bouncy Land"] = "Odbijający Teren", -- HedgeEditor + ["Bozo"] = "Bozo", -- + ["Brain Blower"] = "Mózgorozwalacz", -- A_Classic_Fairytale:journey + ["Brainiac"] = "Możdżak", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow + ["Brainila"] = "Możdżila", -- A_Classic_Fairytale:united + ["Brain Stu"] = "Mózgozupa", -- A_Classic_Fairytale:united + ["Brain Teaser"] = "Łamigłowa", -- A_Classic_Fairytale:backstab + ["Brigadier Briggs"] = "Brygadier Briggs", -- + ["Bruce"] = "Bruce", -- A_Space_Adventure:moon01 + ["Brutal Lily"] = "Brutalna Lilia", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil + ["Brutus"] = "Brutus", -- A_Classic_Fairytale:backstab + ["Build a fortress and destroy your enemy."] = "Zbuduj fortecę i zniszcz swojego wroga.", -- Construction_Mode + ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "Zbuduj niesamowitą trasę wyścigową,|stawiając punkty kontrolne, które jeże|muszą dotknąć, by zakończyć rundę.", -- Racer ["Build a track and race."] = "Zbuduj trasę i ścigaj się.", --- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon --- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon --- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab --- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy --- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab --- ["But where can we go?"] = "", -- A_Classic_Fairytale:united --- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab --- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy --- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode --- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family --- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood --- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey --- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "PRZECHWYĆ FLAGĘ", + ["Builder"] = "Budowniczy", -- Battalion + ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "Zbuduj jedną z wielu różnych struktur, by|pomóc sobie w zwycięstwie, kosztem energii.", -- Construction_Mode + ["Bullseye"] = "Oczko", -- A_Classic_Fairytale:dragon + ["Bunny"] = "Zając", -- + ["burp"] = "burp", -- + ["Bushi"] = "Buszi", -- + ["Buster"] = "Drań", -- + ["But it proved to be no easy task!"] = "Ale okazało się to nie być łatwym zadaniem!", -- A_Classic_Fairytale:dragon + ["But I want my sandals!"] = "Ale ja chcę moje sandały!", -- A_Classic_Fairytale:queen + ["But one thing's for sure:"] = "Ale jedna rzecz jest pewna:", -- A_Space_Adventure:final + ["But that's impossible!"] = "Ale to niemożliwe!", -- A_Classic_Fairytale:backstab + ["But the ones alive are stronger in their heart!"] = "Ale ci co żyją, są silniejsi w swoich sercach!", -- A_Classic_Fairytale:enemy + ["But … they kidnapped you!"] = "Ale... porwali cię!", -- A_Classic_Fairytale:queen + ["But...we died!"] = "Ale... umarliśmy!", -- A_Classic_Fairytale:backstab + ["But where can we go?"] = "Ale gdzie możemy pójść?", -- A_Classic_Fairytale:united + ["But why did you betray us?!"] = "Ale dlaczego nas zdradziłeś?!", -- A_Classic_Fairytale:queen + ["But why would they help us?"] = "Ale czemu by nam pomagali?", -- A_Classic_Fairytale:backstab + ["But you're cannibals. It's what you do."] = "Ale jesteście kanibalami. Tym się zajmujecie.", -- A_Classic_Fairytale:enemy + ["But you said you'd let her go!"] = "Ale powiedziałeś, że ją wypuścisz!", -- A_Classic_Fairytale:journey + ["But you saved me!"] = "Ale uratowałeś mnie!", -- A_Classic_Fairytale:queen + ["C-1"] = "C-1", -- portal + ["C-2"] = "C-2", -- portal + ["Callahan"] = "Callahan", -- + ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "Zwij mnie Brzęczek! Bo jestem taką miłą... osobą!", -- A_Classic_Fairytale:family + ["Cannibal Sentry"] = "Wartownik Kanibali", -- A_Classic_Fairytale:journey + ["Cannibals"] = "Kanibale", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood + ["Cannibals?! You're the cannibals!"] = "Kanibale?! To wy jesteście kanibalami!", -- A_Classic_Fairytale:enemy + ["Can you do it?"] = "Możesz to zrobić?", -- A_Space_Adventure:ice02 + ["Captain Lime"] = "Kapitan Limonka", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 + ["Captain Lime offered his help if you assist him in battle."] = "Kapitan Limonka zaoferował swoją pomoc, jeśli wesprzesz go w walce.", -- A_Space_Adventure:fruit01 + ["Capture The Flag"] = "Przejmij Flagę", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Nieostrożny", --- ["Carol"] = "", -- A_Classic_Fairytale:family --- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge - ["Change Weapon"] = "Zmień broń", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity --- ["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 --- ["Cleaver"] = "", -- Construction_Mode --- ["Cleaver Placement Mode"] = "", -- Construction_Mode --- ["Climber"] = "", -- ClimbHome --- ["Climb Home"] = "", -- ClimbHome --- ["Clowns"] = "", -- User_Mission_-_Nobody_Laugh + ["Carol"] = "Karolina", -- A_Classic_Fairytale:family + ["Challenge completed!"] = "Wyzwanie ukończone!", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa + ["CHALLENGE COMPLETE"] = "WYZWANIE UKOŃCZONE", -- User_Mission_-_RCPlane_Challenge + ["Challenge failed!"] = "Wyzwanie nieudane!", -- SpeedShoppa + ["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 Content: [Left], [Right]"] = "Zmień zawartość: [Lewo], [Prawo]", -- HedgeEditor + ["Change Health Boost: [Left], [Right]"] = "Zmień wzrost zdrowia: [Lewo], [Prawo]", -- HedgeEditor + ["Change Health: [Left], [Right]"] = "Zmień zdrowie: [Lewo], [Prawo]", -- HedgeEditor + ["Change modification mode: [Left], [Right]"] = "Zmień tryb modyfikacji: [Lewo], [Prawo]", -- HedgeEditor + ["Change Placement Mode: [Up], [Down]"] = "Zmień tryb ustawiania: [Lewo], [Prawo]", -- HedgeEditor + ["Change Rotation: [Left], [Right]"] = "Zmień obrót: [Lewo], [Prawo]", -- HedgeEditor + ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "Zmień klatkę Grafiki: [Precyzja]+[Lewo], [Precyzja]+[Prawo]", -- HedgeEditor + ["Change Sprite: [Left], [Right]"] = "Zmień Grafikę: [Lewo], [Prawo]", -- HedgeEditor + ["Change Timer: [Left], [Right]"] = "Zmień czas: [Lewo], [Prawo]", -- HedgeEditor + ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "Zmień broń: [Długi skok] lub [Slot 1]-[Slot 3]", -- Tumbler + ["Charmander"] = "Charmander", -- + ["Chasing the blue hog"] = "Ścigając niebieskego jeża", -- A_Space_Adventure:moon02 + ["Cheater"] = "Oszust", -- User_Mission_-_RCPlane_Challenge + ["Checkpoint reached!"] = "Punkt kontrolny osiągnęty!", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 + ["Chef"] = "Kucharz", -- Battalion, HedgeEditor + ["Chester"] = "Czester", -- + ["Chicken"] = "Kurczak", -- + ["Chief Sandologist"] = "Naczelny Piaskolog", -- A_Space_Adventure:desert01 + ["Chikorita"] = "Chikorita", -- + ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "Wybierz Zaznaczanie/Ustawianie/Usuwanie: [Lewo], [Prawo]", -- HedgeEditor + ["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 + ["Chunli"] = "Czunli", -- + ["Clark Kent"] = "Clark Kent", -- + ["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 + ["Clowns"] = "Klauny", -- User_Mission_-_Nobody_Laugh + ["Cluck-cluck time: [Fire an egg ~ Sabotages and cures poison ~ Cannot be fired close to another hog]"] = "Czas gdakania: [Wystrzel jajo ~ Sabotuje i leczy truciznę ~ Nie może być wystrzelone blisko innego jeża]", -- Continental_supplies ["Clumsy"] = "Fajtłapa", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb --- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Kryptonim: Praca zespołowa", --- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey --- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey --- ["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 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 crates within the time limit!|If you fail, you'll have to try again."] = "", -- A_Classic_Fairytale:first_blood --- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood --- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge + ["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 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 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 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 + ["Collect the green and purple invaders."] = "Zbierz zielonych i fioletowych najeźdźców.", -- Space_Invasion + ["Collect the weapon crate at the left coast!"] = "Zbierz skrzynię z bronią na lewym wybrzeżu.", -- A_Classic_Fairytale:journey + ["Color Squad"] = "Kolorowy Oddział", -- + ["Come closer and die! … burp …"] = "Podejdź bliżej i umrzyj! ...bek...", -- A_Classic_Fairytale:queen + ["Come closer, so that your training may continue!"] = "Podejdź bliżej, żeby kontynuować swój trening!", -- A_Classic_Fairytale:first_blood + ["Comet"] = "Kometa", -- Big_Armory + ["Commander"] = "Dowódca", -- HedgeEditor + ["Compete to use as few planes as possible!"] = "Rywalizuj w użyciu najmniejszej jak się da ilości samolotów!", -- User_Mission_-_RCPlane_Challenge + ["Complete all main and side missions to complete the spacetrip mission."] = "Ukończ wszystkie główne i poboczne misje, by ukończyć kosmiczną wycieczkę.", -- A_Space_Adventure:cosmos + ["Complete the remaining side missions to complete this mission."] = "Ukończ pozostałe misje poboczne, by ukończyć tę misję.", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Ukończ trasę tak szybko jak tylko potrafisz!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Configuration accepted."] = "", -- WxW --- ["Congratulations"] = "", -- Basic_Training_-_Rope + ["Completion time: %.2fs"] = "Czas ukończenia: %.2fs", -- User_Mission_-_Rope_Knock_Challenge + ["Comrades! Sail me away!"] = "Kamraci! Zabierzcie mnie stąd!", -- A_Classic_Fairytale:queen + ["Configuration accepted."] = "Konfiguracja przyjęta.", -- WxW + ["Configuration phase"] = "Faza konfiguracjy", -- WxW + ["Congrats! You won!"] = "Gratulacje! Wygrałeś!", -- A_Space_Adventure:moon01 ["Congratulations!"] = "Gratulacje", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- Basic_Training_-_Rope + ["Congratulations"] = "Gratulacje", -- Basic_Training_-_Rope + ["Congratulations, you acquired the device part!"] = "Gratulacje, zdobyłeś część urządzenia!", -- A_Space_Adventure:ice01 + ["Congratulations, you are the best!"] = "Gratulacje, jesteś najlepszy!", -- A_Space_Adventure:desert03 + ["Congratulations, you are the fastest!"] = "Gratulacje, jesteś najszybszy!", -- A_Space_Adventure:moon02 + ["Congratulations, you collected the device part!"] = "Gratulacje, zebrałeś część urządzenia!", -- A_Space_Adventure:ice01 + ["Congratulations! You have destroyed all targets within the time."] = "Gratulacje! Zniszczyłeś wszystkie cele w czasie.", -- TargetPractice + ["Congratulations, you have saved Hogera!"] = "Gratulacje, uratowałeś Jeżerrę!", -- A_Space_Adventure:final + ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "Gratulacje! Prawdziwie opanowałeś to wyzwanie! Nie zapomnij zapisać dema.", -- User_Mission_-_RCPlane_Challenge + ["Congratulations! You've completed the Basic Rope Training!"] = "Gratulacje! Ukończyłeś podstawowy trening linowy!", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratulacje! Zniszczyłeś wszystkie cele przed upłynięciem czasu.", --- ["CONSTRUCTION MODE"] = "", -- Construction_Mode --- ["Construction Station"] = "", -- Construction_Mode --- ["Continental supplies"] = "", -- Continental_supplies - ["Control pillars to score points."] = "Kontroluj filary by zdobyć punkty", --- ["Core"] = "", -- Construction_Mode --- ["Corporationals"] = "", -- A_Classic_Fairytale:queen --- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow --- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil --- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode --- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity + ["Congratulations! You win."] = "Gratulacje! Wygrywasz.", -- Big_Armory + ["Congratulations, you won!"] = "Gratulacje, wygrałeś!", -- 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 + ["Conquering the galaxy"] = "Podbijanie galaktyki", -- A_Space_Adventure:cosmos + ["Construction Mode tool"] = "Narzędzie Trybu Konstrukcji", -- Construction_Mode + ["CONSTRUCTION MODE"] = "TRYB KONSTRUKCJI", -- Construction_Mode + ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "Stacja Konstrukcji: Pozwala na stawianie| belek, gumy, min, min samoprzylepnych| i beczek.", -- Construction_Mode + ["Construction Station"] = "Stacja Konstrukcji", -- Construction_Mode + ["Continental supplies"] = "Kontynentalne zaopatrzenie", -- Continental_supplies + ["Control"] = "Kontrola", -- Control + ["Control pillars to score points."] = "Kontroluj kolumny, by zdobyć punkty.", + ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "Sterowanie: Przytrzymaj przycisk Ataku (domyślnie Spacja), by|wystrzelić linę, potem po zaczepieniu, użyj:|Lewo i Prawo, by rozhuśtać linę;|Góra i Dół, by skurczyć i rozszerzyć.", -- Basic_Training_-_Rope + ["Copper"] = "Miedź", -- User_Mission_-_Nobody_Laugh + ["Corn"] = "Kukurydza", -- A_Space_Adventure:fruit01 + ["Corporal Calvin"] = "Kapral Kalwin", -- + ["Corporationals"] = "Korponacjonaliści", -- A_Classic_Fairytale:queen + ["Corpsemonger"] = "Ciałohandlarz", -- A_Classic_Fairytale:shadow + ["Corpse Thrower"] = "Truchło-rzucacz", -- A_Classic_Fairytale:epil + ["Cost"] = "Koszt", -- Construction_Mode + ["Count Hogula"] = "Hrabia Jeżula", -- + ["Coward"] = "Tchórz", -- A_Classic_Fairytale:queen + ["Crate Before Attack: %s"] = "Skrzynia przed atakiem: %s", -- WxW + ["Crate Before Attack: You must collect a crate before you can attack."] = "Skrzynia przed atakiem: Musisz zebrać skrzynię, zanim będziesz móc atakować.", -- WxW + ["Crate Placer"] = "Stawiacz skrzyń", -- Construction_Mode + ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "Skrzynie: Skrzynie spadają częściej, z większą szansą na dodatkową amunicję", -- Battalion + ["Crates: Crates drop randomly and may be empty"] = "Skrzynie: Skrzynie spadają losowo i mogą być puste", -- Battalion + ["Crates: Crates drop randomly with chance of being empty"] = "Skrzynie: Skrzynie spadają losowo z szansą na bycie pustymi", -- Battalion + ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "Czas krykieta: [Wystrzel 1-sekundową minę! ~ Nie może być wystrzelone blisko innego jeża]", -- Continental_supplies + ["CTF_Blizzard"] = "CTF Burza Śnieżna", -- CTF_Blizzard + ["Cursor: Mode action"] = "Kursor: Akcja trybu", -- HedgeEditor + ["|Cursor: Place crate"] = "|Kursor: Postaw skrzynię", -- Construction_Mode + ["Cursor: Place waypoint"] = "Kursor: Postaw punkt kontrolny", -- Racer + ["Cutlass Cain"] = "Kordelas Kain", -- ["Cybernetic Empire"] = "Cybernetyczne Imperium", --- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy --- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab + ["Cyborg. It's what the aliens call themselves."] = "Cyborgi. Tak nazywają siebie ci kosmici.", -- A_Classic_Fairytale:enemy + ["Dahmer"] = "Damer", -- A_Classic_Fairytale:backstab + ["Daisy"] = "Stokrotka", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "Młody!!! Złaź z mojej głowy!!!", ["DAMMIT, ROOKIE!"] = "Żółtodziobie!", + ["+%d ammo"] = "+%d amunicji", -- Battalion + ["+%d Ammo"] = "+%d amunicji", -- Space_Invasion ["Dangerous Ducklings"] = "Niebezpieczne Kaczory", --- ["Deadweight"] = "", --- ["Decrease"] = "", -- Continental_supplies --- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode + ["Dark Strawberry"] = "Mroczna Truskawa", -- A_Space_Adventure:fruit02 + ["%d crate(s) remaining"] = "%d skrzyń pozostało", -- SpeedShoppa + ["%d damage was dealt in this game."] = "%d obrażeń zostało zadanych w tej grze.", -- Mutant + ["+%d"] = "+%d", -- Battalion + ["Deadly Grape"] = "Zabójczy Winogron", -- A_Space_Adventure:fruit02 + ["Deadweight"] = "Balast", + ["Deer"] = "Jeleń", -- + ["Defeat all enemies!"] = "Pokonaj wszystkich wrogów!", -- portal + ["Defeat Professor Hogevil!"] = "Pokonaj Profesora Jeżozło!", -- 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"] = "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 + ["Deletion Mode: [5]"] = "Tryb usuwania: [5]", -- HedgeEditor + ["Deletion Mode"] = "Tryb Usuwania", -- HedgeEditor + ["Deletition Mode"] = "Tryb Usuwania", -- HedgeEditor + ["Demo"] = "Demo", -- The_Specialists ["Demolition is fun!"] = "Rozwałka jest fajna!", --- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow --- ["Depleted Kamikaze!"] = "", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 --- ["Destroy him, Leaks A Lot! He is responsible for the deaths of many of us!"] = "", -- A_Classic_Fairytale:first_blood - ["Destroy invaders to score points."] = "Zabijaj najeźdźców by zdobyć punkty.", --- ["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 --- ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united --- ["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 --- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion --- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab --- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood --- ["DOUBLE KILL"] = "", -- Mutant - ["Double Kill!"] = "Podwójna śmierć!", --- ["Do you have any idea how valuable grass is?"] = "", -- A_Classic_Fairytale:enemy --- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy --- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode --- ["Drills"] = "", -- A_Classic_Fairytale:backstab --- ["Drill Strike"] = "", -- Construction_Mode - ["Drone Hunter!"] = "Łowca dronów", --- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - --- ["Drowner"] = "", --- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family --- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey --- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab --- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow --- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon --- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab --- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab --- ["Duration"] = "", -- Continental_supplies --- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode --- ["Each turn is only ONE SECOND!"] = "", -- Frenzy + ["Dense Cloud"] = "Gęsta Chmura", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united + ["Dense Cloud must have already told them everything..."] = "Gęsta Chmura pewnie im już wszystko powiedział...", -- A_Classic_Fairytale:shadow + ["Dense Cloud?! What are you doing?!"] = "Gęsta Chmura?! Co ty robisz?!", -- A_Classic_Fairytale:queen + ["Depleted Kamikaze! +5 points!"] = "Wyczerpany Kamikaze! +% punktów", -- Space_Invasion + ["Derp"] = "Derp", -- User_Mission_-_Nobody_Laugh + ["Desert Storm"] = "Pustynna Burza", -- + ["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 + ["+%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 + ["Did I miss something?"] = "Czy ja coś przegapiłem?", -- Space_Invasion + ["Did not finish"] = "Nieukończony", -- Racer, TechRacer + ["Did you really think I've changed?"] = "Naprawdę myślałeś, że się zmieniłem?", -- A_Classic_Fairytale:queen + ["Did you really think that I've changed?"] = "Naprawdę myślałeś, że się zmieniłem?", -- A_Classic_Fairytale:queen + ["Did you really think that we needed the help of one of you?"] = "Naprawdę myślałeś, że potrzebujemy pomocy jednego z was?", -- A_Classic_Fairytale:queen + ["Did you see him coming?"] = "Widziałeś jak nadchodzi?", -- A_Classic_Fairytale:shadow + ["Did you warn the village?"] = "Ostrzegłeś wioskę?", -- A_Classic_Fairytale:shadow + ["Die, die, die!"] = "Giń, giń, giń!", -- A_Classic_Fairytale:dragon + ["Difficulty: Easy"] = "Poziom trudności: Łatwy", -- A_Classic_Fairytale:first_blood + ["Difficulty: Hard"] = "Poziom trudności: Trudny", -- A_Classic_Fairytale:first_blood + ["Difficulty: "] = "Poziom trudności:", -- Continental_supplies + ["Dimitry"] = "Dymitr", -- + ["%d invaders have been destroyed in this game."] = "%d najeźdźców zostało zniszczonych w tej grze.", -- Space_Invasion + ["Disabled"] = "Wyłączone", -- WxW + ["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 + ["Domination game"] = "Gra o dominację", -- Control + ["Donald"] = "Donad", -- + ["Do not destroy the crates!"] = "Nie niszcz skrzyń!", -- A_Space_Adventure:fruit02 + ["Do not laugh, inexperienced one, for he speaks the truth!"] = "Nie śmiej się, niedoświadczony, on mówi prawdę!", -- A_Classic_Fairytale:backstab + ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "Nie pozwól jego słowom cię oszukać, młodzieńcze! On wbije ci nóż w plecy zaraz po tym, jak się odwrócisz!", -- A_Classic_Fairytale:first_blood + ["Don't be foolish, son, there will be more."] = "Nie bądź głupi synu, będzie ich więcej!", -- A_Space_Adventure:fruit01 + ["Don't blow up the crate."] = "Nie wysadź skrzyni.", -- A_Classic_Fairytale:journey + ["Don't destroy the device crate!"] = "Nie zniszcz skrzyni urządzenia!", -- A_Space_Adventure:desert01 + ["Don't eliminate Captain Lime before collecting the last crate!"] = "Nie eliminuj Kapitana Limonki przed zebraniem ostatniej skrzyni!", -- A_Space_Adventure:fruit02 + ["Don't hit me, you fools!"] = "Nie uderzcie mnie, wy głupcy!", -- A_Space_Adventure:moon01 + ["Don't you dare harming our tribe!"] = "Nie waż się skrzywdzić naszego plemienia!", -- A_Classic_Fairytale:queen + ["Double Kill!"] = "Podwójne zabójstwo!", + ["Double kill!"] = "Podwójne zabójstwo!", -- Mutant + ["Do you have any idea how bad an exploding arrow hurts?"] = "Czy ty masz pojęcie jak bardzo boli eksplodująca strzała?", -- A_Classic_Fairytale:queen + ["Do you have any idea how valuable grass is?"] = "Czy ty masz pojęcie jak cenna jest trawa?", -- A_Classic_Fairytale:enemy + ["Do you have any idea what it's like in the village for a woman?"] = "Czy ty masz pojęcie jak żyje się kobietom w wiosce?", -- A_Classic_Fairytale:queen + ["Do you know where they are?"] = "Czy wiesz, gdzie oni są?", -- A_Classic_Fairytale:queen + ["Do you think you're some kind of god?"] = "Czy ty myślisz, że jesteś jakimś bogiem?", -- A_Classic_Fairytale:enemy + ["Dragon's Lair"] = "Gniazdo smoka", -- A_Classic_Fairytale:dragon + ["Dr. Banting"] = "Dr Benting", -- + ["Dr. Barnard"] = "Dr Bernard", -- + ["Dr. Blackwell"] = "Dr Blakłel", -- + ["Dr. Cornelius"] = "Dr Korneliusz", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 + ["Dr. Crushing"] = "Dr Kraszing", -- + ["Dr. Drew"] = "Dr Andrzej", -- + ["Dr. Harvey"] = "Dr Harwej", -- + ["Dr. Hollows"] = "Dr Holołs", -- + ["Dr. Horace"] = "Dr Horacy", -- + ["Drill Strike"] = "Wiertniczy nalot", -- Construction_Mode + ["Drills"] = "Wiertła", -- A_Classic_Fairytale:backstab + ["Dr. Jenner"] = "Dr Dżener", -- + ["Dr. Jung"] = "Dr Dżang", -- + ["Drone Hunter! +10 points!"] = "Łowca dronów! +10 punktów!", -- Space_Invasion + ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "Upuść bombę: [Upuść trochę heroicznego wiatru, który przy uderzeniu zamieni się w bombę]", -- Continental_supplies + ["- Dropped flags may be returned or recaptured"] = "- Upuszczone flagi mogą być zwrócone lub ponownie przejęte", -- Capture_the_Flag + ["Dropping a weapon while in water would just drown it, but launching one would work."] = "Upuszczenie broni pod wodą by ją utopiłą, ale wystrzelenie zadziała.", -- Basic_Training_-_Flying_Saucer + ["Drowner"] = "Topielec", + ["Dr. Parkinson"] = "Dr Parkinson", -- + ["Drunk greenhorn"] = "Pijany żółtodziób", -- User_Mission_-_RCPlane_Challenge + ["Drunk with power, perhaps!"] = "Upił się mocą, być może!", -- A_Classic_Fairytale:queen + ["%d sec"] = "%d sekund", -- Construction_Mode + ["+%d seconds!"] = "%d sekund!", -- Tumbler + ["Dubloon Devil"] = "Dublonowy Diabeł", -- + ["Dude, all the plants are gone!"] = "Koleś, wszystkie rośliny zniknęły!", -- A_Classic_Fairytale:family + ["Dude, can you see Ramon and Spiky?"] = "Koleś, widzisz Ramona i Kolczastego?", -- A_Classic_Fairytale:journey + ["Dude, it's unbearable!"] = "Koleś, to jest nie do zniesienia!", -- A_Classic_Fairytale:queen + ["Dude, let me out!"] = "Koleś, wypuść mnie!", -- A_Classic_Fairytale:epil + ["Dude, that outfit is so cool!"] = "Koleś, ten kostium jest taki odjazdowy!", -- A_Classic_Fairytale:epil + ["Dude, that's so cool!"] = "Koleś, to takie odlotowe!", -- A_Classic_Fairytale:backstab + ["Dude, this is boring!"] = "Koleś, to jest nudne!", -- A_Classic_Fairytale:queen + ["Dude, we really need a new shaman..."] = "Koleś, naprawdę potrzebujemy nowego szamana...", -- A_Classic_Fairytale:shadow + ["Dude, what's this place?!"] = "Koleś, co to za miejsce?", -- A_Classic_Fairytale:dragon + ["Dude, where are we?"] = "Koleś, gdzie my jesteśmy?", -- A_Classic_Fairytale:backstab + ["Dude, wow! I just had the weirdest high!"] = "Koleś, wow! Miałem właśnie najdziwniejszy odlot!", -- A_Classic_Fairytale:backstab + ["Dude, wow, you're so cute!"] = "Koleś, wow, jesteś taki słodki!", -- A_Classic_Fairytale:queen + ["Dud Mine Placement Mode"] = "Tryb Ustawiania Niewybuchów", -- HedgeEditor + ["DUD MINE PLACEMENT MODE"] = "TRYB USTAWIANIA NIEWYBUCHÓW", -- HedgeEditor + ["Duration"] = "Czas trwania", -- Continental_supplies + ["During the final testing of the device an accident happened."] = "Podczas finałowych testów urządzenia zdarzył się wypadek.", -- A_Space_Adventure:moon02 + ["During the game you can get new RC planes by collecting the weapon crates."] = "Podczas gry możesz zdobyć nowe samolociki, zbierając skrzynie z broniami.", -- A_Space_Adventure:desert03 + ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "Burza pyłowa: [Zadaje 15 obrażeń każdemu wrogowi w kole]", -- Continental_supplies + ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "Za każdym razem, gdy zniszczysz wszystkie cele na twoim aktualnym poziomie, zostaniesz przeteloportowany do następnego poziomu.", -- A_Space_Adventure:desert03 + ["Each time you play this missions enemy hogs will play in a random order."] = "Za każdym razem, gdy grasz w tę misję, wrogie jeże będą grały w losowym porządku.", -- A_Space_Adventure:death02 + ["Each turn is only ONE SECOND!"] = "Każda tura to tylko JEDNA SEKUNDA!", -- Frenzy ["Each turn you get 1-3 random weapons"] = "Z każdą turą dostaniesz 1-3 bronie", ["Each turn you get one random weapon"] = "Z każdą turą dostaniesz losową broń", --- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab --- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - --- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil --- ["Elderbot"] = "", -- A_Classic_Fairytale:family --- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Wyeliminuj wszystkich przeciwników", - ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Zniszcz wszystkie cele zanim upłynie czas.|W tej misji masz nieskończoną ilość amunicji.", - ["Eliminate enemy hogs and take their weapons."] = "Ukatrup jeże przeciwnika i przejmij ich bronie.", -- Highlander - ["Eliminate Poison before the time runs out"] = "Zabij Truciciela zanim skończy się czas", - ["Eliminate the Blue Team"] = "Zniszcz niebieską drużynę", - ["Eliminate the enemy before the time runs out"] = "Wyeliminuj przeciwnika przed upłynięciem czasu.", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock + ["Each turn you'll have only one rope to use."] = "W każdej turze będziesz mieć tylko jedną linę do użycia.", -- A_Space_Adventure:moon02 + ["Eagle Eye: [Blink to the impact ~ One shot]"] = "Sokole Oko: [Mrugnij do uderzenia ~ Jeden strzał]", -- Continental_supplies + ["Eagle Eye"] = "Sokole Oko", -- A_Classic_Fairytale:backstab + ["Ear Sniffer"] = "Wąchacz Uszu", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil + ["EASY"] = "ŁATWY", -- Continental_supplies + ["Eckles"] = "Ekles", -- User_Mission_-_Nobody_Laugh + ["Eclipse"] = "Zaćmienie", -- Big_Armory + ["Editing Commands: (Use while no weapon is selected)"] = "Komendy edytowania: (Użyj ,gdy nie wybrano broni)", -- HedgeEditor + ["Ehm, okay ..."] = "Em, dobrze...", -- A_Space_Adventure:moon01 + ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Rozwal Jednostkę 3378 |- Twoja drużyna musi przetrwać", --- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - ["Energetic Engineer"] = "Energetyczny Inżynier", + ["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 + ["Elite pilot"] = "Elitarny pilot", -- User_Mission_-_RCPlane_Challenge + ["Elmo"] = "Elmo", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Enabled"] = "Włączone", -- WxW + ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "Zabójstwa wroga: Zabierz bronie ofiary i +%d%% jej bazowego zdrowia", -- Battalion + ["Energetic Engineer"] = "Inżynier Energetyczny", + ["Engineer"] = "Inżynier", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Popływaj trochę...", - ["[Enter]"] = "[Enter]", --- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab --- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy --- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon --- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy --- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode --- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey --- ["Family Reunion"] = "", -- A_Classic_Fairytale:family + ["Entered boredom phase! Discrepancies detected …"] = "Wchodzę w fazę nudy! Wykryto rozbieżności...", -- A_Classic_Fairytale:queen + ["Epilogue"] = "Epilog", -- A_Classic_Fairytale:epil + ["ERROR [getHogInfo]: Hog is nil!"] = "BŁĄD [getHogInfo]: Jeż jest nil!", -- Battalion + ["Eugene"] = "Eugeniusz", -- + ["Europe"] = "Europa", -- Continental_supplies + ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "Za każde 2 pierścienie, kolor pierścienia będzie zielony i dostaniesz dodatkowy latający talerz.", -- A_Space_Adventure:ice02 + ["Every 2 rings you'll get extra flying saucers."] = "Za każde 2 pierścienie dostaniesz dodatkowe latające talerze.", -- A_Space_Adventure:ice02 + ["Everyone knows this."] = "Każdy to wie.", -- A_Classic_Fairytale:enemy + ["Every single time!"] = "Za każdym razem!", -- A_Classic_Fairytale:dragon + ["Everything looks OK..."] = "Wszystko wygląda w porządku...", -- A_Classic_Fairytale:enemy + ["Every time you kill an enemy hog your ammo will get reset next turn."] = "Za każdym razem, gdy zabijesz wrogiego jeża, twoja amunicja zresetuje się w następnej turze.", -- A_Space_Adventure:death02 + ["Everywhere I look, I see hogs walking around …"] = "Wszędzie, gdzie spojrzę, widzę chodzące jeże...", -- A_Classic_Fairytale:epil + ["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 + ["Exploring the tunnel"] = "Eksploracja tunelu", -- A_Space_Adventure:fruit02 + ["Eye Chewer"] = "Przeżuwacz Oczu", -- A_Classic_Fairytale:journey + ["Fair Wind"] = "Sprawiedliwy Wiatr", -- + ["Family Reunion"] = "Spotkanie rodzinne", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Najszybsze okrążenie: ", ["Feeble Resistance"] = "Ruch Oporu", --- ["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 --- ["Fell From Heaven"] = "", -- 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 --- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family --- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion --- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united --- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings --- ["Find your tribe!|Cross the lake!"] = "", -- A_Classic_Fairytale:dragon --- ["Finish your training|Hint: Animations can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:first_blood - - ["Fire"] = "Ogień", --- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united --- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant --- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood + ["Fell From Grace"] = "Upadły z Łaski", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "Upadły z Niebios jest najlepszy! Upadły z Niebios jest najświetniejszy!", -- A_Classic_Fairytale:family + ["Fell From Heaven"] = "Upadły z Niebios", -- 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 + ["Femur Lover"] = "Wielbiciel Ud", -- A_Classic_Fairytale:shadow + ["Fierce Competition! +8 points!"] = "Zacięta rywalizacja! +8 punktów!", -- Space_Invasion + ["Fiery Water?! Are you drunk again?"] = "Ognista Woda? Znowu jesteś pijany?", -- A_Classic_Fairytale:queen + ["Fiery Water"] = "Ognista Woda", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united + ["Fighting instead of cultivating a beautiful friendship."] = "Walcząc, zamiast podtrzymywać piękną przyjaźń.", -- A_Classic_Fairytale:epil + ["Fight: Press [Attack]"] = "Walcz: Wciśnij [Atak]", -- A_Space_Adventure:fruit01 + ["Filthy Blue"] = "Brudny Niebieski", -- User_Mission_-_Dangerous_Ducklings + ["Finally you are here!"] = "Nareszcie tu jesteś!", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 + ["Final result"] = "Końcowy rezultat", -- Mutant + ["Final team scores:"] = "Końcowe wyniki drużyn:", -- Space_Invasion + ["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 + ["Fire: [Precise]"] = "Strzel: [Precyzja]", -- Space_Invasion, Tumbler + ["First aid kits?!"] = "Apteczki?", -- A_Classic_Fairytale:united + ["First Blood"] = "Pierwsza krew", -- A_Classic_Fairytale:first_blood + ["First killer will mutate"] = "Pierwszy zabójca zmutuje", -- Mutant + ["First Steps"] = "Pierwsze kroki", -- A_Classic_Fairytale:first_blood + ["- First team to capture the flag wins"] = "Pierwsa drużyna, która przejmie flagę, wygrywa", -- Capture_the_Flag + ["- First team to score %d captures wins"] = "Pierwsa drużyna, która przejmie flagę %d razy, wygrywa", -- Capture_the_Flag + ["Fishy"] = "Podejrzany", -- ["Flag captured!"] = "Flaga przechwycona!", ["Flag respawned!"] = "Flaga przywrócona!", ["Flag returned!"] = "Flaga odzyskana!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Flagi i baza zostaną umieszczone tam gdzie zespół zakończy swą pierwszą turę.", --- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode --- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - --- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW --- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode --- ["FRENZY"] = "", -- Frenzy --- ["Friendly Fire!"] = "", - ["fuel extended!"] = "zdobyto paliwo", - ["GAME BEGUN!!!"] = "GRA ROZPOCZĘTA!!!", + ["Flamer"] = "Miotacz ognia", + ["Flamer selected!"] = "Miotacz ognia wybrany!", -- Tumbler + ["Flaming Worm"] = "Płomienisty Robal", -- A_Classic_Fairytale:backstab + ["Flawless victory!"] = "Bezbłędne zwycięstwo!", -- User_Mission_-_RCPlane_Challenge + ["Flee: Press [Jump]"] = "Ucieknij: Wciśnij [Skok]", -- A_Space_Adventure:fruit01 + ["Flesh for Brainz"] = "Mięso dla Mózgów", -- A_Classic_Fairytale:journey + ["Fly around and hurl explosives to your enemies."] = "Lataj dookoła i ciskaj ładunki wybuchowe na swoich wrogów.", -- Tumbler + ["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 + ["Four Eyes"] = "Czterooki", -- + ["Frank"] = "Franek", -- User_Mission_-_Nobody_Laugh + ["Frankie"] = "Franka", -- + ["Free Dense Cloud and continue the mission!"] = "Uwolnij Gęstą Chmurę i kontynuuj misję!", -- A_Classic_Fairytale:journey + ["FRENZY"] = "SZAŁ", -- Frenzy + ["Friendly Fire!"] = "Przyjacielski Ogień!", + ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "Przyjacielskie zabójstwa: Wyczyść pulę zabójcy i -%d%% jego bazowego zdrowia", -- Battalion + ["From the second turn and beyond the water rises."] = "Od drugiej tury woda się podwyższa.", -- A_Space_Adventure:desert02 + ["Frozen Bandits"] = "Zamrożeni Bandyci", -- A_Space_Adventure:ice01 + ["Fruit Assassins"] = "Owocowi Zabójcy", -- A_Space_Adventure:fruit02 + ["Fruit"] = "Owoc", -- + ["Fruity"] = "Owocny", -- + ["Fuel: %d"] = "Paliwo: %d", -- Tumbler + ["Fuzzy Beard"] = "Puszystobrody", -- + ["“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 Started!"] = "Gra Rozpoczęta", --- ["Game? Was this a game to you?!"] = "", -- A_Classic_Fairytale:enemy --- ["GasBomb"] = "", -- Continental_supplies --- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen --- ["General information"] = "", -- Continental_supplies --- ["Generates power."] = "", -- Construction_Mode --- ["Generator"] = "", -- Construction_Mode --- ["Get Dense Cloud out of the pit!"] = "", -- A_Classic_Fairytale:journey + ["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 + ["Gangsters"] = "Gangsterzy", -- + ["GasBomb"] = "Bomba Gazowa", -- Continental_supplies + ["Gas Gargler"] = "Gazowy Płukacz", -- A_Classic_Fairytale:queen + ["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 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"] = "", -- A_Classic_Fairytale:first_blood --- ["Get out of there!"] = "", -- User_Mission_-_The_Great_Escape --- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood --- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope --- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab --- ["Girder"] = "", -- Construction_Mode --- ["Girder Placement Mode"] = "", -- Construction_Mode --- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Gol", + ["Get on the head of the mole"] = "Wejdź na głowę kreta", -- 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 + ["Get the crate on the other side of the island!|"] = "Zdobądź skrzynię na drugim końcu wyspy!|", -- A_Classic_Fairytale:journey + ["Get the highest score to win."] = "Zdobądź najwyższy wynik, by wygrać.", -- Space_Invasion + ["Getting ready"] = "Przygotowanie", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 + ["Getting to the device"] = "Dojście do urządzenia", -- A_Space_Adventure:fruit02 + ["Get to the crate using your flying saucer!"] = "Dostań się do skrzyni, używając swojego latającego talerza!", -- Basic_Training_-_Flying_Saucer + ["Get to the target using your rope!"] = "Dostań się do celu, używając swojej liny!", -- Basic_Training_-_Rope + ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "Wydostań swoich kolegów z ich naturalnego więzienia i uratuj księżniczkę!|Porada: Wywiercenie dziur powinno wszystko rozwiązać.|Porada: Może być dobrym pomysłem, by ustawić belkę przez rozpoczęciem wiercenia. Tylko mówię.|Porada: Wszystkie twoje jeże powiny być ponad zaznaczoną wysokością!|Porada: Spory Przeciek musi dostać się naprawdę blisko księżniczki!", -- A_Classic_Fairytale:family + ["Giggles"] = "Chichot", -- + ["Gimme Bones"] = "Dej Kości", -- A_Classic_Fairytale:backstab + ["Girder"] = "Belka", -- Construction_Mode + ["Girder Placement Mode"] = "Tryb Stawiania Belek", -- Construction_Mode + ["GIRDER PLACEMENT MODE"] = "TRYB STAWIANIA BELEK", -- HedgeEditor + ["Give a hog a preset identity and weapons"] = "Daj jeżowi ustaloną tożsamość i bronie", -- HedgeEditor + ["Give an entire team themed hats and names"] = "Daj całej drużynie tematyczne czapki i imiona", -- HedgeEditor + ["Glark"] = "Glark", -- A_Classic_Fairytale:shadow + ["Glasses"] = "Okulary", -- + ["Glassy"] = "Szklisty", -- + ["Goal Definition Mode"] = "Tryb Definicji Celu", -- HedgeEditor + ["GOAL DEFINITION MODE"] = "TRYB DEFINICJI CELU", -- HedgeEditor + ["Go and collect the crate"] = "Idź i zbierz skrzynię", -- A_Space_Adventure:cosmos + ["Godai"] = "Godai", -- + ["Go down and save these PAotH hogs!"] = "Zejdź na dół i uratuj te jeże z PSJ!", -- A_Space_Adventure:moon01 + ["Go, get him again!"] = "Idźcie, złapcie go znowu!", -- A_Space_Adventure:moon02 + ["Goggles"] = "Gogl", -- + ["Goggs"] = "Gogs", -- ["GO! GO! GO!"] = "RUCHY! RUCHY! RUCHY!", - ["Good birdy......"] = "Dooobry ptaszek...", --- ["Good Dude"] = "", -- User_Mission_-_The_Great_Escape --- ["Good idea, they'll never find us there!"] = "", -- A_Classic_Fairytale:united --- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey - ["Good luck out there!"] = "Powodzenia!", + ["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 + ["Good luck...or else!"] = "Powodzenia... lub nie!", -- A_Classic_Fairytale:journey + ["Good luck out there!"] = "Powodzenia tam!", + ["Good luck!"] = "Powodzenia!", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 ["Good so far!"] = "Jak dotąd idzie dobrze!", ["Good to go!"] = "Gotowi do akcji!", --- ["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 + ["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 + ["Got 1 more saucer and 8 more seconds added to the clock"] = "Zdobywasz 1 talerz więcej i 8 więcej sekund dodane do zegara", -- A_Space_Adventure:ice02 + ["Got 1 more saucer"] = "Zdobywasz 1 talerz więcej", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "MAM CIĘ!", - ["Grab Mines/Explosives"] = "Chwyć miny/beczki", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity --- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow --- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope --- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - --- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon --- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 --- ["Grenade Training"] = "", -- Basic_Training_-_Grenade --- ["Grenadiers"] = "", -- Basic_Training_-_Grenade --- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab --- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy --- ["Haha!"] = "", -- A_Classic_Fairytale:united + ["Go to Thanta and get the device part!"] = "Idź do Tanty i zdobądź część urządzenia!", -- A_Space_Adventure:ice01 + ["Go to the surface!"] = "Idź na powierzchnię!", -- A_Space_Adventure:fruit02 + ["Go to the upper platform and get the weapons in the crates!"] = "Idź na górną platformę i zdobądź bronie ze skrzyń!", -- A_Space_Adventure:moon01 + ["Got the saucer!"] = "Dotarto do talerza!", -- A_Space_Adventure:cosmos + ["Got to go back."] = "Muszę wracać.", -- A_Space_Adventure:cosmos + ["Got you? You're acting weird."] = "Dopadło cię? Dziwnie się zachowujesz.", -- A_Classic_Fairytale:queen + ["Grab mines/barrels: [High jump]"] = "Złap miny/beczki: [Wysoki skok]", -- Tumbler + ["Gravity: 100%"] = "Grawitacja: 100%", -- Gravity + ["Great choice, Steve! Mind if I call you that?"] = "Świetny wybór, Stefan! Masz coś przeciwko nazywaniu cię tak?", -- A_Classic_Fairytale:shadow + ["Great! Let’s kill all these enemies, using portals."] = "Świetnie! Zabijmy wszystkich tych wrogów, używając portali.", -- portal + ["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 areas are portal-proof and repel portals."] = "Zielone obszary są portaloodporne i odpierają portale.", -- A_Space_Adventure:final + ["Green areas are portal-proof."] = "Zielone obszary są portaloodporne.", -- A_Space_Adventure:final + ["Green Bananas won!"] = "Zielone Banany wygrywają!", -- A_Space_Adventure:fruit01 + ["Green Bananas"] = "Zielone Banany", -- A_Space_Adventure:fruit01 + ["Green Hog Grape"] = "Zielonojeżowy Winogron", -- A_Space_Adventure:fruit01 + ["Green hogs won't intentionally hurt you."] = "Zielone jeże nie zaatakują cię umyślnie.", -- A_Space_Adventure:fruit01 + ["Greenhorn"] = "Żółtodziób", -- User_Mission_-_RCPlane_Challenge + ["Green lipstick bullet: [Poisonous, deals no damage]"] = "Zielony szminkowy pocisk: [Zatruty, nie zadaje obrażeń]", -- Continental_supplies + ["Green"] = "Zielony", -- + ["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 + ["Grenade Training"] = "Trening Granatowy", -- Basic_Training_-_Grenade + ["Grenadier"] = "Grenadier", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor + ["Grenadiers"] = "Grenadierzy", -- Basic_Training_-_Grenade + ["Grey"] = "Szary", -- + ["Guards"] = "Strażnicy", -- A_Space_Adventure:cosmos + ["Guile"] = "Wilhelm", -- + ["Guys, do you think there's more of them?"] = "Ziomki, myślicie, że jest ich więcej?", -- A_Classic_Fairytale:backstab + ["Haha! Come!"] = "Haha! Chodź!", -- A_Classic_Fairytale:queen + ["HAHA!"] = "HAHA!", -- A_Classic_Fairytale:enemy + ["Haha!"] = "Haha!", -- A_Classic_Fairytale:united ["Hahahaha!"] = "Hahahaha!", + ["Haha, I love the look on your face!"] = "Haha, uwielbiam to spojrzenie na twojej twarzy!", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Haha, to było by COŚ", --- ["Hammer"] = "", -- Construction_Mode, Continental_supplies --- ["Hannibal"] = "", -- A_Classic_Fairytale:epil + ["Haha, that was just a coincidence!"] = "Haha, to był tylko przypadek!", -- A_Classic_Fairytale:queen + ["Hammer"] = "Młotek", -- Construction_Mode, Continental_supplies + ["Hannibal"] = "Hannibal", -- A_Classic_Fairytale:epil [" Hapless Hogs left!"] = " Nieszczęsne Jeże pozostały", ["Hapless Hogs"] = "Nieszczęsne Jeże", --- [" HAS MUTATED"] = "", -- Mutant --- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen --- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow --- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy --- ["Healing Station"] = "", -- Construction_Mode --- ["Health Crate Placement Mode"] = "", -- Construction_Mode - ["Health crates extend your time."] = "Apteczki dodają czas.", --- ["Heavy"] = "", --- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy --- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Koszykówka", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", --- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab + ["Happy with your race track?|Then stop building and start racing!"] = "Zadowolony ze swojej trasy?|Więc przestań budować i zacznij wyścig!", -- Racer + ["Hard flying"] = "Twarde latanie", -- A_Space_Adventure:ice02 + ["HARD"] = "TRUDNY", -- Continental_supplies + ["Harris"] = "Harys", -- + ["Harry"] = "Henryk", -- User_Mission_-_Nobody_Laugh + ["Harry Potter"] = "Harry Potter", -- + ["Hatless Jerry"] = "Bezczapkowy Jerry", -- A_Classic_Fairytale:queen + ["Have no illusions, your tribe is dead, indifferent of your choice."] = "Nie miej złudzeń, twoje plemię jest martwe, niezależnie od twojego wyboru.", -- A_Classic_Fairytale:shadow + ["Haven't found it yet ..."] = "Jeszcze tego nie znalazłem...", -- A_Space_Adventure:desert01 + ["Have we ever attacked you first?"] = "Czy kiedykolwiek zaatakowaliśmy pierwsi?", -- A_Classic_Fairytale:enemy + ["H confirmed that there isn't such a PAotH activity logged."] = "J potwierdził, że nie ma zapisanej takiej aktywności PSJ.", -- A_Space_Adventure:desert01 + ["Healing Station: Heals nearby hogs."] = "Stacja Lecząca: Leczy pobliskie jeże.", -- Construction_Mode + ["Healing Station"] = "Stacja Lecząca", -- Construction_Mode + ["Health Crate Placement Mode"] = "Tryb Stawiania Apteczek", -- Construction_Mode + ["HEALTH CRATE PLACEMENT MODE"] = "TRYB STAWIANIA APTECZEK", -- HedgeEditor + ["Health: %d"] = "Zdrowie: %d", -- HedgeEditor + ["Health: Hogs lose up to 7% base health per turn"] = "Zdrowie: Jeże tracą do 7% bazowego zdrowia co turę", -- Battalion + ["Health Modification Mode"] = "Tryb Modyfikacji Zdrowia", -- HedgeEditor + ["HEALTH MODIFICATION MODE"] = "TRYB MODYFIKACJI ZDROWIA", -- HedgeEditor + ["Heartful"] = "Serdeczny", -- Challenge_-_Speed_Shoppa_-_Hedgelove + ["Heavy Cannfantry"] = "Ciężka Kanibaleria", -- A_Classic_Fairytale:united + ["Heavy"] = "Ciężki", + ["Heckles"] = "Hekles", -- + ["Heck, you even executed one of your own!"] = "Do licha, nawet wykonaliście wyrok na jednym ze swoich!", -- A_Classic_Fairytale:queen + ["Hedge-cogs"] = "Jeże Zębate", -- A_Classic_Fairytale:enemy + ["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 + ["Hedgehogs can not be deleted."] = "Jeże nie mogą być usunięte", -- HedgeEditor + ["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 + ["He doesn't know it but this device is a part of the anti-gravity device."] = "On tego nie wie, ale to urządzenie jest częścią urządzenia antygrawitacyjnego.", -- A_Space_Adventure:ice01 + ["He has captured the rest of the PAotH team and awaits to capture you!"] = "On już porwał resztę zespołu PSJ i teraz oczekuje, aż porwie ciebie!", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Heh, nie jest aż tak źle.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family --- ["Help me, Leaks!"] = "", -- A_Classic_Fairytale:journey --- ["Help me, please!!!"] = "", -- A_Classic_Fairytale:journey --- ["Help me, please!"] = "", -- A_Classic_Fairytale:journey --- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood --- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey --- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab --- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family --- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hero Team"] = "", -- User_Mission_-_The_Great_Escape --- ["He's so brave..."] = "", -- A_Classic_Fairytale:first_blood --- ["He won't be selling us out anymore!"] = "", -- A_Classic_Fairytale:backstab --- ["Hey, guys!"] = "", -- A_Classic_Fairytale:backstab --- ["Hey guys!"] = "", -- A_Classic_Fairytale:united --- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander --- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey --- ["Hint: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey --- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood - ["Hit Combo!"] = "Combo!", --- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy - ["Hmmm..."] = "Hmmmm...", --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal --- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood --- ["Hogminator"] = "", -- A_Classic_Fairytale:family --- ["Hogs in sight!"] = "", -- Continental_supplies --- ["HOLY SHYTE!"] = "", -- Mutant --- ["Homing Bee"] = "", -- Construction_Mode --- ["Honest Lee"] = "", -- A_Classic_Fairytale:enemy - ["Hooray!"] = "Hurraaa!", --- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family --- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey --- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon --- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united --- ["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 --- [" HP"] = "", -- Mutant + ["Height over time"] = "Wysokość według czasu", -- ClimbHome + ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "On jest bardzo twardym i zdeterminowanym jeżem. Na twoim miejscu byłbym bardzo ostrożny.", -- A_Space_Adventure:moon02 + ["Helena"] = "Helena", -- A_Space_Adventure:moon01 + ["Hell Army"] = "Armia Piekieł", -- portal + ["Hello again, %s!"] = "Witaj znowu, %s!", -- A_Classic_Fairytale:family + ["Help Disabled"] = "Pomoc wyłączona", -- HedgeEditor + ["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 + ["He moves like an eagle in the sky."] = "Porusza się on jak orzeł po niebie.", -- A_Classic_Fairytale:first_blood + ["He must be in the village already."] = "On musi już być w wiosce.", -- A_Classic_Fairytale:journey + ["HeneK"] = "HeneK", -- + ["Here, let me help you save her!"] = "Tutaj, daj mi pomóc ci ją uratować!", -- A_Classic_Fairytale:family + ["Here, let me help you!"] = "Tutaj, daj mi sobie pomóc!", -- A_Classic_Fairytale:backstab + ["Here...pick your weapon!"] = "Masz... wybierz swoją broń!", -- A_Classic_Fairytale:first_blood + ["Here! Take it!"] = "Masz! Weź to!", -- A_Space_Adventure:ice01 + ["Here we go!"] = "No to ruszamy!", -- A_Space_Adventure:moon01 + ["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 + ["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, 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! 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 + ["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 ---"] = "--- Wyżyna ---", -- Battalion + ["Hightime"] = "Najwyższa pora", -- A_Classic_Fairytale:first_blood + ["Hightower"] = "Wysowieża", -- + ["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: 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: Press [Esc] to review the mission texts."] = "Porada: Wciśnij [Esc], by zobaczyć teksty 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 ---"] = "--- Wskazówka ---", -- Battalion + ["Hint: you might want to stay out of sight and take all the crates...|"] = "Porada: Możesz chcieć pozostać poza widokiem i zabrać wszystkie skrzynie...|", -- A_Classic_Fairytale:journey + ["His arms are so strong!"] = "Jego ręce są tak silne!", -- A_Classic_Fairytale:first_blood + ["hits"] = "wskazówki", -- Basic_Training_-_Bazooka + ["H"] = "J", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 + ["Hmm … it's going slower than expected."] = "Hmm... to będzie wolniejsze, niż się spodziewałem.", -- A_Classic_Fairytale:queen + ["Hmmm...actually...I didn't either."] = "Hmmm... właściwie... ja również nie.", -- A_Classic_Fairytale:enemy + ["Hmmm..."] = "Hmmm...", + ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "Hmmm, będę musiał znaleźć jakiś sposób zepchnięcia go z tej powierzchni antyportalowej.", -- portal + ["Hmmm...it's a draw. How unfortunate!"] = "Hmmm... to remis. Jak niefortunnie!", -- A_Classic_Fairytale:enemy + ["Hmmm...perhaps a little more time will help."] = "Hmmm... być może więcej czasu pomoże.", -- A_Classic_Fairytale:first_blood + ["Hm ... Now I ran out of fuel."] = "Hm... teraz skończyło mi się paliwo.", -- A_Space_Adventure:cosmos + ["Hog 100"] = "Jeż 100", -- A_Space_Adventure:fruit03 + ["Hog 1"] = "Jeż 1", -- A_Space_Adventure:fruit03 + ["Hog 3x5"] = "Jeż 3x5", -- A_Space_Adventure:fruit03 + ["Hog 7+7"] = "Jeż 7+7", -- A_Space_Adventure:fruit03 + ["Hog decar"] = "Jeż decar", -- A_Space_Adventure:fruit03 + ["Hog dertien"] = "Jeż dertien", -- A_Space_Adventure:fruit03 + ["Hog D"] = "Jeż D", -- A_Space_Adventure:fruit03 + ["Hog EOF"] = "Jeż EOF", -- A_Space_Adventure:fruit03 + ["Hogera is definitely the last planet I saved!"] = "Jeżera jest definitywnie ostatnią planetą, którą uratowałem!", -- A_Space_Adventure:final + ["Hogera is safe!"] = "Jeżera jest bezpieczna!", -- A_Space_Adventure:final + ["Hog exi"] = "Jeż exi", -- A_Space_Adventure:fruit03 + ["Hog Hephaestus"] = "Jeż Hefajstos", -- A_Space_Adventure:fruit03 + ["Hog Identity Mode"] = "Tryb Tożsamości Jeża", -- HedgeEditor + ["HOG IDENTITY MODE"] = "TRYB TOŻSAMOŚCI JEŻA", -- HedgeEditor + ["Hog III"] = "Jeż III", -- A_Space_Adventure:fruit03 + ["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 + ["Holy shit!"] = "Jasna cholera!", -- Mutant + ["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 + ["Hopeless case"] = "Beznadziejny przypadek", -- User_Mission_-_RCPlane_Challenge + ["Hop on top of the next flower and advance to the left coast."] = "Wskocz na następny kwiatek i posuwaj się w stronę lewego wybrzeża.", -- A_Classic_Fairytale:journey + ["Horns"] = "Rogi", -- + ["Hostage Situation"] = "Zakładnicza sytuacja", -- A_Classic_Fairytale:family + ["How can I ever repay you for saving my life?"] = "Jak mogę ci się odpłacić za uratowanie mi życia?", -- A_Classic_Fairytale:journey + ["How come in a village full of warriors, it's up to me to save it?"] = "Jak to jest, że w wiosce pełnej wojowników, to do mnie należy uratowanie jej?", -- A_Classic_Fairytale:dragon + ["How could you betray us?"] = "Jak mogłeś nas zdradzić?", -- A_Classic_Fairytale:queen + ["How difficult would you like it to be?"] = "Jak trudne chciałbyś, żeby to było?", -- A_Classic_Fairytale:first_blood + ["HOW DO THEY KNOW WHERE WE ARE?"] = "SKĄD ONI WIEDZĄ, GDZIE JESTEŚMY?", -- A_Classic_Fairytale:united + ["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 + ["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 ["Hunter"] = "Strzelec", --- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab --- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood --- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow --- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy --- ["I can't believe what I'm hearing!"] = "", -- A_Classic_Fairytale:backstab --- ["I can't wait any more, I have to save myself!"] = "", -- A_Classic_Fairytale:shadow --- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family --- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey --- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope --- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab --- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab --- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood --- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab --- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united --- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow --- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey --- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow --- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow --- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow --- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon --- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow --- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow --- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab --- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow --- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood --- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab --- ["I just found out that they have captured your princess!"] = "", -- A_Classic_Fairytale:family --- ["I just wonder where Ramon and Spiky disappeared..."] = "", -- A_Classic_Fairytale:journey --- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow --- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood --- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon --- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab --- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood --- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy --- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family --- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family --- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family --- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united --- ["Impressive...you are still dry as the corpse of a hawk after a week in the desert..."] = "", -- A_Classic_Fairytale:first_blood --- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies --- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow --- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab --- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey --- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united --- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab --- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab --- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant + ["I ain't gonna sit around no more!"] = "Nie mam zamiaru dłużej siedzieć!", -- A_Classic_Fairytale:queen + ["I already said I'm sorry!"] = "Już powiedziałem, że przepraszam!", -- A_Classic_Fairytale:epil + ["I always suspected him!"] = "Zawsze go podejrzewałem!", -- A_Classic_Fairytale:epil + ["I am going to leave the kids play by themselves."] = "Zamierzam zostawić dzieci, by bawiły się same.", -- A_Classic_Fairytale:queen + ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "Nie jestem jeszcze gotowy na tę planetę. Powinienem odwiedzić ją, kiedy znajdę wszystkie inne części urządzenia.", -- A_Space_Adventure:cosmos + ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "Przepraszam, ale szukałem urządzenia, które może być schowane gdzieś tutaj.", -- A_Space_Adventure:fruit02 + ["I believe there's more of them."] = "Nie mogę uwierzyć, że jest ich więcej.", -- A_Classic_Fairytale:backstab + ["I cannot let you go any further! … burp …"] = "Nie mogę pozwolić ci podejść ani trochę bliżej! ...bek...", -- A_Classic_Fairytale:queen + ["I can see you have been training diligently."] = "Widzę, że pilnie trenowałeś.", -- A_Classic_Fairytale:first_blood + ["I can't believe how blind we were."] = "Nie mogę uwierzyć jacy byliśmy ślepi.", -- A_Classic_Fairytale:epil + ["I can't believe it worked!"] = "Nie mogę uwierzyć, że to zadziałało!", -- A_Classic_Fairytale:shadow + ["I can't believe this!"] = "Nie mogę w to uwierzyć!", -- A_Classic_Fairytale:enemy + ["I can't believe what I'm hearing!"] = "Nie mogę uwierzyć w to co słyszę!", -- A_Classic_Fairytale:backstab + ["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 + ["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 + ["Icy Land"] = "Lodowy Teren", -- HedgeEditor + ["I'd better get going myself."] = "Lepiej sam już pójdę.", -- A_Classic_Fairytale:journey + ["I didn't until about a month ago."] = "Nie robiłem, aż do jakoś zeszłego miesiąca.", -- A_Classic_Fairytale:enemy + ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "Nie obchodzi mnie to. To jest warte fortunę! Do widzenia, idioto!", -- A_Space_Adventure:fruit02 + ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "Nie wiem jak to zrobiłeś. Ale dobra robota!|Następny powinien być dla ciebie łatwy!", -- Basic_Training_-_Rope + ["I don't know if I can forget what you've done!"] = "Nie wiem, czy mogę zapomnieć co zrobiłeś!", -- A_Classic_Fairytale:epil + ["I don't know who I can trust anymore."] = "Nie wiem już komu mogę ufać.", -- A_Classic_Fairytale:epil + ["I don't like your tone! You're hurting me!"] = "Nie lubię twojego tonu! On mnie rani!", -- A_Classic_Fairytale:queen + ["I feel something...a place! They will arrive near the circles!"] = "Coś wyczuwam... miejsce! Oni przybędą niedaleko kół!", -- A_Classic_Fairytale:backstab + ["If only I had a way..."] = "Gdybym tylko miał wyjście...", -- A_Classic_Fairytale:backstab + ["If only I were given a chance to explain my being here..."] = "Gdybym tylko dostał szansę wytłumaczyć swoją obecność tutaj...", -- A_Classic_Fairytale:first_blood + ["I forgot that she's the daughter of the chief, too..."] = "Zapomniałem, że ona jest też córką szefa...", -- A_Classic_Fairytale:backstab + ["I found it! Hooray!"] = "Znalazłem to! Hurra!", -- A_Space_Adventure:desert01 + ["If some good old explosives were enough to save Hogera …"] = "Jeśli trochę starych dobrych ładunków wybuchowych by wystarczyło, aby uratować Jeżerę...", -- A_Space_Adventure:final + ["If they try coming here, they can have a taste of my delicious knuckles!"] = "Jeśli spróbują tu przyjść, posmakują moich kastetów!", -- A_Classic_Fairytale:united + ["If you agree to provide the information we need, you will be spared!"] = "Jeśli zgodzisz się zdradzić informacje, których potrzebujemy, zostaniesz oszczędzony!", -- A_Classic_Fairytale:shadow + ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "Jeśli uda ci się zdobyć tę skrzynię wystarczająco szybko, twoja ukochana \"księżniczka\" zostanie uwolniona.", -- A_Classic_Fairytale:journey + ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "Jednak jeśli zdecydujesz się nam pomóc, nie będziemy już musieli znaleźć nowego gubernatora dla wyspy.", -- A_Classic_Fairytale:shadow + ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "Jeśli utkniesz, użyj swojego Desert Eagle lub zrestartuj misję!|", -- A_Classic_Fairytale:journey + ["If you help us you can keep the device if you find it but we'll keep everything else."] = "Jeśli nam pomożesz, możesz zatrzymać urządzenie jeśli je znajdziesz, ale zatrzymay wszytko inne.", -- A_Space_Adventure:fruit02 + ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "Jeśli zranisz jeża, otrzymasz 35% zadanych obrażeń.", -- A_Space_Adventure:death02 + ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "Jeśli zabijesz jeża odpowiednią bronią, twoje zdrowie zostanie ustawione na 100.", -- A_Space_Adventure:death02 + ["If you know what I mean..."] = "Jeśli wiesz co mam na myśli...", -- A_Classic_Fairytale:shadow + ["If you say so..."] = "Jeśli tak mówisz...", -- A_Classic_Fairytale:shadow + ["If you skip a turn then the turn time left will be added to your next turn."] = "Jeśli pominiesz turę, pozostały czas zostanie dodany do twojej następnej tury.", -- A_Space_Adventure:fruit03 + ["If you wish to replay, there are other possible endings, too!"] = "Jeśli zechcesz zagrać ponownie, są również inne możliwe zakończenia!", -- A_Classic_Fairytale:epil + ["Igmund"] = "Igmund", -- User_Mission_-_Nobody_Laugh + ["I grew sick of the oppression! I broke free!"] = "Miałam dość opresji! Uwolniłam się!", -- A_Classic_Fairytale:queen + ["I guess I can't go far without fuel!"] = "Zdaje się, że nie mogę zajść daleko bez paliwa!", -- A_Space_Adventure:cosmos + ["I guess we lost him!"] = "Zdaje się, że go zgubiliśmy!", -- A_Space_Adventure:cosmos + ["I guess you'll have to kill them."] = "Zdaje się, że będziesz musiał ich zabić.", -- A_Classic_Fairytale:dragon + ["I have come to make you an offering..."] = "Przyszedłem, by ci coś zaoferować...", -- A_Classic_Fairytale:shadow + ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "Słyszałem, jak lokalne plemienia mówiły, że wiele lat temu jacyś naukowcy PSJ wyrzucali tu śmieci.", -- A_Space_Adventure:desert01 + ["I have more important things to do!"] = "Mam ważniejsze rzeczy do zrobienia!", -- A_Classic_Fairytale:queen + ["I have no idea where that mole disappeared...Can you see it?"] = "Nie mam pojęcia, gdzie ten kret zniknął. Ty go widzisz?", -- A_Classic_Fairytale:shadow + ["I have only 3 hogs available and they are all cadets."] = "Mam dostępne tylko 3 jeże i wszyscy są kadetami.", -- A_Space_Adventure:fruit01 + ["I have to follow that alien."] = "Muszę śledzić tego obcego.", -- A_Classic_Fairytale:backstab + ["I have to get back to the village!"] = "Muszę dostać się z powrotem do wioski!", -- A_Classic_Fairytale:shadow + ["I have to reach the surface as quickly as I can."] = "Muszę dotrzeć na powierzchnię tak szybko, jak mogę.", -- A_Space_Adventure:desert02 + ["I hope you are prepared for a small challenge, young one."] = "Mam nadzieję, że jesteś gotowy na małe wyzwanie, młodzieńcze.", -- A_Classic_Fairytale:first_blood + ["I just don't want to sink to your level."] = "Nie chcę zniżyć się do twojego poziomu.", -- A_Classic_Fairytale:backstab + ["I just forgot all checkpoints of incomplete missions."] = "Właśnie zapomniałem wszystkie punkty kontrolne niedokończonych misji.", -- A_Space_Adventure:cosmos + ["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 + ["I … like being with you, too."] = "Ja... również lubię z tobą być.", -- A_Classic_Fairytale:epil + ["I'll get him!"] = "Dopadnę go!", -- A_Space_Adventure:cosmos + ["I'll hold them off while you return to the village!"] = "Zatrzymam ich, a ty wróć do wioski!", -- A_Classic_Fairytale:shadow + ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "Przekażę ci wszystko, co o nim wiem, jeśli uda ci się złapać mnie 3 razy.", -- A_Space_Adventure:moon02 + ["I'll make good use of it."] = "Zdrobię z tego pożytek.", -- A_Space_Adventure:cosmos + ["I'll protect you!"] = "Będę cię chronił!", -- A_Classic_Fairytale:epil + ["I love Dense Cloud now!"] = "Teraz kocham Gęstą Chmurę!", -- A_Classic_Fairytale:epil + ["I love you."] = "Kocham cię.", -- A_Classic_Fairytale:epil + ["I'm afraid I can't let you proceed!"] = "Obawiam się, że nie mogę pozwolić ci przejść.", -- A_Classic_Fairytale:queen + ["I'm afraid we cannot afford that."] = "Obawiam się, że nie możemy sobie na to pozwolić.", -- A_Classic_Fairytale:queen + ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "Wyobraź sobie, że te cele to wilki, które zabiły twoich rodziców! Wyzwól na nich swój gniew!", -- A_Classic_Fairytale:first_blood + ["I'm...alive? How? Why?"] = "Ja... żyję? Jak? Dlaczego?", -- A_Classic_Fairytale:backstab + ["I'm a ninja."] = "Jestem ninja.", -- A_Classic_Fairytale:dragon + ["I marked the place of their arrival. You're welcome!"] = "Zaznaczyłem miejsce ich przybycia. Nie ma za co!", -- A_Classic_Fairytale:backstab + ["I may lost this battle, but I haven't lost the war yet!"] = "Może i przegrałem tę bitwę, ale jeszcze nie przegrałem wojny!", -- A_Space_Adventure:moon01 + ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "Jestem pewien, że to nieporozumienie, jeżowi koledzy!", -- A_Classic_Fairytale:first_blood + ["I mean, none of you ceased to live."] = "Znaczy, nikt z was nie przestał żyć.", -- A_Classic_Fairytale:enemy + ["I'm getting old for this!"] = "Robię się na to za stary.", -- A_Classic_Fairytale:family + ["I'm getting thirsty..."] = "Chce mi się pić...", -- A_Classic_Fairytale:family + ["I'm glad this is over!"] = "Cieszę się, że to koniec!", -- A_Classic_Fairytale:epil + ["I'm here to help you rescue her."] = "Jestem tu pomóc ci ją uratować.", -- A_Classic_Fairytale:family + ["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 + ["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 + ["I'm so glad this is finally over!"] = "Tak się cieszę, że to wreszcie koniec!", -- A_Space_Adventure:final + ["I'm so scared!"] = "Tak się boję!", -- A_Classic_Fairytale:united + ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "Nadal mam mało jeży. Jeśli się nie boisz, przydałyby się dodatkowe dłonie do pomocy.", -- A_Space_Adventure:fruit02 + ["I'm still with the aliens."] = "Nadal jestem z obcymi.", -- A_Classic_Fairytale:queen + ["I'm terribly sorry!"] = "Tak mocno przepraszam!", -- A_Classic_Fairytale:queen + ["I'm the spy! I've been giving you out!"] = "Jestem szpiegiem! Wydawałam was!", -- A_Classic_Fairytale:queen + ["In am also entrusting you with some rope."] = "Powierzam ci również trochę liny.", -- A_Space_Adventure:cosmos + ["In case you haven't noticed, I'm a woman, too!"] = "W razie, gdybyś nie zauważył, też jestem kobietą!", -- A_Classic_Fairytale:queen + ["Incredible..."] = "Niesamowite...", -- A_Classic_Fairytale:shadow + ["Indestructible Girder: [2]"] = "Niezniszczalna Belka: [2]", -- HedgeEditor + ["Indestructible Land: [2]"] = "Niezniszczalny Teren: [2]", -- HedgeEditor + ["Indestructible Land"] = "Niezniszczalny Teren", -- HedgeEditor + ["In each round, the worst hedgehog of the round is eliminated."] = "W każdej rundzie, najgorszy jeż rundy jest eliminowany.", -- TrophyRace + ["I need to find the others!"] = "Muszę odnaleźć innych!", -- A_Classic_Fairytale:backstab + ["I need to get to the other side of this island, fast!"] = "Muszę dostać się na drugą stronę tej wyspy, szybko!", -- A_Classic_Fairytale:journey + ["I need to move the tribe!"] = "Muszę przemieścić plemię!", -- A_Classic_Fairytale:united + ["I need to prevent their arrival!"] = "Muszę zapobiec ich przybyciu!", -- A_Classic_Fairytale:backstab + ["I need to warn the others."] = "Muszę ostrzec innych.", -- A_Classic_Fairytale:backstab + ["In fact, you are the only one that's been acting strangely."] = "Tak naprawdę, jesteś jedynym, który dziwnie się zachowywał.", -- A_Classic_Fairytale:backstab + ["Initiate escape wish!"] = "Inicjalizuj życzenie ucieczki!", -- A_Classic_Fairytale:queen + ["In order to get to the other side, you need to get rid of the crates first."] = "Żeby dostać się na drugą stronę, musisz pozbyć się najpierw skrzyń.", -- A_Classic_Fairytale:dragon + ["Insanity!"] = "Szaleństwo!", -- Mutant + ["Inside %d"] = "Wewnątrz %d", -- WxW + ["Inside"] = "Wewnątrz", -- WxW + ["Instructions"] = "Instrukcje", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Instruktor", --- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy --- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab --- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "najeźdźców zniszczonych", --- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode --- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow --- ["I see..."] = "", -- A_Classic_Fairytale:shadow --- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood --- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood --- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab --- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab --- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon --- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon --- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon --- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab --- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow --- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy --- ["It is time to practice your fighting skills."] = "", -- A_Classic_Fairytale:first_blood --- ["It must be a childhood trauma..."] = "", -- A_Classic_Fairytale:family --- ["It must be the aliens!"] = "", -- A_Classic_Fairytale:backstab --- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab --- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy --- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab - ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Jak to dobrze, że Nagła Śmierć jest dopiero za 99 tur...", --- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon --- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family --- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow --- ["It's over..."] = "", -- A_Classic_Fairytale:shadow --- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey --- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy --- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow --- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab --- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united --- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey --- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon --- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow --- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family --- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey --- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon --- ["John"] = "", -- A_Classic_Fairytale:journey --- ["Judas"] = "", -- A_Classic_Fairytale:backstab - ["Jumping is disabled"] = "Skakanie jest niemożliwe", --- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy --- ["Just on a walk."] = "", -- A_Classic_Fairytale:united --- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family --- ["Kamikaze"] = "", -- Construction_Mode --- ["Kamikaze Expert!"] = "", + ["Insufficient Power"] = "Niewystarczająca Moc", -- Construction_Mode + ["Interesting idea, haha!"] = "Ciekawy pomysł, haha!", -- A_Classic_Fairytale:enemy + ["Interesting! Last time you said you killed a cannibal!"] = "Ciekawe! Ostanim razem mówiłeś, że zabiłeś kanibala!", -- A_Classic_Fairytale:backstab + ["In the Ice Planet Flying Saucer Stadium ..."] = "Na Stadionie Latających Talerzy Lodowej Planety...", -- A_Space_Adventure:ice02 + ["In the meantime, take these and return to your \"friend\"!"] = "W międzyczasie, weź je i wróć do swojego \"przyjaciela\"!", -- A_Classic_Fairytale:shadow + ["In this accident, Professor Hogevil lost all his spines on his head!"] = "W wypadku tym, Profesor Jeżozło stracił wszystkie kolce na swojej głowie!", -- A_Space_Adventure:moon02 + ["In this mission you get %d%% fuel."] = "W tej misji dostajesz %d%% paliwa.", -- User_Mission_-_Diver + ["In this mission you have infinite time."] = "W tej misji masz nieskończony czas.", -- portal + ["Invalid Placement"] = "Nieprawidłowe Ustawienie", -- Construction_Mode + ["Invasion"] = "Inwazja", -- A_Classic_Fairytale:united + ["In your best (and only) flight you took out %d crates with one RC plane!"] = "W swoim najlepszym (i jedynym) locie, usunąłeś %d skrzyń jednym samolotem!", -- User_Mission_-_RCPlane_Challenge + ["In your best flight you took out %d crates with one RC plane."] = "W swoim najlepszym locie, usunąłeś %d skrzyń jednym samolotem.", -- User_Mission_-_RCPlane_Challenge + ["I regret to end your little odyssey."] = "Z przykrością kończę twoją małą wędrówkę.", -- A_Classic_Fairytale:queen + ["I saw it with my own eyes!"] = "Widziałem to na własne oczy!", -- A_Classic_Fairytale:shadow + ["I see..."] = "Widzę...", -- A_Classic_Fairytale:shadow + ["I see you already took care of your enemies."] = "Widzę, że już zająłeś się swoimi wrogami.", -- A_Classic_Fairytale:dragon + ["I see you have already taken the leap of faith."] = "Widzę, że zrobiłeś już skok wiary.", -- A_Classic_Fairytale:first_blood + ["I see you would like his punishment to be more...personal..."] = "Widzę, że chciałbyś, żeby jego kara była bardziej... osobista...", -- A_Classic_Fairytale:first_blood + ["I sense another wave of cannibals heading my way!"] = "Wyczuwam kolejną falę kanibali idących w moją stronę!", -- A_Classic_Fairytale:backstab + ["I sense another wave of cannibals heading our way!"] = "Wyczuwam kolejną falę kanibali idących w naszą stronę!", -- A_Classic_Fairytale:backstab + ["I should get myself a portal device, maybe this crate has one."] = "Powinienem sobie zdobyć urządzenie portalowe. Może ta skrzynia ma takie.", -- portal + ["I should go now, goodbye!"] = "Muszę już iść, do widzenia!", -- A_Space_Adventure:moon02 + ["I shouldn't have drunk that last pint."] = "Nie powinienem był wypić tego ostatniego piwa.", -- A_Classic_Fairytale:dragon + ["%i s"] = "%i s", -- Gravity + ["Is this place in my head?"] = "Czy to miejsce jest w mojej głowie?", -- A_Classic_Fairytale:dragon + ["I still can't believe he sold us out like that."] = "Nie mogę uwierzyć, że tak po prostu nas wydał.", -- A_Classic_Fairytale:epil + ["I still can't believe you forgave her!"] = "Nie mogę uwierzyć, że jej wybaczyłeś!", -- A_Classic_Fairytale:epil + ["I still have to get rid of the crates."] = "Nadal muszę pozbyć się skrzyń.", -- A_Classic_Fairytale:dragon + ["Itami"] = "Itami", -- + ["It doesn't matter. I won't let that alien hurt my daughter!"] = "To nie ma znaczenia. Nie pozwolę temu obcemu skrzywdzić mojej córki!", -- A_Classic_Fairytale:dragon + ["I think I love you!"] = "Myślę, że cię kocham!", -- A_Classic_Fairytale:epil + ["I think we are safe here."] = "Myślę, że jesteśmy tu bezpieczni.", -- A_Classic_Fairytale:backstab + ["I thought their shaman died when he tried our medicine!"] = "Myślałem, że ich szaman umarł, gdy spróbował naszego lekarstwa!", -- A_Classic_Fairytale:shadow + ["It is called 'Hogs of Steel'."] = "Nazywa się 'Jeż ze Stali'.", -- A_Classic_Fairytale:enemy + ["It is time to practice your fighting skills."] = "Już czas, byś poćwiczył swoje zdolności bojowe.", -- A_Classic_Fairytale:first_blood + ["It must be a childhood trauma..."] = "To musi być trauma z dzieciństwa...", -- A_Classic_Fairytale:family + ["It must be the aliens' deed."] = "To pewnie robota obcych.", -- A_Classic_Fairytale:backstab + ["It must be the aliens!"] = "To pewnie obcy!", -- A_Classic_Fairytale:backstab + ["It must be the cyborgs again!"] = "To pewnie znowu te cyborgi!", -- A_Classic_Fairytale:enemy + ["I told you, I just found them."] = "Mówię ci, właśnie je znalazłem.", -- A_Classic_Fairytale:backstab + ["It only works in teleportation nodes of your own clan."] = "To działa tylko w węzłach teleportacyjnych twojego klanu.", -- Construction_Mode + ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Jak to dobrze, że NAGŁA ŚMIERĆ jest dopiero za 99 tur...", + ["It's all about the right carrots, you know."] = "Wszystko zależy od właściwej marchewki, no wiesz.", -- A_Classic_Fairytale:epil + ["It's always up to women to clear up the mess men created!"] = "Zawsze należało do kobiet, by posprzątać bałagan pozostawiony przez mężczyzn!", -- A_Classic_Fairytale:dragon + ["It's amazing how quickly our lives can change."] = "To niesamowite, jak szybko nasze życia potrafią się zmienić.", -- A_Classic_Fairytale:epil + ["It's an ancient ritual of theirs."] = "To ich starożytny rytuał.", -- A_Classic_Fairytale:queen + ["IT'S A SERIOUS MEDICAL CONDITION!"] = "TO POWAŻNE SCHORZENIE!", -- A_Classic_Fairytale:queen + ["It's a shame, I forgot how to do that!"] = "Ale wstyd, zapomniałem jak to się robi!", -- A_Classic_Fairytale:family + ["It's a shame, really!"] = "To wstyd, naprawdę!", -- A_Classic_Fairytale:queen + ["It seems that Professor Hogevil has prepared for your arrival!"] = "Zdaje się, że Profesor Jeżozło przygotował się na twoje przybycie!", -- A_Space_Adventure:moon01 + ["It's empty!"] = "Jest pusta!", -- Battalion + ["It's impossible to communicate with the spirits without a shaman."] = "Niemożliwa jest komunikacja z duszami, bez szamana.", -- A_Classic_Fairytale:shadow + ["It's not that easy, so listen carefully:"] = "To nie takie łatwe, więc słuchaj uważnie:", -- Basic_Training_-_Flying_Saucer + ["It's over..."] = "To koniec!", -- A_Classic_Fairytale:shadow + ["It's precious to me!"] = "Jest dla mnie cenny!", -- A_Classic_Fairytale:queen + ["It's time you learned that your actions have consequences!"] = "To czas, byś się nauczył, że twoje akcje mają konsekwencje!", -- A_Classic_Fairytale:journey + ["It's worth more than wood!"] = "Jest warty więcej niż drewno!", -- A_Classic_Fairytale:enemy + ["It's your fault you're there!"] = "Jesteś tu ze swojej winy!", -- A_Classic_Fairytale:epil + ["It wants our brains!"] = "To chce naszych mózgów.", -- A_Classic_Fairytale:shadow + ["It was all a trick?!"] = "To wszystko było sztuczką?", -- A_Classic_Fairytale:queen + ["It was all just bad luck!"] = "To wszystko był tylko pech!", -- ClimbHome + ["It was completely useless!"] = "To było kompletnie bezużyteczne!", -- A_Space_Adventure:final + ["It was fun to watch, though."] = "Zabawnie się to jednak oglądało.", -- A_Classic_Fairytale:queen + ["It was fun to watch."] = "Zabawnie się to oglądało.", -- A_Classic_Fairytale:queen + ["It was not a dream, unwise one!"] = "To nie był sen, nierozsądny!", -- A_Classic_Fairytale:backstab + ["It wasn't her fault!"] = "To nie była jej wina!", -- A_Classic_Fairytale:epil + ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "Byłoby mądrzej ukraść statek kosmiczny, kiedy strażnicy PSJ mają przerwę!", -- A_Space_Adventure:cosmos + ["Ivan"] = "Iwan", -- + ["I've made it! Yeah!"] = "Udało mi się! Tak!", -- A_Space_Adventure:moon01 + ["I've seen this before. They just appear out of thin air."] = "Widziałem to już wcześniej. Oni pojawiają się znikąd.", -- A_Classic_Fairytale:united + ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "Myślałem, że najlepszym sposobem, by zdobyć urządzenie, jest pozwolić ci zebrać większość części dla mnie!", -- A_Space_Adventure:death01 + ["I want to play a game..."] = "Zagrajmy w grę...", -- A_Classic_Fairytale:journey + ["I want to see how it handles this!"] = "Chcę zobaczyć jak sobie z tym poradzi!", -- A_Classic_Fairytale:backstab + ["I was heading home, you see!"] = "Szedłem w stronę domu, widzisz!", -- A_Classic_Fairytale:queen + ["I was so scared."] = "Tak się bałam.", -- A_Classic_Fairytale:epil + ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "Powiedziano mi, że jako dowódca królewskiej straży, nikt nie zna tego świata lepiej od ciebie!", -- A_Space_Adventure:fruit01 + ["I will never hand you the parts!"] = "Nigdy nie oddam ci części!", -- A_Space_Adventure:death01 + ["I wish to help you, %s!"] = "Chcę ci pomóc, %s!", -- A_Classic_Fairytale:dragon + ["I wonder where Dense Cloud is..."] = "Zastanawiam się, gdzie jest Gęsta Chmura...", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow + ["I wonder why I'm so angry all the time..."] = "Zastanawiam się, dlaczego jestem taki zły cały czas...", -- A_Classic_Fairytale:family + ["I won't let you kill her!"] = "Nie pozwolę ci jej zabić!", -- A_Classic_Fairytale:journey + ["I won't let you kill the tribe!"] = "Nie pozwolę ci zabić plemienia!", -- A_Classic_Fairytale:queen + ["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."] = "Z chęcią bym ci pomógł, jeśli wygralibyśmy tę bitwę, ale w tych okolicznościach, pomogę ci tylko jeśli zawalczysz po naszej stronie.", -- A_Space_Adventure:fruit01 + ["Jack"] = "Jacek", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Jason"] = "Jason", -- + ["Jeremiah"] = "Jeremiasz", -- A_Classic_Fairytale:dragon + ["Jetpack"] = "Plecak odrzutowy", -- Big_Armory + ["Jigglypuff"] = "Jigglypuff", -- + ["Jim Morgan"] = "Jim Morgan", -- + ["Jimmy"] = "Dżimi", -- + ["Jingo"] = "Dżingo", -- + ["Joe"] = "Dżoł", -- A_Space_Adventure:moon01 + ["John"] = "Dżon", -- A_Classic_Fairytale:journey + ["John Snow"] = "John Snow", -- A_Space_Adventure:ice01 + ["Jolly Roger"] = "Jolly Roger", -- + ["Jones"] = "Dżons", -- + ["Judas"] = "Judasz", -- A_Classic_Fairytale:backstab + ["Juicy"] = "Soczysty", -- + ["Jumping is disabled"] = "Skakanie jest wyłączone", + ["Just kidding, none of you have died!"] = "Tylko żartuję, nikt z was nie umarł.", -- A_Classic_Fairytale:enemy + ["Just look at Leaks, may he rest in peace!"] = "Spójrz tylko na Przecieka, niech spoczywa w pokoju.", -- A_Classic_Fairytale:queen + ["Just on a walk."] = "Tylko na spacer.", -- A_Classic_Fairytale:united + ["Just wait till I get my hands on that trauma! ARGH!"] = "Tylko czekaj, aż dorwę się do tej traumy! ARGH!", -- A_Classic_Fairytale:family + ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "Kabum! Hahahaha! A masz, głupi meteorycie!", -- A_Space_Adventure:final + ["Kaboom!"] = "Ka-bum!", -- Basic_Training_-_Flying_Saucer + ["Kamikaze Expert! +15 points!"] = "Ekspert kamikaze! +15 punktów!", -- Space_Invasion + ["Kamikaze"] = "Kamikaze", -- Construction_Mode ["Keep it up!"] = "Tak trzymaj!", --- ["Kerguelen"] = "", -- Continental_supplies - ["Killing spree!"] = "Masakra!", --- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood - ["KILLS"] = "Zabicia", --- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon --- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode + ["Ken"] = "Ken", -- + ["Kenshi"] = "Kenshi", -- + ["Kerguelen"] = "Kerguelen", -- Continental_supplies + ["key."] = "klucz.", -- Continental_supplies + ["Kill all enemy hedgehogs in a single turn."] = "Zabij wszystkie wrogie jeże w jednej turze.", -- Big_Armory + ["Kill him or skip your turn."] = "Zabij go lub pomiń swoją turę.", -- A_Classic_Fairytale:backstab + ["Killing spree!"] = "Szaleństwo zabijania!", + ["Killing the specialists"] = "Zabijanie specjalistów", -- A_Space_Adventure:death02 + ["KILL IT!"] = "ZABIJ TO!", -- A_Classic_Fairytale:first_blood + ["Kills: %d"] = "Zabójstwa: %d", -- Space_Invasion + ["Kill the aliens!"] = "Zabij obcych!", -- A_Classic_Fairytale:dragon + ["Kill the cannibal!"] = "Zabij kanibala!", -- A_Classic_Fairytale:first_blood + ["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 + ["Knight"] = "Rycerz", -- Battalion + ["Knives"] = "Noże", -- + ["Knockball"] = "Stukany", -- Knockball + ["Knockball weapon"] = "Broń stukanego", -- Knockball + ["Knock off the enemies from the left-most place of the map!"] = "Zrzuć wrogów z lewej części mapy!", -- A_Space_Adventure:fruit01 + ["koda"] = "koda", -- + ["Kostya"] = "Kostja", -- + ["Lady Mango"] = "Pani Mango", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 + ["LandFlag Modification Mode"] = "Tryb Modyfikacji Flag Terenu", -- HedgeEditor + ["Land mines explode instantly."] = "Miny wybuchają natychmiast.", -- User_Mission_-_Teamwork_2 + ["Lassard"] = "Draniówa", -- + ["Last Resort: Having less than 25% base health gives kamikaze"] = "Ostatnia Deska Ratunku: Posiadanie mniej niż 25% bazowego zdrowia daje kamikaze", -- Battalion ["Last Target!"] = "Ostatni cel!", --- ["Leader"] = "", -- A_Classic_Fairytale:enemy --- ["Leaderbot"] = "", -- A_Classic_Fairytale:queen --- ["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 --- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey --- ["Led Heart"] = "", -- A_Classic_Fairytale:queen --- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "[Lewy Shift]", --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies --- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey --- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey --- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow --- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey --- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab --- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab --- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab --- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode + ["Last wave in 3 turns"] = "Ostatnia fala za 3 tury", -- A_Space_Adventure:fruit01 + ["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 + ["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 + ["Leaks A Lot"] = "Spory Przeciek", -- 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 + ["Led Heart"] = "Prowadzące Serce", -- A_Classic_Fairytale:queen + ["Lee"] = "Li", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Left and right"] = "Lewo i prawo", -- WxW + ["Left, right and roof"] = "Lewo, prawo i sufit", -- WxW + ["[Left], [Right]: Change between identities."] = "[Lewo], [Prawo]: Zmień między tożsamościami.", -- HedgeEditor + ["[Left], [Right]: Change health value."] = "[Lewo], [Prawo]: Zmień ilość zdrowia.", -- HedgeEditor + ["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 + ["Legs"] = "Nogi", -- + ["Less tools, more fun"] = "Mniej narzędzi, więcej zabawy", -- Battalion + ["Lestat"] = "Lestat", -- portal + ["Let a continent provide your weapons!"] = "Daj kontynentowi zapewnić ci twoje bronie!", -- Continental_supplies + ["Let me test your skills a little, will you?"] = "Pozwól mi sprawdzić trochę twoje zdolności, co?", -- A_Classic_Fairytale:journey + ["Let's go home!"] = "Wracajmy do domu!", -- A_Classic_Fairytale:journey + ["Let's go, %s!"] = "Chodźmy, %s!", -- WxW + ["Let's go!"] = "Zaczynajmy!", -- A_Space_Adventure:moon02 + ["Let's head back to the village!"] = "Udajmy się z powrotem do wioski!", -- A_Classic_Fairytale:shadow + ["Let's see what your comrade does now!"] = "Zobaczmy, co twój towarzysz teraz robi!", -- A_Classic_Fairytale:journey + ["Let's show those cannibals what we're made of!"] = "Pokażmy kanibalom z czego jesteśmy zrobieni!", -- A_Classic_Fairytale:backstab + ["Let them have a taste of my fury!"] = "Dajmy im posmakować mojej furii!", -- A_Classic_Fairytale:backstab + ["Let us help, too!"] = "Pozwól nam również pomóc!", -- A_Classic_Fairytale:backstab + ["Level 1 clear!"] = "Poziom 1 ukończony!", -- A_Space_Adventure:desert03 + ["Level 2 clear!"] = "Poziom 2 ukończony!", -- A_Space_Adventure:desert03 + ["Level Data Saved!"] = "Wczytano dane poziomu!", -- HedgeEditor + ["Lightbender"] = "Władca Światła", -- + ["Light Cannfantry"] = "Lekka Kanibaleria", -- A_Classic_Fairytale:united + ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "Słuchaj uważnie! Przywódca bandytów, Tanta, znalazł ostatnio bardzo dziwne urządzenie.", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Słuchaj mnie, gnido!", --- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow - ["Lively Lifeguard"] = "Ratownik!", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- Continental_supplies --- ["Lonely Hog"] = "", -- ClimbHome --- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy --- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant --- ["Made it!"] = "", -- ClimbHome --- ["- Massive weapon bonus on first turn"] = "", -- Continental_supplies --- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab --- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant --- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab --- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy --- ["Mine Deployer"] = "", - ["Mine Eater!"] = "Pożeracz min!", --- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Czas detonacji min:", --- ["Mine Strike"] = "", -- Construction_Mode + ["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 + ["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 Hog"] = "Samotny Jeż", -- ClimbHome + ["Long Live The Queen"] = "Niech żyje królowa", -- A_Classic_Fairytale:queen + ["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 + ["Loon"] = "Gbur", -- The_Specialists + ["Loopy"] = "Wariat", -- + ["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 + ["Lt. Luke"] = "Pułkownik Łukasz", -- + ["Lucifer"] = "Lucyfer", -- portal + ["Luck: %d%% (modifier for crates)"] = "Szczęście: %d%% (modyfikator do skrzyń)", -- Battalion + ["Luckily, I've managed to snatch some of them."] = "Szczęśliwie, udało mi się uszczknąć parę z nich.", -- A_Classic_Fairytale:united + ["Ludicrous kill!"] = "Niedorzeczne zabójstwo!", -- Mutant + ["Lugia"] = "Lugia", -- + ["Luigi"] = "Luigi", -- + ["Made it!"] = "Udało się!", -- ClimbHome + ["Mahoney"] = "Mahoney", -- + ["Make fun of me when I fart …"] = "Śmiać się ze mnie, gdy pierdnę...", -- A_Classic_Fairytale:queen + ["Manual: https://hedgewars.org/hedgeeditor"] = "Instrukcja: https://hedgewars.org/hedgeeditor", -- HedgeEditor + ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "Wiele dawno zapomnianych rzeczy może być znalezione w tych samych tunelach, które mamy właśnie odkrywać!", -- A_Space_Adventure:fruit02 + ["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 + ["Maybe you should try an easier map next time."] = "Może następnym razem powinieneś spróbować łatwiejszej mapy.", -- Racer + ["Maybe you should try an easier TechRacer map."] = "Może powinieneś spróbować łatwiejszej mapy TechWyścigu.", -- TechRacer + ["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 + ["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 Deployer selected!"] = "Rozmieszczacz Min wybrany!", -- Tumbler + ["Mine Eater"] = "Pożeracz Min", -- Tumbler + ["Mine Placement Mode"] = "Tryb Ustawiania Min", -- Construction_Mode + ["MINE PLACEMENT MODE"] = "TRYB USTAWIANIA MIN", -- HedgeEditor + ["Mines explode after %d s."] = "Miny wybuchają po %d s.", -- Mutant + ["Mines time: 0 seconds"] = "Czas min: 0 sekund", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 + ["Mines time: 1.5 seconds"] = "Czas min: 1.5 sekundy", -- A_Space_Adventure:death01 + ["Mines time: 1 second"] = "Czas min: 1 sekunda", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 + ["Mines time: 3 seconds"] = "Czas min: 3 sekundy", -- A_Classic_Fairytale:journey + ["Mines time: 5 seconds"] = "Czas min: 5 sekund", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey + ["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 lost!"] = "Misja stracona!", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "MISJA POWIODŁA SIĘ", - ["MISSION SUCCESS"] = "MISJA ZAKOŃCZONA SUKCESEM", --- ["Molotov Cocktail"] = "", -- Construction_Mode --- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant --- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 + ["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 + ["Mixed"] = "Mieszane", -- WxW + ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "Tryby: Aktywuj tryb \"highland\", \"king\" lub \"points\" dodając mode=|do parametrów skryptu", -- Battalion + ["Modifiers: Unlimited ammo, per-hog ammo"] = "Modyfikatory: Nieskończona amunicja, amunicja na jeża", -- Battalion + ["Modifiers: Unlimited ammo, shared clan ammo"] = "Modyfikatory: Nieskończona amunicja, amunicja klanowa", -- Battalion + ["Modify Sprite under Cursor: [Left Click]"] = "Modyfikuj Grafikę pod Kursorem: [Lewy klik]", -- HedgeEditor + ["Molly"] = "Moli", -- + ["Molotov"] = "Koktajl Mołotowa", -- Continental_supplies + ["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 + ["Most of the time you'll be able to use the freezer only."] = "Przez większość czasu będziesz mógł użyć tylko zamrażarki.", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Poruszanie się: [Góra], [Dół], [Lewo], [Prawo]", --- ["Mudball"] = "", -- Construction_Mode - ["Multi-shot!"] = "Wielokrotny strzał", --- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant --- ["Mutant"] = "", -- Mutant --- ["Nade Boy"] = "", -- Basic_Training_-_Grenade --- ["Name"] = "", -- A_Classic_Fairytale:queen + ["Mr Mango"] = "Pan Mango", -- A_Space_Adventure:fruit01 + ["Mudkip"] = "Mudkip", -- + ["Multi-shot! +15 points!"] = "Mutli-strzał! +15 punktów!", -- Space_Invasion + ["Muriel"] = "Miuriel", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Muscle Dissolver"] = "Rozpuszczacz Mięśni", -- A_Classic_Fairytale:shadow + ["Mushroom Kingdom"] = "Grzybowe Królestwo", -- + ["Mutant"] = "Mutant", -- Mutant + ["My flying saucer stopped working!"] = "Mój latający talerz przestał działać!", -- A_Space_Adventure:ice01 + ["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"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:queen --- ["Napalm"] = "", -- Construction_Mode --- ["Napalm rocket: [Fire a bomb with napalm!]"] = "", -- Continental_supplies --- ["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 - ["New Barrels Per Turn"] = "Ilość beczek dodanych co turę", - ["NEW CLAN RECORD: "] = "NOWY REKORD ZESPOŁU: ", + ["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 + ["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 + ["nemo"] = "nemo", -- + ["Neutralize your enemies and be careful!"] = "Zneutralizuj swoich wrogów i bądź ostrożny!", -- A_Space_Adventure:moon01 + ["New barrels per turn: %d"] = "Nowe beczki na turę: %d", -- Tumbler + ["New clan record: %.1fs"] = "Nowy rekord klanu: %.1fs", -- Racer, TechRacer ["NEW fastest lap: "] = "NOWE najszybsze okrążenie: ", - ["New Mines Per Turn"] = "Ilość min dodanych co turę", - ["NEW RACE RECORD: "] = "NOWY REKORD WYŚCIGU: ", - ["Newton's Hammock"] = "Hamak Newtona", --- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon --- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy --- ["Nilarian"] = "", -- A_Classic_Fairytale:queen --- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh --- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow --- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey --- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey --- ["NomNom"] = "", -- A_Classic_Fairytale:united --- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow --- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey --- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant --- ["North America"] = "", -- Continental_supplies - ["Not all hogs are born equal."] = "Nie wszystkie jeże rodzą się równe.", -- Highlander + ["New mines per turn: %d"] = "Nowe miny na turę: %d", -- Tumbler + ["New race record: %.1fs"] = "Nowy rekord wyścigu: %.1fs", -- Racer, TechRacer + ["Newton and the Hammock"] = "Niuton i Hamak", -- User_Mission_-_Newton_and_the_Hammock + ["Next target is ready!"] = "Następny cel jest gotowy!", -- Basic_Training_-_Flying_Saucer + ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "Następnym razem grając w \"Poszukiwanie w kurzu\", będziesz miał dostępny radiowy samolocik.", -- A_Space_Adventure:desert03 + ["Next wave in 3 turns"] = "Następna fala za 3 tury", -- A_Space_Adventure:fruit01 + ["Nicely done, meatbags!"] = "Ładnie zrobione, mięsne worki!", -- A_Classic_Fairytale:enemy + ["Nice!"] = "Nieźle!", -- A_Space_Adventure:cosmos + ["Nice! Now hurry and get down! You have to rescue my friends!"] = "Nieźle! Teraz pośpiesz się i tu zejdź! Musisz uratować moich przyjaciół!", -- A_Space_Adventure:moon01 + ["Nice, then I should get the part as soon as possible!"] = "Nieźle, więc powinienem zabrać tę część tak szybko, jak to możliwe!", -- A_Space_Adventure:ice01 + ["Nice work!"] = "Ładna robota!", -- A_Classic_Fairytale:enemy + ["Nice work, meatbags!"] = "Ładna robota, worki na mięso!", -- A_Classic_Fairytale:queen + ["Nice work, %s!"] = "Ładna robota, %s!", -- A_Classic_Fairytale:dragon + ["Nilarian"] = "Nilarianin", -- A_Classic_Fairytale:queen + ["Ninja"] = "Ninja", -- Battalion, HedgeEditor, The_Specialists + ["Ninpo"] = "Ninpo", -- + ["Nobody Laugh"] = "Nikt się nie śmieje", -- User_Mission_-_Nobody_Laugh + ["Nobody managed to finish the race. What a shame!"] = "Nikomu nie udało się ukończyć wyścigu. Co za wstyd!", -- Racer, TechRacer + ["Nobody takes walks every day!"] = "Nikt nie chadza na spacery każdego dnia!", -- A_Classic_Fairytale:epil + ["No, I am afraid I had to travel light."] = "Nie, obawiam się, że musiałem podróżować bez bagażu.", -- A_Space_Adventure:moon01 + ["No, I came back to help you out..."] = "Nie, wróciłem, by ci pomóc...", -- A_Classic_Fairytale:shadow + ["No...I wonder where they disappeared?!"] = "Nie... ciekawe, gdzie oni zniknęli?!", -- A_Classic_Fairytale:journey + ["Nom-Nom"] = "Nom-Nom", -- A_Classic_Fairytale:journey + ["NomNom"] = "NomNom", -- A_Classic_Fairytale:united + ["Noo, Thanta has to stay alive!"] = "Niee, Tanta musi zostać przy życiu!", -- A_Space_Adventure:ice01 + ["Nope. It was one fast mole, that's for sure."] = "Nie. To był jeden szybki kret, to na pewno.", -- A_Classic_Fairytale:shadow + ["No! Please, help me!"] = "Nie! Proszę, pomóż mi!", -- A_Classic_Fairytale:journey + ["No problem, Captain!"] = "Nie ma sprawy, Kapitanie!", -- A_Space_Adventure:fruit01 + ["No problem, I would do anything for H!"] = "Nie ma sprawy, zrobiłbym wszystko dla J!", -- A_Space_Adventure:desert01 + ["No radar pings left!"] = "Brak pozostałych sygnałów radaru!", -- Space_Invasion + ["Normal Girder: [1]"] = "Normalna Belka: [1]", -- HedgeEditor + ["Normal Land: [1]"] = "Normalny Teren: [1]", -- HedgeEditor + ["Normal Land"] = "Normalny Teren", -- HedgeEditor + ["NORMAL"] = "NORMALNY", -- Continental_supplies + ["Normal Rubber: [1]"] = "Normalna Guma: [1]", -- HedgeEditor + ["North America"] = "Ameryka Północna", -- Continental_supplies + ["Not being able to fight or hunt."] = "Bez możliwości walki, czy łowu.", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "ZA MAŁO PUNKTÓW KONTROLNYCH", --- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab + ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "Notka: Niektóre bronie mają drugą opcję (zobacz informację o kontynencie). Znajdź je i użyj przez \"", -- Continental_supplies + ["Note: We only give you grenades if you stay in your flying saucer."] = "Notka: Dajemy ci granaty tylko, gdy jesteśw swoim spodku.", -- Basic_Training_-_Flying_Saucer + ["Nothing of interest has happened."] = "Nic interesującego się nie wydarzyło.", -- Space_Invasion + ["Not now, Fiery Water!"] = "Nie teraz, Ognista Wodo!", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Mecz Nie-Do-Końca Towarzyski", --- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow --- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united --- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope --- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey --- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow --- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon --- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode --- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow --- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon --- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family --- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey --- ["Oh, my!"] = "", -- A_Classic_Fairytale:first_blood --- ["Oh, my! This is even more entertaining than I've expected!"] = "", -- A_Classic_Fairytale:backstab + ["Not you again! My head still hurts from last time!"] = "Tylko nie znowu ty! Moja głowa nadal boli od ostatniego razu!", -- A_Classic_Fairytale:shadow + ["No waypoint to be removed!"] = "Brak punktu kontrolnego do usunięcia!", -- Racer + ["Now collect the 2 crates to the far left and right."] = "Teraz zbierz 2 skrzynie na końcu po lewej i po prawej.", -- Basic_Training_-_Flying_Saucer + ["Now collect the next crate!"] = "Teraz zdobądź następną skrzynię!", -- Basic_Training_-_Flying_Saucer + ["Now dive just one more time and collect the next crate."] = "Teraz zanurkuj ostatni raz i zbierz następną skrzynię.", -- Basic_Training_-_Flying_Saucer + ["No, we made sure of that!"] = "Nie, upewniliśmy się co do tego!", -- A_Classic_Fairytale:united + ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "Teraz znajdź następny cel!|Wskazówka: Normalnie tracisz zdrowie po upadku, więc bądź ostrożny!", -- Basic_Training_-_Rope + ["Now for the supreme discipline of saucer flying, the underwater attack."] = "Teraz najwyższa dyscyplina latania talerzem, podwodny atak.", -- Basic_Training_-_Flying_Saucer + ["Now go and don't waste more of my time, you coward!"] = "Teraz idź i nie marnuj więcej mojego czasu, ty tchórzu!", -- A_Space_Adventure:fruit01 + ["Now go and play the menu mission to complete the campaign."] = "Teraz idź i zagraj w misję z menu, by ukończyć kampanię.", -- A_Space_Adventure:death01 + ["No! What have I done?! What have YOU done?!"] = "Nie! Co ja narobiłem?! Co TY narobiłeś?!", -- A_Classic_Fairytale:journey + ["No. Where did he come from?"] = "Nie. Skąd on przyszedł?", -- A_Classic_Fairytale:shadow + ["Now how do I get on the other side?!"] = "Teraz, jak mam dostać się na drugą stronę?", -- A_Classic_Fairytale:dragon + ["Now I have to climb these trees"] = "Teraz muszę wspiąć się na te drzewa", -- A_Space_Adventure:cosmos + ["Now let's try to drop weapons while flying!"] = "Teraz spróbujmy zrzucić bronie latając!", -- Basic_Training_-_Flying_Saucer + ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "Teraz słuchaj uważnie! Pod nami są tunele, które zostały naturalnie stworzone przez lata.", -- A_Space_Adventure:desert01 + ["Now use it and go to the moon PAotH station to get more fuel!"] = "Teraz użyj tego i udaj się na stację księżycową PSJ, by zdobyć więcej paliwa!", -- A_Space_Adventure:cosmos + ["Now you have the chance to try and claim the place that you deserve among the best."] = "Teraz masz szansę, by spróbować i zdobyć zasłużone miejsce między najlepszymi.", -- A_Space_Adventure:ice02 + ["No. You and the rest of the tribe are safer there!"] = "Nie. Ty i reszta plemienia jesteście tu bezpieczniejsi.", -- A_Classic_Fairytale:backstab + ["Objective completed! Now land safely."] = "Cel wykonany! Teraz wyląduj bezpiecznie.", -- Basic_Training_-_Flying_Saucer + ["Objectives"] = "Cele", -- A_Space_Adventure:ice01 + ["Object Placer"] = "Stawiacz Obiektów", -- Construction_Mode + ["Obliterate them!|Hint: You might want to take cover..."] = "Unicestwić ich!|Porada: Możesz chcieć się schować...", -- A_Classic_Fairytale:shadow + ["Obstacle course"] = "Tor przeszkód", -- A_Classic_Fairytale:dragon + ["Of course, but you're … special."] = "Oczywiście, ale jesteś... specjalna.", -- A_Classic_Fairytale:epil + ["Of course I am!"] = "Oczywiście, że jestem!", -- A_Classic_Fairytale:queen + ["Of course I have to save her. What did I expect?!"] = "Oczywiście, że muszę ją uratować. Czego ja oczekiwałem?!", -- A_Classic_Fairytale:family + ["Of course! It's all obvious now!"] = "No jasne! Teraz jest wszystko oczywiste!", -- A_Classic_Fairytale:epil + ["Of course, I will observe the battle and intervene if necessary."] = "Oczywiście, będę obserwował bitwę i interweniował, kiedy trzeba.", -- A_Space_Adventure:fruit01 + ["OH, COME ON!"] = "OCH, NO DAWAJ!", -- A_Classic_Fairytale:journey + ["Oh man! Learn how to fly!"] = "Człowieku! Naucz się latać!", -- A_Space_Adventure:ice02 + ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united + ["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."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Oh, silly me! I forgot that I'm the shaman."] = "", -- A_Classic_Fairytale:backstab --- ["Olive"] = "", -- A_Classic_Fairytale:united --- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood --- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant --- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood --- ["on Skip"] = "", -- Continental_supplies --- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united --- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Operacja Nurek", - ["Opposing Team: "] = "Przeciwna drużyna", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity --- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen --- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy --- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Żałosny Jeż #%d", --- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% 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 + ["Oh no! You failed! Just try again."] = "O nie! Nie udało ci się! Spróbuj jeszcze raz.", -- Basic_Training_-_Cluster_Bomb + ["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 + ["Oh, that. We were just having fun!"] = "Och, to. Tylko się bawiliśmy.", -- A_Classic_Fairytale:queen + ["Oh yes! I got the device part! Now it belongs to me alone."] = "O tak! Mam teraz część urządzenia! Teraz należy tylko do mnie.", -- A_Space_Adventure:fruit02 + ["Okay, I'll be extra careful!"] = "Dobrze, będę ekstra ostrożny!", -- A_Space_Adventure:desert01 + ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "Dobrze, więc musisz iść i wziąć trochę broni, które ukryliśmy na nagły wypadek!", -- A_Space_Adventure:moon01 + ["Okay then!"] = "Zatem w porządku!", -- A_Space_Adventure:fruit02 + ["Old One Eye"] = "Stary Jednooki", -- + ["Oleg"] = "Oleg", -- + ["Olive"] = "Oliwka", -- A_Classic_Fairytale:united + ["Omnivore"] = "Wszystkożerca", -- A_Classic_Fairytale:first_blood + ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "Pewnego razu, na wyspie z bogatymi zasobami naturalnymi, żyły dwa plemienia w gorącym konflikcie...", -- A_Classic_Fairytale:first_blood + ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "Kiedy uruchomisz zbliżeniowy wyzwalacz, Pani Mina nie jest twoim przyjacielem", -- ClimbHome + ["One does not simply rope to the moon!"] = "Nikt tak po prostu nie dostaje się liną na księżyc!", -- A_Space_Adventure:cosmos + ["One flower: Incomplete side missions"] = "Jeden kwiatek: Nieukończone misje poboczne", -- A_Space_Adventure:cosmos + ["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 the best pilots can master the following stunts."] = "Tylko najlepsi piloci mogą opanować następujące wyczyny.", -- Basic_Training_-_Flying_Saucer + ["On the Ice Planet, where ice rules ..."] = "Na Lodowej Planecie, gdzie rządzi lód...", -- A_Space_Adventure:ice01 + ["On the other side of the moon ..."] = "Po drugiej stronie księżyca...", -- A_Space_Adventure:moon02 + ["On the Planet of Sand, you have to double check your moves ..."] = "Na Planecie Piasku musisz starannie wykonywać swoje ruchy...", -- A_Space_Adventure:desert01 + ["On this map you get %d%% fuel."] = "Na tej mapie dostajesz %d%% paliwa.", -- TechRacer + ["On this map you get infinite fuel."] = "Na tej mapie dostajesz nieskończone paliwo.", -- TechRacer + ["Oops...I dropped them."] = "Ups... upuściłem je.", -- A_Classic_Fairytale:united + ["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 + ["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", -- + ["Orlando Boom!"] = "Orlando Boom!", -- A_Classic_Fairytale:queen + ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "Lub pozwól następnemu graczowi postawić punkty kontrolne|jeśli mniej niż 2 zostały postawione.", -- Racer + ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "Lub może to było wszystko częścią złego planu, tak złego, że nawet Prof. Jeżozło nie mógł go wymyśleć!", -- A_Space_Adventure:final + ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "Oscylująca grawitacja: Grawitacja okresowo zmienia się w zakresie od %i%% do %i%% z okrese %s.", -- Gravity + ["Other kills don't give you points."] = "Inne zabójstwa nie dają ci punktów.", -- Mutant + ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "Auć! To musiało boleć. %s (%s) uderzył w zimię z %d punktami obrażeń.", -- ClimbHome + ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "Auć! To musiało boleć. Upokorzyłeś swojego biednego jeża %d punktami obrażeń.", -- ClimbHome + ["Our tribe, our beautiful island!"] = "Nasze plemię, nasza piękna wyspa!", -- A_Classic_Fairytale:enemy + ["Out of ammo!"] = "Brak amunicji!", -- A_Space_Adventure:desert03, Tumbler + ["PAotH has sent explosives but unfortunately the trigger mechanism seems to be faulty!"] = "PSJ wysłało ładunki wybuchowe, ale niestety, mechanizm zapalnika wydaje się być wadliwy!", -- A_Space_Adventure:cosmos + ["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 + ["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: [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 + ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - --- ["Per team weapons"] = "", -- Continental_supplies --- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow --- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion + ["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 + ["Per team weapons"] = "Drużynowa amunicja", -- Continental_supplies + ["Pfew! That was close!"] = "Fiu! To było bliskie!", -- A_Classic_Fairytale:shadow + ["Phosphat"] = "Fosfat", -- portal + ["Physicist"] = "Fizyk", -- HedgeEditor + ["Piano Strike"] = "Zrzut pianina", -- Construction_Mode + ["Pikachu"] = "Pikachu", -- + ["Pings left: %d"] = "Pozostałe sygnały: %d", -- Space_Invasion + ["Pink"] = "Róż", -- + ["Pirates"] = "Piraci", -- + ["Place 2-%d waypoints using the waypoint placement tool."] = "Postaw 2-%d punktów kontrolnych, używając narzędzia do stawiania punktów kontrolnych.", -- Racer + ["Place 2 waypoints using the waypoint placement tool."] = "Postaw 2 punkty kontrolne, używając narzędzia do stawiania punktów kontrolnych.", -- Racer + ["Place air mines"] = "Postaw latające miny", -- HedgeEditor + ["Place barrels"] = "Postaw beczki", -- HedgeEditor + ["Place cleavers"] = "Postaw tasaki", -- HedgeEditor + ["Place/Delete Waypoint: [Left Click]"] = "Postaw/usuń punkt kontrolny: [Lewy klik]", -- HedgeEditor + ["Place dud mines"] = "Postaw niewybuchy", -- HedgeEditor + ["Place Gears (and more): Gear Placement Tool"] = "Postaw rzeczy (i więcej): Narzędzie do Stawiania Reczy", -- HedgeEditor + ["Place Girder: Girder"] = "Postaw belkę: Belka", -- HedgeEditor + ["Place Girder: [Left Click]"] = "Postaw belkę: [Lewy klik]", -- HedgeEditor + ["Place girders"] = "[Postaw belki]", -- HedgeEditor + ["Place health crates"] = "Postaw apteczki", -- HedgeEditor + ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "Postaw jeże: Postaw jeże na początku gry.", -- WxW + ["Placement Mode"] = "Tryb Stawiania", -- HedgeEditor + ["Place mines"] = "Postaw miny", -- HedgeEditor + ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "Postaw, modyfikuj i usuwaj rzeczy (np. obiekty)|i punkty kontrolne, edytuj utawienia jeży, wartości|warunki zwycięstwa i więcej.", -- HedgeEditor ["Place more waypoints using the 'Air Attack' weapon."] = "Postaw więcej punktów orientacyjnych używając [Nalotu]", --- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer --- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["POINTS"] = "", -- Mutant + ["Place Object: [Left Click]"] = "Postaw obiekt: [Lewy klik]", -- HedgeEditor + ["Place or delete waypoints"] = "Postaw lub usuń punkt kontrolny", -- HedgeEditor + ["Place rubber"] = "Postaw gumę", -- HedgeEditor + ["Place Rubber: Rubber"] = "Postaw gumę: Guma", -- HedgeEditor + ["Place Sprite: [Left Click]"] = "Postaw Grafik: [Lewy klik]", -- HedgeEditor + ["Place sprites to build land"] = "Postaw grafiki, by zbudować teren", -- HedgeEditor + ["Place sticky mines"] = "Postaw miny samoprzylepne", -- HedgeEditor + ["Place targets"] = "Postaw cele", -- HedgeEditor + ["Place utility crates"] = "Postaw skrzynie z narzędziami", -- HedgeEditor + ["Place Waypoint"] = "Postaw Punkt Kontrolny", -- HedgeEditor + ["Place waypoint"] = "Postaw punkt kontrolny", -- Racer + ["Place weapon crates"] = "Postaw skrzynie z brońmi", -- HedgeEditor + ["- 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: %d", -- 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 + ["Please click on a crate."] = "Kliknij na skrzynię.", -- HedgeEditor + ["Please click on a gear."] = "Kliknij na rzecz.", -- HedgeEditor + ["Please click on a hedgehog, barrel, health crate or dud mine."] = "Kliknij na jeża, beczkę, apteczkę lub niewybuch.", -- HedgeEditor + ["Please click on a hedgehog."] = "Kliknij na jeża.", -- HedgeEditor + ["Please place the waypoint further away from the waterline"] = "Postaw punkt kontrolny dalej od powierzchni wody", -- Racer, TechRacer + ["Please place the waypoint in the air and within the map boundaries"] = "Postaw punkt kontrolny w powietrzu i wewnątrz granic mapy", -- TechRacer + ["Please place the waypoint in the air, within the map boundaries"] = "Postaw punkt kontrolny w powietrzu, wewnątrz granic mapy", -- Racer + ["Please place your hedgehog first!"] = "Postaw najpierw swojego jeża!", -- WxW + ["Please, stop releasing your \"smoke signals\"!"] = "Proszę, przestań wysyłać swoje \"sygnały dymne\"!", -- A_Classic_Fairytale:shadow + ["Please wait …"] = "Proszę czekać...", -- WxW + ["Point Blank Combo! +5 points!"] = "Kombo martwego punktu! +5 punktów!", -- Space_Invasion + ["--- 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 ["Poison"] = "Truciciel", --- ["Population"] = "", -- Continental_supplies --- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "pkt. energii pozostało", + ["Pokémon"] = "Pokémon", -- + ["Poor %s (%s) died %d times."] = "Biedny %s (%s) umarł %d razy.", -- Mutant + ["Population"] = "Populacja", -- Continental_supplies + ["Porkey"] = "Jeżozwierzuś", -- + ["Portal hint: one goes to the destination, and one is the entrance.|"] = "Porada do portalu: jeden idzie do celu, a drugi jest wejściem.|", -- A_Classic_Fairytale:dragon + ["Portal Mind Challenge"] = "Wyzwanie portalowego umysłu", -- portal + ["Precise flying"] = "Precyzyhne ltanie", -- A_Space_Adventure:desert03 + ["Precise: Remove previous waypoint"] = "Precyzja: Usuń poprzedni punkt kontrolny", -- Racer + ["Precise shooting"] = "Precyzyjne strzelanie", -- A_Space_Adventure:fruit03 + ["Predator"] = "Predator", -- portal + ["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ę", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW --- ["Press [Left] or [Right] to move around, [Enter] to jump"] = "", -- A_Classic_Fairytale:first_blood - ["Press [Precise] to skip intro"] = "Naciśnij [Precyzyjne celowanie] by pominąć intro", --- ["Prestigious Pilot"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb --- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow - ["Race complexity limit reached."] = "Osiągnięto limit złożoności trasy.", + ["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] to begin."] = "Wciśnij [Atak], by zacząć.", -- A_Classic_Fairytale:first_blood + ["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 [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 [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 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 + ["Prof. Hogevil"] = "Prof. Jeżozło", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 + ["Pro Killers"] = "Pro Zabójcy", -- Big_Armory + ["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 + ["Race complexity limit reached"] = "Limit złożoności wyścigu osiągnięty", -- Racer, TechRacer + ["Racer tool"] = "Narzędzie wyścigu", -- Racer ["RACER"] = "WYŚCIG", --- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion --- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united --- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity --- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow --- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode --- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab --- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab --- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope --- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies --- ["Respawner"] = "", -- Construction_Mode --- ["Resurrector"] = "", -- Construction_Mode --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode - [" - 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 to Leaks A Lot! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow --- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome --- ["Rope Training"] = "", -- Basic_Training_-_Rope --- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow - ["Round Limit:"] = "Ilość rund:", - ["Round Limit"] = "Ilość rund", - ["Rounds Complete"] = "Koniec", - ["Rounds Complete: "] = "Ukończono rund: ", --- ["Rubber Band"] = "", -- Construction_Mode --- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "ZASADY GRY [Naciśnij ESC by zobaczyć]", --- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - --- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united --- ["Salvation"] = "", -- A_Classic_Fairytale:family --- ["Salvation was one step closer now..."] = "", -- A_Classic_Fairytale:dragon - ["Save as many hapless hogs as possible!"] = "Uratuj jak najwięcej nieszczęsnych jeży", --- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow --- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family --- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey --- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["Score"] = "", -- Mutant - ["SCORE"] = "PUNKTY", - - ["sec"] = "sek", --- ["Seduction"] = "", -- Continental_supplies --- ["Seems like every time you take a \"walk\", the enemy find us!"] = "", -- A_Classic_Fairytale:backstab --- ["See that crate farther on the right?"] = "", -- A_Classic_Fairytale:first_blood + ["Racer"] = "Wyścig", -- Racer + ["Race"] = "Wyścig", -- TrophyRace + ["Rachel"] = "Rachela", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Radar: Off"] = "Radar: Wyłączony", -- WxW + ["Radar: On"] = "Radar: Włączony", -- WxW + ["Radar Ping: [High jump]"] = "Sygnał radaru: [Wysoki skok]", -- Space_Invasion + ["Radar: Show after crate drop"] = "Radar: Pokaż po zrzucie skrzyni", -- WxW + ["Raging Buffalo"] = "Wściekły Bawół", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united + ["Ramesses"] = "Ramzes", -- + ["Ramon"] = "Ramon", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow + ["Rank: %s"] = "Ranga: %s", -- User_Mission_-_RCPlane_Challenge + ["Razac"] = "Razak", -- portal + ["RC Plane Challenge"] = "Wyzwanie Samolotowe", -- User_Mission_-_RCPlane_Challenge + ["RC Plane"] = "Radiowy samolocik", -- Construction_Mode + ["Read the challenge objectives from within the mission for more details."] = "Przeczytaj cele wyzwania z misji po więcej szczegółów.", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 + ["Ready for Battle?"] = "Gotowy do bitwy?", -- A_Space_Adventure:fruit01 + ["Really?! You thought you could harm me with your little toys?"] = "Naprawdę?! Myślałeś, że mógłbyś zranić mnie swoimi zabaweczkami?", -- A_Classic_Fairytale:shadow + ["Red areas are indestructible."] = "Czerwone obszary są niezniszczalne.", -- A_Space_Adventure:final + ["Red"] = "Czerwony", -- + ["Reflector Shield: Reflects enemy projectiles."] = "Tarcza Reflektorowa: Odbija wrogie pociski.", -- Construction_Mode + ["Reflector Shield"] = "Tarcza Reflektorowa", -- Construction_Mode + ["Regurgitator"] = "Zwracacz", -- A_Classic_Fairytale:backstab + ["Reinforcements"] = "Posiłki", -- A_Classic_Fairytale:backstab + ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "Pamiętaj! Wielu będzie szukać urządzenia antygrawitacyjnego! Teraz idź, pośpiesz się!", -- A_Space_Adventure:cosmos + ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "Pamiętaj: Lina zagina się tylko wokół obiektów,|jeśli nic nie uderzy, zawsze jest prosta!", -- Basic_Training_-_Rope + ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "Zapamiętaj to, żałosny zwierzęciu: kiedy nadejdzie dzień, pożałujesz swojej ślepej lojalności!", -- A_Classic_Fairytale:shadow + ["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 + [" - 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 + ["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 + ["Ripe"] = "Dojrzały", -- + ["Robert Yellow Apple"] = "Robert Żółte Jabłko", -- A_Space_Adventure:fruit01 + ["Rocket"] = "Rakieta", -- Big_Armory + ["Ronald"] = "Ronald", -- portal + ["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 + ["Rope Team"] = "Linowa Drużyna", -- Basic_Training_-_Rope + ["Rope Training"] = "Trening linowy", -- Basic_Training_-_Rope + ["Roshi"] = "Roshi", -- + ["Rot Molester"] = "Zepsuty Molester", -- A_Classic_Fairytale:shadow + ["Rotten"] = "Zepsuty", -- + ["Round draw"] = "Remis", -- Racer, TechRacer + ["Round %d (Sudden Death in round %d)"] = "Runda %d (Nagła Śmierć w rundzie %d)", -- Battalion + ["Round limit: %d"] = "Limit rund: %d", -- Racer + ["Round Limit: %d"] = "Limit rund: %d", -- Space_Invasion + ["Round limit:"] = "Limit rund: ", -- TechRacer + ["Rounds complete: %d/%d"] = "Ukończone rundy: %d/%d", -- Racer, Space_Invasion, TechRacer + ["Round score: %d"] = "Wynik rundy: %d", -- Space_Invasion + ["RS1"] = "RS1", -- A_Space_Adventure:fruit03 + ["RS2"] = "RS2", -- A_Space_Adventure:fruit03 + ["Rubber"] = "Guma", -- Construction_Mode, HedgeEditor + ["Rubber Placement Mode"] = "Tryb Stawiania Gumy", -- Construction_Mode + ["RUBBER PLACEMENT MODE"] = "TRYB STAWIANIA GUMY", -- HedgeEditor + ["Rules:"] = "Zasady:", -- Capture_the_Flag + ["RULES:"] = "ZASADY:", -- Frenzy + ["Rules: "] = "Zasady: ", -- Mutant + ["Run away, you coward!"] = "Uciekaj, ty tchórzu!", -- A_Space_Adventure:desert01 + ["Running displacement algorithm …"] = "Uruchamianie algorytmu wysiedlania...", -- A_Classic_Fairytale:queen + ["Running for survival"] = "Bieg o przetrwanie", -- A_Space_Adventure:desert02 + ["Rusted Diego"] = "Zardzewiały Diego", -- + ["Rusty Joe"] = "Rdzawy Joe", -- A_Classic_Fairytale:queen + ["Ryu"] = "Ryu", -- + ["%s: %.1fs"] = "%s: %.1fs", -- Racer, TechRacer + ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "Sabotaż/Flara: [Sabotuje wszystkie jeże w kole i zadaje ~1 obrażeń LUB wystrzeliwuje w powietrze odłamek]", -- Continental_supplies + ["Saint"] = "Święty", -- HedgeEditor, The_Specialists + ["Salivaslurper"] = "Ślinosiorb", -- A_Classic_Fairytale:united + ["Salty Dog"] = "Słony Pies", -- + ["Salvation"] = "Odkupienie", -- A_Classic_Fairytale:family + ["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 + ["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!", + ["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 + ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "Uratuj księżniczkę! Wszystkie twoje jeże muszą przeżyć!|Porada: zabij najpierw cyborgi! Używaj amunicji bardzo ostrożnie!|Porada: możesz chcieć poświęcić belkę jako osłonę!", -- A_Classic_Fairytale:family + ["Save the princess by collecting the crate in under 12 turns!"] = "Uratuj księżniczkę, poprzez zebranie skrzyni w mniej niż 12 tur!", -- A_Classic_Fairytale:journey + ["Saving Hogera"] = "Ratowanie Jeżery", -- A_Space_Adventure:cosmos + ["%s barely made it past the hogosphere."] = "%s ledwo przekroczył jeżosferę.", -- ClimbHome + ["%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"] = "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 + ["Score: %d"] = "Wynik: %d", -- Space_Invasion + ["Score goal: %d"] = "Wymagany wynik: %d", -- Control + ["Score graph"] = "Graf wyniku", -- Mutant, Space_Invasion + ["Score points by killing other hedgehogs (see below)."] = "Zdobądź punkty, zabijając inne jeże (zobacz niżej).", -- Mutant + ["Scores: "] = "Wyniki: ", -- Capture_the_Flag + ["Scores:"] = "Wyniki:", -- Mutant + ["Scores"] = "Wyniki", -- Mutant + ["Scoring: "] = "Wynki: ", -- Mutant + ["Script parameter examples:"] = "Przykłady parametrów skryptu:", -- Gravity + ["%s: %d (deaths: %d)"] = "%s: %d (śmierci: %d)", -- Mutant + ["%s: Did not finish"] = "%s: Nie ukończył", -- Racer, TechRacer + ["%s did not finish the race."] = "%s nie ukończył wyścigu", -- Racer, TechRacer + ["%s didn't expect that."] = "%s nie spodziewał się tego", -- User_Mission_-_Rope_Knock_Challenge + ["%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", -- Capture_the_Flag, Control + ["Search for the device with the help of the other hedgehogs "] = "Poszukaj 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"] = "", -- A_Classic_Fairytale:dragon --- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood + ["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 ["selected!"] = "wybrany!", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey --- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "Osłona ulepszona: +30 energii", - ["Shield Depleted"] = "Straciłeś Osłonę", - ["Shield is fully recharged!"] = "Osłona całkowicie naładowana", - ["Shield Master!"] = "Mistrz Osłony!", - ["Shield Miser!"] = "Osłonowy skąpiec!", - ["Shield OFF:"] = "Osłona WYŁĄCZONA:", - ["Shield ON:"] = "Osłona WŁĄCZONA:", - ["Shield Seeker!"] = "Zdobywca osłon!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 --- ["Shotgun"] = "", -- Continental_supplies - ["Shotgun Team"] = "Strzelcy", - ["Shotgun Training"] = "Trening strzelecki", + ["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 + ["Select, reposition and delete gears"] = "Wybierz, przestaw i usuń rzecz", -- HedgeEditor + ["Select win/lose condition: [Left], [Right]"] = "Wybierz warunki wygranej/przegranej: [Lewo], [Prawo]", -- HedgeEditor + ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "Wybierz swój kontynent/zestaw broni używając klawiszy \"Góra\" lub \"Dół\". Możesz także wybrać je z menu broni.", -- Continental_supplies + ["Sergey"] = "Sergiusz", -- + ["Set Health: [Left Click]"] = "Ustaw zdrowie: [Lewy klik]", -- HedgeEditor + ["Set Identity: [Left Click]"] = "Ustaw tożsamość: [Lewy klik]", -- HedgeEditor + ["Set period to negative value for random gravity."] = "Ustaw okres na negatywną wartość dla losowej grawitacji.", -- Gravity + ["Set the health of hogs, health crates, barrels and duds"] = "Ustaw zdrowie jeży, skrzyń ze zdrowiem, beczek i niewybuchów", -- HedgeEditor + ["Set to %d"] = "Ustaw na %d", -- HedgeEditor + ["%s exploded."] = "%s wybuchł.", -- User_Mission_-_Rope_Knock_Challenge + ["%s fell from a high cliff."] = "%s upadł z wysokiego klifu.", -- User_Mission_-_Rope_Knock_Challenge + ["%s fell too fast."] = "%s spadł za szybko.", -- User_Mission_-_Rope_Knock_Challenge + ["%s felt unstable."] = "%s poczuł się niestabilnie.", -- User_Mission_-_Rope_Knock_Challenge + ["%s felt victim to rope-knocking."] = "%s stał się ofiarą uderzania liną.", -- User_Mission_-_Rope_Knock_Challenge + ["%s flew like a rock."] = "%s poleciał jak kamień.", -- User_Mission_-_Rope_Knock_Challenge + ["%s goes the way of the lemming."] = "%s poszedł drogą lemingów.", -- User_Mission_-_Rope_Knock_Challenge + ["Sgt. Smith"] = "Sierżant Smith", -- + ["%s had it coming."] = "%s czuł, że tak będzie.", -- User_Mission_-_Rope_Knock_Challenge + ["%s had no chance."] = "%s nie miał szans.", -- User_Mission_-_Rope_Knock_Challenge + ["... share your beauty with the world every morning, my princess!"] = "...dziel się swoją pięknością ze światem każdego ranka, moja księżniczko!", -- A_Classic_Fairytale:journey + ["%s has been knocked out."] = "%s został zrzucony.", -- User_Mission_-_Rope_Knock_Challenge + ["%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 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", -- + ["Sheepy"] = "Owieczka", -- + ["She's behind that tall thingy."] = "Ona jest za tym wysokim czymś.", -- A_Classic_Fairytale:family + ["Shield boosted! +%d power"] = "Osłona wzmocniona! +%d mocy", -- Space_Invasion + ["Shield depleted"] = "Osłona wyczerpana", -- Space_Invasion + ["Shield is fully recharged!"] = "Osłona całkowicie naładowana!", + ["Shield Master! +10 points!"] = "Mistrz osłony! +10 punktów", -- Space_Invasion + ["Shield Miser! +%d points!"] = "Osłonowy skąpiec! +%d punktów!", -- Space_Invasion + ["Shield OFF: %d power remaining"] = "Osłona wyłączona: pozostało %d mocy", -- Space_Invasion + ["Shield ON: %d power remaining"] = "Osłona włączona: pozostało %d mocy", -- Space_Invasion + ["Shield Seeker! +10 points!"] = "Poszukiwacz osłon! +10 punktów!", -- Space_Invasion + ["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 ["shots remaining."] = "strzałów pozostało.", + ["Sigh."] = "Ech.", -- A_Classic_Fairytale:epil ["Silly"] = "Głuptas", --- ["SineGun"] = "", -- Construction_Mode --- ["Sinky"] = "", --- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s utonął i drużyna %d|dostała punkt karny!| |Punktacja:", - ["%s is out and Team %d|scored a point!| |Score:"] = "%s utonął i drużyna %d|zdobyła punkt!| |Punktacja:", --- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy --- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy --- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy --- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy --- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion - ["Sniper Training"] = "Trening Snajperski", + ["Silver"] = "Srebro", -- + ["Sine Gun"] = "Sinusoidalna giwera", -- Construction_Mode + ["Sinky"] = "Śmierdziel", + ["Sirius Lee"] = "Syriusz Li", -- A_Classic_Fairytale:enemy + ["%s is eliminated!"] = "%s jest wyeliminowany!", -- User_Mission_-_Rope_Knock_Challenge + ["Slimer"] = "Szlamiarz", -- + ["Slippery"] = "Śliski", -- A_Classic_Fairytale:journey + ["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", -- + ["%s made it past the hogosphere."] = "%s przekroczył jeżosferę.", -- ClimbHome + ["%s managed to pass half of the distance towards home."] = "%s zdołał pokonać połowę dystansu do domu.", -- ClimbHome + ["%s may choose the rules."] = "%s mogą wybrać zasady.", -- WxW + ["Smith 0.97"] = "Smith 0.97", -- A_Classic_Fairytale:enemy + ["Smith 0.98"] = "Smith 0.98", -- A_Classic_Fairytale:enemy + ["Smith 0.99a"] = "Smith 0.99a", -- A_Classic_Fairytale:enemy + ["Smith 0.99b"] = "Smith 0.99b", -- A_Classic_Fairytale:enemy + ["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 skip this turn for rule violation."] = "%s musi opuścić swoją turę za naruszenie zasad.", -- WxW + ["%s never got the ninja diploma."] = "%s nigdy nie zdobył dyplomu ninja.", -- ClimbHome + ["%s never wanted to reach for the sky in the first place."] = "%s wcale nie chciał dosięgnąć nieba.", -- ClimbHome + ["Sniper! +8 points!"] = "Snajper! +8 punktów!", -- Space_Invasion + ["Sniper Rifle"] = "Karabin snajperski", -- Continental_supplies + ["Sniper"] = "Snajper", -- HedgeEditor, The_Specialists + ["Sniper Training"] = "Trening snajperski", ["Sniperz"] = "Snajperzy", --- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies --- ["South America"] = "", -- Continental_supplies --- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW --- ["Special Weapons:"] = "", -- Continental_supplies --- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["Spleenlover"] = "", -- A_Classic_Fairytale:united + ["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 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 + ["So I shook my fist in the air!"] = "Więc potrząsłem moją pięścią w powietrzu!", -- A_Classic_Fairytale:epil + ["Soldier"] = "Żołnierz", -- HedgeEditor, The_Specialists + ["So, let me tell you what I know about Professor Hogevil."] = "A więc, pozwól mi powiedzieć, co wiem o Profesorze Jeżozło.", -- A_Space_Adventure:moon02 + ["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 + ["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 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 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", -- + ["South America"] = "Ameryka Południowa", -- Continental_supplies + ["So? What will it be?"] = "Więc? Co to będzie?", -- A_Classic_Fairytale:shadow + ["So you are able to launch projectiles into your aiming direction, always at full power."] = "Więc możesz wystrzelić pociski w kierunku celowania, zawsze z pełną mocą.", -- Basic_Training_-_Flying_Saucer + ["So you are interested in Professor Hogevil, huh?"] = "Więc jesteś zainteresowany Profesorem Jeżozło, co?", -- A_Space_Adventure:moon02 + ["So you basically did the dirty work for us."] = "Więc w zaszadzie zrobiłeś dla nas całą brudną robotę.", -- A_Classic_Fairytale:dragon + ["Space Invasion"] = "Kosmiczna inwazja", -- Space_Invasion + ["SPACE INVASION"] = "KOSMICZNA INWAZJA", -- Space_Invasion + ["Spacetrip"] = "Kosmiczna wycieczka", -- A_Space_Adventure:cosmos + ["Spawn the crate and attack!"] = "Ustaw skrzynię i atakuj!", -- WxW + ["Specials: Kings and air generals drop helpers, not weapons"] = "Specjalne: Królowie i powietrzni generałowie upuszczają pomocników, nie bronie", -- Battalion + ["Special Weapons:"] = "Specjalne bronie:", -- Continental_supplies + ["Speckles"] = "Spekles", -- + ["Specs Appeal"] = "Urok Speców", -- + ["Specs"] = "Spece", -- + ["Spectator"] = "Widz", -- + ["Speed Shoppa"] = "Szybka Shoppa", -- SpeedShoppa + ["Spike"] = "Kolec", -- A_Space_Adventure:desert01 + ["Spikes"] = "Kolce", -- + ["Spiky Cheese"] = "Kolczasty Ser", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow + ["%s, place the first hedgehog!"] = "%s, ustaw pierwszego jeża!", -- WxW + ["Spleenlover"] = "Wielbiciel Śledzion", -- A_Classic_Fairytale:united ["Sponge"] = "Gąbka", ["Spooky Tree"] = "Straszne drzewo", --- ["Sprite Placement Mode"] = "", -- Construction_Mode --- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["s|"] = "s|", - ["s"] = "s", -- GaudyRacer, Space_Invasion - ["STATUS UPDATE"] = "WYNIKI", -- GaudyRacer, Space_Invasion --- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen --- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood --- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Sticky Mine"] = "", -- Continental_supplies --- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode --- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - --- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- Construction_Mode --- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW --- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW --- ["Surfer! +15 points!"] = "", -- Space_Invasion --- ["Surfer!"] = "", -- WxW --- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- A_Classic_Fairytale:shadow --- ["Swing, Leaks A Lot, on the wings of the wind!"] = "", -- A_Classic_Fairytale:first_blood --- ["switch"] = "", -- Continental_supplies + ["Sprite Erasure Mode"] = "Tryb Usuwania Grafik", -- HedgeEditor + ["Sprite Modification Mode"] = "Tryb Modyfikacji Grafik", -- HedgeEditor + ["SPRITE MODIFICATION MODE"] = "TRYB MODYFIKACJI GRAFIK", -- HedgeEditor + ["Sprite Placement Mode"] = "Tryb Stawiania Grafik", -- Construction_Mode + ["SPRITE PLACEMENT MODE"] = "TRYB STAWIANIA GRAFIK", -- HedgeEditor + ["Sprite Testing Mode"] = "Tryb Testowania Grafik", -- Construction_Mode + ["Squirtle"] = "Squirtle", -- + ["Squishy"] = "Grząski", -- + ["%s reached home in %.3f seconds. Congratulations!"] = "%s dotarł do domu w %.3f sekund. Gratulacje!", -- ClimbHome + ["%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 (%s) gave short shrift to the invaders: Longest combo of %d!"] = "%s (%s) dał najeźdźcom krótką pokutę: Najdłuższe kombo %d!", -- Space_Invasion + ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "%s (%s) został zaproszony do dołączenia do Planetarnego Stowarzyszenia Jeży, zniszczył zdumiewające %d najeźdźców w jednej rundzie!", -- Space_Invasion + ["%s (%s) hate life and suicided %d times."] = "%s (%s) nienawidzi życia i zabił się %d razy.", -- Mutant + ["%s should try the rope training mission first."] = "%s powinien najpierw spróbować treningu linowego.", -- ClimbHome + ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "%s (%s) jest uzależniony od zabijania: %d najeźdźców zniszczonych w jednej rundzie.", -- Space_Invasion + ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "%s (%s) jest zahartowanym łowcą: Bez pudła i z %d uderzeniami w swojej najlepszej rundzie!", -- Space_Invasion + ["%s (%s) is a tumbleweed: %d points in one round."] = "%s (%s) jest biegaczem: %d punktów w jednej rundzie.", -- Space_Invasion + ["%s (%s) is good at this: %d points in only one round!"] = "%s (%s) jest w tym dobry: %d punktów w tylko jednej rundzie!", -- Space_Invasion + ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "%s (%s) jest Rambo w kostiumie jeża! Zniszczył %d najeźdźcóww jednej rundzie.", -- Space_Invasion + ["%s skipped ninja classes."] = "%s wagarował na zajęciach ninja.", -- ClimbHome + ["%s spawned at a really bad position."] = "%s pojawił się na naprawdę złej pozycji.", -- User_Mission_-_Rope_Knock_Challenge + ["%s splatted."] = "%s plasnął.", -- User_Mission_-_Rope_Knock_Challenge + ["%s (%s) reached a decent peak height of %d."] = "%s (%s) osiągnął przyzwoitą szczytową wysokość %d.", -- ClimbHome + ["%s (%s) reached a peak height of %d."] = "%s (%s) osiągnął szczytową wysokość %d.", -- ClimbHome + ["%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) 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 (%s) tumbles like no other: %d points in one round."] = "%s (%s) toczy się jak nikt inny: %d punktów w jednej rundzie.", -- Space_Invasion + ["%s stumpled."] = "%s potknął się.", -- User_Mission_-_Rope_Knock_Challenge + ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "%s (%s) z pewnością nie bał się wysokości: Szczytowa wysokość %d!", -- ClimbHome + ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "%s (%s) był szybki jak błyskawica! Najdłuższe kombo %d, absolutnie szalone!", -- Space_Invasion + ["%s (%s) was on fire: Longest combo of %d."] = "%s (%s) palił się: Najdłuższe kombo %d.", -- Space_Invasion + ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "%s (%s) panicznie bał się wody i zdecydował się dostać na bezpieczną odległość %d od niej.", -- ClimbHome + ["%s (%s) was the best baby tumbler: %d points in one round."] = "%s (%s) był najlepszym dziecięcym akrobatą: %d punktów w jednej rundzie.", -- Space_Invasion + ["%s (%s) was the greediest hedgehog and collected %d crates."] = "%s (%s) był najchciwszym jeżem i zebrał % skrzyń.", -- Mutant + ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "%s (%s) był niewątpliwie najlepszym profesjonalnym akrobatą w tej grze: %d punktów w jednej rundzie.", -- Space_Invasion + ["Star"] = "Gwiazda", -- Big_Armory + ["Status update"] = "Aktualizacja statusu", -- Racer, TechRacer + ["Status Update"] = "Aktualizacja statusu", -- Space_Invasion + ["Stay away from our weapons!"] = "Trzymaj się z dala od naszych broni!", -- A_Classic_Fairytale:queen + ["Stay there, comrades!"] = "Zostańcie tam, towarzysze!", -- A_Classic_Fairytale:queen + ["Stay there to flee!"] = "Zostań tu, by uciec!", -- A_Space_Adventure:fruit01 + ["Steel Eye"] = "Stalowooki", -- A_Classic_Fairytale:queen + ["Step 1: Activate your flying saucer but do NOT move yet!"] = "Krok 1: Aktywuj swój latający talerz, ale NIE ruszaj się jeszcze!", -- Basic_Training_-_Flying_Saucer + ["Step 2: Select your grenade."] = "Krok 2: Wybierz swój granat.", -- Basic_Training_-_Flying_Saucer + ["Step 3: Start flying and get yourself right above the target."] = "Krok 3: Zacznij lecieć i ustaw się tuż nad swoim celem.", -- Basic_Training_-_Flying_Saucer + ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "Krok 4: Upuść swój granat wciskając przycisk [Długi skok].", -- Basic_Training_-_Flying_Saucer + ["Step 5: Get away quickly and land safely anywhere."] = "Krok 5: Szybko odleć i bezpiecznie wyląduj gdziekolwiek.", -- Basic_Training_-_Flying_Saucer + ["Step By Step"] = "Krok po kroku", -- A_Classic_Fairytale:first_blood + ["Steve"] = "Stefan", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["Sticky Mine"] = "Mina samoprzylepna", -- Continental_supplies + ["Sticky Mine Placement Mode"] = "Tryb Stawiania Min Samoprzylepnych", -- Construction_Mode + ["STICKY MINE PLACEMENT MODE"] = "TRYB STAWIANIA MIN SAMOPRZYLEPNYCH", -- HedgeEditor + ["Stop, comrades!"] = "Stójcie, towarzysze!", -- A_Classic_Fairytale:queen + ["Stop right there, puny worms!"] = "Stójcie tam, mizerne robaki!", -- A_Classic_Fairytale:queen + ["Street Fighters"] = "Uliczni Wojownicy", -- + ["Strength: %d (multiplier for ammo)"] = "Siła: %d (wielokrotność amunicji)", -- Battalion + ["Stronglings"] = "Silniacy", -- A_Classic_Fairytale:shadow + ["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 + ["Sundaland"] = "Sundaland", -- Continental_supplies + ["Sunflame"] = "Słoneczny Płomień", -- Big_Armory + ["Super weapons: A few crates contain very powerful weapons."] = "Super bronie: Parę skrzyń zawiera bardzo potężne bronie.", -- WxW + ["Super weapons: %s"] = "Super bronie: %s", -- WxW + ["Support Station: Allows placement of crates."] = "Stacja Wsparcia: Pozwala na ustawianie skrzyń.", -- Construction_Mode + ["Support Station"] = "Stacja Wsparcia", -- Construction_Mode + ["Sure!"] = "Jasne!", -- A_Classic_Fairytale:epil + ["Surf Before Crate: %s"] = "Serfuj przed skrzynią: %s", -- WxW + ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "Serfuj przed skrzynią: Musisz raz się odbić od wody, zanim będziesz mógł zdobyć skrzynie.", -- WxW + ["Surfer! +15 points!"] = "Surfer! +15 punktów!", -- Space_Invasion + ["Surfer!"] = "Surfer!", -- WxW + ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "Przetrwaj!Porada: Przerywniki mogą zostać pominięte przyciskiem [Precyzja].", -- 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 + ["%s was a good target."] = "%s był dobrym celem.", -- User_Mission_-_Rope_Knock_Challenge + ["%s was close to home."] = "%s był blisko domu.", -- ClimbHome + ["%s was damn close to home."] = "%s był piekielnie blisko domu.", -- ClimbHome + ["%s was doomed from the beginning."] = "%s był na to skazany od początku.", -- User_Mission_-_Rope_Knock_Challenge + ["%s was good, but not good enough."] = "%s był dobry, ale nie wystarczająco.", -- ClimbHome + ["%s was knocked away."] = "%s został zrzucony.", -- User_Mission_-_Rope_Knock_Challenge + ["%s was really unlucky."] = "%s był prawdziwym pechowcem.", -- User_Mission_-_Rope_Knock_Challenge + ["%s was shoved away."] = "%s został zmieciony.", -- User_Mission_-_Rope_Knock_Challenge + ["%s was smashed."] = "%s został zmiażdżony.", -- User_Mission_-_Rope_Knock_Challenge + ["Sweet"] = "Słodki", -- + ["%s went over a quarter of the way towards home."] = "%s przeszedł ćwierć drogi w stronę domu.", -- ClimbHome + ["%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 + ["%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 ["Switched to "] = "Przełączono na ", --- ["Switch Hog"] = "", -- Construction_Mode --- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode --- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode --- ["Target Placement Mode"] = "", -- Construction_Mode + ["Switch Hog"] = "Zmień Jeża", -- Construction_Mode + ["switch"] = "przełącz", -- Continental_supplies + ["Switch: Toggle crate radar"] = "Zmiana: Przełącz radar skrzyń", -- WxW + ["Syntax Errol"] = "Błąt Składni", -- A_Classic_Fairytale:dragon + ["%s, you may choose the rules."] = "%s, możesz wybrać zasady.", -- WxW + ["szczur"] = "szczur", -- + ["Tackleberry"] = "Tackleberry", -- + ["Tails"] = "Reszka", -- + ["Talk about mixed signals..."] = "Mów o pomieszanych sygnałach...", -- A_Classic_Fairytale:dragon + ["Tall Potato"] = "Wysoki Ziemniak", -- A_Space_Adventure:fruit01 + ["Target"] = "Cel", -- HedgeEditor + ["Target Placement Mode"] = "Tryb Stawiania Celów", -- Construction_Mode + ["TARGET PLACEMENT MODE"] = "TRYB STAWIANIA CELÓW", -- HedgeEditor + ["Target Practice: Bazooka (easy)"] = "Ćwiczenie celowania: Bazooka (łatwy)", -- Target_Practice_-_Bazooka_easy + ["Target Practice: Bazooka (hard)"] = "Ćwiczenie celowania: Bazooka (trudny)", -- Target_Practice_-_Bazooka_hard + ["Target Practice: Grenade (easy)"] = "Ćwiczenie celowania: Granat (łatwy)", -- Target_Practice_-_Grenade_easy + ["Target Practice: Grenade (hard)"] = "Ćwiczenie celowania: Granat (trudny)", -- Target_Practice_-_Grenade_hard + ["Target Practice: Homing Bee"] = "Ćwiczenie celowania: Pszczoła", -- Target_Practice_-_Homing_Bee + ["Target Practice: Shotgun"] = "Ćwiczenie celowania: Strzelba", -- Target_Practice_-_Shotgun + ["Targets left: %d"] = "Pozostałe cele: %d", -- TargetPractice + ["Tatsujin"] = "Tatsudżin", -- + ["Tatters"] = "Szmaciarze", -- ["Team %d: "] = "Drużyna %d: ", - ["Team Scores"] = "Punktacja(?)", -- Control, Space_Invasion --- ["Teleporation Node"] = "", -- Construction_Mode --- ["Teleportation Mode"] = "", -- Construction_Mode --- ["Teleportation Node"] = "", -- Construction_Mode --- ["Teleport"] = "", -- Construction_Mode, Frenzy --- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon --- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode --- ["Thanks!"] = "", -- A_Classic_Fairytale:family --- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family --- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey --- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey --- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united --- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy --- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab --- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab --- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow --- ["That Sinking Feeling"] = "", --- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy --- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family --- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "To było bezcelowe", --- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant --- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood --- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united --- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood --- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon + ["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 Scores:"] = "Wyniki drużyn:", -- Control + ["Team scores:"] = "Wyniki drużyn:", -- Space_Invasion + ["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 + ["Teleportation Node: Allows teleportation| between other nodes."] = "Węzeł Teleportacyjny: Pozwala na teleportację| pomiędzy innymi węzłami.", -- Construction_Mode + ["Teleportation Node"] = "Węzeł Teleportacyjny", -- Construction_Mode + ["Teleport hint: just use the mouse to select the destination!"] = "Porada do teleportu: po prostu użyj myszki, by wybrać cel teleportacji!", -- A_Classic_Fairytale:dragon + ["Teleport"] = "Teleport", -- Construction_Mode, Frenzy + ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "Teleport Nieudany. Proszę teleportować się wewnątrz sfery wpłyu klanowego teleportu.", -- Construction_Mode + ["Thanks, dude! It really means a lot to me."] = "Dzięki, koleś! To naprawdę wiele dla mne znaczy.", -- A_Classic_Fairytale:epil + ["Thanks!"] = "Dzięki!", -- A_Classic_Fairytale:family + ["Thanks, man! It really means a lot to me."] = "Dzięki, ziom! To naprawdę wiele dla mne znaczy.", -- A_Classic_Fairytale:epil + ["Thank you, Dr. Cornelius."] = "Dziękuję, Doktorze Korneliuszu.", -- A_Space_Adventure:cosmos + ["Thank you for meeting me on such a short notice!"] = "Dziękuję za spotkanie ze mną w tak krótkim czasie!", -- A_Space_Adventure:desert01 + ["Thank you, my hero!"] = "Dziękuję, mój bohaterze!", -- A_Classic_Fairytale:family + ["Thank you, oh, thank you, Leaks A Lot!"] = "Dziękuję, och, dziękuję, Spory Przecieku!", -- A_Classic_Fairytale:journey + ["Thank you, oh, thank you, my heroes!"] = "Dziękuję, och, dziękuję, moi bohaterzy!", -- A_Classic_Fairytale:journey + ["Thanta"] = "Tanta", -- A_Space_Adventure:ice01 + ["That is, indeed, very weird..."] = "To jest, w rzeczy samej, bardzo dziwne...", -- A_Classic_Fairytale:united + ["That makes it almost invaluable!"] = "To czyni to prawie bezwartościowym!", -- A_Classic_Fairytale:enemy + ["That ought to show them!"] = "To powinno im pokazać!", -- A_Classic_Fairytale:backstab + ["That's all, folks!"] = "To wszystko, ludzie!", -- A_Classic_Fairytale:epil + ["That's for my father!"] = "To za mojego ojca!", -- A_Classic_Fairytale:backstab + ["That shaman sure knows what he's doing!"] = "Ten szaman z pewnością wie co robi!", -- A_Classic_Fairytale:shadow + ["That Sinking Feeling"] = "Cisza na morzu", + ["That's just the way it works, you know."] = "To tak po prostu działa, no wiesz.", -- A_Classic_Fairytale:queen + ["That's not our problem!"] = "To nie nasz problem!", -- A_Classic_Fairytale:enemy + ["That's typical of you!"] = "To takie typowe dla ciebie!", -- A_Classic_Fairytale:family + ["That's why he always wears a hat since then."] = "To dlatego od tego czasu on zawsze nosi kapelusz.", -- A_Space_Adventure:moon02 + ["That traitor won't be killing us anymore!"] = "Ten zdrajca nie będzie nas już więcej zabijał!", -- A_Classic_Fairytale:queen + ["That was just mean!"] = "To było po prostu wredne!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united + ["That was pointless. The flag will respawn next round."] = "To było bezcelowe. Flaga odnowi się w następnej rundzie.", -- CTF_Blizzard + ["The adventure begins!"] = "Przygoda się zaczyna!", -- A_Space_Adventure:cosmos + ["The air bombs are weaker than usual."] = "Latające miny są słabsze niż zazwyczaj.", -- Battalion + ["The aliens respect me, even worship me!"] = "Obcy mnie respektują, nawet mnie czczą!", -- A_Classic_Fairytale:queen + ["The ally units share their ammo."] = "Sprzymierzone jednostki dzielą swoją amunicję.", -- A_Space_Adventure:fruit01 + ["The answer is...entertaintment. You'll see what I mean."] = "Odpowiedź to... rozrywka. Zobaczycie co mam na myśli.", -- A_Classic_Fairytale:backstab + ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "Antyportalowa powierzchnia jest na całej podłodze, a ja nie mam nic, by go zabić. Zrzucenie czegoś mogłoby go skrzywdzić wystarczająco, by go zabić.", -- portal + ["The big bang"] = "Wielki wybuch", -- A_Space_Adventure:final + ["The boss has fallen! Retreat!"] = "Szef upadł! Odwrót!", -- A_Space_Adventure:moon01 + ["The Boss"] = "Szef", -- + ["The Bull's Eye"] = "Bycze Oko", -- A_Classic_Fairytale:first_blood + ["The caves are well hidden, they won't find us there!"] = "Jaskinie są dobrze ukryte, nie znajdą nas tutaj!", -- A_Classic_Fairytale:united + ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "Klan Czerwonych Truskawek chce przejąć zwierzchnictwo i obalić Króla Ananasa.", -- A_Space_Adventure:fruit01 + ["The Crate Frenzy"] = "Szał skrzyń", -- A_Classic_Fairytale:first_blood + ["The Customer is King"] = "Król jest klientem", -- Challenge_-_Speed_Shoppa_-_ShoppaKing + ["The device part has been stolen!"] = "Część urządzenia została skradziona!", -- A_Space_Adventure:fruit02 + ["The device part is hidden in one of the crates! Go and get it!"] = "Część urządzenia jest ukryta w jednej ze skrzyń! Idź ją zdobyć!", -- A_Space_Adventure:desert01 + ["The Devs"] = "Deweloperzy", -- + ["The Dilemma"] = "Dylemat", -- A_Classic_Fairytale:shadow + ["The editor weapons and tools have been added!"] = "Edytorowe bronie i narzędzia zostały dodane!", -- HedgeEditor + ["The editor weapons and tools have been removed!"] = "Edytorowe bronie i narzędzia zostały usunięte!", -- HedgeEditor + ["The enemies aren't many anyway, it is going to be easy!"] = "Nie ma zbyt wielu wrogów tak w ogóle, to będzie łatwe!", -- A_Space_Adventure:fruit01 + ["The enemy can't move but it might be a good idea to stay out of sight!"] = "Ten wróg nie może się ruszać, ale może być dobrym pomysłem pozostać poza widokiem!", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Na tamtej kaczce ukrywa się nasz przeciwnik!", --- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy --- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant + ["The Enemy Of My Enemy"] = "Wróg mojego wroga", -- A_Classic_Fairytale:enemy + ["The explosion is weaker than usual."] = "Eksplozja jest słabsza niż zazwyczaj.", -- Battalion + ["The fight begins!"] = "Walka się zaczyna!", -- A_Space_Adventure:moon01 + ["The final part"] = "Ostatnia część", -- A_Space_Adventure:death01 + ["The First Blood"] = "Pierwsza krew", -- A_Classic_Fairytale:first_blood + ["The First Encounter"] = "Pierwsze starcie", -- A_Classic_Fairytale:shadow + ["The first hedgehog to kill someone becomes the Mutant."] = "Pierwszy jeż, który kogoś zabije, stanie się Mutantem.", -- Mutant + ["The first hedgehog which scores %d or more wins the game."] = "Pierwszy jeż, który zdobędzie %d lub więcej punktów, wygrywa mecz.", -- Mutant + ["The first stop"] = "Pierwszy przystanek", -- A_Space_Adventure:moon01 + ["The first turn will last 25 sec and every other turn 15 sec."] = "Pierwsza tura potrwa 25 sekund, a każda inna 15 sek.", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Flaga pojawi się ponownie przy następnej rundzie.", --- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab --- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode --- ["The guardian"] = "", -- A_Classic_Fairytale:shadow --- ["The Individualist"] = "", -- A_Classic_Fairytale:shadow --- ["Their buildings were very primitive back then, even for an uncivilised island."] = "", -- A_Classic_Fairytale:united --- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey --- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood --- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey --- ["The Mutant has super-weapons and a lot of health."] = "", -- Mutant --- ["The Mutant loses health quickly if he doesn't keep scoring kills."] = "", -- Mutant + ["The flood has stopped! Challenge over."] = "Powódź się zatrzymała! Wyzwanie skończone.", -- User_Mission_-_That_Sinking_Feeling + ["The food bites back"] = "Jedzenie się odgryza", -- A_Classic_Fairytale:backstab + ["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 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 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 + ["The Iron Curtain"] = "Żelazna Kurtyna", -- + ["The Journey Back"] = "Podróż z powrotem", -- A_Classic_Fairytale:journey + ["The king of %s has died!"] = "Król drużyny %s umarł!", -- Battalion + ["The last encounter"] = "Ostatnie starcie", -- A_Space_Adventure:death01 + ["The last surviving clan wins."] = "Ostatni ocalały klan wygrywa.", -- TrophyRace + ["The leader escaped. Defeat the rest of the aliens!"] = "Dowódca uciekł. Pokonaj resztę obcych!", -- A_Classic_Fairytale:queen + ["The leader seems scared, he will probably flee."] = "Dowódca wydaje się być przestraszony, prawdopodobnie ucieknie.", -- A_Classic_Fairytale:queen + ["The Leap of Faith"] = "Skok Wiary", -- A_Classic_Fairytale:first_blood + ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "Meteoryt zbliżył się za bardzo i antygrawitacyjne urządzenie nie jest wystarczająco potężne, by go teraz zatrzymać.", -- A_Space_Adventure:cosmos + ["The Moonwalk"] = "Spacer po księżycu", -- A_Classic_Fairytale:journey + ["The Mutant has super-weapons and a lot of health."] = "Mutant ma super bronie i dużo zdrowia.", -- 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 next one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope --- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow --- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant --- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode --- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab --- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey --- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey --- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey --- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood --- ["The Savior"] = "", -- A_Classic_Fairytale:journey --- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab --- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow --- ["The Showdown"] = "", -- A_Classic_Fairytale:shadow --- ["The Slaughter"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:first_blood + ["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 one is pretty hard! |Tip: You have to do multiple swings!"] = "Następne jest bardzo trudne!|Porada: Masz wielokrotne wymachy!", -- Basic_Training_-_Rope + ["Then how do they keep appearing?"] = "Więc jak oni się cały czas pojawiają?", -- A_Classic_Fairytale:shadow + ["The Ninja-Samurai Alliance"] = "Sojusz Ninja-Samurajski", -- + ["Then prepare for battle!"] = "Więc przygotuj się na bitwę!", -- A_Space_Adventure:death01 + ["Then what am I?"] = "Więc czym jestem?", -- A_Classic_Fairytale:epil + ["The only woman, huh?"] = "Jedyna kobieta, co?", -- A_Classic_Fairytale:epil + ["The opression of the elders, of course!"] = "Ucisk starszych, oczywiście!", -- A_Classic_Fairytale:queen + ["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 + ["The RC plane only carries 2 weak bombs."] = "Radiowy samolocik niesie tylko 2 słabe bomby.", -- Battalion + ["There are a variety of structures available to aid you."] = "Jest różnorodność dostępnych struktur, by ci pomóc.", -- Construction_Mode + ["There are no snarky comments this time."] = "Tym razem nie ma komentarzy.", -- Space_Invasion + ["There is one below us!"] = "Jedna jest pod nami!", -- A_Space_Adventure:ice01 + ["There must be a spy among us!"] = "Musi być między nami szpieg!", -- A_Classic_Fairytale:backstab + ["There's more of them? When did they become so hungry?"] = "Jest ich więcej? Kiedy oni stali się tacy głodni?", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united + ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "Nie ma dla mnie nic bardziej satysfakcjonującego, niż widzenie jak dzielisz się swoją pięknością ze światem każdego ranka, moja księżniczko!", -- A_Classic_Fairytale:journey + ["There's nothing more satisfying to us than seeing you share your beauty..."] = "Nie ma dla mnie nic bardziej satysfakcjonującego, niż widzenie jak dzielisz się swoją pięknością...", -- A_Classic_Fairytale:journey + ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "Nie ma dla nas nic bardziej satysfakcjonującego, niż widzenie jak dzielisz się swoją pięknością ze światem każdego ranka, moja księżniczko!", -- A_Classic_Fairytale:journey + ["The Rising"] = "Powstanie", -- A_Classic_Fairytale:first_blood + ["The rope won't get reset."] = "Lina się nie zresetuje.", -- A_Space_Adventure:death02 + ["The Savior"] = "Wybawiciel", -- A_Classic_Fairytale:journey + ["These primitive people are so funny!"] = "Prymitywni ludzie są tacy zabawni!", -- A_Classic_Fairytale:backstab + ["The Shadow Falls"] = "Zapada cień", -- A_Classic_Fairytale:shadow + ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood --- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood --- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey --- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood --- ["The Union"] = "", -- A_Classic_Fairytale:enemy --- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey --- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow --- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood --- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood --- ["The what?!"] = "", -- A_Classic_Fairytale:dragon --- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood --- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion --- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united --- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy --- ["They never learn"] = "", -- A_Classic_Fairytale:journey --- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy --- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy --- ["Thighlicker"] = "", -- A_Classic_Fairytale:united --- ["This is it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood --- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy --- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon --- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow --- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab --- ["This one's tricky."] = "", --- ["This rain is really something..."] = "", --- ["This will be fun!"] = "", -- A_Classic_Fairytale:enemy --- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["TIME: "] = "CZAS: ", --- ["Timed Kamikaze!"] = "", - ["Time Extended!"] = "Więcej Czasu!", - ["Time Extension"] = "Dodatkowy Czas!", --- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Wł/Wył Osłonę", --- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey --- ["To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"] = "", -- A_Classic_Fairytale:shadow --- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon --- ["To the caves..."] = "", -- A_Classic_Fairytale:united - ["Toxic Team"] = "Toksyczny zespół", - ["TRACK COMPLETED"] = "UKOŃCZONO TRASĘ", - --- ["training"] = "", -- portal --- ["Traitors"] = "", -- A_Classic_Fairytale:epil --- ["Tribe"] = "", -- A_Classic_Fairytale:backstab + ["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 team continued their quest of finding the rest of the tribe."] = "Drużyna kontynuowała swoje zadanie odnalezienia reszty plemienia.", -- A_Classic_Fairytale:queen + ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "Czas, który ci pozostanie po dotarciu do niebieskiego jeża, zosanie dodany do następnej tury.", -- A_Space_Adventure:moon02 + ["The Torment"] = "Udręka", -- A_Classic_Fairytale:first_blood + ["The truth about Professor Hogevil"] = "Prawda o Profesorze Jeżozło", -- A_Space_Adventure:moon02 + ["The tunnel entrance is over there."] = "Wejście do tunelu jest tutaj.", -- A_Space_Adventure:desert01 + ["The tunnel is about to get flooded!"] = "Tunel zaraz zostanie zalany!", -- A_Space_Adventure:desert02 + ["The Tunnel Maker"] = "Wytwórca Tuneli", -- A_Classic_Fairytale:journey + ["The Ultimate Weapon"] = "Broń Ostateczna", -- A_Classic_Fairytale:first_blood + ["The Union"] = "Unia", -- A_Classic_Fairytale:enemy + ["The village, unprepared, was destroyed by the cyborgs..."] = "Wioska, nieprzygotowana, została zniszczona przez cyborgów...", -- A_Classic_Fairytale:journey + ["The walk of Fame"] = "Spacer Chwały", -- A_Classic_Fairytale:shadow + ["The wasted youth"] = "Zmarnowana młodość", -- A_Classic_Fairytale:first_blood + ["The way you handled your little internal conflicts …"] = "Sposób, w który radziliście sobie ze swoimi małymi, wewnętrznymi konfliktami...", -- A_Classic_Fairytale:queen + ["The weapon in that last crate was bestowed upon us by the ancients!"] = "Broń w tej ostatniej skrzyni została nam darowana przez starożytnych!", -- A_Classic_Fairytale:first_blood + ["The what?!"] = "Że co?", -- A_Classic_Fairytale:dragon + ["The wind whispers that you are ready to become familiar with tools, now..."] = "Wiatr szepcze, że stałeś się już gotowy, by zapoznać się z narzędziami...", -- A_Classic_Fairytale:first_blood + ["They are all waiting back in the village, haha."] = "Oni wszyscy już czekają w wiosce, haha.", -- A_Classic_Fairytale:enemy + ["They are up there! Take this rope and hurry!"] = "One są tam na górze! Weź tę linę i się pośpiesz!", -- A_Space_Adventure:moon01 + ["They Call Me Bullseye! +16 points!"] = "Zwą mnie Oczko! +16 punktów!", -- Space_Invasion + ["They have weapons we've never seen before!"] = "Mają bronie, których nigdy wcześniej nie widzieliśmy!", -- A_Classic_Fairytale:united + ["They keep appearing like this. It's weird!"] = "Oni pojawiają się tak po prostu. To dziwne!", -- A_Classic_Fairytale:united + ["They killed %s! You bastards!"] = "Oni zabili %s! Wy dranie!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united + ["They must be trying to weaken us!"] = "Muszą próbować nas osłabić!", -- A_Classic_Fairytale:enemy + ["They never learn"] = "Nigdy się nie nauczą", -- A_Classic_Fairytale:journey + ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "Natknęli się na kupkę broni, wydawali się zbliżać.", -- A_Classic_Fairytale:queen + ["They told us to wear these clothes. They said that this is the newest trend."] = "Powiedzieli nam, by nosić te ubrania. Powiedzieli, że jest to najnowszy trend.", -- A_Classic_Fairytale:enemy + ["They've been manipulating us all this time!"] = "Manipulowali nami cały ten czas!", -- A_Classic_Fairytale:enemy + ["They won't hesitate to attack you in order to rob you!"] = "Nie zawahają się oni cię zaatakować, by cię obrabować!", -- A_Space_Adventure:desert01 + ["The Zoo"] = "Zoo", -- + ["Thighlicker"] = "Udolizacz", -- A_Classic_Fairytale:united + ["Things are going to get messy around here."] = "Sprawy tutaj staną się kłopotliwe.", -- A_Space_Adventure:fruit01 + ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "To pozwala ci stworzyć skrzynię gdziekolwiek|wewnątrz strefy wpływu klanu,|kosztem energii.", -- Construction_Mode + ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "To pozwala ci stworzyć i ustawić miny, samoprzylepne|miny i beczki gdziekolwiek wewnątrz strefy wpływu|twojego klanu, kosztem energii.|Góra/dół: Wybierz typ obiektu|Lewo/prawo: Wybierz czas (dla min)|Kursor: Ustaw obiekt", -- Construction_Mode + ["This almost concludes our tutorial."] = "To prawie kończy nasz samouczek.", -- Basic_Training_-_Flying_Saucer + ["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 it! It's time to make Fell From Heaven fall for me..."] = "To jest to! Już czas sprawić, że Updały z Niebios zakocha się we mnie...", -- A_Classic_Fairytale:first_blood + ["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 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 + ["This one's tricky."] = "Ten jest podchwytliwy.", + ["This planet seems dangerous!"] = "Ta planeta wydaje się niebezpieczna!", -- A_Space_Adventure:cosmos + ["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 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 + ["This will certianly come in handy."] = "To zdecydowanie się przyda.", -- User_Mission_-_Teamwork_2 + ["Thompson"] = "Tomson", -- + ["Those aliens are destroying the island!"] = "Ci obcy niszczą naszą wyspę!", -- A_Classic_Fairytale:family + ["Those were scheduled for disposal anyway."] = "Ci i tak mieli iść do śmieci.", -- A_Classic_Fairytale:dragon + ["Throw a baseball at your foes|and send them flying!"] = "Rzuć piłkę baseballową w swoich wrogów|i spraw, że polecą.", -- Knockball + ["Thug #%d"] = "Zbir #%d", -- A_Space_Adventure:death01 + ["Timbers"] = "Drewna", -- + ["Time: %.1fs"] = "Czas: %.1fs", -- Racer, TechRacer + ["Time Box"] = "TARDIS", -- Construction_Mode + ["Timed Kamikaze! +10 points!"] = "Wymierzony kamikaze! +10 punktów!", -- Space_Invasion + ["Time extended! +%dsec"] = "Czas przedłużony! +%dsek", -- Space_Invasion + ["Time extension: %ds"] = "Rozszerzenie czasu: %ds", -- Tumbler + ["Time for a more interesting stunt, but first just collect the next crate!"] = "Czas na bardziej interesujący wyczyn, ale najpierw zbierz następną skrzynię!", -- Basic_Training_-_Flying_Saucer + ["Time's up!"] = "Koniec czasu!", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion + ["Time’s up!"] = "Koniec czasu!", -- TargetPractice + ["Time to run!"] = "Czas uciekać!", -- A_Space_Adventure:fruit01 + ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "Porada: Celowanie podczas latanie jest bardzo trudne, więc ustaw sobie zanim odlecisz.", -- Basic_Training_-_Flying_Saucer + ["Tip: Don't remain for too long in the water, or you won't make it."] = "Porada: Nie pozostawaj zbyt długo w wodzie, bo ci się nie uda.", -- Basic_Training_-_Flying_Saucer + ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "Porada: Jeśli utkniesz w tym treningu, użyj \"Pominięcia tury\", by zrestartować aktualne zadanie.", -- Basic_Training_-_Flying_Saucer + ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "Porada: Wciśnij przycisk \"esc\" (to menu), jeśli chcesz zobaczyć kontynent aktualnie grającej drużyny lub specjały tego kontynentu.", -- Continental_supplies + ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "Porada: Fizyka liny jest inna od tej w prawdziwym świecie.|Wykorzystaj to na swoją korzyść!", -- Basic_Training_-_Rope + ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "Porada: Możesz zmienić swój latający talerz|podczas lotu, wciskając dwukrotnie przycisk [Atak].", -- Basic_Training_-_Flying_Saucer + ["Tiyuri"] = "Tiyuri", -- + ["Toad"] = "Ropucha", -- + ["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 + ["To help you, of course!"] = "By ci pomóc, oczywiście!", -- A_Classic_Fairytale:journey + ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "By wystrzelić pocisk w locie, przytrzymaj [Precyzja] i naciśnij [Długi skok].", -- Basic_Training_-_Flying_Saucer + ["Tony"] = "Tony", -- + ["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 + ["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 + ["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 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 + ["To win the game you have to pass into the rings in time."] = "By wygrać grę, musisz na czas przejść przez pierścienie.", -- A_Space_Adventure:ice02 + ["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 + ["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 + ["Tribe"] = "Plemię", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "TrophyRace", --- ["Try to protect the chief! You won't lose if he dies, but it is advised that he survives."] = "", -- A_Classic_Fairytale:united + ["Trunks"] = "Trunks", -- + ["Try again!"] = "Spróbuj ponownie!", -- Basic_Training_-_Flying_Saucer + ["Try it now and dive here to collect the crate on the right girder."] = "Spróbuj teraz i zanurkuj tu, by zebrać skrzynię na prawej belce.", -- Basic_Training_-_Flying_Saucer + ["Try not to get spotted by the guards!"] = "Spróbuj nie zostać zauważonym przez straże!", -- A_Space_Adventure:cosmos + ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "Spróbuj być mądry i wyeliminuj ich szybko. W ten sposób, możesz odstraszyć resztę!", -- A_Space_Adventure:fruit01 + ["Try to keep as many allies alive as possible."] = "Spróbuj utrzymać przy życiu najwięcej sojuszników, ile się da.", -- A_Space_Adventure:fruit01 + ["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 ["T_T"] = "T_T", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Długość Tury", --- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey --- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow --- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant --- ["Under Construction"] = "", -- A_Classic_Fairytale:shadow --- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon --- ["Unique new weapons"] = "", -- Continental_supplies --- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family --- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united + ["Tumbler"] = "Akrobata", -- Tumbler + ["Turns: Hogs get %d random weapon(s) from their pool"] = "Tury: Jeż dostaje %d losowych broni ze swojej puli", -- Battalion + ["Turns: King's health is set to %d%% of the team health"] = "Tury: Zdrowie króla jest ustawione na %d%% zdrowia drużyny", -- Battalion + ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "Tura: Odnów %d broni i %d punktów pomocniczych|i wylosuj bronie i pomocników według punktów drużyny", -- Battalion + ["Turns until arrival: %d"] = "Tury do przybycia: %d", -- A_Classic_Fairytale:backstab + ["Turn Time: %dsec"] = "Czas tury: %dsec", -- Space_Invasion + ["Twenty-Twenty"] = "Dwadzieścia-dzieścia", -- + ["Two flowers: All missions complete"] = "Dwa kwiaty: Wszystkie misje ukończone", -- A_Space_Adventure:cosmos + ["Two little hogs cooperating, getting past obstacles..."] = "Dwa małe jeże współpracują, pokonując przeszkody...", -- A_Classic_Fairytale:journey + ["Ugly Mug"] = "Brzydki Bandyta", -- + ["Uhm...I met one of them and took his weapons."] = "Um... Spotkałem jednego z nich i zabrałem mu bronie.", -- A_Classic_Fairytale:shadow + ["Uhmm, it's … uhm … my ring!"] = "Umm, to... um... mój pierścień!", -- A_Classic_Fairytale:queen + ["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 + ["Under the meteorites shadow ..."] = "Pod cieniem meteorytu...", -- A_Space_Adventure:cosmos + ["Unexpected Igor"] = "Nieoczekiwany Igor", -- A_Classic_Fairytale:dragon + ["Unique new weapons"] = "Unikalne nowe bronie", -- Continental_supplies + ["Unit 0x0007"] = "Jednostka 0x0007", -- A_Classic_Fairytale:family + ["Unit 189"] = "Jednostka 189", -- + ["Unit 234"] = "Jednostka 234", -- + ["Unit 333"] = "Jednostka 333", -- + ["Unit 334a$7%;.*"] = "Jednostka 334a$7%;.*", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Jednostka 3378", + ["Unit 485"] = "Jednostka 485", -- + ["Unit 527"] = "Jednostka 527", -- + ["Unit 638"] = "Jednostka 638", -- + ["Unit 709"] = "Jednostka 709", -- ["Unit 835"] = "Jednostka 835", --- ["United We Stand"] = "", -- A_Classic_Fairytale:united + ["Unit 883"] = "Jednostka 883", -- + ["United We Stand"] = "Zgoda buduje", -- A_Classic_Fairytale:united ["Unit"] = "Jednostka", + ["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"] = "", -- User_Mission_-_Rope_Knock_Challenge + ["Unlucky Sods"] = "Pechowi Kolesie", -- User_Mission_-_Rope_Knock_Challenge ["Unstoppable!"] = "Nie do zatrzymania!", --- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood --- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon --- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood --- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode --- ["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 rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Use your ready time to think."] = "", -- Frenzy - ["Use your rope to get from start to finish as fast as you can!"] = "Użyj liny by jak najszybciej dotrzeć od startu do mety", --- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode --- ["Vedgies"] = "", -- A_Classic_Fairytale:journey --- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy --- ["Victory!"] = "", -- Basic_Training_-_Rope + ["Unsuspecting Louts"] = "Niepodejrzewające Chamy", -- User_Mission_-_Rope_Knock_Challenge + ["Up/Down: Change placement mode"] = "Góra/Dół: Zmień tryb stawiania", -- HedgeEditor + ["Up/down: Choose crate type"] = "Góra/Dół: Zmień typ skrzyni", -- Construction_Mode + ["Upper-class elite pilot"] = "Elitarny pilot wyższej klasy", -- User_Mission_-_RCPlane_Challenge + ["Use it wisely!"] = "Użyj tego mądrze!", -- A_Classic_Fairytale:dragon + ["Use it with precaution!"] = "Użyj tego z ostrożnośćią!", -- A_Classic_Fairytale:first_blood + ["User Challenge"] = "Wyzwanie użytkownika", + ["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 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 + ["Use the rope to get on the head of the mole, young one!"] = "Użyj liny, by dostać się na głowę jeża, młodzieńcze!", -- A_Classic_Fairytale:first_blood + ["Use the rope to get to the crate"] = "Użyj liny, by dostać się do skrzyni", -- A_Space_Adventure:cosmos + ["Use the rope to knock your enemies to their doom."] = "Użyj liny, by wybić swoich wrogów na ich zgubę.", -- User_Mission_-_Rope_Knock_Challenge + ["Use the rope to quickly get to the surface!"] = "Użyj liny, by szybko dostać się na powierzchnię!", -- A_Space_Adventure:desert02 + ["Use the saucer and fly away"] = "Użyj talerza i odleć", -- A_Space_Adventure:cosmos + ["Use the saucer and fly to the moon"] = "Użyj taerza i poleć na księżyc", -- A_Space_Adventure:cosmos + ["Use the shield to protect yourself from bazookas."] = "Użyj osłony, by chronić się przed bazookami.", -- Space_Invasion + ["Use the structure placer to place structures."] = "Użyj stawiacza struktur, by stawiać struktury.", -- Construction_Mode + ["Use your ammo wisely."] = "Użyj mądrze swojej amunicji.", -- A_Space_Adventure:desert01 + ["Use your available weapons in order to eliminate the enemies."] = "Użyj swoich dostępnych broni, żeby wyeliminować wrogów.", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 + ["Use your ready time to think."] = "Użyj swojego czasu przygotowania, by pomyśleć.", -- Frenzy + ["Use your rope to collect all crates as fast as possible."] = "Użyj swojej liny, by jak najszybciej zebrać wszystkie skrzynie.", -- SpeedShoppa + ["Use your rope to get from start to finish as fast as you can!"] = "Użyj liny, by jak najszybciej dotrzeć od startu do mety", + ["Utility Crate Placement Mode"] = "Tryb Stawiania Skrzyń z Narzędziami", -- Construction_Mode + ["UTILITY CRATE PLACEMENT MODE"] = "TRYB STAWIANIA SKRZYŃ Z NARZĘDZIAMI", -- HedgeEditor + ["Utility crates extend your time."] = "Skrzynie z narzędziami zwiększają twój czas.", -- Tumbler + ["Variants: Hogs will be randomized from 12 different variants"] = "Wariant: Jeże będą wylosowane z 12 różnych wariantów.", -- Battalion + ["Variants: Kings and air generals are disabled"] = "Wariant: Królowie i powietrzni generałowie są wyłączeni", -- Battalion + ["Variants: The last hog of each team will be a king"] = "Wariant: Ostatni jeż każdej drużyny będzie królem", -- Battalion + ["Vedgies"] = "Warzywka", -- A_Classic_Fairytale:journey + ["Vegan Jack"] = "Wegański Jacek", -- A_Classic_Fairytale:enemy + ["Vega"] = "Vega", -- + ["Very valuable, haha!"] = "Bardzo wartościowe, haha!", -- A_Classic_Fairytale:queen + ["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", --- ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW --- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode + ["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 + ["Vladimir"] = "Władimir", -- + ["Void"] = "Pustka", -- Big_Armory + ["Voldemort"] = "Voldemort", -- portal + ["Voltorb"] = "Voltorb", -- + ["Wait a moment …"] = "Czekaj no chwilę...", -- A_Space_Adventure:final + ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "Ściana przed skrzynią: Musisz dotknąć zaznaczonej ściany, zanim będziesz mógł zebrać skrzynie.", -- WxW + ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "Ściana przed skrzynią: Musisz dotknąć %d zaznaczonych ścian, zanim będziesz mógł zebrać skrzynie.", -- WxW + ["Wall set: No walls"] = "Ustawienie ścian: Bez ścian", -- WxW + ["Wall set: %s (%d walls)"] = "Ustawienie ścian: %s (%d ścian)", -- WxW + ["Wall set: %s"] = "Ustawienie ścian: %s", -- WxW + ["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 Shoppsta"] = "Shoppi Pozerzy", -- User_Mission_-_Rope_Knock_Challenge + ["Wario"] = "Wario", -- + ["Warning: Never ever leave the flying saucer while in water!"] = "Ostrzeżenie: Nigdy przenigdy nie opuszczaj latającego talerza pod wodą!", -- Basic_Training_-_Flying_Saucer + ["WARNING: Sabotage detected!"] = "OSTRZEŻENIE: Wykryto sabotaż!", -- Continental_supplies + ["Warrior"] = "Wojownik", -- Battalion + [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = " został wyciągnięty ze schematu|- Ten kontynent będzie mógł użyć specjali z innych kontynentów!", -- Continental_supplies + ["WatchBot 4000"] = "PaczBot 4000", -- User_Mission_-_Teamwork_2 + ["Watch your steps, young one!"] = "Patrz pod nogi, młodzieńczce!", -- A_Classic_Fairytale:first_blood + ["Watermelon Heart"] = "Melonowe Serce", -- A_Space_Adventure:fruit02 + ["Water: Rises by 37 per turn"] = "Woda: Podnosi się o 37 co turę", -- Battalion + ["Waypoint Editing Mode"] = "Tryb Edycji Punktów Kontrolnych", -- HedgeEditor + ["WAYPOINT EDITING MODE"] = "TRYB EDYCJI PUNKTÓW KONTROLNYCH", -- HedgeEditor + ["Waypoint placed. Available points remaining: %d"] = "Punkt kontrolny ustawiony. Pozostałe dostępne punkty: %d", -- Racer ["Waypoint placed."] = "Postawiono punkt kontrolny", - ["Way-Points Remaining"] = "Pozostało punktów: ", --- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow --- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood --- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode --- ["Weapon Filter"] = "", -- Construction_Mode --- ["weaponschemes"] = "", -- Continental_supplies - ["Weapons Reset"] = "Bronie odnawiają się", - ["Weapons reset."] = "Bronie odnawiają się.", -- Highlander --- ["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 --- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy --- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey --- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy --- ["We have to protect the village!"] = "", -- A_Classic_Fairytale:united --- ["We have to unite and defeat those cylergs!"] = "", -- A_Classic_Fairytale:enemy --- ["Welcome, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey + ["Waypoint placement phase"] = "Faza ustawiania punktów kontrolnych", -- Racer + ["Waypoint removed. Available points: %d"] = "Punkt kontrolny usunięty. Pozostałe punkty: %d", -- Racer + ["Waypoints remaining: %d"] = "Pozostałe punkty kontrolne: %d", -- Racer, TechRacer + ["Weaklings"] = "Słabeusze", -- A_Classic_Fairytale:shadow + ["We all know what happens when you get frightened..."] = "Wszyscy wiemy, co się dzieje, gdy się przestraszysz...", -- A_Classic_Fairytale:first_blood + ["Weapon Crate Placement Mode"] = "Tryb Ustawiania Skrzyń z Brońmi", -- Construction_Mode + ["WEAPON CRATE PLACEMENT MODE"] = "TRYB USTAWIANIA SKRZYŃ Z BROŃMI", -- HedgeEditor + ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "Filtr Broni: Dematerializuje całą amunicję| niesioną przez wroga, który wejdzie.", -- Construction_Mode + ["Weapon Filter"] = "Filtr Broni", -- Construction_Mode + ["weaponschemes"] = "schematy broni", -- Continental_supplies + ["Weapons: Each team starts with %d weapon points"] = "Bronie: ażda drużyna zaczyna z %d punktami broni", -- Battalion + ["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 + ["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 + ["We can't hold them up much longer!"] = "Nie możemy ich zatrzymać wiele dłużej!", -- A_Classic_Fairytale:united + ["We can't let them take over our little island!"] = "Nie możemy im pozwolić przejąć naszej małej wyspy!", -- A_Classic_Fairytale:enemy + ["We come in peace! Just let our friends go!"] = "Przychodzimy w pokoju! Wypuśćcie tylko naszych przyjaciół!", -- A_Classic_Fairytale:queen + ["We could just have blown up the meteorite from the the beginning!"] = "Mogliśmy od początku po prostu wysadzić ten meteoryt!", -- A_Space_Adventure:final + ["We don't have time for that now!"] = "Nie mamy teraz na to czasu!", -- A_Classic_Fairytale:queen + ["We have no time to waste..."] = "Nie mamy czasu do stracenia...", -- A_Classic_Fairytale:journey + ["We have nowhere else to live!"] = "Nie mamy gdzie indziej mieszkać!", -- A_Classic_Fairytale:enemy + ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "Zauważyliśmy wrogra! Zaatakujemy, kiedy wrogowie zaczną się zbierać!", -- A_Space_Adventure:fruit02 + ["We have to find our folk!"] = "Musimy odnaleźć naszych ludzi!", -- A_Classic_Fairytale:queen + ["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, Leaks A Lot!"] = "Witaj, Spory Przecieku!", -- A_Classic_Fairytale:journey + ["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 + ["Welcome to the meteorite!"] = "Witaj na meteorycie!", -- A_Space_Adventure:cosmos + ["Welcome to the moon!"] = "Witaj na księżycu!", -- A_Space_Adventure:cosmos + ["Welcome to the Planet of Ice!"] = "Witaj na Planecie Lodu!", -- A_Space_Adventure:cosmos ["Well done."] = "Dobra robota", --- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy --- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab --- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon --- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey --- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy --- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab --- ["We need to move!"] = "", -- A_Classic_Fairytale:united --- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab --- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow --- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow --- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family --- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey --- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood --- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy --- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family --- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood --- ["What are you doing? Let her go!"] = "", -- A_Classic_Fairytale:journey --- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow --- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon --- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab --- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood --- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab --- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab --- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy --- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab --- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy --- ["When?"] = "", -- A_Classic_Fairytale:enemy --- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon --- ["Where are all these crates coming from?!"] = "", -- A_Classic_Fairytale:shadow --- ["Where are they?!"] = "", -- A_Classic_Fairytale:backstab --- ["Where did that alien run?"] = "", -- A_Classic_Fairytale:dragon --- ["Where did you get the exploding apples?"] = "", -- A_Classic_Fairytale:shadow --- ["Where did you get the exploding apples and the magic bow that shoots many arrows?"] = "", -- A_Classic_Fairytale:shadow --- ["Where did you get the magic bow that shoots many arrows?"] = "", -- A_Classic_Fairytale:shadow --- ["Where did you get the weapons in the forest, Dense Cloud?"] = "", -- A_Classic_Fairytale:backstab --- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy --- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab --- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey --- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family --- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family --- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood --- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow --- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy --- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab --- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab --- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies --- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - - ["Will this ever end?"] = "Co to się kiedyś skończy?", --- ["WINNER IS "] = "", -- Mutant - ["WINNING TIME: "] = "ZWYCIĘSKI CZAS: ", --- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon --- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood --- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab --- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow --- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy --- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon --- ["Yeah...I think it's a 'he', lol."] = "", -- A_Classic_Fairytale:shadow --- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab --- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon --- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey --- ["Yes!"] = "", -- A_Classic_Fairytale:enemy --- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood --- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome --- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow --- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal --- ["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!"] = "Przysiągłbym, że woda zdaje się podnosić!", --- ["You'd better watch your steps..."] = "", -- A_Classic_Fairytale:journey --- ["You did not make it in time, try again!"] = "", -- Basic_Training_-_Rope --- ["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 "] = "", -- A_Classic_Fairytale:dragon --- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope --- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united --- ["You have failed to complete your task, young one!"] = "", -- A_Classic_Fairytale:journey --- ["You have failed to save the tribe!"] = "", -- A_Classic_Fairytale:backstab --- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy --- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy --- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab --- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood --- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy - ["You have SCORED!!"] = "Zdobyłeś PUNKT", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb --- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy --- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab --- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow --- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab --- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab --- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab --- ["You'll see what I mean!"] = "", -- A_Classic_Fairytale:enemy --- ["You may only attack from a rope!"] = "", -- WxW --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode --- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy --- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab --- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united --- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy --- ["Your death will not be in vain, Dense Cloud!"] = "", -- A_Classic_Fairytale:shadow --- ["You're...alive!? But we saw you die!"] = "", -- A_Classic_Fairytale:backstab --- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab --- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope --- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow --- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab --- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow --- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey --- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "Uratowałeś", --- ["You've been assaulting us, we have been just defending ourselves!"] = "", -- A_Classic_Fairytale:enemy + ["We'll give you a problem then!"] = "Więc sprawimy ci problem!", -- A_Classic_Fairytale:enemy + ["We'll play a game first."] = "Najpierw zagramy w grę.", -- A_Space_Adventure:moon02 + ["We'll spare your life for now!"] = "Na razie oszczędzimy twoje życie!", -- A_Classic_Fairytale:backstab + ["Well, that escalated quickly!"] = "Cóż, to eskalowało szybko.", -- ClimbHome + ["Well that was an unnecessary act of violence."] = "Cóż, to był niepotrzebny akt przemocy.", -- A_Classic_Fairytale:epil + ["Well, that was a waste of time."] = "Cóż, to była strata czasu.", -- A_Classic_Fairytale:dragon + ["We'll use our communicators to contact you."] = "Użyjemy naszych komunikatorów, by się z tobą skontaktować.", -- A_Space_Adventure:cosmos + ["Well, well! Isn't that the cutest thing you've ever seen?"] = "No no! Czy to nie najsłodsza rzecz, jaką kiedykolwiek widziałeś?", -- A_Classic_Fairytale:journey + ["Well, yes. This was a cyborg television show."] = "Cóż, tak. To był program telewizyjny cyborgów.", -- A_Classic_Fairytale:enemy + ["Well, you're about to wake up!"] = "Cóż, zaraz się obudzisz!", -- A_Classic_Fairytale:queen + ["We made sure noone followed us!"] = "Upewniliśmy się, że nikt nas nie śledził!", -- A_Classic_Fairytale:backstab + ["We need it to get split into at least two parts."] = "Musimy go podzielić co najmniej na dwie części.", -- A_Space_Adventure:cosmos + ["We need to go back!"] = "Musimy wrócic!", -- A_Classic_Fairytale:queen + ["We need to hurry!"] = "Musimy się śpieszyć!", -- A_Classic_Fairytale:queen + ["We need to move!"] = "Musimy ruszać!", -- A_Classic_Fairytale:united + ["We need to prevent their arrival!"] = "Musimy zapobiec ich przybyciu!", -- A_Classic_Fairytale:backstab + ["We need to warn the village."] = "Musimy ostrzec wioskę.", -- A_Classic_Fairytale:shadow + ["We need you to go there and detonate them yourself! Good luck!"] = "Musimy tam pójść i zdetonować je sami! Powodzenia!", -- A_Space_Adventure:cosmos + ["We oppressed her, the only woman in the tribe!"] = "Uciskaliśmy ją, jedyną kobietę w plemieniu!", -- A_Classic_Fairytale:epil + ["We're terribly sorry!"] = "Bardzo nam przykro!", -- A_Classic_Fairytale:epil + ["We risk our lives going through challenges."] = "Ryzykujemy nasze życia, przechodząc przez wyzwania.", -- A_Classic_Fairytale:queen + ["We should better report this and continue our watch!"] = "Lepiej powinniśmy to zgłosić i kontynuować naszą wartę!", -- A_Space_Adventure:cosmos + ["We should head back to the village now."] = "Powinniśmy udać się teraz z powrotem do wioski.", -- A_Classic_Fairytale:shadow + ["We, the youth, have to constantly prove our value."] = "My, młodzi, musimy stale dowodzić naszej wartości.", -- A_Classic_Fairytale:queen + ["We trusted you, you fool!"] = "Ufaliśmy ci, głupcze!", -- A_Classic_Fairytale:queen + ["We were trying to save her and we got lost."] = "Próbowaliśmy ją uratować i się zgubiliśmy.", -- A_Classic_Fairytale:family + ["We were your home! Your family!"] = "My byliśmy twoim domem! Twoją rodziną!", -- A_Classic_Fairytale:queen + ["We won't accept you destroying our village!"] = "Nie zaakceptujemy twojego niszczenia naszej wioski!", -- A_Classic_Fairytale:queen + ["We won't let you hurt any more of us!"] = "Nie pozwolimy ci skrzywdzić więcej z nas!", -- A_Classic_Fairytale:queen + ["We won't let you hurt her!"] = "Nie pozwolimy ci jej skrzywdzić!", -- A_Classic_Fairytale:journey + ["We work and work until we sweat blood."] = "Pracujemy i pracujemy, aż pocimy się krwią.", -- A_Classic_Fairytale:queen + ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "Co? Kanibal? Tutaj? Nie ma czasu do stracenia! Chodź, jesteś przygotowany.", -- A_Classic_Fairytale:first_blood + ["What a douche!"] = "Co za dupek!", -- A_Classic_Fairytale:enemy + ["What am I gonna...eat, yo?"] = "Co ja zamierzam... zjeść, joł?", -- A_Classic_Fairytale:family + ["What are you doing at a distance so great, young one?"] = "Co robisz w odległości tak wielkiej, młodzieńcze?", -- A_Classic_Fairytale:first_blood + ["What are you doing? Let her go!"] = "Co ty robisz? Wypuść ją!", -- A_Classic_Fairytale:journey + ["What a ride!"] = "Co za jazda!", -- A_Classic_Fairytale:shadow + ["What a strange cave!"] = "Co za dziwna jaskinia!", -- A_Classic_Fairytale:dragon + ["What a strange feeling!"] = "Co za dziwne uczucie!", -- A_Classic_Fairytale:backstab + ["What?!"] = "Co?!", -- A_Classic_Fairytale:queen + ["What could you possibly forget in that cage?"] = "Czego mógłbyś zapomnieć w tej klatce?", -- A_Classic_Fairytale:queen + ["What does it look like?"] = "Jak to wygląda?", -- A_Classic_Fairytale:queen + ["What do my faulty eyes observe? A spy!"] = "Co widzą moje wadliwe oczy? Szpiega!", -- A_Classic_Fairytale:first_blood + ["What do you say? Are you in?"] = "Co powiesz? Wchodzisz w to?", -- A_Space_Adventure:fruit02 + ["What do you say? Will you fight for us?"] = "Co powiesz? Będziesz dla nas walczył?", -- A_Space_Adventure:fruit01 + ["What do you want to do?"] = "Co chcesz zrobić?", -- A_Space_Adventure:fruit01 + ["Whatever floats your boat..."] = "Cokolwiek ci pasuje...", -- A_Classic_Fairytale:shadow + ["What?! For all this struggle I just win some ... time? Oh dear!"] = "Co?! Za cały ten wysiłek wygrałem tylko trochę... czasu? O rany!", -- portal + ["What has %s ever done to you?"] = "Co %s ci kiedykolwiek zrobił?", -- A_Classic_Fairytale:backstab + ["What? Here? How did they find us?!"] = "Co? Tutaj? Jak nas znaleźli?!", -- A_Classic_Fairytale:backstab + ["What? Is it over already?"] = "Co? To już koniec?", -- ClimbHome + ["What is it that you forgot?"] = "O czym takim zapomniałeś?", -- A_Classic_Fairytale:queen + ["What is this place?"] = "Co to za miejsce?", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy + ["What oppression? You were the most unoppressed member of the tribe!"] = "Jaki ucisk? Byłaś najbardziej nieuciskanym członkiem naszego plemienia!", -- A_Classic_Fairytale:queen + ["What shall we do with the traitor?"] = "Co powinniśmy zrobić ze zdrajcą?", -- A_Classic_Fairytale:backstab + ["What the?"] = "Co do?", -- A_Classic_Fairytale:queen + ["WHAT?! You're the ones attacking us!"] = "CO? To wy nas atakowaliście!", -- A_Classic_Fairytale:enemy + ["When I find it..."] = "Kiedy to znajdę...", -- A_Classic_Fairytale:dragon + ["When?"] = "Kiedy?", -- A_Classic_Fairytale:enemy + ["Where are all these crates coming from?!"] = "Skąd przychodzą te wszystkie skrzynie?!", -- A_Classic_Fairytale:shadow + ["Where are they?!"] = "Gdzie oni są?!", -- A_Classic_Fairytale:backstab + ["Where did that alien run?"] = "Gdzie ten obcy pobiegł?", -- A_Classic_Fairytale:dragon + ["Where did you get the exploding apples and the magic bow that shoots many arrows?"] = "Gdzie zdobyłeś eksplodujące jabłka i magiczny łuk, który strzela wieloma strzałami?", -- A_Classic_Fairytale:shadow + ["Where did you get the exploding apples?"] = "Gdzie ty zdobyłeś wybuchowe jabłka?", -- A_Classic_Fairytale:shadow + ["Where did you get the magic bow that shoots many arrows?"] = "Gdzie zdobyłeś magiczny łuk, który strzela wieloma strzałami?", -- A_Classic_Fairytale:shadow + ["Where did you get the weapons in the forest, Dense Cloud?"] = "Gdzie zdobyłeś bronie w lesie, Gęsta Chmuro?", -- A_Classic_Fairytale:backstab + ["Where do you get that?!"] = "Gdzie takie się zdobywa?", -- A_Classic_Fairytale:enemy + ["Where have you been?!"] = "Gdzie ty byłeś?!", -- A_Classic_Fairytale:backstab + ["Where have you been?"] = "Gdzie ty byłeś?", -- A_Classic_Fairytale:united + ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "W trybie modyfikacji, możesz zmienić|Flagę Terenu, klikając na obiekt.", -- HedgeEditor + ["White Tee"] = "Biały Cel", -- A_Space_Adventure:ice01 + ["Who's there?! I'll get you!"] = "Ko tam jest?! Dopadnę cię!", -- A_Space_Adventure:desert01 + ["Why are you doing this?"] = "Czemu to robisz?", -- A_Classic_Fairytale:journey + ["Why are you helping us, uhm...?"] = "Czemu nam pomagasz, um...?", -- A_Classic_Fairytale:family + ["Why can't he just let her go?!"] = "Czemu on nie może jej po prostu puścić?", -- A_Classic_Fairytale:family + ["Why?"] = "Czemu?", -- A_Classic_Fairytale:queen + ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "...czemu ryzykowałem moje życie, by zebrać wszystkie części urządzenia antygrawitacyjnego?", -- A_Space_Adventure:final + ["Why did you do this?"] = "Czemu to zrobiłaś?", -- A_Classic_Fairytale:queen + ["Why did you kill your father?"] = "Czemu zabiłaś swojego ojca?", -- A_Classic_Fairytale:queen + ["Why do men keep hurting me?"] = "Czemu mężczyźni cały czas mnie krzywdzą?", -- A_Classic_Fairytale:first_blood + ["Why do you always have to call me names?"] = "Czemu zawsze musisz mówić mi po imieniu?", -- A_Classic_Fairytale:queen + ["Why do you keep betraying us?"] = "Czemu wciąż nas zdradzasz?", -- A_Classic_Fairytale:queen + ["Why do you not like me?"] = "Czemu mnie nie lubisz?", -- A_Classic_Fairytale:shadow + ["Why do you want to take over our island?"] = "Czemu chcecie przejąć naszą wyspę?", -- A_Classic_Fairytale:enemy + ["Why me?!"] = "Czemu ja?!", -- A_Classic_Fairytale:backstab + ["Why %s? Why?"] = "Czemu %s? Czemu?", -- A_Classic_Fairytale:backstab + ["Why, why, why, why!"] = "Czemu, czemu, czemu, czemu!", -- A_Classic_Fairytale:queen + ["Why would they do this?"] = "Czemu mieliby to zrobić?", -- A_Classic_Fairytale:backstab + ["- Will Get 1-3 random weapons"] = "- Dostaniesz 1-3 losowych broni", -- Continental_supplies + ["- Will give you a parachute every second turn."] = "- Da ci spadochron co drugą turę.", -- Continental_supplies + ["Will this ever end?"] = "Czy to się kiedyś skończy?", + ["Will you give me the other parts?"] = "Dasz mi resztę części?", -- A_Space_Adventure:death01 + ["Winner: %s"] = "Zwycięzca: %s", -- Mutant + ["Winning time: %s"] = "Wygrywający czas: %s", -- Racer, TechRacer + ["Win"] = "Wygrana", -- A_Space_Adventure:ice01 + ["Wise Oak"] = "Mądry Dąb", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen + ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "Z Gęstą Chmurą w krainie cieni, jestem jedyną nadzieją wioski...", -- A_Classic_Fairytale:journey + ["With the rest of the tribe gone, it was up to %s to save the village."] = "Z resztą naszego plemienia nieobecną, jedynie %s mógł uratować wioskę.", -- A_Classic_Fairytale:dragon + ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "Nie martw się, gdyż jest to pokojowe zwierzę! Nie ma powodu się obawiać...", -- A_Classic_Fairytale:first_blood + ["Wow, what a dream!"] = "Wow, co za sen!", -- A_Classic_Fairytale:backstab + ["Xeli"] = "Xeli", -- + ["Xerxes"] = "Xerxes", -- + ["Y3K1337"] = "Y3K1337", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow + ["Yay, we won!"] = "Jej, wygraliśmy!", -- A_Classic_Fairytale:enemy + ["Y Chwiliad"] = "Y Człiliad", -- A_Classic_Fairytale:dragon + ["Yeah...I think it's a 'he', lol."] = "Racja... zdaje się, że to \"on\", lol.", -- A_Classic_Fairytale:shadow + ["Yeah, sure! I died. Hillarious!"] = "Racja, pewnie! Umarłem. Komiczne.", -- A_Classic_Fairytale:backstab + ["Yeah, take that!"] = "Tak, przyjmij to!", -- A_Classic_Fairytale:dragon + ["Yeah? Watcha gonna do? Cry?"] = "Tak? Co zamierzasz zrobić? Płakać?", -- A_Classic_Fairytale:journey + ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "Racja, cóż, żeby jakiś koleś był szczęśliwy, inny koleś musi cierpieć.", -- A_Classic_Fairytale:queen + ["Yellow Pepper"] = "Żółta Papryka", -- A_Space_Adventure:fruit01 + ["Yellow Watermelons"] = "Żółte Melony", -- A_Space_Adventure:fruit01 + ["Yellow"] = "Żółty", -- + ["Yes, but you're … different!"] = "Tak, ale ty jesteś... inny!", -- A_Classic_Fairytale:queen + ["Yes!"] = "Tak!", -- A_Classic_Fairytale:enemy + ["Yes, yeees! You are now ready to enter the real world!"] = "Tak, taaak! Jesteś teraz gotowy, by wejść w prawdziwy świat!", -- A_Classic_Fairytale:first_blood + ["Yeti"] = "Yeti", -- + ["Yikes!"] = "Jejciu!", -- A_Space_Adventure:desert01 + ["Yo, dude! Get away from our weapons!"] = "Hej, ziom! Odejdź od naszych broni!", -- A_Classic_Fairytale:queen + ["Yo, dude, we're here, too!"] = "Hej, ziom, my też tu jesteśmy!", -- A_Classic_Fairytale:family + ["Yo, escort my buttocks!"] = "Ej ty, eskortuj moje pośladki!", -- A_Classic_Fairytale:queen + ["Yoshi"] = "Yoshi", -- + ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "Hej, obcy dali mi rośliny. Medyczne rośliny. Dużo roślin.", -- A_Classic_Fairytale:queen + ["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."] = "Jesteś daleko od domu, a woda się podwyższa. Wspinaj się najwyżej jak potrafisz!|Twój wynik będzie zależeć od twojej wysokości.", -- ClimbHome + ["You are given the chance to turn your life around..."] = "Masz szansę odwrócić swoje życie...", -- A_Classic_Fairytale:shadow + ["You are in control of all the active ally units."] = "Sprawujesz kontrolę nad wszystkimi aktywnymi sprzymierzonymi jednostkami.", -- A_Space_Adventure:fruit01 + ["You are indeed the best PAotH pilot."] = "Jesteś doprawdy najlepszym pilotem PSJ.", -- A_Space_Adventure:desert03 + ["You are out of danger, time to go to the moon!"] = "Jesteś poza niebezpieczeństwem, czas lecieć na księżyc!", -- A_Space_Adventure:cosmos + ["You are playing with our lives here!"] = "Bawisz się tu naszymi życiami!", -- A_Classic_Fairytale:enemy + ["You are sabotaged, RUN!"] = "Jesteś sabotowany, UCIEKAJ!", -- Continental_supplies + ["You are the one who fled! So, you are alive."] = "Ty jesteś tym, który uciekł! Więc, przeżyłeś.", -- A_Space_Adventure:fruit02 + ["You bear impressive skills, %s!"] = "Posiadasz imponujące zdolności, %s!", -- A_Classic_Fairytale:dragon + ["You can always trust me! I love you!"] = "Zawsze możesz mi ufać! Kocham cię!", -- A_Classic_Fairytale:epil + ["You can always trust me!"] = "Zawsze możesz mi ufać!", -- A_Classic_Fairytale:epil + ["You can avoid some battles."] = "Możesz uniknąć niektórych bitw.", -- A_Space_Adventure:desert01 + ["You can choose another planet by replaying this mission."] = "Możesz wyrać inną planetę, grając w tę misję jeszcze raz.", -- A_Space_Adventure:cosmos + ["You can dive with your flying saucer!"] = "Możesz nurkować swoim spodkiem!", -- Basic_Training_-_Flying_Saucer + ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "Możesz zmieniać kierunek celowania w locie, jeśli najpierw przytrzymasz [Precyzja], a potem wciśniesz [Góra] lub [Dół].", -- Basic_Training_-_Flying_Saucer + ["You can further customize the race by changing the scheme script paramater."] = "Możesz jeszcze dostosować swój wyścig, zmieniając parametr skryptu w schemacie.", -- TechRacer + ["You can only use the sniper rifle or the watermelon bomb."] = "Możesz użyć tylko karabinu snajperskiego lub bomby arbuzowej.", -- A_Space_Adventure:fruit03 + ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "W tej misji możesz poćwiczyć chodzenie i używanie narzędzi.|Jednakże, ona nigdy się nie skończy!", -- A_Classic_Fairytale:epil + ["- You can switch between hogs at the start of your turns. (Not first one)"] = "- Możesz zmieniać między jeżami na początku swoich tur. (Nie tej pierwszej)", -- Continental_supplies + ["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 choose well, Hog Solo!"] = "Wybierz dobrze, Hog Solo!", -- 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 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 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 + ["You drove the minions away."] = "Odpędziłeś sługusów.", -- A_Space_Adventure:moon01 + ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "Zdobyłeś osiągnięcie \"Mistrz Liny\" za ukończenie poniżej 50 sekund.", -- Basic_Training_-_Rope + ["You endangered your whole tribe, you bastard!"] = "Naraziłeś całe swoje plemię, ty draniu!", -- A_Classic_Fairytale:queen + ["You failed!"] = "Ponosisz porażkę!", -- Basic_Training_-_Rope + ["You failed to kill all enemies in a single turn."] = "Nie udało ci się zabić wszystkich wrogów w jednej turze.", -- Big_Armory + ["You failed to kill all enemies in this turn."] = "Nie udało ci się zabić wszystkich wrogów w tej turze.", -- Big_Armory + ["You fought bravely and you helped us win this battle!"] = "Walczyłeś dzielnie i pomogłeś nam wygrać tę bitwę!", -- A_Space_Adventure:fruit02 + ["You give me no choice!"] = "Nie pozostawiasz mi wyboru!", -- A_Classic_Fairytale:queen + ["You got a killer mask there, amigo!"] = "Masz tu zabójczą maskę, amigo!", -- A_Classic_Fairytale:epil + ["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 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 beaten the challenge!"] = "Pokonałeś wyzwanie!", -- ClimbHome + ["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 + ["You have chosen to flee."] = "Wybrałeś ucieczkę.", -- A_Space_Adventure:fruit01 + ["You have collected %d out of %d crate(s)."] = "Zebrałeś %d z %d skrzyń.", -- SpeedShoppa + ["You have completed this challenge in %.2f s (+%d points)."] = "Ukończyłeś to wyzwanie w %.2fs (+%d punktów).", -- User_Mission_-_Rope_Knock_Challenge + ["You have destroyed all targets!"] = "Zniszczyłeś wszystkie cele!", -- TargetPractice + ["You have destroyed all the targets."] = "Zniszczyłeś wszystkie cele.", -- A_Space_Adventure:desert03 + ["You have destroyed %d of %d targets (+%d points)."] = "Zniszczyłeś %d z %d celów (+%d punktów)", -- Basic_Training_-_Sniper_Rifle, TargetPractice + ["You have destroyed %d of %d targets."] = "Zniszczyłeś %d z %d celów.", -- Basic_Training_-_Bazooka + ["You have dropped %d missiles."] = "Upuściłeś %d rakiet.", -- User_Mission_-_RCPlane_Challenge + ["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 + ["You have finally figured it out!"] = "Nareszcie to wykombinowałeś!", -- A_Classic_Fairytale:enemy + ["You have finished the Basic Rope Training!"] = "Ukończyłeś podstawowy trening linowy!", -- Basic_Training_-_Rope + ["You have finished the bazooka training!"] = "Ukończyłeś trening bazookowy!", -- Basic_Training_-_Bazooka + ["You have finished the challenge in %.3f s."] = "Ukończyłeś wyzwanie w %.3fs.", -- SpeedShoppa + ["You have finished the challenge!"] = "Ukończyłęś wyzwanie!", -- User_Mission_-_RCPlane_Challenge + ["You have finished the Flying Saucer Training!"] = "Ukończyłeś trening latającego spodka!", -- Basic_Training_-_Flying_Saucer + ["You have finished the target practice!"] = "Ukończyłeś ćwiczenie celności!", -- TargetPractice + ["You have kidnapped our whole tribe!"] = "Porwałeś całe nasze plemię!", -- A_Classic_Fairytale:enemy + ["You have killed all enemies."] = "Zabiłeś wszystkich wrogów.", -- Big_Armory + ["You have killed an innocent hedgehog!"] = "Zabiłeś niewinnego jeża!", -- A_Classic_Fairytale:backstab + ["You have killed %d of 16 hedgehogs (+%d points)."] = "Zabiłeś %d z 16 jeży (+%d punktów)", -- User_Mission_-_Rope_Knock_Challenge + ["You have launched %d bazookas."] = "Wystrzeliłeś %d bazook.", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka + ["You have launched %d homing bees."] = "Wystrzeliłeś %d pszczół.", -- Target_Practice_-_Homing_Bee + ["You have made %d shots."] = "Wykonałeś %d strzałów.", -- Basic_Training_-_Sniper_Rifle + ["You have managed to catch the blue hedgehog in %.3f seconds."] = "Udało ci się złapać niebieskiego jeża w %.3f sekund.", -- A_Space_Adventure:moon02 + ["You have never worked a bit in your life!"] = "Nigdy nie pracowałaś ani trochę w swoim życiu!", -- A_Classic_Fairytale:queen + ["You have nothing to be afraid of now."] = "Teraz nie masz się czego bać.", -- A_Classic_Fairytale:epil + ["You haven't rescued anyone."] = "Nikogo nie uratowałeś.", -- User_Mission_-_That_Sinking_Feeling + ["You have obtained an achievement: Lively Lifeguard"] = "Zdobyłeś osiągnięcie: Żwawy Ratownik", -- User_Mission_-_That_Sinking_Feeling + ["You have perfectly beaten the challenge!"] = "Perfekcyjnie pokonałeś wyzwanie!", -- User_Mission_-_RCPlane_Challenge + ["You have proven yourself worthy to see our most ancient secret!"] = "Udowodniłeś, że jesteś godny, by zobaczyć nasz najbardziej starożytny sekret!", -- A_Classic_Fairytale:first_blood + ["You have proven yourselves worthy!"] = "Udowodniliście, że jesteście godni!", -- A_Classic_Fairytale:enemy + ["You have reached the take-off area successfully!"] = "Dotarłeś pomyślnie do strefy odlotu!", -- A_Space_Adventure:fruit01 + ["You have rescued H and Dr. Cornelius."] = "Uratowałeś J i Dr Korneliusza.", -- A_Space_Adventure:death01 + ["You have SCORED!!"] = "Zdobyłeś PUNKT!!", + ["You have shot %d times."] = "Strzeliłeś %d razy.", -- TargetPractice + ["You have successfully eliminated Professor Hogevil."] = "Pomyślnie wyeliminowałeś Profesora Jeżozło.", -- A_Space_Adventure:death01 + ["You have successfully finished the campaign!"] = "Pomyślnie ukończyłeś kampanię!", -- A_Classic_Fairytale:epil + ["You have successfully finished the sniper rifle training!"] = "Pomyślnie ukończyłeś trening karabinem snajperskim!", -- Basic_Training_-_Sniper_Rifle + ["You have thrown %d cluster bombs."] = "Wyrzuciłeś %d granatów odłamkowych.", -- Target_Practice_-_Cluster_Bomb + ["You have thrown %d grenades."] = "Wyrzuciłeś %d granatów.", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard + ["You have to be careful and must not die!"] = "Musisz być ostrożny i nie możesz umrzeć!", -- A_Space_Adventure:cosmos + ["You have to catch the other hog 3 times."] = "Musisz złapać tamtego jeża 3 razy.", -- A_Space_Adventure:moon02 + ["You have to complete the main mission on moon in order to travel to other planets."] = "Musisz ukończyć główną misję na księżycu, by podróżować na inne planety.", -- A_Space_Adventure:cosmos + ["You have to continue alone from now on."] = "Od teraz musisz kontynuować samemu.", -- A_Space_Adventure:cosmos + ["You have to destroy all the explosives without dying!"] = "Musisz zniszczyć wszystkie ładunki wybuchowe bez umierania!", -- A_Space_Adventure:final + ["You have to destroy all the targets."] = "Musisz zniszczyć wszystkie cele.", -- A_Space_Adventure:desert03 + ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "Musisz zniszczyć cel powyżej, upuszczając na niego granat z twojego latającego talerza.", -- Basic_Training_-_Flying_Saucer + ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "Musisz zniszczyć dwa cele, ale poprzednia technika byłaby bardzo trudna lub niebezpieczna do użycia.", -- Basic_Training_-_Flying_Saucer + ["You have to eliminate all the enemies."] = "Musisz wyeliminować wszystkich wrogów.", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 + ["You have to eliminate all the visible enemies."] = "Musisz wyeliminować wszystkich widocznych wrogów.", -- A_Space_Adventure:fruit01 + ["You have to get the weapons and rescue the PAotH researchers."] = "Musisz zdobyć bronie i uratować naukowców PSJ.", -- A_Space_Adventure:moon01 + ["You have to get to the left-most land and remove any enemy hog from there."] = "Musisz dostać się do lądu po lewej i usunać stamtąd każdego wroga.", -- A_Space_Adventure:fruit01 + ["You have to go back to the moon!"] = "Musisz wrócić na księżyc!", -- A_Space_Adventure:cosmos + ["You have to move upwards, not downwards, %s!"] = "Musisz poruszać się w górę, nie w dół, %s!", -- ClimbHome + ["You have to reach the left-most place on the map."] = "Musisz dostać się na lewą część mapy.", -- A_Space_Adventure:fruit01 + ["You have to stand very close to him"] = "Musisz stanąć bardzo blisko niego", -- A_Space_Adventure:moon02 + ["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 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 + ["You have violated PAotH regulations!"] = "Naruszyłeś regulacje PSJ!", -- A_Space_Adventure:cosmos + ["You have won the game by proving true cooperative skills!"] = "Wygrałeś grę, udowadniając prawdziwe zdolności współpracy!", -- A_Classic_Fairytale:enemy + ["You just appeared out of thin air!"] = "Właśnie pojawiłeś się znikąd!", -- A_Classic_Fairytale:backstab + ["You just can't let it go, can you!"] = "Po prostu nie możesz odpuścić, co!", -- A_Classic_Fairytale:queen + ["You just committed suicide..."] = "Właśnie popełniłeś samobójstwo...", -- A_Classic_Fairytale:shadow + ["You killed my father, you monster!"] = "Zabiłeś mojego ojca, ty potworze!", -- A_Classic_Fairytale:backstab + ["You know...taking a stroll."] = "No wiesz... udanie się na przechadzkę.", -- A_Classic_Fairytale:backstab + ["You know what? I don't even regret anything!"] = "Wiesz co? Nawet nic nie żałuję!", -- A_Classic_Fairytale:backstab + ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "Dostaniesz dodatkowy karabin snajperski za każdym razem, gdy zabijesz wrogiego jeża, z limitem maksymalnie 4 karabinów.", -- A_Space_Adventure:fruit03 + ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "Dostaniesz dodatkowy teleport za każdym razem, gdy zabijesz wrogiego jeża, z limitem maksymalnie 4 teleportów.", -- A_Space_Adventure:fruit03 + ["You'll get extra time in case you need it when you pass a ring."] = "Dostaniesz dodatkowy czas, na wypadek gdybyś go potrzebował, gdy przejdziesz pierścień.", -- A_Space_Adventure:ice02 + ["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 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 + ["You may only place 1 Extra Time crate per turn."] = "Możesz postawić tylko 1 skrzynię z Dodatkowym Czasem na turę.", -- Construction_Mode + ["You may only place %d crates per round."] = "Możesz postawić tylko %d skrzyń na turę.", -- Construction_Mode + ["- You may only score when your flag is in your base"] = "- Możesz zapunktować tylko, gdy twoja flaga jest w twojej bazie.", -- Capture_the_Flag + ["You meatbags are pretty slow, you know!"] = "Wy mięsne worki jesteście całkiem wolni, wiecie!", -- A_Classic_Fairytale:enemy + ["You might want to find a way to instantly kill arriving cannibals!"] = "Możesz chcieć znaleźć sposób, by natychmiastowo zabić przybywających kanibali!", -- A_Classic_Fairytale:backstab + ["You must attack from a rope, after you collected a crate!"] = "Musisz zaatakować z liny, po tym jak zbierzesz skrzynię!", -- WxW + ["You must first collect a crate before you attack!"] = "Musisz najpierw zdobyć skrzynię, zanim zaatakujesz!", -- WxW + ["You must survive the flood in order to score."] = "Musisz przeżyć powódź, żeby zapunktować.", -- User_Mission_-_That_Sinking_Feeling + ["You never give me plants!"] = "Nigdy nie dajesz mi roślin!", -- A_Classic_Fairytale:queen + ["Young one, you are telling us that they can instantly change location without a shaman?"] = "Młodzieńcze, mówisz nam, że mogą oni natychmiastowo zmienić lokację, bez szamana?", -- A_Classic_Fairytale:united + ["You now have infinite fuel, grenades and bazookas for fun."] = "Masz teraz nieskończona paliwo, granaty i bazooki, dla zabawy.", -- Basic_Training_-_Flying_Saucer + ["You only have 2 flying saucers this time."] = "Masz tym razem tylko 2 latające talerze.", -- Basic_Training_-_Flying_Saucer + ["You only have one flying saucer this time."] = "Masz tym razem tylko 1 latający talerz.", -- Basic_Training_-_Flying_Saucer + ["You probably know what to do next..."] = "Prawdopodobnie wiesz, co dalej robić...", -- A_Classic_Fairytale:first_blood + ["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 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 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 + ["You're a pathetic liar!"] = "Jesteś żałosnym kłamcą!", -- A_Classic_Fairytale:backstab + ["You're funny!"] = "Jesteś zabawny!", -- A_Classic_Fairytale:journey + ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "Stajesz się całkiem dobry!|Porada: Kiedy skrócisz swoją linę, poruszasz się szybciej!|A kiedy ją wydłużysz, poruszasz się wolniej.", -- Basic_Training_-_Rope + ["You're on your way to freeing your tribe!"] = "Jesteś na swojej drodze, by uwolnić twoje plemię!", -- A_Classic_Fairytale:queen + ["You're pathetic! You are not worthy of my attention..."] = "Jesteś żałosny! Nie jesteś godzien mojej uwagi...", -- A_Classic_Fairytale:shadow + ["You're probably wondering why I bought you back..."] = "Pewnie zastanawiacie się, dlaczego sprowadziłem was z powrotem...", -- A_Classic_Fairytale:backstab + ["Your escape took you %d turns."] = "Twoja ucieczka zajęła ci %d tur.", -- A_Space_Adventure:desert02 + ["You're so brave! I feel safe with you."] = "Jesteś taki odważny! Czuję się przy tobie bezpieczna.", -- A_Classic_Fairytale:epil + ["You're some piece of hypocrite junkie!"] = "Jesteś kawałkiem hipokryckiego ćpuna!", -- A_Classic_Fairytale:queen + ["You're terrorizing the forest...We won't catch anything like this!"] = "Terroryzujesz las... Nie złapiemy nic takiego!", -- A_Classic_Fairytale:shadow + ["You retrieved the lost part."] = "Odzyskałeś straconą część.", -- A_Space_Adventure:fruit02 + ["Your fastest escape so far: %d turns"] = "Twoja najszybsza ucieczka jak dotąd: %d tur", -- A_Space_Adventure:desert02 + ["Your fastest victory so far: %d rounds"] = "Twoja najszybsza wygrana jak dotąd: %d rund", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 + ["Your first destination is the moon in order to get more fuel."] = "Twój pierwszy cel to księżyc, żeby zdobyć więcej paliwa.", -- A_Space_Adventure:cosmos + ["Your hedgehog died!"] = "Twój jeż umarł!", -- User_Mission_-_That_Sinking_Feeling + ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "Twój jeż panicznie obawiał się wody i zdecydował udać się na bezpieczną odległość %d od niej.", -- ClimbHome + ["Your height over time"] = "Twoja wysokość ponad czasem", -- ClimbHome + ["Your hogs must survive!"] = "Twoje jeże muszą przeżyć!", -- A_Classic_Fairytale:journey + ["Your movement skills will be evaluated now."] = "Twoje zdolności ruchowe zostaną teraz ocenione.", -- A_Classic_Fairytale:first_blood + ["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 + ["You see, hedgehog spikes are very, very valuable."] = "Widzisz, kolce jeża są bardzo, bardzo cenne.", -- A_Classic_Fairytale:queen + ["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!"] = "", -- A_Classic_Fairytale:shadow --- ["- You will recieve 2-4 weapons on each kill! (Even on own hogs)"] = "", -- Continental_supplies --- ["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 --- ["Zealandia"] = "", -- Continental_supplies + ["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", -- + ["Zealandia"] = "Zelandia", -- Continental_supplies + ["Zombie"] = "Zombie", -- + ["Zombi"] = "Zombi", -- portal ["'Zooka Team"] = "Bazookinierzy", --- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } + ["Zook"] = "Zook", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard + ["Zork"] = "Zork", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/pl.txt --- a/share/hedgewars/Data/Locale/pl.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/pl.txt Sun Dec 17 00:09:24 2017 +0100 @@ -60,8 +60,9 @@ 00:56=Tasak 00:57=Guma 00:58=Mina powietrzna +00:59=Gumowa kaczuszka -01:00=Walczmy! +01:00=Wczytywanie … 01:01=Remis 01:02=%1 wygrywają! 01:03=Głośność %1% @@ -86,7 +87,11 @@ 01:22=Tryb AFK 01:23=Auto-kamera: wyłączona 01:24=Auto-kamera: włączona -01:25=Press the target button to mark the target +01:25=Wciśnij przycisk celu, by zaznaczyć cel +01:26=To narzędzie jest niedostępne w Nagłej Śmierci +; E.g. “+25” when gaining health from crate or vampirism +01:27=+%1 +01:28=Puste! ; Event messages ; Hog (%1) died @@ -98,7 +103,6 @@ 02:00=%1 spotkał stwórcę! 02:00=%1 już dłużej nie wytrzyma! 02:00=%1 zakończył służbę! -02:00=%1 poświęcił się dla ogółu! 02:00=%1 zrezygnował z trudu życia! 02:00=Tak jak liść opuszcza drzewo, tak %1 opuszcza nas! 02:00=%1 mówi "Pokój z wami"! @@ -112,11 +116,11 @@ 02:00=%1 już nie będzie strzelał z dubeltówki.. 02:00=%1 już nie będzie rzucał w innych owocami... 02:00=%1 nie postrzela już ze strzelby... -02:00=%1 przyjął o jeden strzał za dużo. +02:00=%1 przyjął o jeden strzał za dużo 02:00=A mógł zebrać tę skrzynkę z życiem... 02:00=%1 poszedł pograć w lepszą grę... 02:00=%1 przytupnął nóżką i umarł -02:00=%1 poniósł całkowitą klęskę. +02:00=%1 poniósł całkowitą klęskę 02:00=Biedny %1 ... 02:00=%1 woli grać w WarMUX 02:00=%1 blokuje strzały własną twarzą @@ -124,7 +128,7 @@ 02:00=%1 opuścił budynek 02:00=%1 podąża drogą dinozaurów 02:00=%1 przybliża jeże o krok do wyginięcia -02:00=Śmierć %1 sprawia, że chce mi się płakać +02:00=Śmierć %1 sprawia, że chce mi się płakać 02:00=%1 wącha kwiatki... od spodu 02:00=%1 zakończył egzystencję 02:00=Musimy Cię pożegnać, %1 @@ -135,10 +139,10 @@ 02:00=%1 już się do nas nie uśmiechnie 02:00=%1 już nie istnieje 02:00=%1 przestał istnieć -02:00=Nie chcąc dłużej żyć, %1 umiera w pokoju. +02:00=Nie chcąc dłużej żyć, %1 umiera w pokoju 02:00=Żegnaj %1, dopiero Cię poznaliśmy! -02:00=%1 ma niską tolerancję na bycie postrzelonym. -02:00=%1 mógł użyć dodatkowego życia. +02:00=%1 ma niską tolerancję na bycie postrzelonym +02:00=%1 mógł użyć dodatkowego życia 02:00=Czy jest na sali jakiś doktor? 02:00=%1 przeszedł na emeryturę 02:00=%1 poszedł do innej piaskownicy @@ -153,7 +157,10 @@ 02:00=%1, machamy na pożegnanie! 02:00=%1 zatruł się ołowiem 02:00=%1 się wykrwawił -02:00=%1 zginął za słuszną sprawę +02:00=%1 zapomniał jak się oddycha +02:00=%1 wziął i umarł +02:00=%1 został zabity na śmierć +02:00=%1 mógł nie fikać ; Hog (%1) drowned 02:01=%1 robi za łódź podwodną! @@ -192,7 +199,7 @@ 02:01=%1 będzie grał w "Uwolnić Orkę" 02:01=%1 szuka rybek do akwarium! 02:01=%1 odnalazł Atlantydę! -02:01=Trzeba było się nauczyć się pływać... +02:01=Trzeba było się nauczyć się pływać... 02:01=%1 powinien ze sobą zabrać narty wodne 02:01=%1 nie lubi sportów wodnych 02:01=%1 będzie już zawsze puszczał bąbelki @@ -206,12 +213,13 @@ 02:01=%1 był bardzo spragniony 02:01=%1 weźmie udział w "Szczękach"... jako przynęta! 02:01=%1 lubi nurkować -02:01=%1 nie zdążył zadzwonić po WOPR-u +02:01=%1 nie zdążył zadzwonić po WOPR 02:01=%1 miał za mało tlenu 02:01=%1 przemoczył sobie wdzianko 02:01=%1 utonął 02:01=%1 ma za małą wyporność 02:01=%1, uważaj na rekiny! +02:01=%1 ma bardzo ważne spotkanie na dnie oceanu ; Round starts 02:02=Walczmy! @@ -266,11 +274,20 @@ 02:02=Nie odczuwaj strachu! 02:02=Bądź odważny i podbijaj! -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=%1 wygrywają! +02:03=%1 są zwycięzcami! +02:03=%1 zmiażdżyli konkurencję! +02:03=%1 mają dzisiaj imprezę +02:03=%1 byli po prostu lepsi +02:03=Drużynie %1 nikt nie podskoczy -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Remis +02:04=Ale nudy, remis +02:04=Nikt nie wygrywa, remis +02:04=Wszyscy martwi. Dobrze. +02:04=Gdzie znikły wszystkie jeże? ; New health crate 02:05=Przybyła pomoc! @@ -295,7 +312,6 @@ 02:05=Na zdrowie! 02:05=Szczepionka! - ; New ammo crate 02:06=Więcej broni! 02:06=Posiłki! @@ -322,7 +338,6 @@ 02:06=Cokolwiek tam jest, na pewno się przyda 02:06=Gadżety! 02:06=Odjazdowy sprzęt! -02:06=Czy to ptak...? Czy to samolot...? ; New utility crate 02:07=Czas na narzędzia! @@ -388,18 +403,18 @@ ; Hog (%1) hurts himself only 02:09=%1 powinien potrenować celowanie! -02:09=%1 najwidoczniej nienawidzi samego siebie.. +02:09=%1 najwidoczniej nienawidzi samego siebie 02:09=%1 stoi po złej stronie! -02:09=%1 przypomina emo. -02:09=%1 trzymał broń drugą stroną. -02:09=%1 jest trochę sadystyczny -02:09=%1 jest masochistą. +02:09=%1 przypomina emo +02:09=%1 trzymał broń drugą stroną +02:09=%1 jest trochę sadystyczny +02:09=%1 jest masochistą 02:09=%1 nie ma instynktu samozachowawczego -02:09=%1 zepsuł strzał. +02:09=%1 zepsuł strzał 02:09=%1 musiał to zepsuć 02:09=To był marny strzał, %1 -02:09=%1 jest trochę za bardzo nieostrożny przy używaniu silnych broni. -02:09=%1 powinien rozważyć zmianę kariery. +02:09=%1 jest trochę za bardzo nieostrożny przy używaniu silnych broni +02:09=%1 powinien rozważyć zmianę kariery 02:09=Najgorszy strzał! Kiedykolwiek! 02:09=Źle, źle, źle %1, powinieneś strzelać do WROGA! 02:09=%1 powinien celować w przeciwnika @@ -408,20 +423,20 @@ 02:09=To było głupie, %1 02:09=%1 żyje według zasady: "nie ryzykujesz, nie zyskujesz" 02:09=%1 jest rozkojarzony -02:09=%1 przez swoje rozkojarzenie uderza samego siebie. +02:09=%1 przez swoje rozkojarzenie uderza samego siebie 02:09=%1 ma talent w niszczeniu samego siebie 02:09=%1 jest niezdarny 02:09=%1 pokazuje wrogowi na co go stać! -02:09=Nie można się spodziewać by %1 był cały czas perfekcyjny. +02:09=Nie można się spodziewać by %1 był cały czas perfekcyjny 02:09=Nie martw się %1, nikt nie jest doskonały... -02:09=%1 zrobił to celowo. +02:09=%1 zrobił to celowo 02:09=%1, ta wpadka zostanie między nami 02:09=%1 zapomniał przeczyścić lufę 02:09=%1, granat po wyjęciu zawleczki przestaje być przyjacielem 02:09=Na pewno nikt tego nie zobaczył, %1 02:09=%1 powinien przejrzeć podręcznik walki na froncie... 02:09=%1, ktoś popsuł ci giwerę? -02:09=%1 miał ciężki weekend. +02:09=%1 miał ciężki weekend 02:09=Ale Urwał!!! 02:09=%1, ale z ciebie frajer! 02:09=%1 próbował zjeść arbuza @@ -429,14 +444,19 @@ 02:09=%1 trzymał karabin za spust 02:09=%1 postanowił się rozerwać... na strzępy 02:09=%1 ma już dość tego świata +02:09=%1 szuka atencji +02:09=%1 twierdzi, że strzelanie do wrogów jest za mało hipsterskie -; 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=Home Run! 02:10=To ptak? To samolot? 02:10=Jeżyk idzie w odstawkę! 02:10=Bzziuuuuu! 02:10=Niezły rzut! 02:10=Chyba padnie rekord Guinnessa w rzucie jeżem! +02:10=Cel: Księżyc +02:10=%1 daje popis machania kijem +02:10=%1 wysyła jeże zwiedzać kosmos ; Hog (%1) has to leave (team is gone) 02:11=%1 musi iść spać! @@ -444,6 +464,74 @@ 02:11=Żegnamy Cię, %1 02:11=%1 nie ma zamiaru dłużej grać 02:11=%1 musi odejść +02:11=%1 aktywował powietrzne moce i zniknął +02:11=%1 wyparował +02:11=%1 gdzieś wsiąkł +02:11=%1 zamienił się w... nic +02:11=%1 osiągnął wyższą formę egzystencji + +; Hog (%1) was poisoned +02:12=%1 czuje się chory +02:12=%1 chyba ma grypę +02:12=%1 złapał jakieś paskudztwo +02:12=%1 musi odwiedzić doktora +02:12=%1 nie wygląda najlepiej +02:12=%1 kaszle jak opętany +02:12=%1 toczy wewnętrzny bój z groźnym wirusem +02:12=Miejmy nadzieję, że to nie jest zaraźliwe + +; Hog (%1) was resurrected by the Resurrector utility +02:13=%1 został wskrzeszony +02:13=%1 powraca z grobu +02:13=%1 udaje Jezusa +02:13=%1 dostał drugą szansę +02:13=%1 znowu żyje +02:13=%1 stwierdził, że śmierć nie jest dla niego +02:13=%1 musi się jeszcze trochę pomęczyć +02:13=%1 pokonał Śmierć i wraca +02:13=%1 został wyrzucony z piekła + +; Hog (%1) explodes after an kamikaze attack +02:14=%1 umiera z honorem +02:14=%1 znalazł odlotowy sposób, by umrzeć +02:14=%1 zabija siebie i innych +02:14=%1 używa swojej sekretnej samobójczej techniki +02:14=%1 popełnia zbiorowe samobójstwo +02:14=%1 poświęcił się dla ogółu! +02:14=%1 zginął za słuszną sprawę + +; Hog (%1) returned from time-travel with the time box +02:15=%1 wraca z wędrówki w czasie +02:15=%1 jest z powrotem w naszych czasach +02:15=%1 wraca do teraźniejszości +02:15=%1, gdzie ty byłeś? + +; Hog (%1) runs out of turn time (not shown in infinite attack mode) +02:16=%1 był za wolny +02:16=%1 twierdzi, że czas tury to tylko konstrukt społeczny +02:16=%1 zapomniał zaatakować +02:16=%1 za długo się zastanawiał +02:16=%1 jest jakiś niezdecydowany +02:16=%1 przegrzał się +02:16=%1 ma złe nawyki po grze w szachy +02:16=Sekunda więcej i %1 wszystkich by zniszczył +02:16=%1 jest totalną ślamazarą +02:16=%1 jest z natury flegmatykiem +02:16=%1 zaliczył zwiechę +02:16=%1 nie zdążył. Peszek. +02:16=%1 wymyślił genialny plan, w którym zabrakło ataku +02:16=%1 nie jest zbyt szybki + +; King (%1) has died +02:17=%1 nie żyje! Wiwat %1! +02:17=%1 był dobrym królem... był +02:17=Jak na króla, %1 był słabeuszem +02:17=%1 sobie pokrólował +02:17=%1 był królem, a teraz nie żyje +02:17=%1 opuszcza swoje królestwo +02:17=Król %1 zginął na wojnie +02:17=%1 nie zostawił dziedzica +02:17=%1 i tak nie umiał rządzić ; Weapon Categories 03:00=Granat z zapalnikiem @@ -505,7 +593,8 @@ 03:55=Chłodniej już nie będzie! 03:56=Nie przytnij sobie igieł! 03:57=Narzędzie -03:58=Latająca mina +03:58=Latająca bomba zbliżeniowa +03:59=Pływająca bomba ; Weapon Descriptions (use | as line breaks) 04:00=Atakuj przeciwników zwykłym granatem.|Wybuchnie kiedy zapalnik skończy odliczanie.|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą @@ -517,17 +606,17 @@ 04:06=Znudzony? Brak możliwości ataku? Oszczędzasz broń?|Żaden problem! Po prostu pomiń turę, tchórzu!|Atak: Pomiń turę bez walki 04:07=Pokonaj duże dystanse w krótkim czasie za pomocą|liny. Z rozpędu podcinaj inne jeże, lub użyj sprytu|by upuścić na nie granat lub inną broń.|Atak: Wystrzel albo odczep linę|Długi skok: Upuść granat lub podobną broń 04:08=Trzymaj przeciwników na dystans przez upuszczenie|miny w wąskim przejściu lub zaraz obok ich stóp. Nie|zapomnij uciec zanim się włączy!|Atak: Upuść minę obok siebie -04:09=Nie jesteś pewny swoich umiejętności w celowaniu?|Weź pistolet i powystrzelaj przeciwników jak kaczki.|Atak: Strzel (kilka razy) +04:09=Nie jesteś pewny swoich umiejętności w celowaniu?|Weź pistolet i powystrzelaj przeciwników jak kaczki.|Atak: Strzel (kilka razy) 04:10=Brutalna siła zawsze jest rozwiązaniem. Upuść|wybuchową laskę dynamitu obok przeciwnika i|uciekaj gdzie pieprz rośnie.|Atak: Upuść dynamit obok siebie 04:11=Uwolnij się od przeciwników poprzez wyrzucenie|ich poza mapę albo do wody. A co powiesz o|strąceniu min w swoich wrogów?|Atak: Spałuj wszystko co jest przed tobą 04:12=Zbliż się i osobiście wyzwól moc tej|śmiertelnej techniki sztuk walki.|Atak: Użyj swoich pięści 04:13=UNUSED -04:14=Masz lęk wysokości? Lepiej weź spadochron.|Rozwija się kiedy spadasz z wysokości|i ochroni przed obrażeniami od upadku.|Atak: Rozwiń lub złóż spadochron|Lewo/Prawo/Góra/Dół: Kieruj lotem|Długi skok: Upuść granat lub podobną broń +04:14=Masz lęk wysokości? Lepiej weź spadochron.|Rozwija się kiedy spadasz z wysokości|i ochroni przed obrażeniami od upadku.|Atak: Rozwiń lub złóż spadochron|Lewo/Prawo/Góra/Dół: Kieruj lotem|Długi skok: Upuść granat lub podobną broń 04:15=Wezwij samolot, żeby zrzucił bomby na|twoich przeciwników.|Lewo/Prawo: Określ kierunek ataku|Kursor: Wybierz cel 04:16=Wezwij samolot, żeby zrzucił kilka|min w określonym miejscu.|Lewo/Prawo: Określ kierunek ataku|Kursor: Wybierz cel 04:17=Potrzebny schron? Użyj palnika by|wydrążyć tunel w stałym podłożu|co pozwoli Ci się ukryć.|Atak: Zacznij/Zakończ kopać 04:18=Potrzebujesz dodatkowej ochrony albo chcesz|przejść przez teren nie do przejścia? Umieść|konstrukcje gdzie chcesz.|Lewo/Prawo: Wybierz konstrukcję do umieszczenia|Kursor: Umieść konstrukcję w odpowiednim miejscu -04:19=Użyty w odpowiednim momencie teleport jest|potężniejszy niż większość broni. Potrafi|uwolnić jeża z tarapatów w kilka sekund.|Kursor: Wybierz miejsce teleportacji|Lewo/Prawo: Odwróć jeża +04:19=Użyty w odpowiednim momencie teleport jest|potężniejszy niż większość broni. Potrafi|uwolnić jeża z tarapatów w kilka sekund.|Kursor: Wybierz miejsce teleportacji|Lewo/Prawo: Odwróć jeża 04:20=Pozwala w tej turze zagrać innym jeżem.|Atak: Uaktywnij wybieranie jeża|Zmiana (Tab): Wybierz następnego jeża|Precyzyjne celowanie (L.Shift) + Zmiana (Tab): |Wybierz poprzedniego jeża 04:21=Odpal moździerz, który po uderzeniu|wypuści kilka bomb.|Atak: Strzel z całą mocą 04:22=Nie tylko dla Indiana Jones'a! Ten bicz może|być użyteczny w wielu wypadkach. Szczególnie|kiedy chcesz kogoś zrzucić z urwiska.|Atak: Uderz wszystko co jest przed tobą @@ -540,8 +629,8 @@ 04:29=Tego nie powinny używać dzieci!|Pistolet na kulki wystrzeliwuje tony małych|kolorowych kulek wypełnionych materiałem|wybuchowym.|Atak: Strzel kulkami|Góra/Dół: Kontynuuj celowanie 04:30=Wezwij samolot, żeby zrzucić dużą ilość|napalmu. Dzięki dobremu celowi ten atak|może zlikwidować dużą część mapy, w tym|znajdujące się tam nieszczęsne jeże.|Lewo/Prawo: Określ kierunek ataku|Kursor: Wybierz obszar 04:31=Zaatakuj odległych przeciwników, bądź zbierz|skrzynki! Nie zapomnij o zrzuceniu bomb!|Góra/Dół: Steruj samolotem|Atak: Zrzuć bombę (3x) |Długi skok: Niech Walkirie wkroczą na pole bitwy! -04:32=Niska grawitacja jest skuteczniejsza od dowolnej|diety! Skacz wyżej i na większy dystans lub pozwól|przeciwnikom lecieć jeszcze dalej.|Atak: Aktywuj -04:33=Czasami potrzebujesz dodatkowego kopa|żeby zadawać większe obrażenia. Włącze-|nie spowoduje zwiększenie zadawanych|obrażeń o 50% do końca tury.|Atak: Aktywuj +04:32=Niska grawitacja jest skuteczniejsza od dowolnej|diety! Skacz wyżej i na większy dystans lub pozwól|przeciwnikom lecieć jeszcze dalej.|Atak: Aktywuj +04:33=Czasami potrzebujesz dodatkowego kopa|żeby zadawać większe obrażenia. Włącze-|nie spowoduje zwiększenie zadawanych|obrażeń o 50% do końca tury.|Atak: Aktywuj 04:34=Czyni Cię nieważliwym na obrażenia do za-|kończenia tury. Ale nie szalej, nadal możesz|utonąć.|Atak: Aktywuj 04:35=Bywa, że czas pędzi za szybko. Zyskaj 30|dodatkowych sekund by dokończyć atak.|Atak: Aktywuj 04:36=Są takie dni gdy po prostu nie ma się cela.|Ułatw sobie zasadnie wykorzystując naj-|nowsze zdobycze technologiczne.|Atak: Aktywuj @@ -557,7 +646,7 @@ 04:46=Pokrywa twoich wrogów ognistą powłoką.|Czy ktoś zamawiał pieczonego jeża?|Atak: Aktywuj|Góra/Dół: Celowanie|Lewo/Prawo: Ustaw prędkość strzelania 04:47=Podwój zabawę z pomocą 2 lepkich min.|Spróbuj wywołać reakcję łańcuchową lub chroń|samego siebie (albo zrób obydwie rzeczy na raz!)|Atak: Przytrzymaj by rzucić z większą siłą (dwa razy) 04:48=Czyż walenie jeży po głowach nie|jest zabawne? Dobre uderzenie|z młotka zabierze 1/3 życia|przeciwnika i wkopie go w podłoże|Atak: Uderz -04:49=Poświęć swoje zdrowie aby wskrzesić przy-|jaciół! Ale strzeż się, gdyż możesz również|wskrzesić swoich wrogów.|Atak: Przytrzymaj by wskrzeszać powoli|Góra: Przyspiesz wskrzeszanie +04:49=Poświęć swoje zdrowie aby wskrzesić przy-|jaciół! Ale strzeż się, gdyż możesz również|wskrzesić swoich wrogów.|Atak: Przytrzymaj by wskrzeszać powoli|Góra: Przyspiesz wskrzeszanie 04:50=Wezwij szwadron śmiercionośnych wierteł|by wykurzyć kogoś z kryjówki. Po użyciu|zostanie zrzuconych 6 wiertniczych bomb|wkręcających się w podłoże.|Lewo/Prawo: Określ kierunek ataku|Kursor: Wybierz miejsce zrzutu 04:51=Obrzuć kogoś błotem! Broń ta nie zadaje dużych|obrażeń ale potrafi zepchnąć z krawędzi!|Atak: Przytrzymaj by strzelić z większą siłą 04:52=UNUSED @@ -566,17 +655,18 @@ 04:55=Epoka lodowcowa powraca!!|Zamroź jeże, uczyń podłoże śliskim lub zapobiegnij|utonięciu zamrażając wodę.|Atak: Strzał 04:56=Rzuć w przeciwnika dwoma tasakami i zablokuj mu |drogę lub użyj ich do wspinaczki! Jednak uważaj! |Te tasaki są naprawdę ostre!|Atak: Przytrzymaj by rzucić z większą siłą (dwukrotnie) 04:57=Tworzy elastyczne paski wykonane z gumy,|od których jeże i inne rzeczy odbijają się|bez obrażeń przy upadku.|Lewo/Prawo: Zmiana orientacji paska|Kursor: Umieść pasek w aktualnej pozycji -04:58=Ta mina będzie się swobodnie unisić w powietrzu i|podążać za jeżami, które się do niej zblizą.|Jej eksplozja jest jednakże mniejsza niż miny przeciwpiechotnej.|Atak: Przytrzymaj by rzucić z większą siłą +04:58=Ta mina będzie się swobodnie unisić w powietrzu i|podążać za jeżami, które się do niej zblizą.|Jej eksplozja jest jednakże mniejsza niż miny przeciwpiechotnej.|Atak: Przytrzymaj by rzucić z większą siłą +04:59=Wyślij te brudne jeże popływać! Ta słodka, mała, piskliwa|gumowa kaczuszka zdolna jest pływać po wodzie i będzie|płynąć z wiaterm. Wybucha, kiedy uderzy w ziemię, więc|upewnij się, że zrzucasz ją z klifu lub innego bezpiecznego|miejsca.|Atak: Upuść kaczuszkę ; Game goal strings 05:00=Ustawienia gry 05:01=Obowiązują następujące zasady: -05:02=Forty: Broń swojej fortecy. Pokonaj przeciwników! +05:02=Umieść Króla: Wybierz bezpieczną pozycję startową dla króla 05:03=Niska grawitacja: Proszę uważać! 05:04=Niezniszczalność: Jeże są (prawie) niezniszczalne 05:05=Wampiryzm: Jeże dostają życie za zadane obrażenia (80%) 05:06=Karma: Jeże doznają obrażeń za uszkodzenia zadane innym -05:07=Broń Króla: Nie pozwól królowi umrzeć!|Umieść Króla: Wybierz bezpieczną pozycję startową dla króla +05:07=Broń Króla: Nie pozwól królowi umrzeć! 05:08=Umieść jeże: Umieść jeże przed rozpoczęciem gry. 05:09=Artyleria: Jeże nie mogą się poruszać 05:10=Niezniszczalny teren: Większość broni nie niszczy terenu. @@ -591,3 +681,4 @@ 05:19=Uzbrojenie zostaje przywrócone przy kolejnej turze 05:20=Każdy z jeży ma oddzielne uzbrojenie 05:21=Zespół: Zespoły w klanie wykonują tury po kolei|Wspólny czas: Czas jest wspólny dla każdej drużyny w zespole +05:22=Silny wiatr: Wiatr wpływa prawie na wszystko diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/pt_BR.lua --- a/share/hedgewars/Data/Locale/pt_BR.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/pt_BR.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { --- [":("] = "", -- ["!!!"] = "", -- ["..."] = "", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant ["30 minutes later..."] = "30 minutos mais tarde...", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "Há cerca de um mês, um ciborgue veio e nos contou que vocês são os canibais!", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Bônus por acurácia", +-- ["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 Unlocked"] = "Conquista alcançada", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler --- ["???"] = "", -- A_Classic_Fairytale:backstab +-- ["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 ["Actually, you aren't worthy of life! Take this..."] = "Na verdade, você não merece viver! Tome isso...", -- A_Classic_Fairytale:shadow ["A cy-what?"] = "Um cib... o quê?", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy ["Africa"] = "África", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "Depois que Vaza Demais traiu sua tribo, ele se juntou aos canibais...", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode - ["a Hedgewars challenge"] = "um desafio Hedgewars", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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 +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Pratique a sua pontaria", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen ["A little gift from the cyborgs"] = "Um pequeno presente dos ciborgues", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW --- ["Ammo"] = "", --- ["Ammo Depleted!"] = "", --- ["ammo extended!"] = "", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler -- ["Ammo is reset at the end of your turn."] = "", --- ["Ammo Maniac!"] = "", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy - ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "E acabou que Vaza Demais falhou em superar o desafio! Ele chegou em terra firme, pressionado pela vergonha...", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood ["And so it began..."] = "E foi assim que começou...", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "Como o desafio foi superado, Vaza Demais colocou os pés no chão...", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies -- ["Available points remaining: "] = "", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Rebata as bolas em direção ao seus|e derrube-os no mar!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Rebata seus oponentes para|fora do mapa através dos cestos!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Treino com a Bazuca", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Melhor volta por equipe: ", --- ["Best Team Times: "] = "", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow --- ["BOOM!"] = "", +-- ["Bones"] = "", -- -- ["Boom!"] = "", --- ["Boss defeated!"] = "", --- ["Boss Slayer!"] = "", +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer -- ["Build a track and race."] = "", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family ["Cannibals"] = "Canibais", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy --- ["CAPTURE THE FLAG"] = "", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard -- ["Careless"] = "", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Change Weapon"] = "", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb --- ["Codename: Teamwork"] = "", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen ["Come closer, so that your training may continue!"] = "Aproxime-se, para que seu treinamento possa continuar!", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos -- ["Complete the track as fast as you can!"] = "", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations!"] = "", -- ["Congratulations"] = "", -- Basic_Training_-_Rope --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Parabéns! Você eliminou todos os alvos|dentro do tempo limite.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control -- ["Control pillars to score points."] = "", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- -- ["Cybernetic Empire"] = "", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- -- ["DAMMIT, ROOKIE!"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion -- ["Dangerous Ducklings"] = "", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 -- ["Deadweight"] = "", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor -- ["Demolition is fun!"] = "", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow --- ["Depleted Kamikaze!"] = "", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Destrua os invasores para conseguir pontos.", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode --- ["Drone Hunter!"] = "", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer -- ["Drowner"] = "", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy -- ["Each turn you get 1-3 random weapons"] = "", -- ["Each turn you get one random weapon"] = "", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape --- ["Eliminate all enemies"] = "", ["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 enemy hogs and take their weapons."] = "", -- Highlander --- ["Eliminate Poison before the time runs out"] = "", --- ["Eliminate the Blue Team"] = "", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists -- ["Enjoy the swim..."] = "", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Volta mais rápida: ", -- ["Feeble Resistance"] = "", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 --- ["Fire"] = "", - +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united --- ["FIRST BLOOD MUTATES"] = "", -- Mutant ["First Blood"] = "Primeiro sangue", -- A_Classic_Fairytale:first_blood +-- ["First killer will mutate"] = "", -- Mutant ["First Steps"] = "Primeiros passos", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Bandeira capturada!", -- ["Flag respawned!"] = "", -- ["Flag returned!"] = "", --- ["Flags, and their home base will be placed where each team ends their first turn."] = "", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", --- ["fuel extended!"] = "", --- ["GAME BEGUN!!!"] = "", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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 +-- ["Gangsters"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow --- ["Goal"] = "", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey -- ["Good luck out there!"] = "", -- ["Good so far!"] = "", @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 -- ["GOTCHA!"] = "", --- ["Grab Mines/Explosives"] = "", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen -- ["Hahahaha!"] = "", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen -- ["Haha, now THAT would be something!"] = "", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil -- ["Hapless Hogs"] = "", -- [" Hapless Hogs left!"] = "", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode --- ["Health crates extend your time."] = "", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy"] = "", -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Basketball", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 -- ["Heh, it's not that bad."] = "", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hit Combo!"] = "", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm..."] = "", -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Artilheiro", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer -- ["Instructor"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow --- ["invaders destroyed"] = "", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,539 +1040,1291 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode -- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- -- ["Jumping is disabled"] = "", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode --- ["Kamikaze Expert!"] = "", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion -- ["Keep it up!"] = "", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood --- ["KILLS"] = "", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["[Left Shift]"] = "", --- ["left shift"] = "", -- Continental_supplies --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 -- ["Listen up, maggot!!"] = "", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode --- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 SUCCESS"] = "", +-- ["Mission failure in %d s"] = "", -- Big_Armory +-- ["Mission lost!"] = "", -- Basic_Training_-_Grenade -- ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 -- ["Movement: [Up], [Down], [Left], [Right]"] = "", --- ["Mudball"] = "", -- Construction_Mode --- ["Multi-shot!"] = "", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 --- ["New Barrels Per Turn"] = "", --- ["NEW CLAN RECORD: "] = "", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "NOVA volta mais rápida: ", --- ["New Mines Per Turn"] = "", --- ["NEW RACE RECORD: "] = "", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen -- ["NOT ENOUGH WAYPOINTS"] = "", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Partida não muito amigável", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "Era uma vez, em uma ilha com ótimos recursos naturais, duas tribos que viviam em intenso conflito...", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood --- ["Operation Diver"] = "", -- ["Opposing Team: "] = "", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies --- ["Pathetic Hog #%d"] = "", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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"] = "", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["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"] = "", -- Mutant +-- ["point(s)"] = "", -- TargetPractice, Mutant -- ["Poison"] = "", +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal --- ["Power Remaining"] = "", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos -- ["Prepare yourself"] = "", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW -- ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow --- ["Race complexity limit reached."] = "", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", --- ["Round Limit"] = "", --- ["Rounds Complete: "] = "", --- ["Rounds Complete"] = "", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant --- ["RULES OF THE GAME [Press ESC to view]"] = "", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 -- ["Save as many hapless hogs as possible!"] = "", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["SCORE"] = "", --- ["Score"] = "", -- Mutant - --- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["s"] = "", -- GaudyRacer, Space_Invasion +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family --- ["Shield boosted! +30 power"] = "", --- ["Shield Depleted"] = "", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion -- ["Shield is fully recharged!"] = "", --- ["Shield Master!"] = "", --- ["Shield Miser!"] = "", --- ["Shield OFF:"] = "", --- ["Shield ON:"] = "", --- ["Shield Seeker!"] = "", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Carabineiros", - ["Shotgun Training"] = "Treino com a Escopeta", -- ["shots remaining."] = "", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil -- ["Silly"] = "", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode -- ["Sinky"] = "", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s está fora e a Equipe %d|sofreu uma penalidade!| |Pontuação:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s está fora e a Equipe %d|marcou um ponto!| |Pontuação:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united -- ["Sponge"] = "", -- ["Spooky Tree"] = "", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies -- ["Switched to "] = "", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Equipe %d: ", --- ["Team Scores"] = "", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow -- ["That Sinking Feeling"] = "", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["That was pointless."] = "", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon -- ["The enemy is hiding out on yonder ducky!"] = "", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 -- ["The flag will respawn next round."] = "", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos -- ["This rain is really something..."] = "", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family --- ["TIME: "] = "", --- ["Timed Kamikaze!"] = "", --- ["Time Extended!"] = "", --- ["Time Extension"] = "", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope --- ["Toggle Shield"] = "", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "TrophyRace", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 -- ["T_T"] = "", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon --- ["Turn Time"] = "", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit"] = "", -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united -- ["Unit 3378"] = "", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- -- ["Unit 835"] = "", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united -- ["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!"] = "", -- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood -- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Use sua corda para ir do início ao fim o mais rápido que você puder!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor -- ["Waypoint placed."] = "", --- ["Way-Points Remaining"] = "", +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion -- ["Weapons Reset"] = "", --- ["Weapons reset."] = "", -- Highlander +-- ["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 -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos -- ["Well done."] = "", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1035,13 +2332,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1055,31 +2361,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant --- ["WINNING TIME: "] = "", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1087,68 +2401,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 -- ["You have SCORED!!"] = "", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood --- ["You saved"] = "", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "Bazuqueiros", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/pt_BR.txt --- a/share/hedgewars/Data/Locale/pt_BR.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/pt_BR.txt Sun Dec 17 00:09:24 2017 +0100 @@ -59,8 +59,7 @@ 00:55=Freezer 00:56=Machadinha - -01:00=Hora de lutar! +; 01:00=Loading … 01:01=Partida empatou 01:02=%1 ganhou! 01:03=Volume %1% @@ -154,11 +153,11 @@ 02:02=Apiiiita o árbitro! 02:02=Ao vencedor as batatas! -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=%1 ganhou! -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Partida empatou ; New health crate 02:05=Socorro a caminho! @@ -398,12 +397,12 @@ ; Game goal strings 05:00=Modos de Jogo 05:01=As seguintes regras aplicam -05:02=Fortes: Proteja o seu forte, destrua seus inimigos! +05:02=Colocar o Rei: Escolha um lugar protegido para posicionar o seu Rei 05:03=Baixa Gravidade: Olhe seus passos 05:04=Invulnerabilidade: Ouriços são (quase) invulneráveis 05:05=Vampirismo: Ouriços serão curados pelos danos causados 05:06=Carma: Ouriços serão machucados pelos danos causados -05:07=Proteja o rei: Não deixe o seu Rei morrer!|Colocar o Rei: Escolha um lugar protegido para posicionar o seu Rei +05:07=Proteja o rei: Não deixe o seu Rei morrer! 05:08=Colocar Ouriços: Permite posicionar os ouriços antes da partida começar 05:09=Artilharia: Ouriços não podem andar para mudar de lugar 05:10=Terreno Indestrutível: Maioria das armas não destrói o terreno diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/pt_PT.lua --- a/share/hedgewars/Data/Locale/pt_PT.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/pt_PT.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { - [":("] = ":(", ["!!!"] = "!!!", ["..."] = "...", ["011101000"] = "011101000", -- A_Classic_Fairytale:dragon ["011101001"] = "011101001", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant ["30 minutes later..."] = "30 minutos depois...", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "À volta de um mês atrás, apareceu um cyborg e disse-nos que voces é que eram os cabinais!", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Bónus de Precisão!", +-- ["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 Unlocked"] = "Proeza Desbloqueada", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler - ["???"] = "???", -- A_Classic_Fairytale:backstab +-- ["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 ["Actually, you aren't worthy of life! Take this..."] = "Pensando melhor, não mereçes viver! Toma isto...", -- A_Classic_Fairytale:shadow ["A cy-what?"] = "Um cy-quê?", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen ["Adventurous"] = "Aventureiro", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy ["Africa"] = "África", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "Depois do Leaks A Lot ter traído a sua tribo, ele juntou-se aos canibais...", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "Depois do choque causado pelo espião inimigo, Leaks A Lot e Nuvem Densa foram caçar para relaxar.", -- A_Classic_Fairytale:shadow +-- ["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!"] = "Outra vez com a cena dos 'canibais'!", -- A_Classic_Fairytale:enemy --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode - ["a Hedgewars challenge"] = "um desafio Hedgewars", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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 +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Pratica a tua pontaria", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "Um salto num salto", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen ["A little gift from the cyborgs"] = "Um pequeno presente dos cyborgs", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW ["All gone...everything!"] = "Foi-se...tudo!", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen ["All right, we just need to get to the other side of the island!"] = "Ok, so precisamos de chegar ao outro lado da ilha!", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen ["All walls touched!"] = "Todas as paredes alcançadas!", -- WxW --- ["Ammo Depleted!"] = "Munições Esgotadas!", --- ["ammo extended!"] = "munições adicionadas!", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler ["Ammo is reset at the end of your turn."] = "O armamento é reposto no fim do teu turno.", --- ["Ammo Maniac!"] = "", - ["Ammo"] = "Munições", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion ["And how am I alive?!"] = "E como raio estou eu vivo ainda?!", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood ["And so it began..."] = "E assim começou...", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen ["...and so the cyborgs took over the world..."] = "...e então os cyborgs apoderaram-se do mundo...", -- A_Classic_Fairytale:shadow ["And so they discovered that cyborgs weren't invulnerable..."] = "E então descobriram que os cyborgs não eram invulneráveis...", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen ["And where's all the weed?"] = "E onde está a erva toda?", -- A_Classic_Fairytale:dragon ["And you believed me? Oh, god, that's cute!"] = "E tu acreditaste em mim? Ai meu deus, tão fofo!", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - ["Antarctica"] = "Antártica", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies ["Are we there yet?"] = "Já chegámos?", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "Estás a acusar-me de alguma coisa?", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "Estás a tentar dizer-me que estas quantidade de nós morreu para o teu entertenimento?", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen ["As a reward for your performance, here's some new technology!"] = "De forma a recompensar o teu desempenho, aqui tens alguma nova tecnologia!", -- A_Classic_Fairytale:dragon - ["a shoppa minigame"] = "um minijogo shoppa", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW ["Asia"] = "Ásia", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab - ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "Como o armamento está muito disperso, podes querer reutilizar a corda enquanto no ar.|", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 ["As you can see, there is no way to get on the other side!"] = "Como podes ver, não existe forma de passarmos para o outro lado!", -- A_Classic_Fairytale:dragon - ["Attack From Rope"] = "Ataca Da Corda", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 ["Australia"] = "Austrália", -- Continental_supplies -- ["Available points remaining: "] = "Pontos activos restantes: ", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 - ["[Backspace]"] = "[Retrocesso (backspace)]", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Bate bolas contra os teus|enimigos e empurra-os ao mar!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Bate os teus adversarios|fora do mapa acertando com eles no cesto!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Treino com Bazuca", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Melhores voltas por equipa: ", --- ["Best Team Times: "] = "", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "BOOM!", +-- ["Bones"] = "", -- ["Boom!"] = "Boom!", - ["Boss defeated!"] = "Boss derrotado!", --- ["Boss Slayer!"] = "", +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer -- ["Build a track and race."] = "Constroi uma pista e compete numa corrida.", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "Em cheio", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final ["But that's impossible!"] = "Mas isso é impossível!", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "Mas os sobreviventes têm um coração mais forte! (não faz sentido assim...)", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "Mas...nós morremos!", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "Mas para onde podemos ir?", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "Mas porque nos ajudariam eles?", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "Mas voçês são canibais. É o que (voçês)fazem.", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "Mas disseste que a deixarias ir!", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "Trata-me por Beep! Bem, porque eu sou um---a pessoa tão simpática!", -- A_Classic_Fairytale:family ["Cannibals"] = "Canibais", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "Canibais?! Vocês são os canibais!", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "CAPTURAR A BANDEIRA", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Descuidado", ["Carol"] = "Carol", -- A_Classic_Fairytale:family ["CHALLENGE COMPLETE"] = "DESAFIO COMPLETO", -- User_Mission_-_RCPlane_Challenge - ["Change Weapon"] = "Trocar Arma", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "Desastrado", --- ["Cluster Bomb"] = "", -- Construction_Mode - ["Cluster Bomb MASTER!"] = "MESTRE da Bomba de Fragmentos!", -- Basic_Training_-_Cluster_Bomb ["Cluster Bomb Training"] = "Treino com Bomba de Fragmentos!", -- Basic_Training_-_Cluster_Bomb --- ["Codename: Teamwork"] = "Nome de código: Trabalho em Equipa", ["Collateral Damage"] = "Dano Colateral", -- A_Classic_Fairytale:journey ["Collateral Damage II"] = "Dano Colateral II", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Completa a pista o mais rápido que conseguires!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "Configuração aceite", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 ["Congratulations!"] = "Parabéns!", -- ["Congratulations"] = "Parabéns", -- Basic_Training_-_Rope --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Parabéns! Eliminaste todos os alvos|dentro do tempo limite.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control -- ["Control pillars to score points."] = "", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Império Cibernético", -- ["Cyborg. It's what the aliens call themselves."] = "Cyborg. É o que os extra terrestres se chamam a eles mesmos(errrr)\autointitulam", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- -- ["DAMMIT, ROOKIE!"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Patinhos perigosos", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 -- ["Deadweight"] = "", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor ["Demolition is fun!"] = "Demolir é divertido!", +-- ["Demo"] = "", -- The_Specialists ["Dense Cloud must have already told them everything..."] = "O Nuvem Densa já lhes deve ter dito tudo...", -- A_Classic_Fairytale:shadow ["Dense Cloud"] = "Nuvem Densa", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["Depleted Kamikaze!"] = "", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["Did you see him coming?"] = "", -- A_Classic_Fairytale:shadow ["Did you warn the village?"] = "Avisaste a aldeia?", -- A_Classic_Fairytale:shadow ["Die, die, die!"] = "Morre, morre, morre!", -- A_Classic_Fairytale:dragon +-- ["Difficulty: "] = "", -- Continental_supplies +-- ["Difficulty: Easy"] = "", -- A_Classic_Fairytale:first_blood +-- ["Difficulty: Hard"] = "", -- A_Classic_Fairytale:first_blood +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["Do you have any idea how bad an exploding arrow hurts?"] = "", -- A_Classic_Fairytale:queen -- ["Do you have any idea how valuable grass is?"] = "Tnes alguma ideia do quão aliosa esta erva é?", -- A_Classic_Fairytale:enemy +-- ["Do you have any idea what it's like in the village for a woman?"] = "", -- A_Classic_Fairytale:queen +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "Pensas que és\Axas-te algum tipo de deus?", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode --- ["Drone Hunter!"] = "", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer -- ["Drowner"] = "", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "Bacano, os planetas desapareceram todos!", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "Bacano, consegues ver o Ramon e o Spiky?", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "Bacano, isso\isto é tão fixe!", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "Bacano, precisamos mesmo de um xamã...", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "Bacano, que sitio é este?!", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "Bacano, onde estamos?", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "Bacano, wow! Acabei de ter o 'high' mais esquesito de sempre.", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor ["Duration"] = "Duração", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy -- ["Each turn you get 1-3 random weapons"] = "Todos os turnos recebes 1-3 armas aleatórias", -- ["Each turn you get one random weapon"] = "Todos os turnos recebes uma arma aleatória", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "Snifa ouvidos\orelhas", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "Elimina o teu raptor.", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Elimina todos os inimigos", ["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 enemy hogs and take their weapons."] = "Elimina os ouriços enimigos e fica-lhes com as armas\apodera-te das armas deles.", -- Highlander - ["Eliminate Poison before the time runs out"] = "Elimina o Poison antes do tempo terminar.", - ["Eliminate the Blue Team"] = "Elimina a equipa azul", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Aproveita o mergulho", - ["[Enter]"] = "[Enter]", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- ["Europe"] = "Europa", -- Continental_supplies --- [" ever done to you?!"] = " alguma vez te aconteceu?!", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "Toda a gente sabe isso.", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "Exactamente, homem! Esse era o meu sonho.", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Volta mais rápida: ", -- ["Feeble Resistance"] = "", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion ["Fiery Water"] = "Água Flamejante", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 - - ["Fire"] = "Fogo", +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler ["First aid kits?!"] = "Kits de primeiros socorros?!", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "Primeiros Passos", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Bandeira capturada!", ["Flag respawned!"] = "Bandeira reiniciada!", ["Flag returned!"] = "Bandeira devolvida!", --- ["Flags, and their home base will be placed where each team ends their first turn."] = "", -- ["Flamer"] = "Azeiteiro", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "Minhoca Flamejante", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy - ["For improved features/stability, play 0.9.18+"] = "Para mais funcionalidades e maior estabilidade, joga 0.9.18+", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh ["Free Dense Cloud and continue the mission!"] = "Liberta o Nuvem Densa e continua a tua missão!", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "Fogo amigável!", --- ["fuel extended!"] = "combustivel aumentado!", --- ["GAME BEGUN!!!"] = "O JOGO COMEÇOU!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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 +-- ["Gangsters"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["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 -- ["Get the crate on the other side of the island!|"] = "Vai buscar a caixa no outro lado da ilha!|", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family - ["GG!"] = "GG! (Excelente jogo!)", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow --- ["Goal"] = "Objectivo\Fim", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 ["Good luck...or else!"] = "Boa sorte...caso contrário!", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Boa sorte aí fora!", ["Good so far!"] = "Até agora tudo bem!", @@ -333,159 +676,361 @@ ["Go, quick!"] = "Vai, rápido!", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "Vai 'surfar'!", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 -- ["GOTCHA!"] = "APANHEI-TE!", --- ["Grab Mines/Explosives"] = "Agarra Minas/Explosivos", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "Excelente escolha, Steve! Importas-te que te chame\trate assim?", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = Bom trabalho! Agora dá-lhe com o teu bastão de basebal! [Ajuada: Podes trocar de arma com o 'Click Direito'!]"", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "Treino com Granadas", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "Pessoal, axam que ainda há mais?\ha mais deles?", -- A_Classic_Fairytale:backstab +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["HAHA!"] = "HAHA!", -- A_Classic_Fairytale:enemy ["Haha!"] = "Haha!", -- A_Classic_Fairytale:united ["Hahahaha!"] = "Hahahaha!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen -- ["Haha, now THAT would be something!"] = "Haha, agora ISSO seria espetacular!\é que era!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "Hannibal", -- A_Classic_Fairytale:epil -- [" Hapless Hogs left!"] = " Ouriços Desafortunados restantes!", -- ["Hapless Hogs"] = "Ouriços Desafortunados", --- [" HAS MUTATED"] = " MUTOU", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "Não tenhas ilusoes, a tua tribo está morta, indiferentes à tua escolha.", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "Alguma vez te atacamos primeiro?", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode - ["Health crates extend your time."] = "As caixas de vida prolongam o teu tempo.", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy"] = "", -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "Engrenagens-ouriço", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Basquetebol", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "Hedgibal Lecter", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 -- ["Heh, it's not that bad."] = "Heh, não é assim tão mau.\Podia ser pior.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode - ["Hello again, "] = "Olá novamente, ", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "Ele move-se tal\como uma águia no ceu.", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "Ele já deve estar\ter chegado à na aldeia.", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "Aqui, deixa-me ajudar-te!", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "Aqui, deixa-me ajudar-te a salva-la!", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "Aqui\Pega...agarra a tua arma!", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "Hey! Isto\Isso é batota!", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["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: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "Os braços dele são tão fortes!", -- A_Classic_Fairytale:first_blood --- ["Hit Combo!"] = "", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen ["Hmmm...actually...I didn't either."] = "Hmmm...na verdade...uu também não fazia ideia.", -- A_Classic_Fairytale:enemy ["Hmmm..."] = "Hmmm...", --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal ["Hmmm...it's a draw. How unfortunate!"] = "Hmmm...é um empate. Que azar!", -- A_Classic_Fairytale:enemy ["Hmmm...perhaps a little more time will help."] = "Hmmm...talvez um pouco mais de tempo ajude.", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "Como posso eu (possivelmente) recompensar-te por teres salvo a minha vida?", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen ["How difficult would you like it to be?"] = "Quão difícil gostarias que fosse?", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 - [" HP"] = " HP", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Comando", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "Acredito que existem mais deles.", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "Consigo ver que tens treinado diligentemente.", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil ["I can't believe it worked!"] = "Mal posso acreditar que funcionou!", -- A_Classic_Fairytale:shadow ["I can't believe this!"] = "Não posso acreditar nisto!", -- A_Classic_Fairytale:enemy ["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 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 +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "Seria melhor se fosse sozinho.", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "Nem pensei nisso até ao mês passado.", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "Eu sinti algo...um lugar! Eles vão chegar perto dos circulos!", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "Ao menos se eu tivesse uma maneira...", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "Esqueci-me\Tinha-me esquecido que ela também é filha do chefe...", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "Se concordares em fornecer a informação que precisamos, serás poupado!", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "Se ficares preso, usa o teu Desert Eagle ou recomeça a missão!|", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "Se percebes o que quero dizer...", -- A_Classic_Fairytale:shadow ["If you say so..."] = "Se tu o dizes...", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos ["I guess you'll have to kill them."] = "Parece que vais ter de os matar.", -- A_Classic_Fairytale:dragon ["I have come to make you an offering..."] = "Eu estou aqui para te fazer uma proposta...", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen ["I have no idea where that mole disappeared...Can you see it?"] = "Não faço ideia para onde se meteu aquela toupeira...Consegues vê-la?", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 ["I have to follow that alien."] = "Tenho de seguir aquele alienígena.", -- A_Classic_Fairytale:backstab ["I have to get back to the village!"] = "Tenho de voltar para a aldeia!", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 ["I hope you are prepared for a small challenge, young one."] = "Espero que estejas preparado para um pequeno desafio jovem.", -- A_Classic_Fairytale:first_blood ["I just don't want to sink to your level."] = "So não quero descer ao teu nível.", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos ["I'll hold them off while you return to the village!"] = "Eu mantenho-os ocupados enquanto regressas à aldeia!", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "Imagina que aqueles alvos são os lobos que mataram os teus pais! Descarrega toda a tua raiva neles!", -- A_Classic_Fairytale:first_blood ["I'm...alive? How? Why?"] = "Eu estou...vivo? Como? Por quê?", -- A_Classic_Fairytale:backstab ["I'm a ninja."] = "Sou um ninja.", -- A_Classic_Fairytale:dragon ["I marked the place of their arrival. You're welcome!"] = "Eu marquei o local onde vão chegar. Não é preciso agradecer!", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "Tenho a certeza que isto é um mal entendido, camaradas ouriços!", -- A_Classic_Fairytale:first_blood ["I mean, none of you ceased to live."] = "Quer dizer, nenhum de vocês cesou de viver.", -- A_Classic_Fairytale:enemy ["I'm getting old for this!"] = "Estou a ficar velho para isto.", -- A_Classic_Fairytale:family ["I'm getting thirsty..."] = "Estou a ficar com sede...", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil ["I'm here to help you rescue her."] = "Estou aqui para te ajudar a salva-la.", -- A_Classic_Fairytale:family +-- ["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 ["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 ["I'm so scared!"] = "Tenho tanto medo!", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen ["Incredible..."] = "Incrível...", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace ["I need to find the others!"] = "Preciso de encontrar os outros!", -- A_Classic_Fairytale:backstab ["I need to get to the other side of this island, fast!"] = "Preciso de chegar ao outro lado da ilha, rápido!", -- A_Classic_Fairytale:journey ["I need to move the tribe!"] = "Preciso de mover a tribo!", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "Não posso deixar\permitir\Preciso de prevenir que cheguem!", -- A_Classic_Fairytale:backstab ["I need to warn the others."] = "Preciso de avisar os outros.", -- A_Classic_Fairytale:backstab ["In fact, you are the only one that's been acting strangely."] = "Na realidade, és o único que se tem comportado de forma estranha.", -- A_Classic_Fairytale:backstab - ["In order to get to the other side, you need to collect the crates first.|"] = "De forma a conseguir chegar ao outro lado, tens primeiro de obter todas as caixas.", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Instrutor", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode ["Interesting idea, haha!"] = "Interessante ideia, haha!", -- A_Classic_Fairytale:enemy ["Interesting! Last time you said you killed a cannibal!"] = "Interessante! Da ultima vez disseste que tinhas morto um canibal!", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "Entretanto, pega\toma isto e volta para o teu \"amigo\"!", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "invasores destruidos", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode ["Invasion"] = "Invasão", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen ["I saw it with my own eyes!"] = "Eu vi-o com os meus próprios olhos!", -- A_Classic_Fairytale:shadow ["I see..."] = "Estou a ver...", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "Vejo que ja deste um salto de fé", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "Estou a ver que gostarias que o seu fosse mais... pessoal...", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "Sinto que outro ataque de canibais vem na minha direcção!", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "Sinto que outro ataque de canibais vem\se move na nossa direcção!", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 ["I shouldn't have drunk that last pint."] = "Não devia ter bebido aquele ultimo caneco.", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "Este lugar é na minha cabeça?", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "Não quero saber. Não vou deixar aquele alienígena magoar a minha filha!", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil ["I think we are safe here."] = "Penso que estamos seguros aqui.", -- A_Classic_Fairytale:backstab ["I thought their shaman died when he tried our medicine!"] = "Pensava que o xamã deles tinha morrido quando experimentou o nosso remédio!", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "É chamado 'Hogs of Steel'.", -- A_Classic_Fairytale:enemy @@ -495,539 +1040,1292 @@ ["It must be the aliens!"] = "Devem ser os alienígenas!", -- A_Classic_Fairytale:backstab ["It must be the cyborgs again!"] = "Devem ser os cyborgs novamente!", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "Eu disse-te que os tinha acabado de encontrar.\que simplesmente os encontrei.", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Ainda bem que ainda faltam 99 turnos para MORTE SÚBITA...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil ["It's always up to women to clear up the mess men created!"] = "Está sempre a cargo das mulheres, limpar a confusão que os homens criaram!", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "É uma pena, esqueci-me de como fazer isso\tal coisa!", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion ["It's impossible to communicate with the spirits without a shaman."] = "É impossível comunicar com os espiritos sem um xamã.", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "Acabou...\Finalmente acabou...", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "Está na hora de aprenderes que as tua ações teem consequencias!", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "É mais valioso\Vale mais que madeira!", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "Quer os nosso cérebros!", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen ["It was not a dream, unwise one!"] = "Não foi um sonho, ó insensato!", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 ["I've seen this before. They just appear out of thin air."] = "Eu já vi isto antes. Eles aparecem do nada.", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 ["I want to play a game..."] = "Eu quero jogar um jogo...", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "Quero ver como ele trata da situação!", -- A_Classic_Fairytale:backstab - ["I wish to help you, "] = "Desejo ajudar-te, ", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon ["I wonder where Dense Cloud is..."] = "Pergunto-me onde estará o Nuvem Densa...", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow ["I wonder why I'm so angry all the time..."] = "Pergunto-me porque estou sempre tão zangado...", -- A_Classic_Fairytale:family ["I won't let you kill her!"] = "Não te vou permitir que a mates!", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 ["Jack"] = "Jack", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- ["Jeremiah"] = "Jeremiah", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 ["John"] = "John", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- ["Judas"] = "Judas", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Saltar está desactivado", ["Just kidding, none of you have died!"] = "Estou só a brincar, nenhum de vocês morreu!", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "Só a passear\dar um passeio.", -- A_Classic_Fairytale:united ["Just wait till I get my hands on that trauma! ARGH!"] = "Espera até eu pôr as mãos naquele trauma! ARGH!", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "Kamikaze profissional!", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion ["Keep it up!"] = "Continua assim!", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "MATA-O!", -- A_Classic_Fairytale:first_blood --- ["KILLS"] = "VITIMAS", +-- ["Kills: %d"] = "", -- Space_Invasion ["Kill the aliens!"] = "Mata os alienígenas!", -- A_Classic_Fairytale:dragon ["Kill the cannibal!"] = "Destrói o canibal!", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "Acaba com o traídor...ou poupa a sua vida!|Mata-o ou pressiona [Precisão]!", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "Ultimo Alvo!", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 ["Leaks A Lot must survive!"] = "Leaks A Lot tem de sobreviver!", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen ["Lee"] = "Lee", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "[Shift Esquerdo]", - ["Let a Continent provide your weapons!"] = "Deixa um Continente fornecer-vos armamento!", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "Pemite-me testar as tuas habilidades um pouco\por um bocadinho.<, ok?>", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 ["Let's go home!"] = "Vamos para casa!", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW ["Let's head back to the village!"] = "Vamos voltar para a aldeia!", -- A_Classic_Fairytale:shadow ["Let's see what your comrade does now!"] = "Vamos ver o que o teu camarada faz agora.", -- A_Classic_Fairytale:journey ["Let's show those cannibals what we're made of!"] = "Vamos mostrar àqueles canibais do que somos feitos!", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "Deixa-os provar a minha fúria!", -- A_Classic_Fairytale:backstab ["Let us help, too!"] = "Deixa-nos ajudar também!", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Ouvem bem, verme!!", -- ["Little did they know that this hunt will mark them forever..."] = "Nunca eles imaginariam que esta caça os marcaria para sempre...", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "Por sorte, consegui alguns deles.", -- A_Classic_Fairytale:united - ["LUDICROUS KILL"] = "LUDICROUS KILL", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies - ["MEGA KILL"] = "MEGA KILL", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Tempo das minas:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "MISSÃO COMPLETA", -- User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "MISSÃO COMPLETA", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- ["Molotov"] = "", -- Continental_supplies - ["MONSTER KILL"] = "MONSTER KILL", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- ["More Natives"] = "Mais Nativos", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Movimento: [Cima], [Baixo], [Esquerda], [Direita]", --- ["Mudball"] = "", -- Construction_Mode --- ["Multi-shot!"] = "Multiplo-tiro!", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow - ["-------"] = "-------", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["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: [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 --- ["New Barrels Per Turn"] = "", --- ["NEW CLAN RECORD: "] = "", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "NOVA volta recorde: ", --- ["New Mines Per Turn"] = "", --- ["NEW RACE RECORD: "] = "NOVO RECORDE PARA ESTA PISTA: ", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "Muito bom trabalho\Muito bem, (seus )sacos de carne!", -- A_Classic_Fairytale:enemy - ["Nice work, "] = "Bom trabalho, ", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 ["Nice work!"] = "Bom trabalho!", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 ["No, I came back to help you out..."] = "Não, voltei para te ajudar...", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "Não... Pegunto-me para onde desapareceram?!", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "Não. Mas foi uma toupeira muito rápida de certeza.", -- A_Classic_Fairytale:shadow ["No! Please, help me!"] = "Não! Por favor, ajuda-me!", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor ["NORMAL"] = "NORMAL", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor ["North America"] = "América do Norte", -- Continental_supplies --- ["Not all hogs are born equal."] = "Nem todos os ouriços nascem iguais\da mesma maneira.", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen -- ["NOT ENOUGH WAYPOINTS"] = "", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion ["Not now, Fiery Water!"] = "Agora não Água Flamejante!", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Partida não muito amigável", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "Tu outra vez?! A minha cabeça ainda doi da ultima vez!", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer ["No, we made sure of that!"] = "Não, certificamo-nos disso!", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 ["No! What have I done?! What have YOU done?!"] = "Não! O que fiz eu?! O que fizeste TU?!", -- A_Classic_Fairytale:journey ["No. Where did he come from?"] = "Não. De onde raio é que ele apareceu?", -- A_Classic_Fairytale:shadow ["Now how do I get on the other side?!"] = "Agora, como chego ao outro lado?!", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow ["Obstacle course"] = "Pista de obstáculos", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen ["Of course I have to save her. What did I expect?!"] = "Claro que tenho de a salvar. Estavas à espera do quê?!", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "OH, VÁ LÁ!", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 +-- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- ["Olive"] = "Azeitona", -- A_Classic_Fairytale:united ["Omnivore"] = "Omnívoro", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "Era uma vez, numa ilha de grandes recursos naturais, viviam duas tribos com um profundo conflituo...", -- A_Classic_Fairytale:first_blood - ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "UM OURIÇO POR EQUIPA! A REMOVER OS OURIÇOS EM EXCESSO", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer ["Oops...I dropped them."] = "Oops...deixei-os cair.", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 ["Open that crate and we will continue!"] = "Abre a caixa e podemos prosseguir!", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Operação Mergulho", ["Opposing Team: "] = "Equipa adversária", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant - ["Ouch!"] = "Ouch!", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome ["Our tribe, our beautiful island!"] = "A nossa tribo, a nossa bela ilha!", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 ["Parachute"] = "Pára-quedas", -- Continental_supplies - ["Pathetic Hog #%d"] = "Ouriço patético #%d", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "Pátetica Resistencia", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies ["Pfew! That was close!"] = "Ufa! Foi por um triz.", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- Battalion -- ["points"] = "", -- Control, Space_Invasion --- ["POINTS"] = "", -- Mutant +-- ["point(s)"] = "", -- TargetPractice, Mutant +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 ["Poison"] = "Poison", +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "Energia Restante", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["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!", --- ["presice"] = "", -- Continental_supplies - ["Press [Enter] to accept this configuration."] = "Pressiona [Enter] para aceitar esta configuração.", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW -- ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow --- ["Race complexity limit reached."] = "", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace ["Rachel"] = "Rachel", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "A SÉRIO?! Pensavas que me podias fazer mal com os teus pequenos brinquedos?", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", --- ["Round Limit"] = "", --- ["Rounds Complete: "] = "Rondas Completas: ", --- ["Rounds Complete"] = "Rondas Completas", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "REGRAS DE JOGO [Pressiona ESC para as visualizar]", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "Joe Emferrujado", -- A_Classic_Fairytale:queen --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "Salvação", -- A_Classic_Fairytale:family -- ["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 +-- ["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!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "Salva o Leaks A Lot! Ajuda: A abilidade\ferramente Switch(?) pode ser-te util.", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab - ["SCORE"] = "RESULTADO", - ["Score"] = "Resultado", -- Mutant - - ["sec"] = "seg", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Chau!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor ["Select continent!"] = "Seleciona o continente!", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "Seleciona a dificuldade: [Esquerda] - facil ou [Direita] - dificil", -- A_Classic_Fairytale:first_blood ["selected!"] = "seleccionado!", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge ["... share your beauty with the world every morning, my princess!"] = "... partilha a tua beleza com o mundo todas as manhãs, minha princesa!", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- ["She's behind that tall thingy."] = "Ela está atráz daquela coisa alta.", -- A_Classic_Fairytale:family --- ["Shield boosted! +30 power"] = "Escudo reparado\aumentado! +30 energia (-unconfirmed)", - ["Shield Depleted"] = "Escudo Esgotado", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Escudo completamente recarregado!", --- ["Shield Master!"] = "", --- ["Shield Miser!"] = "", - ["Shield OFF:"] = "Escudo DESLIGADO:", - ["Shield ON:"] = "Escudo LIGADO:", --- ["Shield Seeker!"] = "", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Caçadores", - ["Shotgun Training"] = "Treino com Caçadeira", -- ["shots remaining."] = "tiros restantes.", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil -- ["Silly"] = "", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode -- ["Sinky"] = "", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s está fora e a equipa %d|perde um ponto!| |Pontuação:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s está fora e a equipa %d|soma um ponto!| |Pontuação:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "Escorregadio", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos ["So humiliating..."] = "Tão humilhante...", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- ["South America"] = "América do Sul", -- Continental_supplies ["So? What will it be?"] = "Então? O que vai ser?", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "Faz aparecer a caixa, e ataca!", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "Armas Especiais:", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "Queijo \"Picante\"", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united -- ["Sponge"] = "Esponja", -- ["Spooky Tree"] = "", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["s"] = "s", -- GaudyRacer, Space_Invasion --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "Olho de Ferro", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "Passo a Passo", -- A_Classic_Fairytale:first_blood ["Steve"] = "Steve", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies -- ["Switched to "] = "", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Equipa %d: ", --- ["Team Scores"] = "Pontuações Equipa", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "Ajuda com o Teleporte: usa o rato para selecionar o teu destino!", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil ["Thanks!"] = "Obrigada!", -- A_Classic_Fairytale:family +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 ["Thank you, my hero!"] = "Obrigada, meu herói!", -- A_Classic_Fairytale:family ["Thank you, oh, thank you, Leaks A Lot!"] = "Obrigada, oh, obrigada, Leaks A Lot!", -- A_Classic_Fairytale:journey ["Thank you, oh, thank you, my heroes!"] = "Obrigada, oh, obrigada, meus heróis!", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 ["That is, indeed, very weird..."] = "Isto é, de facto, muito estranho...", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "Aquele xamã sabe mesmo o que está a fazer!", -- A_Classic_Fairytale:shadow -- ["That Sinking Feeling"] = "", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "Não temos nada a ver com o teu problema.\Esse problema não tem nada a ver comnosco!", -- A_Classic_Fairytale:enemy ["That's typical of you!"] = "Típico vindo de ti!", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "Isso foi desnecessariamente mau! -errr má tradução", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "Isso foi completamente desnecessario.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "A resposta é...entertenimento. Já vais perceber ao que me refiro\quero dizer.", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "O Dilema", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "O inimigo está escondido ali a diante ao pé do patinho!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "A bandeira ira reaparecer no próximo turno.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "Esta gente primitiva é tão divertida!", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "A juventude desperdiçada", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood ["The what?!"] = "Os quê?!", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "O vento sussura que tu estás pronto para te familiarizares com as ferramentas agora...", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion ["They have weapons we've never seen before!"] = "Eles têm armas que nunca vimos antes!", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united - ["They killed "] = "Eles mataram ", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy ["They never learn"] = "Eles nunca aprendem", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen ["They told us to wear these clothes. They said that this is the newest trend."] = "Eles disseram-nos para usar estas roupas. Eles disseram que isto era a última moda.", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "Esta ilha é o último lugar que resta na Terra com erva nele!", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 ["This is typical!"] = "Típico", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "Isto deve ser algum tipo de feitiçaria!", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "Isto devem ser as cavernas!", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "Este é complicado(?)", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Esta chuva é mesmo qualquer coisa...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- ["Those aliens are destroying the island!"] = "Aqueles alienígenas estão a destruir a ilha!", -- A_Classic_Fairytale:family --- ["Timed Kamikaze!"] = "", - ["Time Extended!"] = "Tempo Prolongado!", - ["Time Extension"] = "Extensão de tempo", - ["TIME: "] = "TEMPO: ", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Ligar\Desligar Escudo", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 ["To help you, of course!"] = "Para te ajudar claro!", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "PISTA COMPLETA", - - ["training"] = "treino", -- portal +-- ["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 +-- ["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 ["Tribe"] = "Tribo", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "TrophyRace", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon --- ["Turn Time"] = "", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "Uhm...ok não.", -- A_Classic_Fairytale:enemy - ["ULTRA KILL"] = "ULTRA KILL", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies ["Unit 0x0007"] = "Unidade 0x0007", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- ["Unit 334a$7%;.*"] = "Unidade 334a$7%;.*", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Unidade 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- ["Unit 835"] = "Unidade 835", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united ["Unit"] = "Unidade", ["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!", -- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge - ["[Up], [Down] to aim, [Space] to shoot!"] = "[Cima], [Baixo] para apontar, [Espaço] para disparar!", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "Usa com moderação\sábiamente", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "Usa com cuidado!", -- A_Classic_Fairytale:first_blood -- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "Usa a corda para chegar à cabeça da toupeira, jovem!", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos ["Use the rope to knock your enemies to their doom."] = "Usa a corda para empurrar os teus inimigos para o seu fim.", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Utilizando a corda, percorre o percurso do inicio ao fim o mais rápido que conseguires!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion ["Vedgies"] = "Vegetais", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- ["Vegan Jack"] = "Jack Vegetariano", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Walls Left"] = "Faltam $1 paredes", -- WxW - ["Walls Required"] = "Paredes Necessárias", -- WxW - ["WALL TO WALL"] = "WALL TO WALL", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "Cuidado onde pões os pés, jovem!", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer -- ["Waypoint placed."] = "Waypoint colocado.", --- ["Way-Points Remaining"] = "", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "Fracotes", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "Todos sabemos o que acontece quando te sentes assustado...", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion -- ["Weapons Reset"] = "", --- ["Weapons reset."] = "", -- Highlander +-- ["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 -- ["We can't hold them up much longer!"] = "Não conseguimos aguentalos por muito mais.", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "Não os podemos deixar apoderarem-se\que se apoderem da nossa pequena ilha!", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen ["We have no time to waste..."] = "Não temos tempo a perder...", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "Não temos mais onde viver!", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "Bem vindo, Leaks a Lot!", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos ["Well done."] = "Bom trabalho.", ["We'll give you a problem then!"] = "Nós arranjamos-te um problema então!", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "Vamos poupar a tua vida para ja!", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "Bem, isto foi um desperdicio de tempo.", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "Bem, bem! Não isto é coisa mais fofa que já alguma vez viste?", -- A_Classic_Fairytale:journey ["Well, yes. This was a cyborg television show."] = "Bem, claro. Isto era um programa de televisão para cyborgs.", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen ["We made sure noone followed us!"] = "Certificá-mo-nos que ninguém nos seguiu! que ninguem nos seguiu!", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen ["We need to move!"] = "Temos de ir!", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "Temos de prevenir a sua chegada!", -- A_Classic_Fairytale:backstab ["We need to warn the village."] = "Temos de avisar a aldeia.", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "Estavamos a tentar salva-la e acabamos por nos perder.", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "Não vamos deixar que a magoes!", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "O quê? Um canibal? Aqui? Não ha tempo a perder! Vem, estás preparado.", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen ["What a douche!"] = "Que otário!", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "O que estás a fazer a tão grande distancia, jovem?", -- A_Classic_Fairytale:first_blood @@ -1035,13 +2333,22 @@ ["What a ride!"] = "Que viagem!", -- A_Classic_Fairytale:shadow ["What a strange cave!"] = "Que caverna estranha!", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "Tenho um mau persentimento!", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen ["What do my faulty eyes observe? A spy!"] = "O que vêm observam os meus defeituoso olhos? Um espião!", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "O que quer que seja que faz o teu barco flutuar... (preciso melhor expressão verdadeiramente portuguesa)", -- A_Classic_Fairytale:shadow - [" What !! For all of this struggle i just win some ... TIME o0"] = " O quê !! Por todo este esforço tudo o que ganho é ... TEMPO o0", -- portal --- ["What has "] = "Foi aquilo ", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab ["What? Here? How did they find us?!"] = "O quê? Aqui? Como raio nos encontraram?!", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "O que é este sitio?\Que (raio de) sitio é este?", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen ["What shall we do with the traitor?"] = "O que fazemos com o traidor?", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "O QUÊ?! Voces é que nos atacaram\estão a atacar!", -- A_Classic_Fairytale:enemy ["When I find it..."] = "Quando o encontrar...", -- A_Classic_Fairytale:dragon ["When?"] = "Quando?", -- A_Classic_Fairytale:enemy @@ -1055,31 +2362,39 @@ ["Where do you get that?!"] = "Onde arranjaste isso?!", -- A_Classic_Fairytale:enemy ["Where have you been?!"] = "Onde estiveste?!", -- A_Classic_Fairytale:backstab ["Where have you been?"] = "Onde estiveste?", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen ["Why are you doing this?"] = "Porque estás a fazer isto?", -- A_Classic_Fairytale:journey ["Why are you helping us, uhm...?"] = "Porque nos estás a ajudar, uhm...?", -- A_Classic_Fairytale:family ["Why can't he just let her go?!"] = "Porque não podemos simplesmente deixá-la ir?!", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen ["Why do men keep hurting me?"] = "Porque é que os homens continuam a magoar-me?", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen ["Why do you not like me?"] = "Porque não gostas de mim?", -- A_Classic_Fairytale:shadow ["Why do you want to take over our island?"] = "Porque querem apoderar-se da nossa ilha?", -- A_Classic_Fairytale:enemy ["Why me?!"] = "Por quê eu?!", -- A_Classic_Fairytale:backstab - ["? Why?"] = "? Por quê?", -- A_Classic_Fairytale:backstab - ["Why "] = "Por quê ", -- A_Classic_Fairytale:backstab - ["! Why?!"] = "! Por quê?!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen ["Why would they do this?"] = "Porque fariam eles isto?", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "Será que isto alguma vez vai acabar?", - ["WINNER IS "] = "O VENCEDOR É ", -- Mutant - ["WINNING TIME: "] = "TEMPO VENCEDOR: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "Carvalho Sábio", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "Não te preocupes, pois este animal é perfeitamente pacífico! Não há qualquer fazão para receio...", -- A_Classic_Fairytale:first_blood ["Wow, what a dream!"] = "Wow, mas que sonho!", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- ["Y3K1337"] = "Y3K1337", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "Boa, ganhamos!", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1087,68 +2402,226 @@ ["Yeah, sure! I died. Hillarious!"] = "Sim, claro! Morri. Que piada!", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "Sim, toma isto!", -- A_Classic_Fairytale:dragon ["Yeah? Watcha gonna do? Cry?"] = "Ai sim? E o que vais fazer? Chorar?", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen ["Yes!"] = "Sim!", -- A_Classic_Fairytale:enemy -- ["Yes, yeees! You are now ready to enter the real world!"] = "Sim, SIM! Estás agora pronto para entrar no mundo real!", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "Yo, bacano, também estamos aqui!\chagámos, também!", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome ["You are given the chance to turn your life around..."] = "Foi-te oferecida uma oportunidade para mudar a tua vida...", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "Estas a bincar com as nossas vidas com isto!", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "! Seus bastardos!", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "As tuas habilidades são impressionantes, ", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "Não podes disparar um portal na superficie azul", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["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 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "Finalmente percebeste!", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "Tu raptaste toda a nossa tribo!", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "Marcaste!!", --- ["You have "] = "Tens ", -- A_Classic_Fairytale:dragon - ["You have to destroy 12 targets in 180 seconds"] = "Tens de destruir 12 alvos em 180 segundos", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "Ganhaste o jogo demonstrando a tua excelente habilidade em cooperar!", -- A_Classic_Fairytale:enemy ["You just appeared out of thin air!"] = "Simplesmente apareceste do nada!", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen ["You just committed suicide..."] = "Acabaste de cometer suicídio...", -- A_Classic_Fairytale:shadow ["You killed my father, you monster!"] = "Tu mataste o meu pai, seu monstro!", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "Tu sabes...a passear.", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "Sabes que mais? Nem me arrependo de nada disto!", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag ["You meatbags are pretty slow, you know!"] = "Voçês sacos de carne são muito lentos, sabiam?", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "As vossas mortes serão vingadas canibais!", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "És engraçado!", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "Estás a ficar muito bom!", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "És patetico! Não és digno da minha atenção...", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "Deves-te estar(?) a perguntar-te porque te trouxe de volta...", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen ["You're terrorizing the forest...We won't catch anything like this!"] = "Estás a aterrorizar a floresta...Não vamos conseguir apanhar nada assim!", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome ["Your hogs must survive!"] = "Os teus ouriços têm de sobreviver!", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "A tua habilidade para te movimentares serão agora avaliadas.", -- A_Classic_Fairytale:first_blood --- ["You saved"] = "Salvaste", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "Bazuqueiros", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard ["Zork"] = "Zork", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/pt_PT.txt --- a/share/hedgewars/Data/Locale/pt_PT.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/pt_PT.txt Sun Dec 17 00:09:24 2017 +0100 @@ -59,7 +59,7 @@ 00:55=Congelador 00:56=Cutelo -01:00=Vamos lutar! +; 01:00=Loading … 01:01=Ronda empatada 01:02=%1 venceu! 01:03=Volume %1% @@ -246,11 +246,11 @@ 02:02=Não temas! 02:02=Sê corajoso e conquista -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=%1 venceu! -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Ronda empatada ; New health crate 02:05=Auxílio iminente! @@ -513,12 +513,12 @@ ; Game goal strings 05:00=Modos de Jogo 05:01=Aplicam-se as seguintes regras -05:02=Fortes: Defende a tua fortaleza; derrota os teus inimigos! +05:02=Posiciona o Rei: Escolhe um local seguro para o Rei começar 05:03=Baixa Gravidade: Cuidado onde pões os pés 05:04=Invulnerabilidade: Os ouriços são (quase) invulneráveis 05:05=Vampirismo: Os ouriços são curados em proporção ao dano causado 05:06=Karma: Os ouriços recebem o dano que causam -05:07=Protege o Rei: Não deixes o teu Rei morrer!|Posiciona o Rei: Escolhe um local seguro para o Rei começar +05:07=Protege o Rei: Não deixes o teu Rei morrer! 05:08=Posicionar Ouriços: Posiciona os teus ouriços antes do jogo começar 05:09=Artilharia: Os ouriços não podem andar ou mudar de posição 05:10=Terreno Indestrutível: A maioria das armas não destrói o terreno diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/ro.txt --- a/share/hedgewars/Data/Locale/ro.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/ro.txt Sun Dec 17 00:09:24 2017 +0100 @@ -57,7 +57,7 @@ ; 00:54=Structură 00:54=Spray de teren -01:00=Hai să ne batem! +; 01:00=Loading … 01:01=Remizăr 01:02=%1 a câștigat! 01:03=Volumul %1% @@ -243,11 +243,11 @@ 02:02=Have no fear! 02:02=Be brave and conquer -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=%1 a câștigat! -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Remizăr ; New health crate 02:05=Incoming aid! @@ -510,12 +510,12 @@ ; Game goal strings 05:00=Game Modes 05:01=The following rules apply -05:02=Forts: Defend your fortress; vanquish your enemies! +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!|Place the King: Pick a protected starting point for your King +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 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/ru.lua --- a/share/hedgewars/Data/Locale/ru.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/ru.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,304 +1,556 @@ locale = { --- [":("] = "", -- ["!!!"] = "", -- ["..."] = "", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united - ["+1 to a Bottom Feeder for killing anyone"] = "+1 Аутсайдеру за убийство", -- Mutant - ["+1 to a Mutant for killing anyone"] = "+1 Мутанту за убийство", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler + ["%.1f seconds were remaining."] = "%.1f секунд еще оставалось.", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant ["-1 to anyone for a suicide"] = "-1 за самоубийство", -- Mutant - ["+2 for becoming a Mutant"] = "+2 за то, что стал Мутантом", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy ["Above-average pilot"] = "Пилот выше среднего", -- User_Mission_-_RCPlane_Challenge - ["Accuracy Bonus!"] = "Бонус за точность!", +-- ["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 obtained: Lively Lifeguard"] = "Достижение получено: Живучий Спасатель", -- User_Mission_-_That_Sinking_Feeling - ["Achievement Unlocked"] = "Достижение Разблокировано", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 - ["Aggressively removes enemy hedgehogs."] = "Агрессивно уничтожает вражеских ежей.", -- Construction_Mode - ["a Hedgewars challenge"] = "Hedgewars испытание", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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"] = "Ролевая игра в Hedgewars", -- Mutant --- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Упражнение на точность", --Bazooka, Shotgun, SniperRifle ["Aiming practice"] = "Упражнение на точность", -- TargetPractice ["Air Attack"] = "Воздушная атака", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy - ["Allows free teleportation between other nodes."] = "Позволяет телепортироваться между другими узлами.", -- Construction_Mode - ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "Позволяет размещать балки, батуты, мины, мины-липучки и бочки.", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode - ["Allows the placement of weapons, utiliites, and health crates."] = "Позволяет размещать ящики с оружием, утилитами и аптечки.", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen ["All walls touched!"] = "Все стены тронуты!", -- WxW --- ["Ammo"] = "", --- ["Ammo Depleted!"] = "", --- ["ammo extended!"] = "", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler -- ["Ammo is reset at the end of your turn."] = "", --- ["Ammo Maniac!"] = "", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon - ["a shoppa minigame"] = "shoppa мини-игра", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon - ["Attack From Rope"] = "Атака с верёвки", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies ["Available points remaining: "] = "Осталось точек для размещения: ", ["Average pilot"] = "Средний Пилот", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- ["Bad Guy"] = "Плохой", -- User_Mission_-_The_Great_Escape - ["badmad"] = "Злодеи", -- portal +-- ["Badmad"] = "", -- portal ["Bad Team"] = "Злодеи", -- User_Mission_-_The_Great_Escape - ["Ballgun"] = "Шаромёт", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- ["Bamboo Thicket"] = "Заросли Бамбука", -- User_Mission_-_Bamboo_Thicket --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor ["Barrel Placement Mode"] = "Режим Размещения Бочек", -- Construction_Mode - ["Baseball Bat"] = "Бейсбольная бита", -- Construction_Mode -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Сбей своих соберников|бейсбольными мячами в воду!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Выбей своих соберников через корзину в воду!", - ["Bazooka"] = "Базука", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Тренировка с базукой", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen ["Beginner"] = "Новичок", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos ["Below-average pilot"] = "Пилот ниже среднего", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen -- ["Best laps per team: "] = "", - ["Best Team Times: "] = "ЛУЧШЕЕ ВРЕМЯ КОМАНДЫ: ", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode ["Bio-Filter"] = "Био-Фильтр", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family - ["Birdy"] = "Птичка", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 - ["Blowtorch"] = "Бур", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- ["Blue Team"] = "Синяя Команда", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos ["Bobo"] = "Бобо", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "БАБАХ!", +-- ["Bones"] = "", -- +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion ["Boom!"] = "Бум!", --- ["Boss defeated!"] = "", --- ["Boss Slayer!"] = "", - ["BOTTOM FEEDER"] = "АУТСАЙДЕР", -- Mutant +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab ["Build a fortress and destroy your enemy."] = "Постройте крепость и уничтожьте своего врага.", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer ["Build a track and race."] = "Постройте трек и гоняйте!", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen -- ["C-1"] = "", -- portal -- ["C-2"] = "", -- portal - ["Cake"] = "Торт", -- Construction_Mode +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "ЗАХВАТ ФЛАГА", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Беспечный", -- ["Carol"] = "", -- A_Classic_Fairytale:family - ["Challenge"] = "Испытание", -- SpeedShoppa + ["Challenge completed!"] = "Испытание пройдено!", -- SpeedShoppa ["CHALLENGE COMPLETE"] = "МИССИЯ ПРОЙДЕНА", -- User_Mission_-_RCPlane_Challenge - ["Challenge completed!"] = "Испытание пройдено!", -- SpeedShoppa ["Challenge failed!"] = "Испытание провалено!", -- SpeedShoppa - ["Change Weapon"] = "Сменить оружие", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 ["Cheater"] = "Читер", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- +-- ["Cleaver Placement Mode"] = "", -- Construction_Mode +-- ["CLEAVER PLACEMENT MODE"] = "", -- HedgeEditor ["Cleaver"] = "Секач", -- Construction_Mode --- ["Cleaver Placement Mode"] = "", -- Construction_Mode -- ["Climber"] = "", -- ClimbHome -- ["Climb Home"] = "", -- ClimbHome +-- ["Closing in"] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "Касcетная бомба", -- Construction_Mode - ["Cluster Bomb MASTER!"] = "МАСТЕР Касcетной бомбы", -- Basic_Training_-_Cluster_Bomb ["Cluster Bomb Training"] = "Тренировка с Касcетной бомбой", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Кодовое имя: 'Командная работа'", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor ["Compete to use as few planes as possible!"] = "Постарайся использовать как можно меньше самолетов!", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Закончите трек так быстро, как сможете!", - ["COMPLETION TIME"] = "ВРЕМЯ ЗАВЕРШЕНИЯ", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen ["Configuration accepted."] = "Конфигурация принята.", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 +-- ["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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 + ["Congratulations! You have destroyed all targets within the time."] = "Поздравляем! Вы уничтожили все цели во время.", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final + ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "Поздравляем! Вы действительно освоили это испытание!", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope + ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Поздравляем! Ты уничтожил все цели во время.", --Bazooka, Shotgun, SniperRifle +-- ["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!"] = "Поздравляем!", ["Congratulations"] = "Поздравляем", -- Basic_Training_-_Rope - ["Congratulations! You have destroyed all targets within the time."] = "Поздравляем! Вы уничтожили все цели во время.", -- TargetPractice - ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "Поздравляем! Вы действительно освоили это испытание!", -- User_Mission_-_RCPlane_Challenge - ["Congratulations! You needed only half of time|to eliminate all targets."] = "Поздравляем! Тебе понадобилась только половина|времени, чтобы уничтожить все цели.", -- Basic_Training_-_Cluster_Bomb - ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "Поздравляем! Ты закончил упражнение с Верёвкой! |- Упражнение завершится через 10 секунд!", -- Basic_Training_-_Rope - ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Поздравляем! Ты уничтожил все цели во время.", --Bazooka, Shotgun, SniperRifle - ["Congratulations!"] = "Поздравления!", +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos +-- ["Construction Mode tool"] = "", -- Construction_Mode ["CONSTRUCTION MODE"] = "РЕЖИМ СТРОИТЕЛЬСТВА", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode ["Construction Station"] = "Станция Утилит", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control + ["Control pillars to score points."] = "Контролируй колонны, чтобы заработать очки.", -- Control +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope ["Copper"] = "Медный", -- User_Mission_-_Nobody_Laugh - ["CONTROL"] = "КОНТРОЛЬ", -- Control - ["Control pillars to score points."] = "Контролируй колонны, чтобы заработать очки.", -- Control - ["Core"] = "Ядро", -- Construction_Mode +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil ["Cost"] = "Стоимость", -- Construction_Mode - ["Crate Placement Tool"] = "Инструмент Размещения Ящиков", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["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 - ["%d crate(s) remaining"] = "%d ящиков осталось", -- SpeedShoppa --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Кибер Империя", -- User_Mission_-_Bamboo_Thicket -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- + ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ЧЁРТ ПОБЕРИ! СЛЕЗЬ С МОЕЙ ГОЛОВЫ!", ["DAMMIT, ROOKIE!"] = "ЧЁРТ ПОБЕРИ, САЛАГА!", - ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ЧЁРТ ПОБЕРИ! СЛЕЗЬ С МОЕЙ ГОЛОВЫ!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Опасные Утята", -- User_Mission_-_Dangerous_Ducklings +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion + ["%d crate(s) remaining"] = "%d ящиков осталось", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Балласт", - ["deaths"] = "смертей", -- Mutant --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow - ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "Аннигилирует вражеское оружие и оборудование.", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor + ["Demolition is fun!"] = "Разрушать весело!", ["Demo"] = "Демон", -- The_Specialists - ["Demolition is fun!"] = "Разрушать весело!", -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow --- ["Depleted Kamikaze!"] = "", +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion ["Derp"] = "Глупый", -- User_Mission_-_Nobody_Laugh - ["Desert Eagle"] = "Пистолет Desert Eagle", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Desert Storm"] = "", -- + ["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 to score points."] = "", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 - ["Destroyer of planes"] = "Уничтожитель самолётов", -- User_Mission_-_RCPlane_Challenge +-- ["+%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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion ["Disabled"] = "Отключено", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies +-- ["Displacer"] = "", -- ["Disqualified!"] = "Дисквалификация!", -- User_Mission_-_That_Sinking_Feeling --- ["Dist: "] = "", -- Space_Invasion +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood - ["DOUBLE KILL"] = "ДВОЙНОЕ УБИЙСТВО", -- Mutant +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon - ["Drill Rocket"] = "Сверлящая ракета", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode --- ["Drone Hunter!"] = "", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Утопающий", -- User_Mission_-_Nobody_Laugh +-- ["Dr. Parkinson"] = "", -- ["Drunk greenhorn"] = "Пьяный молокосос", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - - ["Dynamite"] = "Динамит", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy ["Each turn you get 1-3 random weapons"] = "Каждый ход вы получаете 1-3 случайных оружия", ["Each turn you get one random weapon"] = "Каждый ход вы получаете одно случайное оружие", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies ["Eckles"] = "Заика", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family ["Elimate your captor."] = "Уничтожь твоего похитителя.", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Уничтожьте всех врагов", ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Уничтожь все цели, пока время не вышло.|Для этой миссии доступен неограниченный боезапас.", --Bazooka, Shotgun, SniperRifle - ["Eliminate enemy hogs and take their weapons."] = "Уничтожьте вражеских ежей и получите их оружие.", -- Highlander - ["Eliminate Poison before the time runs out"] = "Уничтожь Яд пока время не вышло", - ["Eliminate the Blue Team"] = "Уничтожь Синюю Команду", - ["Eliminate the enemy before the time runs out"] = "Уничтожь врага пока время не вышло", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Уничтожьте Юнит 3378 |- Слабое Сопротивление должно выжить", +-- ["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 ["Elite pilot"] = "Элитный пилот", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen ["Enabled"] = "Включено", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion ["Energetic Engineer"] = "Энергичный Инженер", -- User_Mission_-_Bamboo_Thicket ["Engineer"] = "Инженер", -- The_Specialists ["Enjoy the swim..."] = "Приятного плавания...", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["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 - ["Extra Damage"] = "Дополнительный урон", -- Construction_Mode - ["Extra Time"] = "Дополнительное время", -- Construction_Mode +-- ["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"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Лучший круг: ", ["Feeble Resistance"] = "Слабое Сопротивление", @@ -306,63 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 ["Filthy Blue"] = "Грязный Синяк", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 --- ["Fire"] = "", - +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood - ["FIRST BLOOD MUTATES"] = "ПЕРВАЯ КРОВЬ МУТИРУЕТ", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Флаг захвачен!", ["Flag respawned!"] = "Респаун флага!", ["Flag returned!"] = "Флаг возвращен!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Флаги и базы будут помещены там, где каждая команда закончила свои первый ход.", -- ["Flamer"] = "", - ["Flamethrower"] = "Огнемет", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab ["Flawless victory!"] = "Безупречная победа!", -- User_Mission_-_RCPlane_Challenge - +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey - ["Flying Saucer"] = "Летающая тарелка", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- ["Frank"] = "Фрэнк", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey - ["Freezer"] = "Замораживатель", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", --- ["fuel extended!"] = "", - ["GAME BEGUN!!!"] = "ПОЕХАЛИ!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 - ["Generates power."] = "Генерирует энергию, необходимую для постройки сооружений.", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 +-- ["Generator: Generates energy."] = "", -- Construction_Mode ["Generator"] = "Генератор", -- Construction_Mode -- ["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 out of there!"] = "Выберись отсюда!", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey - ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "Доберись до цели, используя верёвку! |Упрвление: Влево и Вправо для раскачивания - Вверх и Вниз для укорочения и удлинения!", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family - ["GG!"] = "GG!", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor ["Girder Placement Mode"] = "Режим Размещения Балок", -- Construction_Mode +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Цель", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Удачи там!", ["Good so far!"] = "Пока хорошо!", @@ -371,177 +676,360 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey ["Go surf!"] = "Теперь сёрфить!", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "ПОПАЛСЯ!", --- ["Grab Mines/Explosives"] = "", - ["Grants nearby hogs life-regeneration."] = "Восстанавливает здоровье соседних ежей.", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow - ["GREAT ! Let's kill all this enemies, using portals"] = "ПРЕКРАСНО ! Теперь можно убить всех с помощью порталов", -- portal +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "Хорошая работа! А теперь ударь его Бейсбольной Битой! |Подсказка: Оружие можно сменить 'Правым кликом'!", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 ["Greenhorn"] = "Молокосос", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow - ["Grenade"] = "Граната", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 ["Grenade Training"] = "Тренировка с Гранатой", -- Basic_Training_-_Grenade + ["Grenadiers"] = "Гренадеры", -- Basic_Training_-_Grenade ["Grenadier"] = "Гренадер", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard - ["Grenadiers"] = "Гренадеры", -- Basic_Training_-_Grenade +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["Hahahaha!"] = "Хахахаха!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Хаха, да не гони, ЭТО уже слишком!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen ["Hammer"] = "Молот", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil ["Hapless Hogs"] = "Несчастные Ежи", - ["%d Hapless Hogs left"] = "%d Несчастных Ёжиков осталось", +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- ["Harry"] = "Гарри", -- User_Mission_-_Nobody_Laugh - [" HAS MUTATED"] = " МУТИРОВАЛ", -- Mutant +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode ["Healing Station"] = "Лечебная Станция", -- Construction_Mode +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor ["Health Crate Placement Mode"] = "Режим Размещения Аптечек", -- Construction_Mode --- ["Health crates extend your time."] = "", +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor ["Heartful"] = "Сердечный", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "Тяжёлый", --- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars Баскетбол", - ["Hedgewars-Knockball"] = "Hedgewars Вышибалы", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Хех, не так уж всё и плохо.", +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 ["Hell Army"] = "Армия Ада", -- portal - ["Hellish Handgrenade"] = "Адская граната", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey - ["HIGHLANDER"] = "ЦАРЬ ГОРЫ", -- Highlander - ["hiden"] = "Скрытный", -- portal +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hit Combo!"] = "", ["hits"] = "попаданий", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy - ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "Хмм, надо придумать как скинуть его с анти-портальной поверхности...", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood ["Hmmm..."] = "Хммм...", +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 - ["HOLY SHYTE!"] = "ВОТ ЧЕРТ!", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant ["Homing Bee"] = "Пчёлка", -- Construction_Mode +-- ["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"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 - [" HP"] = " HP", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Охотник", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy - ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "Я не знаю, как ты это сделал... Но ты молодец! |Следующая цель вообще не составит тебе труда!", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil ["Igmund"] = "Джокер", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon - ["INSANITY"] = "БЕЗУМИЕ", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Инструктор", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings ["Insufficient Power"] = "Недостаточно Энергии", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow --- ["invaders destroyed"] = "", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal ["Invalid Placement"] = "Неверное Размещение", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united - ["Invulnerable"] = "Неуязвимость", -- Construction_Mode ["In your best (and only) flight you took out %d crates with one RC plane!"] = "В вашем лучшем (и единственном) полёте вы достали %d ящиков с одним самолётом.", -- User_Mission_-_RCPlane_Challenge ["In your best flight you took out %d crates with one RC plane."] = "В вашем лучшем полёте вы достали %d ящиков с одним самолётом.", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab - ["I should get myself a portal gun, maybe this crate has one"] = "Надо достать портальную пушку, может в этом ящике?", -- portal +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -551,592 +1039,1288 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Хорошо, что ВНЕЗАПНАЯ СМЕРТЬ аж через 99 ходов...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Прыжки отключены", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode --- ["Kamikaze Expert!"] = "", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion ["Keep it up!"] = "Так держать!", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood --- ["KILLS"] = "", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion ["King Customer"] = "Король Покупатель", -- Challenge_-_Speed_Shoppa_-_ShoppaKing - ["Land Sprayer"] = "Распылитель земли", -- Construction_Mode - ["Laser Sight"] = "Лазерный прицел", -- Construction_Mode +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion ["Last Target!"] = "Последняя цель!", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["[Left Shift]"] = "", --- ["left shift"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion ["Lestat"] = "Лестат", -- portal --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united - ["Limburger"] = "Старый Лимбургер", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Слушай сюда, щегол!!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 ["Loon"] = "Псих", -- The_Specialists - ["Low Gravity"] = "Слабая гравитация", -- Construction_Mode, Frenzy +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- ["Lucifer"] = "Люцифер", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united - ["LUDICROUS KILL"] = "НЕЛЕПОЕ УБИЙСТВО", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies - ["MEGA KILL"] = "МЕГА УБИЙСТВО", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- ["milliseconds"] = "миллисекунд", -- SpeedShoppa -- ["Mindy"] = "", -- A_Classic_Fairytale:united - ["Mine"] = "Мина", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor ["Mine Placement Mode"] = "Режим Размещения Мин", -- Construction_Mode - ["|- Mines Time:"] = "|- Задержка Мин:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "Миссия провалена!", -- Basic_Training_-_Grenade --- ["MISSION SUCCESS"] = "", ["MISSION SUCCESSFUL"] = "МИССИЯ УСПЕШНА", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork ["Mission won!"] = "Миссия успешна!", -- Basic_Training_-_Grenade - ["Molotov Cocktail"] = "Коктейль Молотова", -- Construction_Mode +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies - ["MONSTER KILL"] = "УБИЙСТВО МОНСТРА", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil - ["Mortar"] = "Миномёт", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 -- ["Movement: [Up], [Down], [Left], [Right]"] = "", - ["Mudball"] = "Комок грязи", -- Construction_Mode --- ["Multi-shot!"] = "", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow - ["-------"] = "-------", -- Mutant - ["MUTANT"] = "МУТАНТ", -- Mutant +-- ["Mushroom Kingdom"] = "", -- ["Mutant"] = "Мутант", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 ["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: [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 --- ["New Barrels Per Turn"] = "", - ["NEW CLAN RECORD: "] = "НОВЫЙ РЕКОРД КЛАНА: ", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "НОВЫЙ лучший круг: ", --- ["New Mines Per Turn"] = "", - ["NEW RACE RECORD: "] = "НОВЫЙ РЕКОРД ГОНКИ: ", - ["Newton's Hammock"] = "Гамак Ньютона", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen ["Ninja"] = "Ниндзя", -- The_Specialists +-- ["Ninpo"] = "", -- ["Nobody Laugh"] = "Никто не смеётся", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies - ["Normal players can only score points by killing the mutant."] = "Обычные игроки могут получить очки только убив Мутанта.", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies - ["Not all hogs are born equal."] = "Не все ежи рождаются равными.", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "НЕДОСТАТОЧНО КОНТРОЛЬНЫХ ТОЧЕК", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Совсем Не Товарищеский Матч", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "Теперь найди следующую цель!|Подсказка: Ты потеряешь здоровье, если упадешь, будь осторожен!", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab - ["Object Placement Tool"] = "Инструмент Размещения Объектов", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood - ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "ТОЛЬКО ОДИН ЁЖ НА КОМАНДУ! ИЗБЫТОК ЕЖЕЙ БУДЕТ УДАЛЕН", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Операция 'Ныряльщик'", ["Opposing Team: "] = "Команда Соперника: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity ["Other kills don't give you points."] = "Другие убийства не дадут вам очков.", -- Mutant - ["Ouch!"] = "Ох!", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 ["Parachute"] = "Парашют", -- Continental_supplies - ["Pathetic Hog #%d"] = "Жалкий Ёж #%d", +-- ["Patches"] = "", -- ["Pathetic Resistance"] = "Жалкое Сопротивление", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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 Portal Device"] = "Портальная Пушка", -- Construction_Mode - -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow - ["phosphatoglucidique"] = "Углеводофосфатный", -- portal +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor ["Piano Strike"] = "Фортепьяновый удар", -- Construction_Mode - ["Pickhammer"] = "Отбойный молоток", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor ["Place more waypoints using the 'Air Attack' weapon."] = "Расположите больше контрольных точек, используя 'Воздушную атаку'", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag ["Planes used: %d"] = "Использовано самолётов: %d", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow - ["player"] = "игрок", -- portal - ["Please place the way-point further from the waterline."] = "Поместите контрольную точку подальше от воды.", -- Racer - ["Please place the way-point in the open, within the map boundaries."] = "Поместите контрольную точку в открытом месте внутри границ карты.", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- Battalion +-- ["point(s)"] = "", -- TargetPractice, Mutant ["points"] = "очки", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle - ["POINTS"] = "ОЧКИ", -- Mutant +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 ["Poison"] = "Яд", +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon - ["Portal mission"] = "Портальная миссия", -- portal --- ["Power Remaining"] = "", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 ["Predator"] = "Хищник", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos ["Prepare yourself"] = "Готовься", --- ["presice"] = "", -- Continental_supplies - ["Press [Enter] to accept this configuration."] = "Нажмите [Enter] для принятия конфигурации.", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW -- ["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 Peach"] = "", -- ["Private Nolak"] = "Рядовой Нолак", -- Target_Practice_-_Cluster_Bomb - ["Private Novak"] = "Рядовой Новак", -- Basic_Training_-_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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["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 - ["Race complexity limit reached."] = "Лимит сложности гонки достигнут.", +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer ["RACER"] = "ГОНЩИК", +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow ["Rank: %s"] = "Ранк: %s", -- User_Mission_-_RCPlane_Challenge --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity - ["razac"] = "Чумной", -- portal +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode - ["RC PLANE TRAINING"] = "ТРЕНИРОВКА С РАДИОУПРАВЛЯЕМЫМ САМОЛЕТОМ", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode ["Reflector Shield"] = "Щит-Отражатель", -- Construction_Mode - ["Reflects enemy projectiles."] = "Отражает снаряды врагов.", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "Помни: Верёвка изгибается только вокруг объекты, |если же она ничего не касается, то всегда остается прямой!", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 - ["Resurrects dead hedgehogs."] = "Возвращает к жизни мертвых ежей.", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 ["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 - ["ronald"] = "Рональд", -- portal - ["Rope"] = "Верёвка", -- Construction_Mode - ["ROPE-KNOCKING"] = "ВЫШИБАНИЕ-ВЕРЁВКОЙ", -- User_Mission_-_Rope_Knock_Challenge - ["Rope Master!"] = "Мастер Верёвки!", -- Basic_Training_-_Rope +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope ["Roper"] = "Верёвочник", -- SpeedShoppa ["Ropes and Crates"] = "Верёвки и Ящики", -- Challenge_-_Speed_Shoppa_-_Ropes ["Rope Team"] = "Верёвочники", -- Basic_Training_-_Rope --- ["Rope to safety"] = "", -- ClimbHome ["Rope Training"] = "Тренировка с Верёвкой", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow - ["Round Limit:"] = "Лимит Раундов:", --- ["Round Limit"] = "", - ["Rounds Complete: "] = "Раундов Завершено: ", --- ["Rounds Complete"] = "", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor ["Rubber Placement Mode"] = "Режим Размещения Батутов", -- Construction_Mode - ["RULES"] = "ПРАВИЛА", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "ПРАВИЛА ИГРЫ", +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - ["Saint"] = "Святой", -- The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 ["Save as many hapless hogs as possible!"] = "Спасите как можно больше несчастных ежей!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["SCORE"] = "", - ["Score"] = "Счет", -- Mutant - - ["sec"] = "сек", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag - ["%.1f seconds were remaining."] = "%.1f секунд еще оставалось.", -- Basic_Training_-_Bazooka +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Увидимся!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["s"] = "", -- GaudyRacer, Space_Invasion +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family --- ["Shield boosted! +30 power"] = "", --- ["Shield Depleted"] = "", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion -- ["Shield is fully recharged!"] = "", --- ["Shield Master!"] = "", --- ["Shield Miser!"] = "", --- ["Shield OFF:"] = "", --- ["Shield ON:"] = "", --- ["Shield Seeker!"] = "", +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shoryuken"] = "Восходящий удар Дракона", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Shotgun"] = "Дробовик", -- Continental_supplies --- ["Shotgun Team"] = "", --- ["Shotgun Training"] = "", -- ["shots remaining."] = "", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Глупый", - ["SineGun"] = "Синус-пушка (бета)", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Утопленник", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s выбит и Команда %d|оштрафована!| |Счет:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s выбит и Команда %d|получает очко!| |Счет:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy - ["Sniper"] = "Снайпер", -- The_Specialists +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion ["Sniper Rifle"] = "Снайперская винтовка", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil ["Soldier"] = "Солдат", -- The_Specialists --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow - ["Spawn the crate, and attack!"] = "Подбери ящик и атакуй!", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- -- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united ["Sponge"] = "Губка", ["Spooky Tree"] = "Зловещее дерево", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["STATUS UPDATE"] = "ОБНОВЛЕНИЕ СТАТУСА", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - ["Sticky Mine"] = "Мина-Липучка", -- Continental_supplies +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor ["Sticky Mine Placement Mode"] = "Режим Размещения Мин-Липучек", -- Construction_Mode + ["Sticky Mine"] = "Мина-Липучка", -- Continental_supplies +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - ["Structure Placement Mode"] = "Режим Размещения Сооружений", -- Construction_Mode - ["Structure Placement Tool"] = "Инструмент Размещения Сооружений", -- Construction_Mode - ["Subject"] = "Испытуемый", -- portal +-- ["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 -- ["Sundaland"] = "", -- Continental_supplies - ["Super Weapons"] = "Супер Оружие", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode ["Support Station"] = "Станция Поддержки", -- Construction_Mode - ["Surf Before Crate"] = "Сёрфинг Перед Ящиком", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies ["Switched to "] = "Выбран ", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode - ["Targets left: %d"] = "Осталось целей: %d", -- TargetPractice +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor ["Target Practice: Bazooka (easy)"] = "Учебная Стрельба: Базука (легко)", -- Target_Practice_-_Bazooka_easy ["Target Practice: Bazooka (hard)"] = "Учебная Стрельба: Базука (сложно)", -- Target_Practice_-_Bazooka_hard ["Target Practice: Grenade (easy)"] = "Учебная Стрельба: Граната (легко)", -- Target_Practice_-_Grenade_easy ["Target Practice: Grenade (hard)"] = "Учебная Стрельба: Граната (сложно)", -- Target_Practice_-_Grenade_hard ["Target Practice: Homing Bee"] = "Учебная Стрельба: Пчёлка", -- Target_Practice_-_Homing_Bee ["Target Practice: Shotgun"] = "Учебная Стрельба: Дробовик", -- Target_Practice_-_Shotgun + ["Targets left: %d"] = "Осталось целей: %d", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Команда %d: ", +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor ["Team of Hearts"] = "Команда сердец", -- Challenge_-_Speed_Shoppa_-_Hedgelove - ["Team Scores"] = "Очки команд", -- Control, Space_Invasion +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 ["Teleportation Node"] = "Узел Телепортации", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "Неудачная Телепортация. Вы можете телепортироваться только в области влияния ваших телепортов.", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow ["That Sinking Feeling"] = "Дед Мазай и Ёжики", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["That was pointless."] = "", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab - ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "Весь пол покрыт анти-портальной краской и мне нечем его убить... Может сбросить на него что-то?..", -- portal - ["The Bottom Feeder can score points by killing anyone."] = "Аутсайдер может заработать очки убив любого.", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood ["The Customer is King"] = "Покупатель это Король", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Враг прячется на соседней утке!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow - ["The first player to kill someone becomes the Mutant."] = "Первый игрок, убивший кого-либо, становится Мутантом.", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Флаг опять появится в следующем раунде.", ["The flood has stopped! Challenge over."] = "Наводнение остановилось! Испытание закончено.", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "Великий Ёж на небесах видит вашу печаль и благословляет вас даром.", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey ["The Mutant has super-weapons and a lot of health."] = "У Мутанта есть супер-оружие и много здоровья.", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "Следующая цель довольно сложна! |Подсказка: Нужно сделать несколько раскачиваний!", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood - ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "Игрок с наименьшим количеством очков становится Аутсайдером.", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion ["There are a variety of structures available to aid you."] = "Множество сооружений доступны вам в помощь.", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab ["This one's tricky."] = "Это непростая цель.", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Этот дождь нескончаем...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family --- ["Timed Kamikaze!"] = "", --- ["Time Extended!"] = "", --- ["Time Extension"] = "", - ["TIME: "] = "ВРЕМЯ: ", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time’s up!"] = "", -- TargetPractice ["Time's up!"] = "Время вышло!", -- Basic_Training_-_Sniper_Rifle +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "Подсказка: Поведение верёвки отличается от того, что в реальном мире, |используй это как преимущество!", -- Basic_Training_-_Rope --- ["Toggle Shield"] = "", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "ТРЕК ЗАВЕРШЕН", - +-- ["Track completed!"] = "", -- Racer, TechRacer ["Trainee"] = "Ученик", -- TargetPractice - ["training"] = "Тренировка", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "Трофейная Гонка", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 -- ["T_T"] = "", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon --- ["Turn Time"] = "", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy - ["ULTRA KILL"] = "УЛЬТРА УБИЙСТВО", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies - ["Unit"] = "Юнит", -- User_Mission_-_Newton_and_the_Hammock -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Юнит 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- ["Unit 835"] = "Юнит 835", -- User_Mission_-_Bamboo_Thicket +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united + ["Unit"] = "Юнит", -- User_Mission_-_Newton_and_the_Hammock +-- ["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 --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode ["Upper-class elite pilot"] = "Элитный пилот высшего класса", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood ["User Challenge"] = "Одиночная Миссия", - ["Use the air-attack weapons and the arrow keys to select structures."] = "Используйте 'Воздушную атаку' и стрелки, чтобы выбрать сооружение.", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood - ["Use the portal to move fast and far, use it to kill, use it with caution!"] = "Используй портал для перемещения, используй его для убийства, используй его с осторожностью!", -- portal +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos ["Use the rope to knock your enemies to their doom."] = "Используйте веревку, чтобы сбить врагов к их гибели.", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy ["Use your rope to collect all crates as fast as possible."] = "Используйте веревку, чтобы собрать все ящики как можно быстрее.", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Используй веревку, чтобы добраться от старта до финиша как можно быстрее!", +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor ["Utility Crate Placement Mode"] = "Режим Размещения Ящиков с Утилитами", -- Construction_Mode - ["Vampirism"] = "Вампиризм", -- Construction_Mode +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy - ["Victory!"] = "Победа!", -- Basic_Training_-_Rope +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen +-- ["Victory Condition: Collect"] = "", -- HedgeEditor +-- ["Victory Condition: Destroy"] = "", -- HedgeEditor +-- ["Victory for %s!"] = "", -- Capture_the_Flag ["Victory for the "] = "Победа за ", -- CTF_Blizzard, Capture_the_Flag - ["voldemort"] = "Волан-де-Морт", -- portal + ["Victory!"] = "Победа!", -- Basic_Training_-_Rope -- ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood - ["Walls Left"] = "Стен осталось", -- WxW - ["Walls Required"] = "Стен Необходимо", -- WxW --- ["WALL TO WALL"] = "ОТ СТЕНЫ К СТЕНЕ", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- ["Wannabe Flyboys"] = "Хочу быть Пилотом", -- User_Mission_-_RCPlane_Challenge ["Wannabe Shoppsta"] = "Хочу быть Шоппером", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood - ["Watermelon Bomb"] = "Арбузная бомба", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Контрольная Точка добавлена.", - ["Way-Points Remaining"] = "Контрольных Точек осталось", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor ["Weapon Crate Placement Mode"] = "Режим Размещения Ящиков с Оружием", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode ["Weapon Filter"] = "Фильтр Оружия", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion +-- ["Weapons reset: The weapons are reset after each turn."] = "", -- WxW ["Weapons Reset"] = "Сброс оружия", - ["Weapons reset."] = "Сброс оружия.", -- Highlander -- ["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 -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos ["Well done."] = "Отлично.", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1144,13 +2328,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow - [" What !! For all of this struggle i just win some ... TIME o0"] = " ЧТО ?! За все эти страдания я выиграл только немного ... ВРЕМЕНИ o0", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1164,32 +2357,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united - ["Whip"] = "Кнут", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab - ["Will be useful if I need a new plateform or if I want to rise...."] = "Это пригодится, чтобы подняться выше...", -- portal -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - ["Will this ever end?"] = "Когда уже конец?", - ["WINNER IS "] = "ПОБЕДИЛ ", -- Mutant - ["WINNING TIME: "] = "ПОБЕДНОЕ ВРЕМЯ: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1197,99 +2397,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon - ["You can't fire a portal on the blue surface"] = "Нельзя ставить порталы на синюю поверхность", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 did not make it in time, try again!"] = "Время вышло, попробуй еще раз!", -- Basic_Training_-_Rope - ["You had %.2fs remaining on the clock (+%d points)."] = "У вас оставалось %.2f секунд на таймере (+%d очков).", -- Basic_Training_-_Sniper_Rifle +-- ["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 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab - ["You have been respawned, at your last checkpoint!"] = "Ты возродился на последней контрольной точке!", -- Basic_Training_-_Rope - ["You have been respawned, be more carefull next time!"] = "Ты возродился, будь осторожней в следующий раз!", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 ["You have collected %d out of %d crate(s)."] = "Вы собрали %d из %d ящиков.", -- SpeedShoppa - ["You have destroyed %d of %d targets."] = "Вы уничтожили %d из %d целей.", -- Basic_Training_-_Bazooka +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 ["You have destroyed %d of %d targets (+%d points)."] = "Вы уничтожили %d из %d целей (+%d очков).", -- Basic_Training_-_Sniper_Rifle + ["You have destroyed %d of %d targets."] = "Вы уничтожили %d из %d целей.", -- Basic_Training_-_Bazooka ["You have dropped %d missiles."] = "Вы запустили %d ракет.", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["You have finished the bazooka training!"] = "Вы прошли тренировку с базукой!", -- Basic_Training_-_Bazooka + ["You have finished the challenge in %.3f s."] = "Вы прошли испытание за %.3f сек.", -- SpeedShoppa ["You have finished the challenge!"] = "Вы прошли испытание!", -- User_Mission_-_RCPlane_Challenge - ["You have finished the challenge in %.3f s."] = "Вы прошли испытание за %.3f сек.", -- SpeedShoppa +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer ["You have finished the target practice!"] = "Вы завершили учебную стрельбу!", -- TargetPractice - ["You have gained an achievement: %s"] = "Вы получили достижение: %s", -- User_Mission_-_RCPlane_Challenge -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge ["You have launched %d bazookas."] = "Вы запустили %d базук.", -- Basic_Training_-_Bazooka ["You have launched %d homing bees."] = "Вы запустили %d пчёлок.", -- Target_Practice_-_Homing_Bee ["You have made %d shots."] = "Вы сделали %d выстрелов.", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil ["You haven't rescued anyone."] = "Вы никого не спасли.", -- User_Mission_-_That_Sinking_Feeling ["You have obtained an achievement: Lively Lifeguard"] = "Вы получили достижение: Живучий Спасатель", -- User_Mission_-_That_Sinking_Feeling ["You have perfectly beaten the challenge!"] = "Вы прекрасно прошли испытание!", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "Вы доставили флаг!!", ["You have shot %d times."] = "Вы выстрелили %d раз.", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil + ["You have successfully finished the sniper rifle training!"] = "Вы успешно завершили тренировку со снайперской винтовкой!", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb ["You have thrown %d grenades."] = "Вы бросили %d гранат.", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard - ["You have to destroy 12 targets in 180 seconds"] = "Тебе надо уничтожить 12 целей за 180 секунд", -- Basic_Training_-_Cluster_Bomb +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 - ["You have used %d RC planes."] = "Вы использовали %d самолётов.", -- User_Mission_-_RCPlane_Challenge - ["You have successfully finished the sniper rifle training!"] = "Вы успешно завершили тренировку со снайперской винтовкой!", -- Basic_Training_-_Sniper_Rifle +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 - ["You may only spawn 5 crates per turn."] = "Вы можете создавать только 5 ящиков за ход.", -- Construction_Mode - ["You may only use 1 Extra Time per turn."] = "Вы можете использовать Дополнительное Время только один раз за ход.", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW ["You must survive the flood in order to score."] = "Вы должны пережить наводнение, чтобы заработать очки.", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood + ["Your accuracy was %.1f%% (+%d points)."] = "Ваша точность составила %.1f%% (+%d очков).", -- TargetPractice ["Your accuracy was %.1f%%."] = "Ваша точность составила %.1f%%.", -- Basic_Training_-_Bazooka - ["Your accuracy was %.1f%% (+%d points)."] = "Ваша точность составила %.1f%% (+%d очков).", -- TargetPractice --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey - ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "У тебя хорошо получается! |Подсказка: Когда веревка укорачивается, ты двигаешься быстрее! |А когда удлиняется - медленнее!", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos ["Your hedgehog died!"] = "Ваш ёж умер!", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood +-- ["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"] = "", ["You saved %d of 8 Hapless Hogs."] = "Вы спасли %d из 8 Несчастных Ёжиков", -- User_Mission_-_That_Sinking_Feeling +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies - ["zombi"] = "Зомби", -- portal +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal + ["'Zooka Team"] = "Команда Зука", ["Zook"] = "Зук", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard - ["'Zooka Team"] = "Команда Зука", -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/ru.txt --- a/share/hedgewars/Data/Locale/ru.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/ru.txt Sun Dec 17 00:09:24 2017 +0100 @@ -60,8 +60,9 @@ 00:56=Секач 00:57=Батут 00:58=Воздушная мина +00:59=Резиновая уточка -01:00=Вперёд к победе! +; 01:00=Loading … 01:01=Ничья 01:02=Победила команда %1! 01:03=Громкость %1% @@ -252,11 +253,11 @@ 02:02=Не бойся! 02:02=Будь храбрым и победи -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=Победила команда %1! -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Ничья ; New health crate 02:05=Помощь пришла! @@ -527,12 +528,12 @@ ; Game goal strings 05:00=Режимы игры 05:01=Применяются следующие правила -05:02=Форты: защищайте свою крепость, уничтожайте врагов! +05:02=Выставить Короля: выберите защищённую точку старта для вашего Короля 05:03=Низкая гравитация: ходите аккуратно 05:04=Неуязвимость: ежи (почти) неуязвимы 05:05=Вампиризм: ежи исцеляются при нанесении урона врагу 05:06=Карма: ежи получают урон при нанесении урона врагу -05:07=Защита Короля: Не позволяйте королю умереть!|Выставить Короля: выберите защищённую точку старта для вашего Короля +05:07=Защита Короля: Не позволяйте королю умереть! 05:08=Расстановка ежей: расставьте своих ежей перед началом игры 05:09=Артиллерия: ежи не могут ходить 05:10=Неразрушаемая земля: большинство видов оружия не разрушают землю diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/sk.lua --- a/share/hedgewars/Data/Locale/sk.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/sk.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { - [":("] = ":(", ["!!!"] = "!!!", ["..."] = "...", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Bonus za presnosť!", +-- ["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 Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["A Hedgewars minigame"] = "", -- Capture_the_Flag ["a Hedgewars mini-game"] = "minihra Hedgewars", -- Space_Invasion, The_Specialists --- ["a Hedgewars tag game"] = "", -- Mutant --- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["Aiming practice"] = "", -- TargetPractice ["Aiming Practice"] = "Tréning presnosti", --Bazooka, Shotgun, SniperRifle -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW - ["Ammo Depleted!"] = "Výzbroj vyčerpaná!", - ["ammo extended!"] = "výzbroj doplnená!", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler ["Ammo is reset at the end of your turn."] = "Výzbroj je na konci každého kola resetovaná.", - ["Ammo Maniac!"] = "Muničný maniak!", - ["Ammo"] = "Výzbroj", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies ["Available points remaining: "] = "Zostávajúci počet bodov: ", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 - ["[Backspace]"] = "[Backspace]", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- ["Bamboo Thicket"] = "Bambusové krovie", - ["Barrel Eater!"] = "Sudový labužník!", +-- ["Barrel Eater"] = "", -- Tumbler +-- ["Barrel Launcher selected!"] = "", -- Tumbler ["Barrel Launcher"] = "Vystreľovač sudov", -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Loptami triafajte vašich nepriateľov|a zhoďte ich tak do mora!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Odpálkujte vašich súperov do koša|a von z mapy!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Tréning s bazukou", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Najrýchlejšie kolá podľa tímov: ", - ["Best Team Times: "] = "Najrýchlejšie tímové časy: ", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "BUM!", +-- ["Bones"] = "", -- +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion ["Boom!"] = "Bum!", - ["Boss defeated!"] = "Vodca bol porazený!", - ["Boss Slayer!"] = "Vodca zabitý!", +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer ["Build a track and race."] = "Vybudujte trasu a pretekajte.", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "ZMOCNITE SA VLAJKY", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Bezstarostný", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge - ["Change Weapon"] = "Zmeniť zbraň", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "Nešikovný", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Kódové meno: Tímová práca", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Prejdite trasu tak rýchlo, ako len viete!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope ["Congratulations!"] = "Gratulujem!", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratulujem! Zneškodnili ste všetky ciele|v stanovenom čase.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Ovládnite piliere, aby ste skórovali", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Kybertnetické impérium", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "Do kelu s tebou, zelenáč! Okamžite mi zlez z hlavy!", ["DAMMIT, ROOKIE!"] = "Prekliaty zelenáč!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Nebezpečné kačiatka", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Mŕtva váha", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor ["Demolition is fun!"] = "Demolícia je super!", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow - ["Depleted Kamikaze!"] = "Vyčerpané kamikadze!", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Ničte votrelcov a zbierajte tak body.", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen ["Double Kill!"] = "Dvojitý zásah!", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode - ["Drone Hunter!"] = "Lovec špionážnych lietadiel!", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Utopenec", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy ["Each turn you get 1-3 random weapons"] = "V každom ťahu dostanete 1-3 náhodné zbrane", ["Each turn you get one random weapon"] = "Každé koho dostanete jednu náhodnú zbraň", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Zneškodnite všetkých nepriateľov", ["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 enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "Zneškodnite Poisona pred tým, ako vyprší čas", - ["Eliminate the Blue Team"] = "Zneškodnite modrý tím", - ["Eliminate the enemy before the time runs out"] = "Zneškodnite nepriateľa skôr ako vyprší čas", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Zneškodnite Jednotku 3378|- Slabý odpor musí prežiť", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", -- User_Mission_-_Bamboo_Thicket +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Užite si plávanie...", - ["[Enter]"] = "[Enter]", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Najrýchlejšie kolo: ", ["Feeble Resistance"] = "Slabý odpor", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 --- ["Fire"] = "", - +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Získaná vlajka!", ["Flag respawned!"] = "Vlajka obnovená!", ["Flag returned!"] = "Vlajka vrátená!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Vlajky a domovské základňe budú umiestnené tam, kde každý tím skončí svoj ťah.", ["Flamer"] = "Plameňomet", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", - ["fuel extended!"] = "palivo doplnené!", - ["GAME BEGUN!!!"] = "HRA ZAČALA!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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 +-- ["Gangsters"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Cieľ", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Veľa šťastia!", -- ["Good so far!"] = "", -- Basic_Training_-_Sniper_Rifle @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "A MÁM ŤA!", --- ["Grab Mines/Explosives"] = "", -- Tumbler --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["Hahahaha!"] = "Hehehehe!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Haha, tak TO by bolo niečo!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil ["Hapless Hogs"] = "Bezmocní ježkovia", [" Hapless Hogs left!"] = " Bezmocných ježkov ostalo!", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode - ["Health crates extend your time."] = "Lekárničky vám dávajú čas naviac.", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "Ťažký", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Basketbal", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Heh, to nie je také zlé.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood - ["Hit Combo!"] = "Opakovaný zásah!", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy ["Hmmm..."] = "Hmm..", --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Lovec", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Inštruktor", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "votrelci zničení", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,543 +1040,1295 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Je dobre, že NÁHLA SMRŤ je tu až za 99 ťahov...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Skákanie je vypnuté", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "Expert na samovraždy!", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion -- ["Keep it up!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", -- Tumbler +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood - ["KILLS"] = "ZABITÍ:", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "[Ľavý Shift]", --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Počúvaj, ty biedny červ!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy +-- ["Mine Deployer selected!"] = "", -- Tumbler -- ["Mine Deployer"] = "", -- Space_Invasion, Tumbler --- ["Mine Eater!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Časovač pre míny:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "MISIA ÚSPEŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "MISIA ÚSPEŠNÁ", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Pohyb: [Hore], [Dole], [Vľavo], [Vpravo]", --- ["Mudball"] = "", -- Construction_Mode - ["Multi-shot!"] = "Viacnásobná rana!", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 --- ["New Barrels Per Turn"] = "", -- Tumbler - ["NEW CLAN RECORD: "] = "NOVÝ KLANOVÝ REKORD: ", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "NOVÉ najrýchlejšie kolo: ", --- ["New Mines Per Turn"] = "", -- Tumbler - ["NEW RACE RECORD: "] = "NOVÝ REKORD ZÁVODU: ", --- ["Newton's Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "NEDOSTATOK NAVIGAČNÝCH BODOV", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Nie tak celkom priateľský zápas", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Operácia Potápač", ["Opposing Team: "] = "Nepriateľský tím", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Žalostný ježko #%d", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", -- Racer +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["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"] = "", -- Mutant +-- ["point(s)"] = "", -- TargetPractice, Mutant +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 ["Poison"] = "Poison", +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "Zostáva energie", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["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 --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow - ["Race complexity limit reached."] = "Bol dosiahnutý limit zložitosti závodu.", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer +-- ["Racer"] = "", -- Racer -- ["RACER"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow - ["Round Limit"] = "Limit na kolo", --- ["Round Limit:"] = "", -- Racer - ["Rounds Complete"] = "Dokončených kôl", --- ["Rounds Complete: "] = "", -- Racer --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "PRAVIDLÁ HRY [Stlačte Esc pre ich zobrazenie]", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["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!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["Score"] = "", -- Mutant - ["SCORE"] = "SKÓRE", - - ["sec"] = "sek", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Tak zatiaľ!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", -- Space_Invasion, Tumbler --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "Štít posilnený! Energia +30", - ["Shield Depleted"] = "Štít vyčerpaný", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Štít je plne nabitý!", - ["Shield Master!"] = "Odborník na štíty!", - ["Shield Miser!"] = "Amatér na štíty!", - ["Shield OFF:"] = "Štít VYPNUTÝ:", - ["Shield ON:"] = "Štít ZAPNUTÝ:", - ["Shield Seeker!"] = "Hľadač štítov!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Shotgun tím", - ["Shotgun Training"] = "Tréning s brokovnicou", ["Shots Left: "] = "Zostáva striel: ", -- GaudyRacer, Tumbler ["shots remaining."] = "striel ostáva.", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Hlúpy", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Prepadnutý", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s je mimo hru a tím %d|dostal trestný bod!| |Skóre:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s je mimo hru a tím %d|získal bod!| |Skóre:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united ["Sponge"] = "Špongia", ["Spooky Tree"] = "Strašidelný strom", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["s|"] = "s|", - ["s"] = "s", -- GaudyRacer, Space_Invasion - ["STATUS UPDATE"] = "AKTUALIZÁCIA STAVU", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies ["Switched to "] = "Prepnuté na ", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Tím %d: ", - ["Team Scores"] = "Tímové skóre", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow ["That Sinking Feeling"] = "Potopené pocity", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "To bolo zbytočné.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Nepriateľ sa schováva na tamtej kačičke!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "V ďalšom kole sa obnoví vlajka.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Ten dážď naozaj stojí za to...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["TIME: "] = "ČAS: ", - ["Timed Kamikaze!"] = "Časovaná samovražda!", - ["Time Extended!"] = "Predĺžený čas!", - ["Time Extension"] = "Predĺženie času", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer ["Time Left: "] = "Zostávajúci čas: ", +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Prepnúť štít", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["To win the game you have to stand next to Thanta."] = "", -- A_Space_Adventure:ice01 ["Toxic Team"] = "Toxic tím", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["TRACK COMPLETED"] = "TRAŤ DOKONČENÁ", - +-- ["Track completed!"] = "", -- Racer, TechRacer ["Track Time: "] = "Čas: ", --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "Preteky o trofej", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", --- ["Tumbling Time Extended!"] = "", -- Tumbler --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Čas na ťah", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Jednotka 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- ["Unit 835"] = "Jednotka 835", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united ["Unit"] = "Jednotka", +-- ["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 --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood ["User Challenge"] = "Výzva", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Použite lano na presun zo štartovnej pozície do cieľa tak rýchlo, ako to len viete!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler ["v.06"] = "v.06", --- ["Vampirism"] = "", -- Construction_Mode +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Navigačný bod umiestnený.", - ["Way-Points Remaining"] = "Ostáva navigačných bodov", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies --- ["Weapons reset."] = "", -- Highlander +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion ["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 -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos ["Well done."] = "Výborne.", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1039,13 +2336,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1059,31 +2365,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - ["Will this ever end?"] = "Skončí to vôbec niekedy?", --- ["WINNER IS "] = "", -- Mutant - ["WINNING TIME: "] = "VÍŤAZNÝ ČAS: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1091,68 +2405,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "SKÓROVALI ste!!", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "Zachránili ste", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "Bazuka tím", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/sk.txt --- a/share/hedgewars/Data/Locale/sk.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/sk.txt Sun Dec 17 00:09:24 2017 +0100 @@ -31,7 +31,7 @@ 00:28=Raketová vŕtačka 00:29=Loptičkový guľomet 00:30=Napalm -00:31=Bezpilotný bombardér +00:31=Dron 00:32=Nízka gravitácia 00:33=Silnejší útok 00:34=Nesmrteľnosť @@ -58,8 +58,10 @@ 00:54=Postrek zeme 00:55=Zmrazovač 00:56=Sekáčik +00:57=Gumička +00:58=Vzdušná mína -01:00=Do boja! +; 01:00=Loading … 01:01=Remíza 01:02=%1 vyhrali! 01:03=Hlasitosť %1% @@ -81,6 +83,10 @@ 01:19=Extrémny 01:20=%1 odskok 01:21=Vypnutý zvuk +01:22=Režim SOMPREČ +01:23=Automatická kamera vypnutá +01:24=Automatická kamera zapnutá +01:25=Stlač cieľové tlačidlo na označenie cieľa ; Správy o udalostiach ; Ježko (%1) zomrel @@ -143,10 +149,13 @@ 02:02=Dajme im na frak! 02:02=Nikdy sa nevzdávaj 02:02=Bojuj čestne! -; Kolo končí (výhra, momentálne nepoužívané) -02:03=... -; Kolo končí (remíza, momentálne nepoužívané) -02:04=... + +; Team %1 wins +02:03=%1 vyhrali! + +; Round draw +02:04=Remíza + ; Nová krabica so zdravím 02:05=Doktora! 02:05=Prvá pomoc z nebies! @@ -271,6 +280,10 @@ 03:53=Typ 40 ;03:54=Postavte niečo 03:54=Pomôcka +03:55=Kúlovejšie už to byť nemôže! +03:56=Použite alebo zneužite +03:57=Pomôcka +03:58=Vznášajúca sa bomba ; Popis zbraní (ako oddeľovač riadkov použite |) 04:00=Zaútočte na vašich nepriateľov obyčajným granátom.|Vybuchne vtedy, keď vyprší časomiera.|1‐5: Nastavenie časovača granátu|Útok: Držanie tlačidla zvyšuje silu hodu| @@ -329,17 +342,21 @@ 04:53=Vyberte sa na cestu časom a priestorom|a nechajte vašich priateľov bojovať bez vás.|Buďte pripravený vrátiť sa kedykoľvek,|buď pri Náhlej smrti alebo keď sú všetci porazení.|Poznámka: Nefunguje počas Náhlej smrti,|ak ste sám alebo ak ste kráľom. ;04:54=NEKOMPLETNÉ 04:54=Rozprášte prúd lepkavej hliny.|Postavte mosty, pochovajte nepriateľov,|zapečaťte tunely. Buďte|však opatrný a nezašpinte sa|od nej aj vy. +04:55=Vráťme sa do doby ľadovej!|Zamrazte ježkov, urobte podlahu šmykľavú alebo|sa poistite pred utopením zmrazením vody.|Útok: Aktivuje/Deaktivuje ľadový lúč|Hore/Dole: Pokračuj v mierení +04:56=Po nepriateľovi môžete hodiť dva sekáčiky,|zablokovať priechody a tunely a dokonca ich použiť pri šplhaní!|Buďte opatrný! Nože nie su na hranie.|Útok: Podržte pre hod väčšou silou (dvakrát) +04:57=Použi VEĽMI elastickú gumičku, z ktorej|môžu ježkovia a ďalšie veci skákať|bez ujmy pri dopade.|Vľavo/Vpravo: Mení orientáciu gumičky|Kurzor: Umiestni gumičku na platnú pozíciu +04:58=Táto bomba so senzorom|priblíženia sa sama udrží|vo vzduchu a prenasleduje ježkov,|ktorý sa k nej nechtiac priblížia.|Jej explózia je slabšia ako|explózia bežnej míny.|Útok: Držaním vystrelíte väčšou silou ; Reťazce pre ciele hry 05:00=Herné režimy 05:01=V platnosti budú nasledovné pravidlá -05:02=Pevnosti: Ubráňte svoju pevnosť; porazte nepriateľov! +05:02=Umiestnite kráľa: Vyberte dobre chránené štartovacie miesto pre vášho kráľa 05:03=Nízka gravitácia: Dávajte pozor, kam šlapete 05:04=Nesmrteľnosť: Ježkovia sú (takmer) nezraniteľní 05:05=Režim vampíra: Ježkovia budú liečení zraneniami, ktoré spôsobia ostatným 05:06=Karma: Ježkovia budú trpieť zraneniami, ktoré spôsobia ostatným -05:07=Ochráňte kráľa: Nenechajte kráľa zomrieť!|Umiestnite kráľa: Vyberte dobre chránené štartovacie miesto pre vášho kráľa +05:07=Ochráňte kráľa: Nenechajte kráľa zomrieť! 05:08=Umiestnenie ježkov: Rozmiestnite vašich ježkov pred začatím hry 05:09=Delostrelectvo: Ježkovia nedokážu chodiť 05:10=Nezničiteľný terén: Väčšina zbraní nepoškodí terén diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/stub.lua --- a/share/hedgewars/Data/Locale/stub.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/stub.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,303 +1,555 @@ locale = { --- [":("] = "", -- ["!!!"] = "", -- ["..."] = "", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy -- ["Above-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Accuracy Bonus!"] = "", +-- ["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 obtained: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling --- ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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 +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome -- ["Aiming Practice"] = "", --Bazooka, Shotgun, SniperRifle -- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW --- ["Ammo"] = "", --- ["Ammo Depleted!"] = "", --- ["ammo extended!"] = "", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler -- ["Ammo is reset at the end of your turn."] = "", --- ["Ammo Maniac!"] = "", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies -- ["Available points remaining: "] = "", -- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- -- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape --- ["badmad"] = "", -- portal +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", -- User_Mission_-_Bamboo_Thicket --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball -- ["Bat balls at your enemies and|push them into the sea!"] = "", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- -- ["Bat your opponents through the|baskets and out of the map!"] = "", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 -- ["Bazooka Training"] = "", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen -- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos -- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen -- ["Best laps per team: "] = "", --- ["Best Team Times: "] = "", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos -- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow --- ["BOOM!"] = "", +-- ["Bones"] = "", -- -- ["Boom!"] = "", --- ["Boss defeated!"] = "", --- ["Boss Slayer!"] = "", --- ["BOTTOM FEEDER"] = "", -- Mutant +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer -- ["Build a track and race."] = "", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen -- ["C-1"] = "", -- portal -- ["C-2"] = "", -- portal --- ["Cake"] = "", -- Construction_Mode +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy --- ["CAPTURE THE FLAG"] = "", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard -- ["Careless"] = "", -- ["Carol"] = "", -- A_Classic_Fairytale:family --- ["Challenge"] = "", -- SpeedShoppa +-- ["Challenge completed!"] = "", -- SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Challenge completed!"] = "", -- SpeedShoppa -- ["Challenge failed!"] = "", -- SpeedShoppa --- ["Change Weapon"] = "", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 -- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb --- ["Codename: Teamwork"] = "", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos -- ["Complete the track as fast as you can!"] = "", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations!"] = "", -- ["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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 -- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final -- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- Basic_Training_-_Rope +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope -- ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies --- ["CONTROL"] = "", -- Control +-- ["Control"] = "", -- Control -- ["Control pillars to score points."] = "", -- Control +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope -- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh --- ["Core"] = "", -- Construction_Mode +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["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 --- ["%d crate(s) remaining"] = "", -- SpeedShoppa --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- -- ["Cybernetic Empire"] = "", -- User_Mission_-_Bamboo_Thicket -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- -- ["DAMMIT, ROOKIE!"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion -- ["Dangerous Ducklings"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 -- ["Deadweight"] = "", --- ["deaths"] = "", -- Mutant --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor +-- ["Demolition is fun!"] = "", -- ["Demo"] = "", -- The_Specialists --- ["Demolition is fun!"] = "", -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow --- ["Depleted Kamikaze!"] = "", +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion -- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 --- ["Destroyer of planes"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["+%d flamer fuel!"] = "", -- Tumbler +-- ["%d Hapless Hogs left"] = "", +-- ["+%d health"] = "", -- Mutant +-- ["%d-Hit Combo! +%d points!"] = "", -- Space_Invasion -- ["Did anyone follow you?"] = "", -- A_Classic_Fairytale:united +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion -- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies +-- ["Displacer"] = "", -- -- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling --- ["Dist: "] = "", -- Space_Invasion +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode --- ["Drone Hunter!"] = "", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer -- ["Drowner"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Dr. Parkinson"] = "", -- -- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy -- ["Each turn you get 1-3 random weapons"] = "", -- ["Each turn you get one random weapon"] = "", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies -- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape --- ["Eliminate all enemies"] = "", -- ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "", --Bazooka, Shotgun, SniperRifle --- ["Eliminate enemy hogs and take their weapons."] = "", -- Highlander --- ["Eliminate Poison before the time runs out"] = "", --- ["Eliminate the Blue Team"] = "", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "", +-- ["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 -- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", -- User_Mission_-_Bamboo_Thicket -- ["Engineer"] = "", -- The_Specialists -- ["Enjoy the swim..."] = "", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["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 --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family -- ["Fastest lap: "] = "", -- ["Feeble Resistance"] = "", @@ -305,63 +557,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 --- ["Fire"] = "", - +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- -- ["Flag captured!"] = "", -- ["Flag respawned!"] = "", -- ["Flag returned!"] = "", --- ["Flags, and their home base will be placed where each team ends their first turn."] = "", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab -- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge - +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- -- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", --- ["fuel extended!"] = "", --- ["GAME BEGUN!!!"] = "", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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 +-- ["Gangsters"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow --- ["Goal"] = "", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey -- ["Good luck out there!"] = "", -- ["Good so far!"] = "", @@ -370,177 +675,360 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 -- ["GOTCHA!"] = "", --- ["Grab Mines/Explosives"] = "", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow --- ["GREAT ! Let's kill all this enemies, using portals"] = "", -- portal +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 -- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade +-- ["Grenadiers"] = "", -- Basic_Training_-_Grenade -- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard --- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen -- ["Hahahaha!"] = "", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen -- ["Haha, now THAT would be something!"] = "", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil -- ["Hapless Hogs"] = "", --- ["%d Hapless Hogs left"] = "", +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- -- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh --- [" HAS MUTATED"] = "", -- Mutant +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode --- ["Health crates extend your time."] = "", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor -- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy"] = "", -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - --- ["Hedgewars-Basketball"] = "", --- ["Hedgewars-Knockball"] = "", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 -- ["Heh, it's not that bad."] = "", +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 -- ["Hell Army"] = "", -- portal --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander --- ["hiden"] = "", -- portal +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hit Combo!"] = "", -- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm..."] = "", -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 -- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen -- ["Hunter"] = "", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil -- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer -- ["Instructor"] = "", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings -- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow --- ["invaders destroyed"] = "", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal -- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode -- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab --- ["I should get myself a portal gun, maybe this crate has one"] = "", -- portal +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -550,379 +1038,843 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode -- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- -- ["Jumping is disabled"] = "", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode --- ["Kamikaze Expert!"] = "", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion -- ["Keep it up!"] = "", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood --- ["KILLS"] = "", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion -- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["[Left Shift]"] = "", --- ["left shift"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion -- ["Lestat"] = "", -- portal --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 -- ["Listen up, maggot!!"] = "", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 -- ["Loon"] = "", -- The_Specialists --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- -- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- -- ["milliseconds"] = "", -- SpeedShoppa -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode --- ["|- Mines Time:"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade --- ["MISSION SUCCESS"] = "", -- ["MISSION SUCCESSFUL"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork -- ["Mission won!"] = "", -- Basic_Training_-_Grenade --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 -- ["Movement: [Up], [Down], [Left], [Right]"] = "", --- ["Mudball"] = "", -- Construction_Mode --- ["Multi-shot!"] = "", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant --- ["MUTANT"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 --- ["New Barrels Per Turn"] = "", --- ["NEW CLAN RECORD: "] = "", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer -- ["NEW fastest lap: "] = "", --- ["New Mines Per Turn"] = "", --- ["NEW RACE RECORD: "] = "", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen -- ["Ninja"] = "", -- The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen -- ["NOT ENOUGH WAYPOINTS"] = "", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab -- ["Not So Friendly Match"] = "", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood --- ["Operation Diver"] = "", -- ["Opposing Team: "] = "", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies --- ["Pathetic Hog #%d"] = "", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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"] = "", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow --- ["phosphatoglucidique"] = "", -- portal +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["player"] = "", -- portal --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["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"] = "", -- Mutant +-- ["point(s)"] = "", -- TargetPractice, Mutant -- ["Poison"] = "", +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal --- ["Power Remaining"] = "", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 -- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos -- ["Prepare yourself"] = "", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW -- ["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 Peach"] = "", -- -- ["Private Nolak"] = "", -- Target_Practice_-_Cluster_Bomb --- ["Private Novak"] = "", -- Basic_Training_-_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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["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 --- ["Race complexity limit reached."] = "", +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow -- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity --- ["razac"] = "", -- portal +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 -- ["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 --- ["ronald"] = "", -- portal --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope Master!"] = "", -- Basic_Training_-_Rope +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope -- ["Roper"] = "", -- SpeedShoppa -- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes -- ["Rope Team"] = "", -- Basic_Training_-_Rope --- ["Rope to safety"] = "", -- ClimbHome -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", --- ["Round Limit"] = "", --- ["Rounds Complete: "] = "", --- ["Rounds Complete"] = "", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant --- ["RULES OF THE GAME [Press ESC to view]"] = "", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - -- ["Saint"] = "", -- The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 -- ["Save as many hapless hogs as possible!"] = "", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["SCORE"] = "", --- ["Score"] = "", -- Mutant - --- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag --- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["s"] = "", -- GaudyRacer, Space_Invasion +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family --- ["Shield boosted! +30 power"] = "", --- ["Shield Depleted"] = "", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion -- ["Shield is fully recharged!"] = "", --- ["Shield Master!"] = "", --- ["Shield Miser!"] = "", --- ["Shield OFF:"] = "", --- ["Shield ON:"] = "", --- ["Shield Seeker!"] = "", +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 -- ["Shotgun"] = "", -- Continental_supplies --- ["Shotgun Team"] = "", --- ["Shotgun Training"] = "", -- ["shots remaining."] = "", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil -- ["Silly"] = "", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode -- ["Sinky"] = "", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy --- ["%s is out and Team %d|scored a penalty!| |Score:"] = "", -- Basketball, Knockball --- ["%s is out and Team %d|scored a point!| |Score:"] = "", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy --- ["Sniper"] = "", -- The_Specialists +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- 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 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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil -- ["Soldier"] = "", -- The_Specialists --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- -- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united -- ["Sponge"] = "", -- ["Spooky Tree"] = "", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- Construction_Mode --- ["Subject"] = "", -- portal +-- ["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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies -- ["Switched to "] = "", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor -- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy -- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard -- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy @@ -930,212 +1882,444 @@ -- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee -- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun -- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- -- ["Team %d: "] = "", +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove --- ["Team Scores"] = "", -- Control, Space_Invasion +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow -- ["That Sinking Feeling"] = "", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["That was pointless."] = "", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood -- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon -- ["The enemy is hiding out on yonder ducky!"] = "", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 -- ["The flag will respawn next round."] = "", -- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos -- ["This rain is really something..."] = "", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome -- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family --- ["TIME: "] = "", --- ["Timed Kamikaze!"] = "", --- ["Time Extended!"] = "", --- ["Time Extension"] = "", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer -- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope --- ["Toggle Shield"] = "", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "", - +-- ["Track completed!"] = "", -- Racer, TechRacer -- ["Trainee"] = "", -- TargetPractice --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab -- ["TrophyRace"] = "", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 -- ["T_T"] = "", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon --- ["Turn Time"] = "", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies --- ["Unit"] = "", -- User_Mission_-_Newton_and_the_Hammock -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united -- ["Unit 3378"] = "", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- -- ["Unit 835"] = "", -- User_Mission_-_Bamboo_Thicket +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united +-- ["Unit"] = "", -- User_Mission_-_Newton_and_the_Hammock -- ["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!"] = "", -- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode -- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood -- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 portal to move fast and far, use it to kill, use it with caution!"] = "", -- portal +-- ["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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy -- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa -- ["Use your rope to get from start to finish as fast as you can!"] = "", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["Victory Condition: Collect"] = "", -- HedgeEditor +-- ["Victory Condition: Destroy"] = "", -- HedgeEditor +-- ["Victory for %s!"] = "", -- Capture_the_Flag -- ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag --- ["voldemort"] = "", -- portal -- ["Violence is not the answer to your problems!"] = "", -- A_Classic_Fairytale:first_blood --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor -- ["Waypoint placed."] = "", --- ["Way-Points Remaining"] = "", +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion -- ["Weapons Reset"] = "", --- ["Weapons reset."] = "", -- Highlander +-- ["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 -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos -- ["Well done."] = "", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1143,13 +2327,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1163,32 +2356,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab --- ["Will be useful if I need a new plateform or if I want to rise...."] = "", -- portal -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant --- ["WINNING TIME: "] = "", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1196,99 +2396,227 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 %.1fs remaining on the clock (+%d points)."] = "", -- TargetPractice +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 -- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 -- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka -- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle -- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope -- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa -- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge --- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer -- ["You have finished the target practice!"] = "", -- TargetPractice --- ["You have gained an achievement: %s"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["You have launched %d bazookas."] = "", -- Basic_Training_-_Bazooka -- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee -- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil -- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling -- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 -- ["You have SCORED!!"] = "", -- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil -- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb -- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 --- ["You have used %d RC planes."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW -- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood -- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka -- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos -- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood +-- ["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"] = "", -- ["You saved %d of 8 Hapless Hogs."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies --- ["zombi"] = "", -- portal +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal +-- ["'Zooka Team"] = "", -- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard --- ["'Zooka Team"] = "", -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/sv.lua --- a/share/hedgewars/Data/Locale/sv.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/sv.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { -- ["..."] = "", - [":("] = ":(", ["!!!"] = "!!!", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy --- ["Accuracy Bonus!"] = "", +-- ["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 Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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 +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Siktesövning", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW --- ["Ammo"] = "", --- ["Ammo Depleted!"] = "", --- ["ammo extended!"] = "", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler -- ["Ammo is reset at the end of your turn."] = "", --- ["Ammo Maniac!"] = "", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies -- ["Available points remaining: "] = "", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Slå bollar mot dina fiender|och slå ner dem i havet", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Slå ner dina motståndare i|korgarna och ut ur kartan!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Bazookaträning", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Bästa varv per lag: ", --- ["Best Team Times: "] = "", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow --- ["BOOM!"] = "", +-- ["Bones"] = "", -- ["Boom!"] = "Bom!", --- ["Boss defeated!"] = "", --- ["Boss Slayer!"] = "", +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer -- ["Build a track and race."] = "", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "CAPTURE THE FLAG", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard -- ["Careless"] = "", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Change Weapon"] = "", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Kodnamn: Lagarbete", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos -- ["Complete the track as fast as you can!"] = "", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope ["Congratulations!"] = "Grattis!", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Grattis! Du har förstört alla målen inom den|tillåtna tidsramen.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Kontrollera pelare för att ta poäng", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Robotriket", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "SATAN, GRÖNGÖLING! SLUTA TJATA!", ["DAMMIT, ROOKIE!"] = "SATAN, GRÖNGÖLING!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Farliga ankungar", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 -- ["Deadweight"] = "", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor -- ["Demolition is fun!"] = "", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow --- ["Depleted Kamikaze!"] = "", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode --- ["Drone Hunter!"] = "", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer -- ["Drowner"] = "", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy -- ["Each turn you get 1-3 random weapons"] = "", -- ["Each turn you get one random weapon"] = "", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Förgör alla fiender", ["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 enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "Förgör Gift innan tiden tar slut", - ["Eliminate the Blue Team"] = "Förgör det Blå laget", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Förgör Enhet 3378 |- Klent motstånd måste överleva", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Ha en trevlig simtur...", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Snabbast varv: ", ["Feeble Resistance"] = "Klent motstånd", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 --- ["Fire"] = "", - +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Flagga tagen!", ["Flag respawned!"] = "Flagga återställd!", ["Flag returned!"] = "Flagga återvänd!", --- ["Flags, and their home base will be placed where each team ends their first turn."] = "", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", --- ["fuel extended!"] = "", --- ["GAME BEGUN!!!"] = "", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow --- ["Goal"] = "", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Lycka till där ute!", -- ["Good so far!"] = "", @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 -- ["GOTCHA!"] = "", --- ["Grab Mines/Explosives"] = "", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen -- ["Hahahaha!"] = "", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen -- ["Haha, now THAT would be something!"] = "", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil -- ["Hapless Hogs"] = "", -- [" Hapless Hogs left!"] = "", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode --- ["Health crates extend your time."] = "", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy"] = "", -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Basket", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 -- ["Heh, it's not that bad."] = "", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hit Combo!"] = "", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy ["Hmmm..."] = "Hmmm...", --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Jägare", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Instruktör", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow --- ["invaders destroyed"] = "", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,539 +1040,1291 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode -- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- -- ["Jumping is disabled"] = "", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode --- ["Kamikaze Expert!"] = "", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion -- ["Keep it up!"] = "", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood --- ["KILLS"] = "", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["[Left Shift]"] = "", --- ["left shift"] = "", -- Continental_supplies --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Hör här, ynkrygg!!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Mintid:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 SUCCESS"] = "", +-- ["Mission failure in %d s"] = "", -- Big_Armory +-- ["Mission lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "UPPDRAG SLUTFÖRT", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 -- ["Movement: [Up], [Down], [Left], [Right]"] = "", --- ["Mudball"] = "", -- Construction_Mode --- ["Multi-shot!"] = "", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 --- ["New Barrels Per Turn"] = "", --- ["NEW CLAN RECORD: "] = "", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "NYTT snabbast varv: ", --- ["New Mines Per Turn"] = "", --- ["NEW RACE RECORD: "] = "", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen -- ["NOT ENOUGH WAYPOINTS"] = "", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "En inte så vänlig match", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Operationens dykare", ["Opposing Team: "] = "Motståndarlag: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Patetisk kott #%d", +-- ["Patches"] = "", -- -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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"] = "", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["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"] = "", -- Mutant +-- ["point(s)"] = "", -- TargetPractice, Mutant ["Poison"] = "Gift", +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal --- ["Power Remaining"] = "", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos -- ["Prepare yourself"] = "", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW -- ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow --- ["Race complexity limit reached."] = "", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", --- ["Round Limit"] = "", --- ["Rounds Complete: "] = "", --- ["Rounds Complete"] = "", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "SPELREGLER [Tryck ESC för att se]", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 -- ["Save as many hapless hogs as possible!"] = "", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["SCORE"] = "", --- ["Score"] = "", -- Mutant - - ["sec"] = "sec", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Ses!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["s"] = "", -- GaudyRacer, Space_Invasion +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family --- ["Shield boosted! +30 power"] = "", --- ["Shield Depleted"] = "", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion -- ["Shield is fully recharged!"] = "", --- ["Shield Master!"] = "", --- ["Shield Miser!"] = "", --- ["Shield OFF:"] = "", --- ["Shield ON:"] = "", --- ["Shield Seeker!"] = "", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Hagelgevärslaget", - ["Shotgun Training"] = "Hagelgevärsträning", -- ["shots remaining."] = "", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil -- ["Silly"] = "", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode -- ["Sinky"] = "", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s är ute och lag %d|fick ett straff!| |Poängställning:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s är ute och lag %d|fick ett poäng!| |Poängställning:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united -- ["Sponge"] = "", ["Spooky Tree"] = "Kusligt träd", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies -- ["Switched to "] = "", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Lag %d: ", --- ["Team Scores"] = "", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow -- ["That Sinking Feeling"] = "", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "Det där var meningslöst.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Fienden gömmer sig på andra ankan!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Flaggan kommer tillbaka nästa runda.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos -- ["This rain is really something..."] = "", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family --- ["TIME: "] = "", --- ["Timed Kamikaze!"] = "", --- ["Time Extended!"] = "", --- ["Time Extension"] = "", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope --- ["Toggle Shield"] = "", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "TrophyRace", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon --- ["Turn Time"] = "", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit"] = "", -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Enhet 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- -- ["Unit 835"] = "", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united -- ["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!"] = "", -- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood -- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Använd ditt rep för att ta dig från start till mål så fort som möjligt!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor -- ["Waypoint placed."] = "", --- ["Way-Points Remaining"] = "", +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion -- ["Weapons Reset"] = "", --- ["Weapons reset."] = "", -- Highlander +-- ["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 -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos -- ["Well done."] = "", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1035,13 +2332,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1055,31 +2361,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant --- ["WINNING TIME: "] = "", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1087,68 +2401,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "Du har tagit poäng!", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood --- ["You saved"] = "", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "Bazookalaget", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/sv.txt --- a/share/hedgewars/Data/Locale/sv.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/sv.txt Sun Dec 17 00:09:24 2017 +0100 @@ -57,7 +57,7 @@ ; 00:54=Struktur 00:54=Markspruta -01:00=Nu kör vi! +; 01:00=Loading … 01:01=Oavgjort 01:02=%1 vinner! 01:03=Volym %1% @@ -256,11 +256,11 @@ 02:02=Ooh, det börjar! 02:02=Inga mesar tillåtna -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=%1 vinner! -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Oavgjort ; New health crate 02:05=Inkommande bistånd! @@ -540,12 +540,12 @@ ; Game goal strings 05:00=Spellägen 05:01=Följande regler gäller -05:02=Fort: Försvara din fästning; besegra dina fiender! +05:02=Placera kungen: Välj en skyddad startpunkt till kungen 05:03=Låg gravitation: Var försiktig 05:04=Osårbarhet: Igelkottar är (nästan) osårbara 05:05=Vampyrism: Igelkottar helas med den mängd de skadar andra 05:06=Karma: Igelkottar skadas med den mängd de skadar andra -05:07=Skydda kungen: Låt inte kungen dö!|Placera kungen: Välj en skyddad startpunkt till kungen +05:07=Skydda kungen: Låt inte kungen dö! 05:08=Placera igelkottar: Placera igelkottarna innan spelet startar 05:09=Artilleri: Igelkottar kan inte ändra position genom att gå 05:10=Oförstörbar terräng: De flesta vapnen förstör inte terrängen diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_cs.xml --- a/share/hedgewars/Data/Locale/tips_cs.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_cs.xml Sun Dec 17 00:09:24 2017 +0100 @@ -45,7 +45,4 @@ Můžeš si asociovat Hedgewars soubory (uložené hry a nahrávky) tak, abys je mohl ihned spouštět z internetového prohlížeče nebo prúzkumníka souborů. Chceš ušetřit lana? Uvolni ho ve vzduchu a vystřel znovu. Dokud se nedotkneš země, využíváš ho bez plýtvání munice! Použij Molotov nebo plamenomet, abys dočasně zamezil ježkům v přechodu terénu jako jsou tunely nebo plošiny. - - Windows verze Hedgewars podporuje Xfire. Přidej si Hedgewars do jeho seznamu her, abys viděl přátele, kteří ho hrají. - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_da.xml --- a/share/hedgewars/Data/Locale/tips_da.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_da.xml Sun Dec 17 00:09:24 2017 +0100 @@ -51,7 +51,4 @@ Du kan finde konfigurationsfilerne til Hedgewars under mappen ".hedgewars" i din hjemmemappe. Opret gerne en back-up eller tag filerne med dig, men lad være med selv at ændre i dem. Brug en Molotovcocktail eller Flammekasteren til midlertidigt at forhindre pindsvin i at passere et område, f.eks. en tunnel eller platform. Den Målsøgende Bi kan være svær at bruge. Den vender lettere hvis den ikke flyver alt for hurtigt, så prøv at spare på kraften når du affyrer den. - - Windows-versionen af Hedgewars understøtter integrering med Xfire. Husk at tilføje Hedgewars til din liste med spil så dine venner kan se hvornår du spiller. - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_de.xml --- a/share/hedgewars/Data/Locale/tips_de.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_de.xml Sun Dec 17 00:09:24 2017 +0100 @@ -66,8 +66,21 @@ In den Ländern des Schnees und der Weihnacht wird der Schnee langsam und allmählich die Landschaft bedecken, es sei denn, das Land ist unzerstörbar. Sei vorsichtig in den Ländern des Schnees und der Weihnacht, weil die Träger aus rutschigem Eis bestehen. Die Rückzugszeit hängt ab von der Waffe, die du benutzt hast. Sei vorsichtig, einige Waffen haben keine Rückzugszeit und beenden deinen Zug sofort! + Mit etwas Können kann man einen Igel wegschubsen, indem man direkt unter ihm wegspringt. + Ein rechtzeitiger Angriff mit Shoryuken, dem Presslufthammer oder der Sinuskanone verhindert Fallschaden. + Dein Igel wird nicht mit Projektilen kollidieren, solange er in der Luft ist. + Löcher von Bohrkopfraketen, Scharfschützengewehren und der Desert Eagle sind groß genug, dass Portale durchpassen – wenn du gut genug zielst. + Sammle einen Erste-Hilfe-Koffer ein, um eine Vergiftung zu kurieren. + Kisten können auch mit Funkflugzeug, Shoryuken, Presslufthammer und Kamikaze aufgesammelt werden. + Pass auf, dass du dich nicht selbst in die Luft jagst, wenn du dich mit dem Schweißbrenner einer Kiste annäherst. + Luftminen bleiben während der ersten 5 Sekunden des Zuges passiv, bevor sie anfangen, nach Igeln zu suchen. + Halte einen Sicherheitsabstand von Luftminen! Sobald dich eine Luftmine verfolgt, ist es schwer, ohne Werkzeuge zu fliehen. + Luftminen explodieren nach einem Viertel der Zeit, nach der reguläre Minen explodieren. + Wenn ein Hackebeil in der Landschaft 30 oder mehr Schaden auf einmal erhält, fällt er vielleicht ins Meer. Diese Chance erhöht sich mit dem Schaden. + Denk an den Wind, denn Flammen und einige Waffen werden von ihm beeinflusst. + Benutze einen Schweißbrenner, um Igel und Minen mit einem langen Zeitzünder zu schubsen. + Wenn du mit einem Schweißbrenner in ein Pulverfass rennst, wirst du eine explosive Überraschung erleben. - Diese Hedgewars-Version unterstützt Xfire. Stell sicher, Hedgewars dessen Spielliste hinzuzufügen, damit deine Freunde dich beim Spielen sehen können. Du kannst deine Hedgewars-Einstellungsdateien unter »Eigene Dokumente\Hedgewars« finden. Erstelle Backups oder nimm die Dateien mit, aber bitte bearbeite sie nicht von Hand. diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_en.xml --- a/share/hedgewars/Data/Locale/tips_en.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_en.xml Sun Dec 17 00:09:24 2017 +0100 @@ -65,8 +65,21 @@ In the lands of Snow and Christmas, the snow piles up over time, unless the land is indestructible. Be aware in lands of Snow and Christmas, because girders are made of slippery ice. The retreat time depends on the weapon you used. Be careful, some weapons don’t have a retreat time and immediately end your turn! + With a bit of skill, you can knock hedgehogs by jumping out from under them. + A timed attack with shoryuken, pick hammer or sine gun can cancel fall damage. + Your hedgehog does not collide with projectiles while it is in mid-air. + Holes left by drill rockets, sniper rifles and the Desert Eagle are large enough to fire portals through them—if your aim is precise enough. + Collect a first aid kit to cure your poisoned hedgehog. + You can also collect crates while using RC plane, shoryuken, pick hammer and kamikaze. + Be careful not to blow yourselves up when using a blow torch to approach a crate. + Air mines remain passive within the first 5 seconds of a turn before they start seeking for hedgehogs. + Keep a safe distance from air mines! Once an air mine starts chasing you, it’s hard to escape without utilities. + Air mines explode after a quarter of the time set for regular mines. + When a cleaver in the landscape receives 30 or more damage in a single blow, there’s a chance it falls off. This chance increases with the damage. + Mind the wind, because flames and some projectiles are affected by wind. + Use a blow torch to push hedgehogs and mines with a long timer. + Running with a blow torch into a barrel is an explosive recipe for disaster! - This version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing. You can find your Hedgewars configuration files under “My Documents\Hedgewars”. Create backups or take the files with you, but don’t edit them by hand. diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_es.xml --- a/share/hedgewars/Data/Locale/tips_es.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_es.xml Sun Dec 17 00:09:24 2017 +0100 @@ -51,7 +51,4 @@ Puedes encontrar los archivos de configuración del juego en la carpeta ".hedgewars" dentro de tu directorio personal. Puedes hacer copias de seguridad de los mismos o copiarlos a otro ordenador si lo deseas, pero no intentes editarlos a mano para evitar posibles pérdidas de datos. Puedes usar el cóctel molotov o el lanzallamas para evitar que erizos enemigos crucen túneles angostos o puentes. El abejorro puede ser complicado de usar. Su maniobrabilidad depende de su velocidad, así que intenta no lanzarlo a máxima potencia. - - La versión de Hedgewars para Windows soporta Xfire. Recuerda agregar Hedgewars a tu lista de juegos para que tus amigos puedan saber cuándo estás jugando. - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_fi.xml --- a/share/hedgewars/Data/Locale/tips_fi.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_fi.xml Sun Dec 17 00:09:24 2017 +0100 @@ -4,44 +4,87 @@ Do not escape characters or use the CDATA tag. --> Valitse sama väri kaverisi kanssa pelataksesi samassa joukkueessa. Kumpikin ohjaa omia siilejään, mutta voitatte ja häviätte yhdessä. - Jotkut aseet tekevät vain vähän vahinkoa, mutta voivat olla tuhoisampia oikeassa tilanteessa. Kokeile ampua useampi siili veteen Desert Eaglella. - Jos et tiedä mitä tehdä etkä halua tuhlata ammuksia, jätä vuoro väliin. Mutta älä anna ajan kulua liikaa koska Äkkikuolema koittaa ennemmin tai myöhemmin! - Jos haluat estää muita käyttämästä nimimerkkiäsi virallisella palvelimella, rekisteröi tunnus osoitteessa http://www.hedgewars.org/. - Kyllästyttääkö normaali peli? Kokeila tehtäviä - Ne tarjoaa erilaisia pelitapoja riippuen valinnasta. - Oletuksena viimeisin peli nauhoitetaan demoksi. Valitse 'Demot' vasemmasta alakulmasta katsoaksesi ja hallitaksesi niitä. - Hedgewars on avointa lähdekoodia ja ilmainen ohjelma jota me luomme vapaa-aikanamme. Jos sinulla on ongelmia, kysy keskustelualueilta apua, mutta älä odota 24/7-tukea! - Hedgewars on avointa lähdekoodia ja ilmainen ohjelma jota me luomme vapaa-aikanamme. Jos pidät siitä, voit auttaa meitä pienellä lahjoituksella tai omaa työllä! - Hedgewars on avointa lähdekoodia ja ilmainen ohjelma jota me luomme vapaa-aikanamme. Jaa sitä perheesi ja ystäviesi kesken miten haluat! - Toisinaan järjestetään virallisia turnauksia. Tulevista tapahtumista tiedotetaan osoitteessa http://www.hedgewars.org/ muutama päivä etukäteen. + Jotkut aseet tekevät vain vähän vahinkoa, mutta voivat olla tehokkaita sopivassa tilanteessa. Kokeile ampua useampi siili veteen Desert Eaglella. + Jos et tiedä mitä tehdä, etkä halua tuhlata ammuksia, jätä vuoro väliin. Mutta älä viivyttele liikaa koska Äkkikuolema koittaa ennemmin tai myöhemmin! + Jos haluat estää muita käyttämästä nimimerkkiäsi virallisella palvelimella, rekisteröi tunnus osoitteessa www.hedgewars.org + Kyllästyttääkö normaali peli? Kokeile operaatioita - Ne tarjoaa erilaisia pelitilanteita. + Oletuksena viimeisin peli nauhoitetaan muistiin. Klikkaa filmikameran kuvaa nähdäksesi tallennetut pelit. Filmikela-kuvakkeesta aukeaa nauhoitetut videoklipit. + Hedgewars on avointa lähdekoodia ja ilmainen peli, jota me kehitämme vapaa-aikanamme. Jos sinulla on ongelmia, kysy keskustelualueilta apua, mutta älä vaadi 24/7-tukea! + Hedgewars on avointa lähdekoodia ja ilmainen peli, jota me kehitämme vapaa-aikanamme. Jos pidät siitä, voit auttaa meitä pienellä lahjoituksella tai omaa työllä! + Hedgewars on avointa lähdekoodia ja ilmainen peli, jota me kehitämme vapaa-aikanamme. Pelaa sitä ystäviesi kanssa miten paljon haluat! + Toisinaan järjestetään virallisia turnauksia. Tulevista tapahtumista tiedotetaan osoitteessa www.hedgewars.org muutama päivä etukäteen. Hedgewars on saatavilla monilla kielillä. Jos oman kielinen käännös puuttuu tai on vanhentunut, ota yhteyttä! Hedgewars toimii useilla eri käyttöjärjestelmillä, kuten Microsoft Windowsissa, Mac OS X:ssä ja Linuxissa. - Muista että voit aina luoda oman pelisi paikallisesti ja verkkopelissä. Et ole rajoitettu yksinkertaiseen peliin. + Voit aina luoda oman pelisi paikallisesti ja verkkopelissä. Et ole rajoitettu yksinkertaiseen peliin. Pelatessa sinun pitäisi pitää lyhyt tauko vähintään kerran tunnissa. - Jos näytönohjaimesi ei tarjoa laitteistokiihdytettä OpenGL:ää, kokeile heikennetyn laadun tilaa parantaaksesi suorituskykyä. + Jos näytönohjaimesi ei tarjoa laitteistokiihdytettyä OpenGL:ää, kokeile pudottaa grafiikan laatua parantaaksesi suorituskykyä. Me olemme avoimia ehdotuksille ja rakentavalle palautteelle. Jos et pidä jostain tai sinulla on loistava idea, kerro meille! Erityisesti verkossa pelattaessa ole kohtelias ja muista että alaikäisiä saattaa myös olla pelaamassa. - Erityispelimoodit kuten 'Vampyrismi' ja 'Karma' mahdollistavat kokonaan uusien taktiikoiden kehittämisen. Kokeile niitä muokatussa pelissä! - Sinun ei ikinä tulisi asentaa Hedgewarsia tietokoneille joita et omista (koulu, yliopisto, työpaikka jne.). Ole hvä ja pyydä vastuuhenkilöä tekemään se! - Hedgewars voi olla täydellinen peli tauoille. Mutta varmista ettet lisää liian montaa siiltä ta käytä liian suurta karttaa. Ajan ja terveyden vähentäminen voi myös auttaa. + Erityispelimoodit kuten 'Vampirismi' ja 'Karma' mahdollistavat kokonaan uusien taktiikoiden kehittämisen. Kokeile niitä muokatussa pelissä! + Sinun ei ikinä tulisi asentaa Hedgewarsia tietokoneille joita et omista (koulu, yliopisto, työpaikka jne.). Ole hyvä ja pyydä vastuuhenkilöä tekemään se! + Hedgewars voi olla täydellinen peli tauoille. Varmista, ettet pelaa liian monella siilillä tai liian suurella kartalla. Kierrosajan tai terveyden vähentäminen auttaa myös. Yhtään siiliä ei vahingoitettu tämän pelin tekemisen aikana. - Hedgewars on avointa lähdekoodia ja ilmainen ohjelma jota me luomme vapaa-aikanamme. Jos joku myi sinulle tämän pelin, koita saada rahasi takaisin! + Hedgewars on avointa lähdekoodia ja ilmainen ohjelma, jota me luomme vapaa-aikanamme. Jos joku myi sinulle tämän pelin, koita saada rahasi takaisin! Yhdistä yksi tai useampi peliohjain ennen pelin käynnistämistä liittääksesi niiden kontrollit omaan joukkueeseesi. - Luo käyttäjätili osoitteessa %1 estääksesi muita käyttämästä suosikkinimimerkkiäsi pelatessasi virallisella palvelimella. Jos näytönohjaimesi ei tue laitteistokiihdytettyä OpenGL:ää, kokeile päivittää ajurit. - Hyppyjä on saatavilla kolmea erilaista. Napauta [korkea hyppy]-nappai kahdesti tehdäksesi todella korkean/taaksepäin hypyn. + Hyppyjä on saatavilla kolmea erilaista. Napsauta [korkea hyppy]-nappia kahdesti tehdäksesi korkean takaperinhypyn. Pelkäätkö että putoat kielekkeeltä? Pidä [tarkkuus]-näppäintä pohjassa kääntyäksesi [vasemmalle] ja [oikealle] liikkumatta. - Jotkut aseet vaativat erityisstrategiaa tai todella paljon harjoittelua, joten älä anna periksi vaikka et kerran osuisikaan. - + Jotkut aseet vaativat erityisstrategiaa tai todella paljon harjoittelua, joten älä anna periksi, vaikka et ensikerralla osuisikaan. Vanha Limburger-juusto aiheuttaa vain pienen räjähdyksen, mutta tuulen vaikuttama hajupilvi voi myrkyttää suuren määrän siiliä kerralla. - Pianoisku on vahingollisin ilmaisku. Menetät siilen joka sen esittää, joten sillä on myös suuri huono puoli. - Tarttuvat miinat ovat täydellinen työkalu luomaan pieniä ketjureaktioita jotka vie vihollissiilit kauheisiin tilanteisiin...tai veteen. - Vasara on tehokkaimmillaan silloilla ja palkeilla. Lyödyt siilit iskeytyvät maan läpi. - Jos olet jumissa vihollissiilin takana, käytä vasaraa vapauttaaksesi itsesi ilman että vahingoidut räjädyksen voimasta. - Kakun pisin mahdollinen kulkumatka riippuu maastosta. Käytä [hyökkäystä] räjäyttääksesi sen aikaisemmin. - Liekinheitin on ase mutta sitä voi käyttää myös tunneleiden kaivamiseen. + Pianoisku on vahingollisin ilmaisku. Menetät siilin joka sen esittää, joten käytä sitä harkiten. + Tarttuvat miinat ovat täydellinen työkalu luomaan pieniä ketjureaktioita jotka vie vihollissiilit kauheisiin tilanteisiin... tai veteen. + Vasara on tehokkaimmillaan silloilla ja palkeilla. Lyödyt siilit iskeytyvät ohuen maan läpi. + Jos olet jumissa vihollissiilin takana, käytä vasaraa vapauttaaksesi itsesi ilman että vahingoitut räjähdyksen voimasta. + Kakun pisin mahdollinen kulkumatka riippuu maastosta. Paina [hyökkäys]-nappia räjäyttääksesi sen aikaisemmin. + Liekinheitin on tavallinen ase, mutta sitä voi käyttää myös tunneleiden kaivamiseen. Haluatko tietää ketkä ovat pelin takana? Klikkaa Hedgewars-logoa päävalikossa nähdäksesi tekijäluettelon. - Piirrä vapaasti omia hautoja, hattuja, lippuja ja jopa karttoja ja teemoja! Mutta huomaa että sinun pitää jakaa ne jossain käyttääksesi niitä verkossa. + Piirrä vapaasti omia hattuja, lippuja ja jopa karttoja ja teemoja! Huomaa kuitenkin, että ne pitää jakaa etukäteen jotta ne toimivat verkkopelissä. Haluatko todella pitää tiettyä hattua? Lahjoita meille niin saat yksinoikeudella vapaavalintaisen hatun! - Pidä näytönohjaimesi ajurit ajantasall välttääksesi ongelmat pelin pelaamisessa. + Pidä näytönohjaimesi ajurit ajantasalla jotta peli pyörii sulavasti ja ongelmitta. Löydät Hedgewars-asetustiedostot hakemistosta "Omat tiedostot\Hedgewars". Ota varmuuskopio tai ota ne mukaasi, mutta älä muokkaa niitä käsin. + Seuraa Hedgewarsia Facebookissa ja Twitterissä. + Kruunu vai klaava? Kirjoita "/rnd" aulassa ja ota selvää. Myös "/rnd kivi paperi sakset" toimii! + Pelitiedostot (tallennukset ja demot) voidaan assosioida pelin kanssa, jolloin ne aukeavat suoraan verkko- ja tiedostoselaimesta. + Suutarit miinat eivät ole harmittomia: ne räjähtävät kovasta iskusta! + Rakkaus polttaa! Viehätys sulattaa jäätyneet siilit kantaman sisällä. + Tynnyristä tuleva savu kertoo sen olevan räjähtämäisillään. Mitä tummempi savu, sitä pienempi kipinä laukaisee sen. + Tynnyreillä on pelin alussa 60 terveyspistettä, ja ottavat vahinkoa samoin kuin siilet. Ne räjähtävät, kun terveys menee nollaan. + Tarvitsetko lisää kimpoamisvoimaa? Kimpoamisen voimakkuutta voi säätää numeronäppäimillä 1-5 kun pitää [tarkkuus]-näppäintä pohjassa. + Unohditko millä säännöillä peliä pelataan? Paina tauko- tai poistumisnäppäintä niin näet ne uudestaan. + Muitakin asioita kuin siiliä voi lyödä, piiskata ja vasaroida. + Miinojen ajastin on kolme sekuntia ellei toisin mainita. + Kuningaspelissä, kuningas aloittaa vahvempana kuin muut sekä kestää enemmän vahinkoa. + Kuningaspelissä kuningas ottaa vahinkoa joka vuorolla kun alaisia ei enää ole. + Piiskalla pystyy lyömään siiliä ja esineitä ohuen seinän läpi. + Veitsi tuottaa sitä enemmän vahinkoa, mitä nopeammin se liikkuu. + Kakun voi pudottaa alas jyrkänteeltä, mutta sillon täytyy olla todella lähellä reunaa, joten ole varovainen sen kanssa. + Köyden avulla voi liikuttaa muita siiliä heittäytymällä niitä kohti. + Älä pysähdy jäiseen ylämäkeen tai liukastut ja putoat. Voit pitää [tarkkuus]-nappia pohjassa sen estämiseksi. + Lumikartoissa lunta sataa tasaiseen tahtiin muodostaen kekoja mitkä saattaa tukkia ohuet käytävät. + Ole tarkkana lumi- ja joulukartoissa, koska sillat ovat jäisen liukkaita. + Riippuu aseesta, paljonko ampumisen jälkeen saa aikaa siirtymiseen tai piiloutumiseen. Joillain aseilla tätä aikaa ei ole, joten vuorosi loppuu heti ampumisen jälkeen. + Polttopullo räjäyttää tynnyrin välittömästi kosketuksesta. + Pienellä taidolla voit kumota päälläsi olevan siilen loikkaamalla sen alta. + Sopivasti ajoitetun karatepotkun, katuporan tai siniaaltoaseen käyttö voi kumota korkean pudotuksen aiheuttaman vahingon. + Siili ei ilmassa ollessaan osu ammuksiin. + Poraraketin, pistoolin ja kiväärin jättämistä rei'istä voi ampua läpi portaaliaseella jos tähtää riittävän tarkasti. + Terveyspakkaus parantaa siilen saamat taudit. + Laatikoita voi kerätä myös radio-ohjattavalla lentokoneella, ninjapotkulla, katuporalla sekä kamikazella. + Laatikot räjähtävät puhalluslampusta, joten ole tarkkana niiden luona! + Leijuvat miinat pysyvät paikallaan kierroksen ensimmäiset viisi sekuntia. + Pysy turvallisella etäisyydellä leijuvista miinoista! Kun ne alkavat seurata, niistä on vaikea päästä eroon ilman sopivia työkaluja. + Leijuvat miinat räjähtävät neljäsosan siitä ajasta mitä tavalliset miinat. + Kun veitsi saa yli 30 vahinkopistettä, on mahdollista että se putoaa pois. Tämä todennäköisyys kasvaa, mitä enemmän vahinkopisteitä se saa. + Tarkista aina tuuli, koska liekit sekä jotkin aseet lentävät sen ohjaamina. + Puhalluslampulla voi siirtää siiliä sekä pitkällä ajastimella varustettuja miinoja. + Tynnyri ja puhalluslamppu ovat yhdistelmä varmaan tuhoon! + + Hedgewars-asetustiedostot ovat kansiossa "Tiedostot\Hedgewars". Varmuuskopioi ja siirrä tiedostot mukanasi, mutta älä muokkaa niitä käsin. + + + You can find your Hedgewars configuration files under “Library/Application Support/Hedgewars” in your home directory. Create backups or take the files with you, but don’t edit them by hand. + + + You can find your Hedgewars configuration files under “.hedgewars” in your home directory. Create backups or take the files with you, but don’t edit them by hand. + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_gd.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Locale/tips_gd.xml Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,78 @@ + + + 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. + 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. + 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! + 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! + Mur eil thu ag iarraidh gun cleachd daoine eile am far-ainm as fhearr leat air an fhrithealaiche oifigeil, clàraich cunntas air http://www.hedgewars.org/. + A bheil thu seachd searbh dhen gheama àbhaisteach? Feuch fear dhe na miseanan — bheir iad dòigh-chluiche eadar-dhealaichte dhut a-rèir an fhir a thagh thu + Clàraichidh sinn an geama mu dheireadh a chluich thu mar demo gu fèin-obrachail. Tagh “Geama ionadail” agus tagh putan nan “Demo” taobh deas aig a' bhonn gus an cluich no an stiùireadh. + 'S e bathar-bog saor (Open Source) a th' ann an Hedgewars a tha sinn a' cruthachadh gu saor-thoileach. Ma tha duilgheadas agad, faighnich air a' bhòrd-bhrath no tadhail air an t-seòmar IRC againn! + 'S e bathar-bog saor (Open Source) a th' ann an Hedgewars a tha sinn a' cruthachadh gu saor-thoileach. Ma tha e a' còrdadh riut, nach doir thu tabhartas airgid no obrach dhuinn? + 'S e bathar-bog saor (Open Source) a th' ann an Hedgewars a tha sinn a' cruthachadh gu saor-thoileach. Co-roinn e le do theaghlach is caraidean mar a thogras tu! + '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 #hedgewars! + Bi fèill-chluiche oifigeil againn o àm gu àm. Sgaoilidh sinn brathan-naidheachd mu na tachartasan air http://www.hedgewars.org/ beagan làithean ro làimh. + 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? + Gabhaidh Hedgewars a ruith air iomadh siostam-obrachaidh, a' gabhail a-steach Microsoft Windows, Mac OS X agus GNU/Linux. + 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. + 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. + Bu chòir dhut beagan fois a ghabhail on chluich gach uair a thìde air eagal 's gun cuir e an sgithear ort. + Mur eil comas luathachaidh bathair-chruaidh OpenGL aig a' chairt-ghrafaigeachd agad, feuch an cuir thu an comas modh na càileachd ìseil gus piseach a thoirt air an dèanadas. + Mur eil comas luathachaidh bathair-chruaidh OpenGL aig a' chairt-ghrafaigeachd agad, feuch gu ùraich thu na draibhearan aice. + Cuiridh sinn fàilte air molaidhean is beachdan cuideachail. Ma tha rud ann nach eil a' còrdadh riut no ma tha deagh bheachd agad, innis dhuinn mu dhèidhinn! + 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! + Special game modes such as “Vampirism” or “Karma” allow you to develop completely new tactics. Try them in a custom game! + Please don't install Hedgewars on computers you don’t own (school, university, work, etc.) unless you got permission. We don't want you to get into any trouble. + Hedgewars can be perfect for short games during breaks. Just ensure you don’t add too many hedgehogs or use an huge map. Reducing time and health might help as well. + No hedgehogs were harmed in making this game. + There are three different jumps available. Tap [high jump] twice to do a very high/backwards jump. + Afraid of falling off a cliff? Hold down [precise] to turn [left] or [right] without actually moving. + Some weapons require special strategies or just lots of training, so don’t give up on a particular tool if you miss an enemy once. + Most weapons won’t work once they touch the water. The Homing Bee as well as the Cake are exceptions to this. + The Old Limburger only causes a small explosion. However the wind affected smelly cloud can poison lots of hogs at once. + The Piano Strike is the most damaging air strike. You’ll lose the hedgehog performing it, so there’s a huge downside as well. + The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power. + Sticky Mines are a perfect tool to create small chain reactions knocking enemy hedgehogs into dire situations … or water. + The Hammer is most effective when used on bridges or girders. Hit hogs will just break through the ground. + If you’re stuck behind an enemy hedgehog, use the Hammer to free yourself without getting damaged by an explosion. + The Cake’s maximum walking distance depends on the ground it has to pass. Use [attack] to detonate it early. + The Flame Thrower is a weapon but it can be used for tunnel digging as well. + Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms. + Want to know who’s behind the game? Click on the Hedgewars logo in the main menu to see the credits. + Like Hedgewars? Become a fan on Facebook or follow us on Twitter + 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. + Keep your video card drivers up to date to avoid issues playing the game. + Heads or tails? Type “/rnd” in the lobby and you’ll find out. Also “/rnd rock paper scissors” works! + 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. + Dud mines are not harmless: Although their timer is broken, they can still explode if they took too much abuse! + Love is hot! Use Seduction to thaw frozen hedgehogs. + 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. + Barrels start with 60 health and take damage like hedgehogs, so they need some abuse until they explode. + Need more bounce power? Change the bounce strength of grenades, cluster bombs, old limburgers and mines while holding [precise] and pressing one of the timer keys. + Did you forget the goals or game modifiers inside the game? Hit the pause or quit key to review them again! + You can punch, whip and hammer other things than just hedgehogs. Hit them all! + If not mentioned otherwise, mines normally explode after 3 seconds. + In King Mode, your king will start out healthier, stronger and more resistant to damage and blows than the minions. + In King Mode, the king will take damage each turn when there are no minions left in the team. + The whip also hits hedgehogs and objects behind a thin wall. + A cleaver deals more damage the faster it’s moving. + You can drop cakes from cliffs, but you have to stand very close to the edge, so be careful. + Use your rope to push away other hedgehogs i.e. by sliding on the ground. This technique is known as “rope-knocking”. + Don’t stand still on an icy slope, or you will slip away. Alternatively, you can hold down [precise]. + In the lands of Snow and Christmas, the snow piles up over time, unless the land is indestructible. + Be aware in lands of Snow and Christmas, because girders are made of slippery ice. + The retreat time depends on the weapon you used. Be careful, some weapons don’t have a retreat time and immediately end your turn! + + This version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing. + You can find your Hedgewars configuration files under “My Documents\Hedgewars”. Create backups or take the files with you, but don’t edit them by hand. + + + You can find your Hedgewars configuration files under “Library/Application Support/Hedgewars” in your home directory. Create backups or take the files with you, but don’t edit them by hand. + + + You can find your Hedgewars configuration files under “.hedgewars” in your home directory. Create backups or take the files with you, but don’t edit them by hand. + + \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_it.xml --- a/share/hedgewars/Data/Locale/tips_it.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_it.xml Sun Dec 17 00:09:24 2017 +0100 @@ -66,7 +66,6 @@ Fai attenzione nelle terre innevate e Natalizie, perché le travi sono fatte di ghiaccio scivoloso. Il tempo di fuga dipende dall'arma che hai usato. Fai attenzione, alcune armi non hanno un tempo di fuga e finiscono subito il tuo turno! - Questa versione di Hedgewars supporta Xfire. Assicurati di aggiungere Hedgewars alla sua lista giochi, cosi i tuoi amici potranno vederti giocare. Puoi trovare i file di configurazione di Hedgewars in “My Documents\Hedgewars”. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente. diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_pl.xml --- a/share/hedgewars/Data/Locale/tips_pl.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_pl.xml Sun Dec 17 00:09:24 2017 +0100 @@ -3,55 +3,92 @@ Tips between the platform specific tags are shown only on those platforms. Do not escape characters or use the CDATA tag. --> - By grać ze swoim przyjacielem w tej samej drużynie po prostu wybierzcie taki sam kolor obydwu zespołów. Każdy z was będzie sterować swoimi własnymi jeżami ale wygracie bądź przegracie jako jedna drużyna. - Niektóre z broni zadają mało punktów obrażeń jednak użyte w odpowiednim momencie mogą pokazać pazur. Na przykład spróbuj użyć pistoletu by strącić swoich przeciwników do wody. - Jeśli nie jesteś pewien co zrobić w danej turze i nie chcesz tracić amunicji możesz pominąć turę. Nie rób tak jednak zbyt często gdyż nagła śmierć jest nieuchronna! - Jeśli chciałbyś zapobiec używania własnego nicka przez kogoś innego, zarejestruj go na http://www.hedgewars.org . - Znudzony domyślnymi ustawieniami gry? Spróbuj zagrać w którąś z misji. - oferują one zmienione zasady gry w zależności od tej którą wybrałeś. - Gra zawsze będzie zapisywała ostatnią rozgrywkę jako Demo. Wybierz "Grę Lokalną" i kliknij w przycisk "Dema" który znajduje się w prawym dolnym rogu ekranu by je odtworzyć i zarządzać nimi. - Hedgewars jest darmową grą o otwartym kodzie, którą tworzymy w naszym wolnym czasie. Jeśli masz jakiś problem, zapytaj na forum ale nie spodziewaj się wsparcia 24 godziny na dobę! - Hedgewars jest darmową grą o otwartym kodzie, którą tworzymy w naszym wolnym czasie. Jeśli ją lubisz, wspomóż nas małą wpłatą lub stwórz własną czapkę bądź mapę! + By grać ze swoim przyjacielem w tej samej drużynie, po prostu wybierzcie taki sam kolor obydwu zespołów. Każdy z was będzie sterować swoimi własnymi jeżami, ale wygracie bądź przegracie jako jedna drużyna. + Niektóre z broni zadają mało punktów obrażeń, jednak użyte w odpowiednim momencie mogą pokazać pazur. Na przykład, spróbuj użyć pistoletu, by strącić swoich przeciwników do wody. + Jeśli nie jesteś pewien, co zrobić w danej turze i nie chcesz tracić amunicji, możesz pominąć turę. Nie rób tak jednak zbyt często, gdyż nagła śmierć jest nieuchronna! + Znudzony domyślnymi ustawieniami gry? Spróbuj zagrać w którąś z misji. - oferują one zmienione zasady gry, w zależności od tej którą wybrałeś. + Gra zawsze będzie zapisywała ostatnią rozgrywkę jako demo. Wybierz "Grę Lokalną" i kliknij przycisk "Dema", który znajduje się w prawym dolnym rogu ekranu, by je odtworzyć i zarządzać nimi. + Hedgewars jest darmową grą o otwartym kodzie, którą tworzymy w naszym wolnym czasie. Jeśli masz jakiś problem, zapytaj na naszym forum lub odwiedź nasz kanał IRC! + Hedgewars jest darmową grą o otwartym kodzie, którą tworzymy w naszym wolnym czasie. Jeśli ją lubisz, wspomóż nas małą wpłatą lub wnieś w nią trochę własnej pracy! Hedgewars jest darmową grą o otwartym kodzie, którą tworzymy w naszym wolnym czasie. Jeśli tylko chcesz, rozdaj ją swojej rodzinie i kolegom! - Od czasu do czasu będą organizowane mistrzostwa. Będą one ogłaszane z wyprzedzeniem na http://www.hedgewars.org/ . + Hedgewars jest darmową grą o otwartym kodzie, którą tworzymy w naszym wolnym czasie, tylko dla zabawy! Poznaj twórcó na #hedgewars! + Od czasu do czasu będą organizowane mistrzostwa. Będą one ogłaszane z wyprzedzeniem na http://www.hedgewars.org/. Hedgewars jest dostępne w wielu językach. Jeśli brakuje tłumaczenia w twoim języku bądź jest ono niekompletne, nie bój się z nami skontaktować! - Hedgewars może być uruchomione na różnych systemach operacyjnych takich jak Microsoft Windows, MacOS X, FreeBSD oraz Linux. + Hedgewars może być uruchomione na różnych systemach operacyjnych, takich jak Microsoft Windows, Mac OS X, oraz GNU/Linux. Zawsze możesz zmieniać ustawienia gry w opcjach gry lokalnej lub sieciowej. Nie musisz ciągle używać tzw. "Szybkiej gry". - Zawsze pamiętaj o robieniu krótkich przerw co godzinę kiedy grasz na komputerze. - Jeśli twoja karta graficzna nie ma sprzętowego przyspieszania OpenGL, spróbuj włączyć tryb obniżonej jakości by zwiększyć płynność gry. + Zawsze pamiętaj o robieniu krótkich przerw co godzinę, kiedy grasz na komputerze. Unikniesz przemęczenia. + Jeśli twoja karta graficzna nie ma sprzętowego przyspieszania OpenGL, spróbuj włączyć tryb obniżonej jakości, by zwiększyć płynność gry. Jesteśmy otwarci na sugestie oraz konstruktywną krytykę. Jeśli coś Ci się nie podoba bądź masz jakiś pomysł, daj nam znać! Bądź kulturalny grając przez internet. Pamiętaj o tym, że w Hedgewars mogą grać także młodsze osoby! Specjalne tryby gry takie jak "Karma" bądź "Wampiryzm" pozwalają na stworzenie nowej taktyki! Nie powinieneś instalować Hedgewars na komputerach których nie posiadasz (w szkole, na studiach, w pracy itp.). Zapytaj osoby odpowiedzialnej za te komputery! - Hedgewars jest idealny do gry w czasie przerw.Upewnij się, że nie dałeś zbyt dużej ilości jeży, bądź zbyt dużej mapy. Pomóc może także zmniejszenie długości tury lub obniżenie ilości życia. + Hedgewars jest idealny do gry w czasie przerw. Upewnij się, że nie dałeś zbyt dużej ilości jeży, bądź zbyt dużej mapy. Pomóc może także zmniejszenie długości tury lub obniżenie ilości życia. Żaden jeż nie został ranny w czasie tworzenia tej gry. - Hedgewars jest darmową grą o otwartym kodzie źródłowym którą tworzymy w naszym wolnym czasie. Jeśli ktokolwiek sprzedał Tobie tę grę powinieneś upomnieć się o swoje pieniądze! - Jeśli podłączysz jeden lub więcej gamepadów przed włączeniem gry będziesz miał możliwość przypisania klawiszy by sterować swoimi jeżami. - Stwórz konto na %1 by zapobiec używania twojego ulubionego nicku przez innych na oficjalnym serwerze. - Jeśli twoja karta nie wspiera sprzętowego przyspieszania OpenGL spróbuj uaktualnić swoje sterowniki. + Hedgewars jest darmową grą o otwartym kodzie źródłowym, którą tworzymy w naszym wolnym czasie. Jeśli ktokolwiek sprzedał Tobie tę grę, powinieneś upomnieć się o swoje pieniądze! + Jeśli podłączysz jeden lub więcej gamepadów przed włączeniem gry, będziesz mieć możliwość przypisania klawiszy, by sterować swoimi jeżami. + Stwórz konto na http://www.hedgewars.org/, by zapobiec używania twojego ulubionego nicku przez innych na oficjalnym serwerze. + Jeśli twoja karta nie wspiera sprzętowego przyspieszania OpenGL, spróbuj uaktualnić swoje sterowniki. Są trzy różne rodzaje skoku możliwe do wykonania. Naciśnij [wysoki skok] dwa razy by zrobić bardzo wysoki skok w tył. - Boisz się upadku z krawędzi terenu? Przytrzymaj klawisz [precyzyjnego celowania] by obrócić się w [lewo] lub [prawo] bez ruszenia się z miejsca. - Niektóre z broni wymagają specjalnej strategii lub dużo treningu by je popranie używać. Nie poddawaj się gdy nie wychodzi ci za pierwszym razem. - Większość uzbrojenia nie działa pod wodą. Pszczoła i Ciasto są wyjątkami od tej reguły. - Cuchnący ser nie powoduje wielkiego wybuchu. Jednakże pod wpływem wiatru chmura śmierdzącego gazu może bardzo daleko zawędrować i otruć wiele jeży naraz. - Zrzut pianina jest najbardziej morderczym atakiem powietrznym. Pamiętaj, że tracisz jeża którym wykonujesz ten atak więc dobrze zaplanuj swój ruch. - Miny samoprzylepne są idealnym narzędziem by tworzyć małe reakcje łańcuchowe bądź do zmuszenia przeciwnika by popadł w tarapaty lub wpadł do wody. + Boisz się upadku z krawędzi terenu? Przytrzymaj klawisz [precyzyjnego celowania], by obrócić się w [lewo] lub [prawo] bez ruszenia się z miejsca. + Niektóre z broni wymagają specjalnej strategii lub dużo treningu, by je poprawnie używać. Nie poddawaj się, gdy nie wychodzi ci za pierwszym razem. + Większość uzbrojenia nie działa pod wodą. Pszczoła i ciasto są wyjątkami od tej reguły. + Cuchnący ser nie powoduje wielkiego wybuchu. Jednakże pod wpływem wiatru, chmura śmierdzącego gazu może bardzo daleko zawędrować i otruć wiele jeży naraz. + Zrzut pianina jest najbardziej morderczym atakiem powietrznym. Pamiętaj, że tracisz jeża, którym wykonujesz ten atak, więc dobrze zaplanuj swój ruch. + Miny samoprzylepne są idealnym narzędziem, by tworzyć małe reakcje łańcuchowe bądź do zmuszenia przeciwnika, by popadł w tarapaty lub wpadł do wody. Młotek jest najbardziej skuteczny na mostach bądź kładkach. Uderzone jeże przelecą przez nie na sam dół. - 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. - Dystans który Ciasto może przebyć zależy od terenu który ma do przebycia. Użyj [ataku] by zdetonować je wcześniej. + 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. + Dystans, który ciasto może przebyć, zależy od terenu, który ma do przebycia. Użyj [ataku] by zdetonować je wcześniej. Miotacz ognia jest śmiercionośną bronią ale może być użyty również jako narzędzie do kopania tuneli. - Chcesz wiedzieć kto tworzy tę grę? Kliknij logo w głównym menu by zobaczyć autorów. - Lubisz Hedgewars? Zostań fanem na %1 lub dołącz do grupy na %2! - Możesz rysować własne nagrobki, czapki, flagi lub nawet mapy albo tematy! Miej na uwadze to by udostępnić je każdemu który będzie grał z Tobą przez sieć. - Chcesz nosić wymarzoną czapkę? Wspomóż nas pieniężnie a my zrobimy specjalną czapkę tylko dla Ciebie! - Pamiętaj o aktualizowaniu sterowników by zapobiec problemom z grami. - Swoje zespoły i konfigurację gry znajdziesz w folderze "Moje Dokumenty\Hedgewars". Twórz regularnie kopie zapasowe, ale nie edytuj tych plików własnoręcznie. - Możesz powiązać typy plików związane z Hedgewars (zapisy gier i dema) by móc je uruchamiać bezpośrednio z ulubionego menedżera plików bądź przeglądarki internetowej. + Chcesz wiedzieć kto tworzy tę grę? Kliknij logo w głównym menu, by zobaczyć autorów. + Lubisz Hedgewars? Zostań fanem na Facebooku lub obserwuj nas na Twitterze! + 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ć. + Chcesz nosić wymarzoną czapkę? Wspomóż nas pieniężnie, a my zrobimy specjalną czapkę tylko dla Ciebie! + Pamiętaj o aktualizowaniu sterowników, by zapobiec problemom z grami. + Możesz powiązać typy plików związane z Hedgewars (zapisy gier i dema), by móc je uruchamiać bezpośrednio z ulubionego menedżera plików bądź przeglądarki internetowej. Chcesz zaoszczędzić liny? Odłącz ją będąc w powietrzu, a potem wypuść ją ponownie. Dopóki nie dotkniesz ziemi, będziesz używał pojedynczego naboju! - Swoje zespoły i konfigurację gry znajdziesz w folderze "Library/Application Support/Hedgewars" w twoim katalogu domowym. Twórz regularnie kopie zapasowe, ale nie edytuj tych plików własnoręcznie. - Swoje zespoły i konfigurację gry znajdziesz w folderze ".hedgewars" w twoim katalogu domowym. Twórz regularnie kopie zapasowe, ale nie edytuj tych plików własnoręcznie. - Użyj koktajlu Mołotowa lub Miotacza ognia by powstrzymać przeciwnika przed przedostaniem się przez tunele lub platformy. - Pszczoła potrafi być ciężka w użyciu. Jej promień skrętu zależy od prędkości lotu, więc nie staraj się nie używać pełnej mocy podczas strzału. + Użyj koktajlu Mołotowa lub miotacza ognia, by powstrzymać przeciwnika przed przedostaniem się przez tunele lub platformy. + Pszczoła potrafi być ciężka w użyciu. Jej promień skrętu zależy od prędkości lotu, więc staraj się nie używać pełnej mocy podczas strzału. + Orzeł czy reszka? Wpisz "/rnd" w poczekalni, a się dowiesz. "/rnd kamień papier nożyce" również działa! + Niewybuchy nie są niegroźne. Mimo, że ich zapalnik jest zepsuty, nadal mogą wybuchnąć, jeśli za mocno oberwą! + Miłość jest gorąca! Użyj uwodzenia, by roztopić zamrożone jeże. + Dym wydostający się z beczek, to znak, że mają mało "zdrowia" i nawet mała ilość obrażeń może spowodować ich eksplozję. + Beczki zaczynają z 60 punktami zdrowia i otrzymują obrażenia jak jeże, więc wymagają trochę uderzeń zanim wybuchną. + Potrzebujesz więcej sprężystej mocy? Zmień siłę odbicia granatów, bomb odłamkowych, starego sera i min, wciskając przyciski czasu, gdy trzymasz [precyzyjne celowanie]. + Zapomniałeś cele lub modyfikatory podczas gry? Wcinij przycisk pauzy lub wyjścia, by je znowu przejrzeć! + Możesz uderzać, biczować i młotkować inne rzeczy, niż tylko jeże. Uderz je wszystkie! + Jeśli nie napisane inaczej, miny wybuchają normalnie po 3 sekundach. + W Trybie Króla, twój król zaczyna zdrowszy, silniejszy oraz bardziej odporny na obrażenia i wybuchy, niż poddani. + W Trybie Króla, król będzie otrzymywał obrażenia w każdej turze, kiedy nie zostało żadnych poddanych w drużynie. + Bicz również uderza jeże i obiekty za cienką ścianą. + Tasak zadaje tym więcej obrażeń, im szybciej się porusza. + Możesz upuszczać ciasta z klifów, ale musisz stać bardzo blisko krawędzi, więc uważaj. + Użyj swojej liny, by odpychać inne jeże poprzez ślizganie po ziemi. Ta technika znana jest jako "trącanie liną". + Nie stój bez ruchu na lodowym stoku, bo się ześlizgniesz. Alternatywnie, możesz przytrzymac [precyzyjne celowanie]. + W krainach Śniegu i Świąt, śnieg nagromadza się w czasie, chyba że teren jest niezniszczalny. + Uważaj w krainach Śniegu i Świąt, ponieważ belki zrobione są ze śliskiego lodu. + Czas odwrotu zależy od użytej broni. Uważaj, niektóre bronie nie mają takiego czasu i kończą turę natychmiast! + Z odrobiną wprawy, możesz uderzać jeże poprzez wyskakiwanie spod nich. + Odmierzony atak ognistą pięścią, młotem pneumatycznym lub sinusoidalną giwerą mogą anulować obrażenia od upadku. + Twój jeż nie koliduje z pociskami, kiedy jest w powietrzu. + Dziury zostawione przez wiertnicze rakiety, karabin snajperski i Desert Eagle są wystarczająco duze, by strzelać przez nie portale, jeśli odpowiednio precyzyjnie wycelujesz. + Zbierz pierwszą apteczkę, by uleczyć swojego zatrutego jeża. + Możesz zbierać skrzynki również używając radiowego samolociku, ognistej pięści, młota pneumatycznego i kamikaze. + Uważaj, by się nie wysadzić, kiedy używasz palnika, by podejść do skrzynki. + Miny powietrzne są pasywne przez pierwsze 5 sekund tury, zanim zaczną szukać jeży. + Trzymaj bezpieczny dystans od latających min! Kiedy taka mina zacznie cię ścigać, trudno będzie uciec bez narzędzi. + Latające miny wybuchają po ćwiartce czasu ustawionego dla zwykłych min. + Kiedy tasak w terenie otrzyma 30 lub więcej obrażeń na raz, jest szansa, że spadnie. Szansa ta zwiększa się z obrażeniami. + Uważaj na wiatr, ponieważ ma wpływ płomienie i niektóre pociski. + Użyj palnika, by pchać jeże i miny z długim zapalnikiem. + Wbiegnięcie palnikiem w beczkę to wybuchowa recepta na katastrofę! + Wszelkie znalezione błędy w tłumaczeniu lub sugestie poprawek, proszę pisać w tym temacie na forum: https://www.hedgewars.org/node/6864. Tłumaczenie nie jest tworzone przez profesjonalistów, tylko przez ochotników w wolnym czasie, więc zawsze może zawierać błędy. - Wersja Hedgewars dla systemu Windows wspiera Xfire. Upewnij się, że dodałeś Hedgewars do listy gier by Twoi znajomi mogli zobaczyć Ciebie w czasie gry. + Swoje zespoły i konfigurację gry znajdziesz w folderze "Moje Dokumenty\Hedgewars". Twórz regularnie kopie zapasowe, ale nie edytuj tych plików własnoręcznie. + + Swoje zespoły i konfigurację gry znajdziesz w folderze "Library/Application Support/Hedgewars" w twoim katalogu domowym. Twórz regularnie kopie zapasowe, ale nie edytuj tych plików własnoręcznie. + + + Swoje zespoły i konfigurację gry znajdziesz w folderze ".hedgewars" w twoim katalogu domowym. Twórz regularnie kopie zapasowe, ale nie edytuj tych plików własnoręcznie. + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_ru.xml --- a/share/hedgewars/Data/Locale/tips_ru.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_ru.xml Sun Dec 17 00:09:24 2017 +0100 @@ -51,7 +51,4 @@ Файлы конфигурации Hedgewars находятся в папке ".hedgewars". Создавайте бэкапы или переносите файлы, но не редактируйте их вручную. Используйте Коктейль Молотова или Огнемёт, чтобы временно не дать ежам пройти через туннель или по платформе. Пчёлку можеть быть сложно использовать. Её радиус поворота зависит от скорости, поэтому попробуйте не использовать полную силу броска. - - Версия Hedgewars под операционную систему Windows поддерживает Xfire. Не забудьте добавить Hedgewars в список игр, чтобы ваши друзья видели, когда вы в игре. - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_sk.xml --- a/share/hedgewars/Data/Locale/tips_sk.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_sk.xml Sun Dec 17 00:09:24 2017 +0100 @@ -51,7 +51,4 @@ Konfiguračné súbory Hedgewars nájdete v ".hedgewars" vo vašom domovskom adresári. Vytvárajte si zálohy alebo prenášajte si tieto súbory medzi počítačmi, ale needitujte ich ručne. Použite Molotovov koktejl alebo plameňomet na dočasné zabránenie ježkom prejsť terénom ako sú tunely alebo plošiny. Navádzaná včela je trošku zložitejšia na použitie. Jej polomer otočenia závisí na jej rýchlosti, takže ju radšej nepoužívajte pri plnej sile. - - Hedgewars vo verzii pre Windows podporujú Xfire. Pridajte si Hedgewars do vášho zoznamu hier tak, aby vás vaši priatelia videli hrať. - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tips_uk.xml --- a/share/hedgewars/Data/Locale/tips_uk.xml Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tips_uk.xml Sun Dec 17 00:09:24 2017 +0100 @@ -51,7 +51,4 @@ Ви можете знайти файли конфігурації Hedgewars в ".hedgewars" в домашній теці. Ви можете створити резервні копії або взяти файли з собою, але не редагуйте їх. Використайте Коктейль Молотова або Вогнемет щоб тимчасово утримати їжаків від проходження такої місцевості як тунелі або платформи. Навідна Бджілка може бути складною у керуванні. Радіус повороту залежить від її швидкості, тому постарайтеся не стріляти на повну силу. - - Windows-версія Hedgewars підтримує Xfire. Переконайтеся в тому, що ви додали Hedgewars до списку ігор, щоб ваші друзі могли бачити вас в грі. - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tr.lua --- a/share/hedgewars/Data/Locale/tr.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tr.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,268 +1,556 @@ locale = { --- [":("] = "", -- ["!!!"] = "", -- ["..."] = "", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant ["30 minutes later..."] = "30 dakika sonra...", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Güzel Nişan Bonusu!", +-- ["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 Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["A Hedgewars minigame"] = "", -- Capture_the_Flag ["a Hedgewars mini-game"] = "Hedgewars mini oyunu", -- Space_Invasion, The_Specialists --- ["a Hedgewars tag game"] = "", -- Mutant --- ["AHHh, home sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["A Hedgewars mini-game"] = "", -- Racer, Space_Invasion, TechRacer, Tumbler +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome ["Aiming Practice"] = "Atış Eğitimi", --Bazooka, Shotgun, SniperRifle +-- ["Aiming practice"] = "", -- TargetPractice -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW - ["Ammo Depleted!"] = "Mermi Bitti!", - ["ammo extended!"] = "mermi genişletildi!", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler ["Ammo is reset at the end of your turn."] = "Mermi turunun sonunda sıfırlanır.", - ["Ammo Maniac!"] = "Mermi Manyağı!", - ["Ammo"] = "Mermi", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies ["Available points remaining: "] = "Halan kullanılabilir puanlar: ", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", - ["Barrel Eater!"] = "Varilsever!", +-- ["Barrel Eater"] = "", -- Tumbler +-- ["Barrel Launcher selected!"] = "", -- Tumbler ["Barrel Launcher"] = "Varil Patlatıcı", -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Düşmanlarına sopayla vur|ve denize dök!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Düşmanlarını sepetlere vurarak|harita dışına at!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Roketatar Eğitimi", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Her takım için en iyi tur: ", - ["Best Team Times: "] = "En İyi Takım Süresi: ", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "BUMM!", +-- ["Bones"] = "", -- +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion ["Boom!"] = "Bumm!", - ["Boss defeated!"] = "Patron öldürüldü!", - ["Boss Slayer!"] = "Patron Katili!", +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer ["Build a track and race."] = "Bir yol inşa et ve yarış.", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "BAYRAĞI YAKALA", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Dikkatsiz", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge - ["Change Weapon"] = "Silahı Değiştir", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "Sakar", --- ["Cluster Bomb"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Kodadı: Takım Çalışması", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Yolu mümkün olduğunca hızlı tamamla!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope ["Congratulations!"] = "Tebrikler!", --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Tebrikler! Tüm hedefleri|belirtilen sürede yendin.", --Bazooka, Shotgun, SniperRifle +-- ["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 +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Puan toplamak için sütunları denetle.", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Kybernetisches Imperium", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "LANET OLSUN ACEMİ! DEFOL BAŞIMDAN!", ["DAMMIT, ROOKIE!"] = "LANET OLSUN ACEMİ!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion -- ["Dangerous Ducklings"] = "", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Graviton", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor ["Demolition is fun!"] = "Yok etmek eğlencelidir!", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow - ["Depleted Kamikaze!"] = "Boşa yapılmış Kamikaze!", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Puan kazanmak için istilacıları yok et.", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode --- ["Drone Hunter!"] = "", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Boğulucu", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy ["Each turn you get 1-3 random weapons"] = "Her turda 1-3 rastgele silah alacaksın", ["Each turn you get one random weapon"] = "Her turda bir adet rastgele silah alacaksın", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Tüm düşmanı yoket", ["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 enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "Neutralisiere das Gift bevor die Zeit abgelaufen ist", - ["Eliminate the Blue Team"] = "Lösche das Blaue Team aus", - ["Eliminate the enemy before the time runs out"] = "Vernichte den Feind bevor die Zeit abgelaufen ist", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Vernichte Einheit 3378 | Kraftloser Widerstand muss überleben", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Viel Spaß beim Schwimmen...", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Schnellste Runde: ", ["Feeble Resistance"] = "Kraftloser Widerstand", @@ -270,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 - - ["Fire"] = "Feuer", +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Fahne erobert!", ["Flag respawned!"] = "Fahne wieder erschienen!", ["Flag returned!"] = "Fahne zurückgebracht!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Fahnen und deren Heimatstandort werden dort plaziert wo jedes Team deren ersten Zug beendet.", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", - ["fuel extended!"] = "Treibstoff aus!", - ["GAME BEGUN!!!"] = "SPIEL GESTARTET!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Ziel", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Viel Glück da draußen!", ["Good so far!"] = "Gut soweit!", @@ -333,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "ERWISCHT!", - ["Grab Mines/Explosives"] = "Sammle Minen/Fässer", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen -- ["Hahahaha!"] = "", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Haha, na DAS wär ja was!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil ["Hapless Hogs"] = "Glücklose Igel", [" Hapless Hogs left!"] = " Glücklose Igel verbleibend!", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode - ["Health crates extend your time."] = "Medipacks verlängern deine Zeit.", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "Schwierig", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Hedgewars-Basketball", - ["Hedgewars-Knockball"] = "Hedgewars-Knockball", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "Hehe, so schlimm ist es nicht.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hit Combo!"] = "", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm..."] = "", -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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 +-- ["Hopeless case"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Hop on top of the next flower and advance to the left coast."] = "", -- A_Classic_Fairytale:journey +-- ["Horns"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Jäger", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Ausbilder", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "Angreifer zerstört", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -495,543 +1040,1295 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Gut, dass SUDDEN DEATH noch 99 Runden entfernt ist...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Sprünge sind deaktiviert!", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "Kamikazeexperte!", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion ["Keep it up!"] = "Weiter so!", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab ["Killing spree!"] = "Blutrausch!", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood --- ["KILLS"] = "", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion ["Last Target!"] = "Letzte Zielscheibe!", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["[Left Shift]"] = "", --- ["left shift"] = "", -- Continental_supplies --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Aufgepasst, du Made!!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy ["Mine Deployer"] = "Minenleger", - ["Mine Eater!"] = "Minenfresser!", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "| - Minenzündzeit: ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "MISSION ERFOLGREICH", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "MISSIONSERFOLG", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Bewegung: [Hoch], [Runter], [Links], [Rechts]", --- ["Mudball"] = "", -- Construction_Mode --- ["Multi-shot!"] = "", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion ["Munition!"] = "Munition erschöpft!", -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 - ["New Barrels Per Turn"] = "Neue Fässer jede Runde", - ["NEW CLAN RECORD: "] = "NEUER KLAN-REKORD", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "NEUE schnellste Runde: ", - ["New Mines Per Turn"] = "Neue Minen jede Runde", - ["NEW RACE RECORD: "] = "NEUER RENNREKORD: ", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "NICHT GENUG WEGPUNKTE", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Kein-so-Freundschaftsspiel", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood --- ["Operation Diver"] = "", ["Opposing Team: "] = "Gegnerisches Team: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Erbärmlicher Igel #%d", +-- ["Patches"] = "", -- ["Pathetic Resistance"] = "Erbärmlicher Widerstand", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor ["Place more waypoints using the 'Air Attack' weapon."] = "Platziere mehr Wegpunkte durch Verwenden der 'Luftangriff'-Waffe", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["POINTS"] = "", -- Mutant +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- 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 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal - ["Power Remaining"] = "Verbleibende Energie", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["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", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW -- ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow ["PUNKTESTAND"] = "", - ["Race complexity limit reached."] = "Rennkomplexitätslimit erreicht.", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", - ["Round Limit"] = "Rundenbegrenzung", --- ["Rounds Complete: "] = "", - ["Rounds Complete"] = "Runden Gespielt", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "SPIEL REGELN (Drücke ESC zum Anzeigen)", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["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!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["Score"] = "", -- Mutant --- ["SCORE"] = "", -- Space_Invasion - --- ["sec"] = "", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Mach's gut!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood ["selected!"] = "ausgewählt!", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["s"] = "", -- GaudyRacer, Space_Invasion +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "Schild verstärkt! +30 Energie", - ["Shield Depleted"] = "Schild aufgebraucht!", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Schild vollständig aufgeladen!", - ["Shield Master!"] = "Schildmeister!", - ["Shield Miser!"] = "Schildgieriger", - ["Shield OFF:"] = "Schild AUS:", - ["Shield ON:"] = "Schild AN:", - ["Shield Seeker!"] = "Schildsucher!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "Schrotflinten-Team", - ["Shotgun Training"] = "Schrotflinten-Training", ["shots remaining."] = "Schüsse übrig", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Doofi", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Blubb", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s ist draußen und Team %d|erhält eine Strafe!| |Punktestand:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s ist draußen und Team %d|erhält einen Punkt!| |Punktestand:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa ["Spielmodifikatoren: "] = "", +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united ["Sponge"] = "Schwamm", -- ["Spooky Tree"] = "", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies ["Switched to "] = "Gewechselt zu ", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- -- ["Team %d: "] = "", - ["Team Scores"] = "Teampunktestand", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow -- ["That Sinking Feeling"] = "", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "Das war sinnlos.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Der Feind versteckt sich auf dem Entlein dort drüben!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Die Fahne wird nächste Runde wieder auftauchen.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab ["This one's tricky."] = "Der hier ist knifflig.", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Das nenne ich mal einen Regenschauer...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["Timed Kamikaze!"] = "Pünktliches Kamikaze!", - ["Time Extended!"] = "Zeit verlängert!", - ["Time Extension"] = "Zeitverlängerung", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer ["Time Left: "] = "Verbleibende Zeit", - ["TIME: "] = "ZEIT: ", +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Schild ein/aus", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "STRECKENLAUF BEENDET", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab -- ["TrophyRace"] = "", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 -- ["T_T"] = "", - ["Tumbling Time Extended!"] = "Purzelzeit verlängert!", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Zeit pro Zug", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Einheit 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- ["Unit 835"] = "Einheit 3378", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united ["Unit"] = "Einheit", +-- ["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 --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood -- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Nutze das Seil um von Start zu Ziel zu gelangen - so schnell du kannst!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Wegpunkt gesetzt", - ["Way-Points Remaining"] = "Wegpunkte verbleibend", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies --- ["Weapons reset."] = "", -- Highlander +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion +-- ["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 -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos ["Well done."] = "Gut gemacht.", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1039,13 +2336,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1059,31 +2365,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - ["Will this ever end?"] = "Bu sona erecek mi?", --- ["WINNER IS "] = "", -- Mutant - ["WINNING TIME: "] = "KAZANMA SÜRESİ: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1091,68 +2405,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "VURDUN!", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "Kurtarılan: ", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "Roketatar Takımı", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/tr.txt --- a/share/hedgewars/Data/Locale/tr.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/tr.txt Sun Dec 17 00:09:24 2017 +0100 @@ -59,7 +59,7 @@ 00:55=Dondurucu 00:56=Satır -01:00=Savaş başlasın! +; 01:00=Loading … 01:01=Beraberlik 01:02=%1 kazandı! 01:03=Bölüm %%1 @@ -248,11 +248,11 @@ 02:02=Asla korkma! 02:02=Cesur ol ve fethet -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=%1 kazandı! -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Beraberlik ; New health crate 02:05=Yardım geliyor! @@ -518,12 +518,12 @@ ; Game goal strings 05:00=Oyun Kipleri 05:01=Aşağıdaki kurallar uygulanır -05:02=Kaleler: Kaleni savun; düşmanlarını alt et! +05:02=Kralı Yerleştir: Kralın için korunaklı bir başlangıç noktası seç 05:03=Düşük Yer Çekimi: Adımına dikkat et 05:04=Dayanıklılık: Kirpiler (neredeyse) zarar görmezler 05:05=Vampirleşme: Verilen hasar kirpileri iyileştirir 05:06=Karma: Verilen hasar kirpilere zarar verir -05:07=Kralı Koru: Kralın ölmesine izin verme!|Kralı Yerleştir: Kralın için korunaklı bir başlangıç noktası seç +05:07=Kralı Koru: Kralın ölmesine izin verme! 05:08=Kirpileri Yerleştir: Kirpilerini oyun başlamadan önce yerleştir 05:09=Ağır Sınıf: Kirpiler hareket etmek için yer değiştiremezler 05:10=Yıkılmaz Zemin: Çoğu silah zemine zarar veremez diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/uk.lua --- a/share/hedgewars/Data/Locale/uk.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/uk.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,267 +1,555 @@ locale = { --- [":("] = "", -- ["..."] = "", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["Accuracy Bonus!"] = "Бонус Точності!", +-- ["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 Unlocked"] = "Досягнення Розблоковано", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler --- ["???"] = "", -- A_Classic_Fairytale:backstab +-- ["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 -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy ["Africa"] = "Африка", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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 +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["Aiming practice"] = "", -- TargetPractice ["Aiming Practice"] = "Практика прицілювання", --Bazooka, Shotgun, SniperRifle -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor ["A leap in a leap"] = "Стрибки-скоки", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen ["A little gift from the cyborgs"] = "Маленький подарунок від кіборгів", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen ["All right, we just need to get to the other side of the island!"] = "Гаразд, нам лише треба добратись до другого кінця острова!", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW - ["Ammo Depleted!"] = "Боєприпаси Скінчились!", - ["ammo extended!"] = "Боєприпаси поповнені!", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler ["Ammo is reset at the end of your turn."] = "Боєприпаси обнуляються в кінці вашого ходу.", - ["Ammo Maniac!"] = "Маніяк Боєприпасів!", - ["Ammo"] = "Боєприпаси", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion ["And how am I alive?!"] = "І чому я живий!?", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood ["And so it began..."] = "І почалось...", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen ["...and so the cyborgs took over the world..."] = "...і так кіборги захопили світ...", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - ["Antarctica"] = "Антарктида", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW ["Asia"] = "Азія", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 ["Australia"] = "Австралія", -- Continental_supplies ["Available points remaining: "] = "Залишилось доступних очків: ", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal ["Bad Team"] = "Погана команда", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- ["Bamboo Thicket"] = "Бамбукові Хащі", - ["Barrel Eater!"] = "Поїдач Бочок!", +-- ["Barrel Eater"] = "", -- Tumbler +-- ["Barrel Launcher selected!"] = "", -- Tumbler ["Barrel Launcher"] = "Катапульта для бочок", -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "Закидайте ворогів м'ячами щоб|зіштовути їх у море!", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "Дубасьте опонентів битою через|кошики та за межі карти!", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "Тренування з базукою", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "Кращі партії на команду: ", - ["Best Team Times: "] = "Кращий Командний Час: ", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow - ["BOOM!"] = "БАБАХ!", +-- ["Bones"] = "", -- +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion ["Boom!"] = "Бабах!", - ["Boss defeated!"] = "Боса переможено!", - ["Boss Slayer!"] = "Вбивця Боса!", +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer ["Build a track and race."] = "Створіть трасу та женіть.", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen ["But...we died!"] = "Але...ми померли!", -- A_Classic_Fairytale:backstab ["But where can we go?"] = "Але куди ми можемо піти?", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen ["But why would they help us?"] = "Чому вони нам допоможуть?", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey ["Cannibals?! You're the cannibals!"] = "Канібали!? Ви канібали!", -- A_Classic_Fairytale:enemy ["Cannibals"] = "Канібали", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood - ["CAPTURE THE FLAG"] = "ЗАХОПЛЕННЯ ПРАПОРА", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard ["Careless"] = "Безтурботний", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge - ["Change Weapon"] = "Змінити Зброю", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "Кодова назва: Командна гра", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos ["Complete the track as fast as you can!"] = "Подолайте трасу так швидко, як тільки зможете!", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Вітаємо! Ви знищили всі цілі|в межах дозволеного часу.", --Bazooka, Shotgun, SniperRifle +-- ["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!"] = "Вітаємо!", +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "Контрольюй стовпи щоб набрати очки.", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge ["Crates Left:"] = "Залишилось ящиків:", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "Кібернетична Імперія", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "ЧОРТ ЗАБИРАЙ, САЛАГА! ЗЛІЗЬ З МОЄЇ ГОЛОВИ!", ["DAMMIT, ROOKIE!"] = "ЧОРТ ЗАБИРАЙ, САЛАГА!", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "Небезпечні Каченята", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 ["Deadweight"] = "Власна вага", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor ["Demolition is fun!"] = "Руйнування це весело!", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow - ["Depleted Kamikaze!"] = "Виснажений Камікадзе!", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "Знищіть загарбників, щоб набрати очки.", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drill Strike"] = "", -- Construction_Mode ["Drills"] = "Дрелі", -- A_Classic_Fairytale:backstab - ["Drone Hunter!"] = "Мисливець за Джмелями!", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer ["Drowner"] = "Потопаючий", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy ["Each turn you get 1-3 random weapons"] = "Кожного ходу ви отримуєте 1-3 випадкової зброї", ["Each turn you get one random weapon"] = "Кожного ходу ви отримуєте одну випадкову зброю", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "Ліквідуйте всіх ворогів", ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Знищіть всі цілі до закінчення часу.|У вас безмежні боєприпаси.", --Bazooka, Shotgun, SniperRifle --- ["Eliminate enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "Знешкодьте Смердюка до закінчення часу", - ["Eliminate the Blue Team"] = "Знищіть Синю Команду", - ["Eliminate the enemy before the time runs out"] = "Знешкодьте ворога до закінчення часу", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- Знищіть Об'єкт 3378 |- Жалюгідні Повстанці повинні вижити", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion ["Energetic Engineer"] = "Енергетичний Інженер", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "Насолоджуйся плаванням...", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 ["Everyone knows this."] = "Кожен це знає.", -- A_Classic_Fairytale:enemy ["Every single time!"] = "КОжного разу!", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "Найшвидша партія: ", ["Feeble Resistance"] = "Жалюгідні Повстанці", @@ -269,61 +557,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 - - ["Fire"] = "Вогонь", +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united --- ["FIRST BLOOD MUTATES"] = "", -- Mutant ["First Blood"] = "Перша кров", -- A_Classic_Fairytale:first_blood +-- ["First killer will mutate"] = "", -- Mutant ["First Steps"] = "Перші кроки", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "Прапор захоплено!", ["Flag respawned!"] = "Прапор відновлено!", ["Flag returned!"] = "Прапор повернено!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Прапори і їх базування будуть розміщені там, де кожна команда закінчить її перший хід.", +-- ["Flamer selected!"] = "", -- Tumbler ["Flamer"] = "Вогнемет", --- ["Flamethrower"] = "", -- Construction_Mode ["Flaming Worm"] = "Палаючий хробак", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy ["Friendly Fire!"] = "Дружній Вогонь!", - ["fuel extended!"] = "пальне поповнене!", - ["GAME BEGUN!!!"] = "ГРА ПОЧАЛАСЬ!!!", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow - ["Goal"] = "Мета", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 ["Good luck...or else!"] = "Удачі...або ще чогось!", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "Удачі!", ["Good so far!"] = "Покищо добре!", @@ -332,158 +675,361 @@ ["Go, quick!"] = "Йди, швидше!", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 ["GOTCHA!"] = "ПОПАВСЯ!", - ["Grab Mines/Explosives"] = "Схопити Міни/Вибухівку", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- ["Guys, do you think there's more of them?"] = "Хлопці, думаєте їх ще більше?", -- A_Classic_Fairytale:backstab +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen ["Hahahaha!"] = "Хахахаха!", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen ["Haha, now THAT would be something!"] = "Хаха, от ЦЕ буде щось!", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen ["HAHA!"] = "ХАХА!", -- A_Classic_Fairytale:enemy ["Haha!"] = "Хаха!", -- A_Classic_Fairytale:united -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil [" Hapless Hogs left!"] = " Нещасних Їжаків лишилось!", ["Hapless Hogs"] = "Нещасні Їжаки", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode - ["Health crates extend your time."] = "Ящики зі здоров'ям продовжують ваш час.", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united ["Heavy"] = "В'ялий", +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "Баскетбол Їжаками", - ["Hedgewars-Knockball"] = "Бейсбол Їжаками", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 ["Heh, it's not that bad."] = "хех, це не так вже й погано.", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family ["Here...pick your weapon!"] = "Ось...бери зброю!", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer ["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, guys!"] = "Гей, хлопці!", -- A_Classic_Fairytale:backstab ["Hey guys!"] = "Гей хлопці!", -- A_Classic_Fairytale:united --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hey, Hog Solo! Finally you have come!"] = "", -- A_Space_Adventure:moon01 +-- ["Hey! I was supposed to collect it!"] = "", -- A_Space_Adventure:fruit02 +-- ["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 +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood - ["Hit Combo!"] = "Зробив Комбо!", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood ["Hmmm..."] = "Хмм...", +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 - ["HOLY SHYTE!"] = "ОТ ЛАЙНО!", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 - [" HP"] = " ЗД", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "Мисливець", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen ["Incredible..."] = "Неймовірно...", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "Інструктор", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode ["Interesting idea, haha!"] = "Цікава ідея, хаха!", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow - ["invaders destroyed"] = "Загарбників знищено", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood ["I see..."] = "Ясно...", -- A_Classic_Fairytale:shadow -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -493,539 +1039,1291 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Це чудово що РАПТОВА СМЕРТЬ віддалилась на 99 ходів...", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- ["Jumping is disabled"] = "Стрибання вимкнене", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode - ["Kamikaze Expert!"] = "Камікадзе Експерт!", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion ["Keep it up!"] = "Так тримати!", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab ["Killing spree!"] = "Череда вбивств!", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood - ["KILLS"] = "ВБИВСТВ", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion ["Last Target!"] = "Остання Ціль!", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["left shift"] = "", -- Continental_supplies - ["[Left Shift]"] = "[Лівий Shift]", --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "Слухай, хробак!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow ["Lively Lifeguard"] = "Жвавий Рятівник", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy +-- ["Mine Deployer selected!"] = "", -- Tumbler ["Mine Deployer"] = "Мінер", - ["Mine Eater!"] = "Поїдач Мін!", +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode - ["|- Mines Time:"] = "|- Час детонування мін:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "МІСІЮ ВИКОНАНО", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "УСПІХ МІСІЇ", --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 ["Movement: [Up], [Down], [Left], [Right]"] = "Керування: [Вверх], [Вниз], [Вліво], [Вправо]", --- ["Mudball"] = "", -- Construction_Mode - ["Multi-shot!"] = "Мультипостріл!", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 - ["New Barrels Per Turn"] = "Нових Бочок на Хід", - ["NEW CLAN RECORD: "] = "НОВИЙ РЕКОРД КЛАНУ: ", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "НОВА найшвидша партія: ", - ["New Mines Per Turn"] = "Нових Мін на Хід", - ["NEW RACE RECORD: "] = "НОВИЙ РЕКОРД ГОНКИ: ", - ["Newton's Hammock"] = "Гамак Ньютона", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy - ["Nice work, "] = "Гарна робота, ", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon ["Nice work!"] = "Гарна робота!", -- A_Classic_Fairytale:enemy -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey ["Nom-Nom"] = "Ням-Ням", -- A_Classic_Fairytale:journey ["NomNom"] = "НямНям", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor ["North America"] = "Північна Америка", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen ["NOT ENOUGH WAYPOINTS"] = "НЕДОСТАТНЬО ТОЧОК ШЛЯХУ", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "Не дуже товариський матч", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "Операція Водолаз", ["Opposing Team: "] = "Команда-Противник: ", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies - ["Pathetic Hog #%d"] = "Жалюгідний Їжак #%d", +-- ["Patches"] = "", -- ["Pathetic Resistance"] = "Жалюгідний Опір", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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 Portal Device"] = "", -- Construction_Mode - -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor ["Place more waypoints using the 'Air Attack' weapon."] = "Розмістіть більше точок шляху використавши зброю 'Повітряна Атака'.", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos ["Play with me!"] = "Зіграй зі мною!", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion --- ["POINTS"] = "", -- Mutant +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion +-- ["--- Points ---"] = "", -- 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 ["Poison"] = "Смердюк", +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon - ["Portal mission"] = "Портальна місія", -- portal - ["Power Remaining"] = "Залишилось Енергії", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos ["Prepare yourself"] = "Приготуйся", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow - ["Race complexity limit reached."] = "Досягнута межа складності гонки.", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer ["RACER"] = "ГОНЩИК", +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow - ["Round Limit:"] = "Межа Раунду:", - ["Round Limit"] = "Межа Раунду", - ["Rounds Complete: "] = "Раундів Завершено: ", - ["Rounds Complete"] = "Раундів Завершено", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "ПРАВИЛА ГРИ [Натисніть ESC для перегляду]", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 ["Save as many hapless hogs as possible!"] = "Врятуйте якнайбільше нещасних їжаків!", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab - ["SCORE"] = "РАХУНОК", - ["Score"] = "Рахунок", -- Mutant - - ["sec"] = "сек", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "Побачимося!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood ["selected!"] = "вибрано!", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family - ["Shield boosted! +30 power"] = "Щит підсилено! +30 сили", - ["Shield Depleted"] = "Щит Вичерпаний", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion ["Shield is fully recharged!"] = "Щит повністю заряджений!", - ["Shield Master!"] = "Майстер Щита!", - ["Shield Miser!"] = "Скупій Щита!", - ["Shield OFF:"] = "Щит Вимкнено:", - ["Shield ON:"] = "Щит Ввімкнено:", - ["Shield Seeker!"] = "Шукач Щита!", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 - ["Shotgun Team"] = "Команда Рушниць", - ["Shotgun Training"] = "Тренування з рушницею", +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 remaining."] = "пострілів залишилось.", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil ["Silly"] = "Дурник", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode ["Sinky"] = "Любимчик", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s вибув і Команда %d|отримала штраф!| |Рахунок:", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s вибув і Команда %d|заробила очко!| |Рахунок:", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- ["South America"] = "Південна Америка", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united ["Sponge"] = "Губка", ["Spooky Tree"] = "Примарне Дерево", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode - ["STATUS UPDATE"] = "ОНОВЛЕННЯ СТАНУ", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies ["Switched to "] = "Перейшов до ", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon - ["s|"] = "с|", - ["s"] = "с", -- GaudyRacer, Space_Invasion --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "Команда %d: ", - ["Team Scores"] = "Очки Команди", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil ["Thanks!"] = "Дякую!", -- A_Classic_Fairytale:family +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow ["That Sinking Feeling"] = "Ця раптова слабкість", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united - ["That was pointless."] = "Це було безглуздо.", +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "Ворог ховається на он тій качечці!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 ["The flag will respawn next round."] = "Прапор відновиться в наступному раунді.", +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab ["This one's tricky."] = "Хитро придумано.", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos ["This rain is really something..."] = "Цей дощ дійсно дещо...", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family - ["Timed Kamikaze!"] = "Часовий Камікадзе!", - ["Time Extended!"] = "Час Продовжено!", - ["Time Extension"] = "Збільшення Часу", - ["TIME: "] = "ЧАС: ", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope - ["Toggle Shield"] = "Перемкнути Щит", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "ТРАСУ ПРОЙДЕНО", - - ["training"] = "тренування", -- portal +-- ["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 +-- ["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 ["Tribe"] = "Плем'я", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "Погоня за Трофеєм", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "Ааааа!!!", - ["Tumbling Time Extended!"] = "Час Падіння Збільшений!", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon - ["Turn Time"] = "Час Ходу", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "Об'єкт 3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- ["Unit 835"] = "Об'єкт 835", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united ["Unit"] = "Модуль", +-- ["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 --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood ["User Challenge"] = "Дуель між користувачами", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "Скористайся мотузкою щоб якнайшвидше досягнути фінішу!", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer ["Waypoint placed."] = "Точка шляху розміщена.", - ["Way-Points Remaining"] = "Залишилось Точок", +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies --- ["Weapons reset."] = "", -- Highlander +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion +-- ["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 -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos ["Well done."] = "Чудова робота.", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1033,13 +2331,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1053,31 +2360,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab - ["? Why?"] = "? Чому?", -- A_Classic_Fairytale:backstab - ["Why "] = "Чому ", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - ["Will this ever end?"] = "Це коли-небудь закінчиться?", - ["WINNER IS "] = "ПЕРЕМІГ ", -- Mutant - ["WINNING TIME: "] = "ЧАС ВИГРАШУ: ", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow ["Yay, we won!"] = "Ура, ми перемогли!", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1085,70 +2400,228 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood ["Yes!"] = "Так!", -- A_Classic_Fairytale:enemy +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "Ви заробили ОЧКО!!", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab ["You're funny!"] = "А ти кумедний!", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood - ["You saved"] = "Ви врятували", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "Команда 'Zooka", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen ["Ей! Так не чесно!"] = "", -- A_Classic_Fairytale:journey ["!!!"] = "Я!", - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/uk.txt --- a/share/hedgewars/Data/Locale/uk.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/uk.txt Sun Dec 17 00:09:24 2017 +0100 @@ -60,7 +60,7 @@ 00:56=Дровокол 00:57=Гумка -01:00=Вперед до перемоги! +; 01:00=Loading … 01:01=Нічия 01:02=Перемогла команда %1! 01:03=Гучність %1% @@ -154,11 +154,11 @@ 02:02=Щасти 02:02=Не здавайся! -; Round ends (win; unused atm) -02:03=... +; Round ends (team/clan %1 wins) +02:03=Перемогла команда %1! -; Round ends (draw; unused atm) -02:04=... +; Round ends (draw) +02:04=Нічия ; New health crate 02:05=Допомога прийшла! @@ -367,12 +367,12 @@ ; Game goal strings 05:00=Режими Гри 05:01=Діють наступні правила -05:02=Фортеці: Захистіть свою фортецю; зовоюйте ворогів! +05:02=Поставте Короля: Виберіть добре захищену зону для вашого Короля 05:03=Слабка Гравітація: Дивись під ноги 05:04=Невразливість: Їжаки (майже) невразливі 05:05=Вампіризм: Їжаки будуть лікуватись за нанесену шкоду 05:06=Карма: Їжаки будуть розплачуватись за нанесену шкоду -05:07=Захистіть Короля: Не дозвольте вашому королеві вмерти!|Поставте Короля: Виберіть добре захищену зону для вашого Короля +05:07=Захистіть Короля: Не дозвольте вашому королеві вмерти! 05:08=Розмістіть Їжаків: Розмістіть їжаків перед початком гри 05:09=Артилерія: Їжаки не можуть змінювати позицію 05:10=Неруйнівна Місцевість: Більшість зброї не буде руйнувати місцевість diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/zh_CN.lua --- a/share/hedgewars/Data/Locale/zh_CN.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/zh_CN.lua Sun Dec 17 00:09:24 2017 +0100 @@ -3,265 +3,554 @@ -- ["..."] = "", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united --- ["+1 to a Bottom Feeder for killing anyone"] = "", -- Mutant --- ["+1 to a Mutant for killing anyone"] = "", -- Mutant +-- ["+1 barrel!"] = "", -- Tumbler +-- ["%.1f seconds were remaining."] = "", -- Basic_Training_-_Bazooka +-- ["%.1fs"] = "", -- Racer, TechRacer +-- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer +-- ["+1 mine!"] = "", -- Tumbler +-- ["-1 point"] = "", -- Mutant +-- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant --- ["+2 for becoming a Mutant"] = "", -- Mutant +-- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant +-- ["+1 to the Mutant for killing anyone"] = "", -- Mutant +-- ["+2 for becoming the Mutant"] = "", -- Mutant -- ["30 minutes later..."] = "", -- A_Classic_Fairytale:shadow +-- ["5 additional enemies will be spawned during the game."] = "", -- A_Space_Adventure:fruit01 +-- ["5 Deadly Hogs"] = "", -- A_Space_Adventure:death02 +-- ["6 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 -- ["About a month ago, a cyborg came and told us that you're the cannibals!"] = "", -- A_Classic_Fairytale:enemy --- ["Accuracy Bonus!"] = "", +-- ["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 Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler +-- ["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_Classic_Fairytale:backstab -- ["Actually, you aren't worthy of life! Take this..."] = "", -- A_Classic_Fairytale:shadow -- ["A cy-what?"] = "", -- A_Classic_Fairytale:enemy --- ["Advanced Repositioning Mode"] = "", -- Construction_Mode +-- ["Add %d"] = "", -- HedgeEditor +-- ["Admit what?"] = "", -- A_Classic_Fairytale:queen -- ["Adventurous"] = "", -- A_Classic_Fairytale:journey --- ["a frenetic Hedgewars mini-game"] = "", -- Frenzy +-- ["A frenetic Hedgewars mini-game"] = "", -- Frenzy -- ["Africa"] = "", -- Continental_supplies +-- ["A frozen adventure"] = "", -- A_Space_Adventure:ice01 -- ["After Leaks A Lot betrayed his tribe, he joined the cannibals..."] = "", -- A_Classic_Fairytale:first_blood +-- ["After that incident he went underground and started working on his plan to steal the device."] = "", -- A_Space_Adventure:moon02 -- ["After the shock caused by the enemy spy, Leaks A Lot and Dense Cloud went hunting to relax."] = "", -- A_Classic_Fairytale:shadow +-- ["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 --- ["Aggressively removes enemy hedgehogs."] = "", -- Construction_Mode --- ["a Hedgewars challenge"] = "", -- User_Mission_-_RCPlane_Challenge, User_Mission_-_Rope_Knock_Challenge +-- ["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 +-- ["A Hedgewars tag game"] = "", -- Mutant +-- ["Ahhh, home, sweet home. Made it in %d seconds."] = "", -- ClimbHome +-- ["Aiming practice"] = "", -- TargetPractice ["Aiming Practice"] = "瞄准练习", --火箭筒、霰弹枪、狙击枪 -- ["Air Attack"] = "", -- Construction_Mode +-- ["Air General"] = "", -- Battalion +-- ["Air Mine Placement Mode"] = "", -- HedgeEditor +-- ["AIR MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["A leap in a leap"] = "", -- A_Classic_Fairytale:first_blood +-- ["Alex"] = "", -- +-- ["Alien! I wish to be moved!"] = "", -- A_Classic_Fairytale:queen -- ["A little gift from the cyborgs"] = "", -- A_Classic_Fairytale:shadow +-- ["Al.Kaholic"] = "", -- +-- ["All But Last"] = "", -- WxW +-- ["All But Last: You must not solely attack the team with the least health"] = "", -- WxW -- ["All gone...everything!"] = "", -- A_Classic_Fairytale:enemy --- ["Allows free teleportation between other nodes."] = "", -- Construction_Mode --- ["Allows placement of girders, rubber-bands, mines, sticky mines and barrels."] = "", -- Construction_Mode --- ["Allows placement of structures."] = "", -- Construction_Mode --- ["Allows the placement of weapons, utiliites, and health crates."] = "", -- Construction_Mode +-- ["Allies"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["All right, I'll admit it!"] = "", -- A_Classic_Fairytale:queen -- ["All right, we just need to get to the other side of the island!"] = "", -- A_Classic_Fairytale:journey +-- ["All right, you got me!"] = "", -- A_Classic_Fairytale:queen +-- ["All the other places are protected by our flight-inhibiting weapons."] = "", -- A_Space_Adventure:fruit01 +-- ["All the saucer pilots dream to come here one day in order to compete with the best!"] = "", -- A_Space_Adventure:ice02 +-- ["All they do is sit around and judge us!"] = "", -- A_Classic_Fairytale:queen +-- ["All this to please our beloved “elders” … hick …"] = "", -- A_Classic_Fairytale:queen -- ["All walls touched!"] = "", -- WxW --- ["Ammo"] = "", --- ["Ammo Depleted!"] = "", --- ["ammo extended!"] = "", +-- ["All you do is take long walks when everyone else works."] = "", -- A_Classic_Fairytale:queen +-- ["Also, you should know that the only place where you can fly is the left-most part of this area."] = "", -- A_Space_Adventure:fruit01 +-- ["Always being considered weak and fragile."] = "", -- A_Classic_Fairytale:queen +-- ["Amazing! I was never beaten in a race before!"] = "", -- A_Space_Adventure:moon02 +-- ["Ammo depleted!"] = "", -- Space_Invasion +-- ["Ammo: %d"] = "", -- Tumbler -- ["Ammo is reset at the end of your turn."] = "", --- ["Ammo Maniac!"] = "", +-- ["Ammo Limit: Hogs can’t have more than 1 ammo per type"] = "", -- Highlander +-- ["Ammo Maniac! +5 points!"] = "", -- Space_Invasion -- ["And how am I alive?!"] = "", -- A_Classic_Fairytale:enemy --- ["And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And I just forgot the checkpoint of my main mission. Great, just great!"] = "", -- A_Space_Adventure:cosmos +-- ["… and I think they are up to something. Something bad!"] = "", -- A_Classic_Fairytale:epil +-- ["Andrey"] = "", -- +-- ["And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ..."] = "", -- A_Classic_Fairytale:first_blood -- ["And so it began..."] = "", -- A_Classic_Fairytale:first_blood +-- ["And so the cyborgs took over the island."] = "", -- A_Classic_Fairytale:queen -- ["...and so the cyborgs took over the world..."] = "", -- A_Classic_Fairytale:shadow -- ["And so they discovered that cyborgs weren't invulnerable..."] = "", -- A_Classic_Fairytale:journey +-- ["… and then I took a stroll …"] = "", -- A_Classic_Fairytale:epil +-- ["And what do they do in the meantime? Nothing!"] = "", -- A_Classic_Fairytale:queen -- ["And where's all the weed?"] = "", -- A_Classic_Fairytale:dragon -- ["And you believed me? Oh, god, that's cute!"] = "", -- A_Classic_Fairytale:journey +-- ["An experimental (and buggy!) editing tool for missions and more"] = "", -- HedgeEditor -- ["Anno 1032: [The explosion will make a strong push ~ Wide range, wont affect hogs close to the target]"] = "", -- Continental_supplies - -- ["Antarctica"] = "", -- Continental_supplies -- ["Antarctic summer: - Will give you one girder/mudball and two sineguns/portals every fourth turn."] = "", -- Continental_supplies +-- ["Anti-Gravity Device Part (+1)"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Anton"] = "", -- +-- ["An unexpected event!"] = "", -- A_Space_Adventure:cosmos +-- ["Anyway, the aliens accept me for who I am."] = "", -- A_Classic_Fairytale:queen +-- ["A random hedgehog will inherit the weapons of his deceased team-mates."] = "", -- A_Space_Adventure:death02 +-- ["Arashi"] = "", -- -- ["Area"] = "", -- Continental_supplies -- ["Are we there yet?"] = "", -- A_Classic_Fairytale:shadow -- ["Are you accusing me of something?"] = "", -- A_Classic_Fairytale:backstab +-- ["Are you helping the aliens?"] = "", -- A_Classic_Fairytale:queen -- ["Are you saying that many of us have died for your entertainment?"] = "", -- A_Classic_Fairytale:enemy +-- ["Argh, the boredom!"] = "", -- A_Classic_Fairytale:queen -- ["Artur Detour"] = "", -- A_Classic_Fairytale:queen -- ["As a reward for your performance, here's some new technology!"] = "", -- A_Classic_Fairytale:dragon --- ["a shoppa minigame"] = "", -- WxW +-- ["Ash"] = "", -- +-- ["A Shoppa minigame"] = "", -- WxW -- ["Asia"] = "", -- Continental_supplies +-- ["A smuggler! Prepare for battle"] = "", -- A_Space_Adventure:desert01 +-- ["A Space Adventure"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:moon01 -- ["Assault Team"] = "", -- A_Classic_Fairytale:backstab --- ["As the ammo is sparse, you might want to reuse ropes while mid-air.|"] = "", -- A_Classic_Fairytale:dragon +-- ["Asteroid"] = "", -- Big_Armory +-- ["As the ammo is sparse, you might want to reuse ropes while mid-air."] = "", -- A_Classic_Fairytale:dragon -- ["As the challenge was completed, Leaks A Lot set foot on the ground..."] = "", -- A_Classic_Fairytale:first_blood +-- ["As you are more experienced, I want you to lead them to battle."] = "", -- A_Space_Adventure:fruit01 +-- ["As you can see I have survived our last encounter and I had time to plot my master plan!"] = "", -- A_Space_Adventure:death01 -- ["As you can see, there is no way to get on the other side!"] = "", -- A_Classic_Fairytale:dragon --- ["Attack From Rope"] = "", -- WxW +-- ["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 From Rope: %s"] = "", -- WxW +-- ["Attack From Rope: You may only attack from a rope."] = "", -- WxW +-- ["Attack rule: %s"] = "", -- WxW +-- ["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 -- ["Australia"] = "", -- Continental_supplies -- ["Available points remaining: "] = "", +-- ["Average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Avoid bazookas, red and blue invaders."] = "", -- Space_Invasion +-- ["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 --- ["[Backspace]"] = "", +-- ["Back in the village, the two tribes finally started to live in harmony."] = "", -- A_Classic_Fairytale:epil -- ["Backstab"] = "", -- A_Classic_Fairytale:backstab +-- ["Bacon"] = "", -- +-- ["Bad Guy"] = "", -- User_Mission_-_The_Great_Escape +-- ["Badmad"] = "", -- portal -- ["Bad Team"] = "", -- User_Mission_-_The_Great_Escape --- ["Ballgun"] = "", -- Construction_Mode +-- ["Bad timing"] = "", -- A_Space_Adventure:fruit01 +-- ["Baggy"] = "", -- +-- ["Balrog"] = "", -- -- ["Bamboo Thicket"] = "", --- ["Barrel Eater!"] = "", +-- ["Barrel Eater"] = "", -- Tumbler -- ["Barrel Launcher"] = "", +-- ["Barrel Launcher selected!"] = "", -- Tumbler -- ["Barrel Placement Mode"] = "", -- Construction_Mode --- ["Baseball Bat"] = "", -- Construction_Mode +-- ["BARREL PLACEMENT MODE"] = "", -- HedgeEditor -- ["Baseballbat"] = "", -- Continental_supplies +-- ["Baseball Bat with Ball"] = "", -- Knockball +-- ["Base damage has been modified to 12 per shot."] = "", -- Battalion +-- ["Based on what you've learned, destroy the target on the girder and as always, land safely!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basically this is a combination of diving and launching."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Basketball"] = "", -- Basketball ["Bat balls at your enemies and|push them into the sea!"] = "发射棒球将敌人击打入水", +-- ["Battalion"] = "", -- Battalion +-- ["Battle Starts Now!"] = "", -- A_Space_Adventure:fruit01 +-- ["Batty"] = "", -- ["Bat your opponents through the|baskets and out of the map!"] = "把敌人击出场地——对准栏框", --- ["Bazooka"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 ["Bazooka Training"] = "火箭筒训练", +-- ["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 +-- ["Be careful, your gadgets won't work in the bandit area. You should get an ice gun."] = "", -- A_Space_Adventure:ice01 -- ["Beep Loopers"] = "", -- A_Classic_Fairytale:queen +-- ["Beginner"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Behind these trees on the east side there is Secret Base 17."] = "", -- A_Space_Adventure:cosmos +-- ["Below-average pilot"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Besides, why would I choose certain death?"] = "", -- A_Classic_Fairytale:queen ["Best laps per team: "] = "每一队最佳速度:", --- ["Best Team Times: "] = "", +-- ["Best team times: "] = "", -- Racer, TechRacer +-- ["Better luck next time!"] = "", -- ClimbHome +-- ["Beware, any damage taken will stay until you complete the moon's main mission"] = "", -- A_Space_Adventure:cosmos +-- ["Beware of mines: They explode after 3 seconds."] = "", -- A_Classic_Fairytale:journey +-- ["Beware of mines: They explode after 5 seconds."] = "", -- A_Classic_Fairytale:journey -- ["Beware, though! If you are slow, you die!"] = "", -- A_Classic_Fairytale:dragon +-- ["Beware, though! Many smugglers come often to explore these tunnels and scavenge whatever valuable items they can find."] = "", -- A_Space_Adventure:desert01 +-- ["Beware, though, you will only be able to move slowly through the water."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Big Armory"] = "", -- Big_Armory +-- ["Billy Frost"] = "", -- A_Space_Adventure:ice01 +-- ["Bingo"] = "", -- +-- ["Bio-Filter: Aggressively removes enemies."] = "", -- Construction_Mode -- ["Bio-Filter"] = "", -- Construction_Mode -- ["Biomechanic Team"] = "", -- A_Classic_Fairytale:family --- ["Birdy"] = "", -- Construction_Mode +-- ["Bitter"] = "", -- +-- ["Blanka"] = "", -- -- ["Blender"] = "", -- A_Classic_Fairytale:family -- ["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 --- ["Blowtorch"] = "", -- Construction_Mode, Frenzy +-- ["Blue"] = "", -- -- ["Blue Team"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Bob"] = "", -- A_Space_Adventure:cosmos +-- ["Bobo"] = "", -- User_Mission_-_Nobody_Laugh -- ["Bone Jackson"] = "", -- A_Classic_Fairytale:backstab -- ["Bonely"] = "", -- A_Classic_Fairytale:shadow --- ["BOOM!"] = "", +-- ["Bones"] = "", -- -- ["Boom!"] = --- ["Boss defeated!"] = "", --- ["Boss Slayer!"] = "", +-- ["BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders."] = "", -- Space_Invasion +-- ["Boom! %s has destroyed %d invaders."] = "", -- Space_Invasion +-- ["BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them."] = "", -- Space_Invasion +-- ["Boris"] = "", -- A_Space_Adventure:moon01 +-- ["Boss defeated! +30 points!"] = "", -- Space_Invasion +-- ["Boss Slayer! +25 points!"] = "", -- Space_Invasion +-- ["Both Barrels"] = "", -- +-- ["Both your hedgehogs must survive."] = "", -- User_Mission_-_Teamwork_2, User_Mission_-_Teamwork +-- ["Bottom Feeder"] = "", -- Mutant +-- ["Bouncy Girder: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land: [4]"] = "", -- HedgeEditor +-- ["Bouncy Land"] = "", -- HedgeEditor +-- ["Bozo"] = "", -- -- ["Brain Blower"] = "", -- A_Classic_Fairytale:journey -- ["Brainiac"] = "", -- A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood, A_Classic_Fairytale:shadow -- ["Brainila"] = "", -- A_Classic_Fairytale:united -- ["Brain Stu"] = "", -- A_Classic_Fairytale:united -- ["Brain Teaser"] = "", -- A_Classic_Fairytale:backstab +-- ["Brigadier Briggs"] = "", -- +-- ["Bruce"] = "", -- A_Space_Adventure:moon01 -- ["Brutal Lily"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil -- ["Brutus"] = "", -- A_Classic_Fairytale:backstab -- ["Build a fortress and destroy your enemy."] = "", -- Construction_Mode +-- ["Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round."] = "", -- Racer -- ["Build a track and race."] = "", +-- ["Builder"] = "", -- Battalion +-- ["Build one of multiple different structures|to aid you in victory, at the cost of energy."] = "", -- Construction_Mode -- ["Bullseye"] = "", -- A_Classic_Fairytale:dragon +-- ["Bunny"] = "", -- +-- ["burp"] = "", -- +-- ["Bushi"] = "", -- +-- ["Buster"] = "", -- -- ["But it proved to be no easy task!"] = "", -- A_Classic_Fairytale:dragon +-- ["But I want my sandals!"] = "", -- A_Classic_Fairytale:queen +-- ["But one thing's for sure:"] = "", -- A_Space_Adventure:final -- ["But that's impossible!"] = "", -- A_Classic_Fairytale:backstab -- ["But the ones alive are stronger in their heart!"] = "", -- A_Classic_Fairytale:enemy +-- ["But … they kidnapped you!"] = "", -- A_Classic_Fairytale:queen -- ["But...we died!"] = "", -- A_Classic_Fairytale:backstab -- ["But where can we go?"] = "", -- A_Classic_Fairytale:united +-- ["But why did you betray us?!"] = "", -- A_Classic_Fairytale:queen -- ["But why would they help us?"] = "", -- A_Classic_Fairytale:backstab -- ["But you're cannibals. It's what you do."] = "", -- A_Classic_Fairytale:enemy -- ["But you said you'd let her go!"] = "", -- A_Classic_Fairytale:journey --- ["Cake"] = "", -- Construction_Mode +-- ["But you saved me!"] = "", -- A_Classic_Fairytale:queen +-- ["C-1"] = "", -- portal +-- ["C-2"] = "", -- portal +-- ["Callahan"] = "", -- -- ["Call me Beep! Well, 'cause I'm such a nice...person!"] = "", -- A_Classic_Fairytale:family -- ["Cannibals"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:first_blood -- ["Cannibal Sentry"] = "", -- A_Classic_Fairytale:journey -- ["Cannibals?! You're the cannibals!"] = "", -- A_Classic_Fairytale:enemy - ["CAPTURE THE FLAG"] = "抢旗子", +-- ["Can you do it?"] = "", -- A_Space_Adventure:ice02 +-- ["Captain Lime"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Captain Lime offered his help if you assist him in battle."] = "", -- A_Space_Adventure:fruit01 +-- ["Capture The Flag"] = "", -- Capture_the_Flag, CTF_Blizzard -- ["Careless"] = "", -- ["Carol"] = "", -- A_Classic_Fairytale:family +-- ["Challenge completed!"] = "", -- User_Mission_-_Rope_Knock_Challenge, User_Mission_-_That_Sinking_Feeling, SpeedShoppa -- ["CHALLENGE COMPLETE"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Change Weapon"] = "", --- ["changing range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Challenge failed!"] = "", -- SpeedShoppa +-- ["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 Content: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health Boost: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Health: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change modification mode: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Placement Mode: [Up], [Down]"] = "", -- HedgeEditor +-- ["Change Rotation: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]"] = "", -- HedgeEditor +-- ["Change Sprite: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change Timer: [Left], [Right]"] = "", -- HedgeEditor +-- ["Change weapon: [Long jump] or [Slot 1]-[Slot 3]"] = "", -- Tumbler +-- ["Charmander"] = "", -- +-- ["Chasing the blue hog"] = "", -- A_Space_Adventure:moon02 +-- ["Cheater"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Checkpoint reached!"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:ice01, A_Space_Adventure:moon01 +-- ["Chef"] = "", -- Battalion, HedgeEditor +-- ["Chester"] = "", -- +-- ["Chicken"] = "", -- +-- ["Chief Sandologist"] = "", -- A_Space_Adventure:desert01 +-- ["Chikorita"] = "", -- +-- ["Choose Selection/Placement/Deletion: [Left], [Right]"] = "", -- HedgeEditor -- ["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 +-- ["Chunli"] = "", -- +-- ["Clark Kent"] = "", -- -- ["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 -- ["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"] = "", -- Construction_Mode --- ["Cluster Bomb MASTER!"] = "", -- Basic_Training_-_Cluster_Bomb -- ["Cluster Bomb Training"] = "", -- Basic_Training_-_Cluster_Bomb - ["Codename: Teamwork"] = "代号:团队行动", -- ["Collateral Damage"] = "", -- A_Classic_Fairytale:journey -- ["Collateral Damage II"] = "", -- A_Classic_Fairytale:journey -- ["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 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 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 +-- ["Collect the green and purple invaders."] = "", -- Space_Invasion +-- ["Collect the weapon crate at the left coast!"] = "", -- A_Classic_Fairytale:journey +-- ["Color Squad"] = "", -- +-- ["Come closer and die! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["Come closer, so that your training may continue!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Comet"] = "", -- Big_Armory +-- ["Commander"] = "", -- HedgeEditor -- ["Compete to use as few planes as possible!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Complete all main and side missions to complete the spacetrip mission."] = "", -- A_Space_Adventure:cosmos +-- ["Complete the remaining side missions to complete this mission."] = "", -- A_Space_Adventure:cosmos -- ["Complete the track as fast as you can!"] = "", --- ["COMPLETION TIME"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Completion time: %.2fs"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Comrades! Sail me away!"] = "", -- A_Classic_Fairytale:queen -- ["Configuration accepted."] = "", -- WxW +-- ["Configuration phase"] = "", -- WxW +-- ["Congrats! You won!"] = "", -- A_Space_Adventure:moon01 -- ["Congratulations"] = "", -- Basic_Training_-_Rope --- ["Congratulations! You needed only half of time|to eliminate all targets."] = "", -- Basic_Training_-_Cluster_Bomb --- ["Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"] = "", -- 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 +-- ["Congratulations, you collected the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Congratulations! You have destroyed all targets within the time."] = "", -- TargetPractice +-- ["Congratulations, you have saved Hogera!"] = "", -- A_Space_Adventure:final +-- ["Congratulations! You have truly mastered this challenge! Don't forget to save the demo."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Congratulations! You've completed the Basic Rope Training!"] = "", -- Basic_Training_-_Rope ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "恭喜!你在规定时限内清零全部目标。", --Bazooka, Shotgun, SniperRifle +-- ["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!"] = "恭喜", +-- ["Conquering the galaxy"] = "", -- A_Space_Adventure:cosmos -- ["CONSTRUCTION MODE"] = "", -- Construction_Mode +-- ["Construction Mode tool"] = "", -- Construction_Mode +-- ["Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels."] = "", -- Construction_Mode -- ["Construction Station"] = "", -- Construction_Mode -- ["Continental supplies"] = "", -- Continental_supplies +-- ["Control"] = "", -- Control ["Control pillars to score points."] = "控制支柱得分", --- ["Core"] = "", -- Construction_Mode +-- ["Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand."] = "", -- Basic_Training_-_Rope +-- ["Copper"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Corn"] = "", -- A_Space_Adventure:fruit01 +-- ["Corporal Calvin"] = "", -- -- ["Corporationals"] = "", -- A_Classic_Fairytale:queen -- ["Corpsemonger"] = "", -- A_Classic_Fairytale:shadow -- ["Corpse Thrower"] = "", -- A_Classic_Fairytale:epil -- ["Cost"] = "", -- Construction_Mode --- ["Crate Placement Tool"] = "", -- Construction_Mode +-- ["Count Hogula"] = "", -- +-- ["Coward"] = "", -- A_Classic_Fairytale:queen +-- ["Crate Before Attack: %s"] = "", -- WxW +-- ["Crate Before Attack: You must collect a crate before you can attack."] = "", -- WxW +-- ["Crate Placer"] = "", -- Construction_Mode +-- ["Crates: Crates drop more often with a higher chance of bonus ammo"] = "", -- Battalion +-- ["Crates: Crates drop randomly and may be empty"] = "", -- Battalion +-- ["Crates: Crates drop randomly with chance of being empty"] = "", -- Battalion +-- ["Crates left: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Crates Left:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Cricket time: [Drop a fireable mine! ~ Will work if fired close to your hog & far away from enemy ~ 1 sec]"] = "", -- Continental_supplies --- ["Current setting is "] = "", -- Gravity +-- ["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: [Fire away a 1 sec mine! ~ Cannot be fired close to another hog]"] = "", -- Continental_supplies +-- ["CTF_Blizzard"] = "", -- CTF_Blizzard +-- ["Cursor: Mode action"] = "", -- HedgeEditor +-- ["|Cursor: Place crate"] = "", -- Construction_Mode +-- ["Cursor: Place waypoint"] = "", -- Racer +-- ["Cutlass Cain"] = "", -- ["Cybernetic Empire"] = "自动化帝国", -- ["Cyborg. It's what the aliens call themselves."] = "", -- A_Classic_Fairytale:enemy -- ["Dahmer"] = "", -- A_Classic_Fairytale:backstab +-- ["Daisy"] = "", -- ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "新人,别让我看到", ["DAMMIT, ROOKIE!"] = "新人", +-- ["+%d ammo"] = "", -- Battalion +-- ["+%d Ammo"] = "", -- Space_Invasion ["Dangerous Ducklings"] = "危险的小鸭子", +-- ["Dark Strawberry"] = "", -- A_Space_Adventure:fruit02 +-- ["+%d"] = "", -- Battalion +-- ["%d crate(s) remaining"] = "", -- SpeedShoppa +-- ["%d damage was dealt in this game."] = "", -- Mutant +-- ["Deadly Grape"] = "", -- A_Space_Adventure:fruit02 -- ["Deadweight"] = "", --- ["Decrease"] = "", -- Continental_supplies +-- ["Deer"] = "", -- +-- ["Defeat all enemies!"] = "", -- portal +-- ["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 cyborgs!"] = "", -- A_Classic_Fairytale:enemy --- ["Defend your core from the enemy."] = "", -- Construction_Mode --- ["Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"] = "", -- A_Classic_Fairytale:shadow --- ["Dematerializes weapons and equipment carried by enemy hedgehogs."] = "", -- Construction_Mode +-- ["Defeat the enemy!"] = "", -- A_Classic_Fairytale:queen +-- ["Delete Waypoint"] = "", -- HedgeEditor +-- ["Deletion Mode: [5]"] = "", -- HedgeEditor +-- ["Deletion Mode"] = "", -- HedgeEditor +-- ["Deletition Mode"] = "", -- HedgeEditor -- ["Demolition is fun!"] = "", +-- ["Demo"] = "", -- The_Specialists -- ["Dense Cloud"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["Dense Cloud must have already told them everything..."] = "", -- A_Classic_Fairytale:shadow --- ["Depleted Kamikaze!"] = "", --- ["Desert Eagle"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Dense Cloud?! What are you doing?!"] = "", -- A_Classic_Fairytale:queen +-- ["Depleted Kamikaze! +5 points!"] = "", -- Space_Invasion +-- ["Derp"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Desert Storm"] = "", -- +-- ["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 to score points."] = "", +-- ["Destroy invaders and collect bonuses to score points."] = "", -- Space_Invasion -- ["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 +-- ["Did I miss something?"] = "", -- Space_Invasion +-- ["Did not finish"] = "", -- Racer, TechRacer +-- ["Did you really think I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that I've changed?"] = "", -- A_Classic_Fairytale:queen +-- ["Did you really think that we needed the help of one of you?"] = "", -- A_Classic_Fairytale:queen -- ["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 +-- ["Dimitry"] = "", -- +-- ["%d invaders have been destroyed in this game."] = "", -- Space_Invasion +-- ["Disabled"] = "", -- WxW -- ["Disguise as a Rockhopper Penguin: [Swap place with a random enemy hog in the circle]"] = "", -- Continental_supplies --- ["Dist: "] = "", -- Space_Invasion +-- ["Displacer"] = "", -- +-- ["Disqualified!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Diver"] = "", -- User_Mission_-_Diver +-- ["%d ms"] = "", -- HedgeEditor +-- ["Doing stuff a monkey could do."] = "", -- A_Classic_Fairytale:queen +-- ["Domination game"] = "", -- Control +-- ["Donald"] = "", -- +-- ["Do not destroy the crates!"] = "", -- A_Space_Adventure:fruit02 -- ["Do not laugh, inexperienced one, for he speaks the truth!"] = "", -- A_Classic_Fairytale:backstab -- ["Do not let his words fool you, young one! He will stab you in the back as soon as you turn away!"] = "", -- A_Classic_Fairytale:first_blood --- ["Do the deed"] = "", -- A_Classic_Fairytale:first_blood +-- ["Don't be foolish, son, there will be more."] = "", -- A_Space_Adventure:fruit01 +-- ["Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey +-- ["Don't destroy the device crate!"] = "", -- A_Space_Adventure:desert01 +-- ["Don't eliminate Captain Lime before collecting the last crate!"] = "", -- A_Space_Adventure:fruit02 +-- ["Don't hit me, you fools!"] = "", -- A_Space_Adventure:moon01 +-- ["Don't you dare harming our tribe!"] = "", -- A_Classic_Fairytale:queen -- ["Double Kill!"] = "", --- ["DOUBLE KILL"] = "", -- Mutant +-- ["Double kill!"] = "", -- Mutant +-- ["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 +-- ["Do you know where they are?"] = "", -- A_Classic_Fairytale:queen -- ["Do you think you're some kind of god?"] = "", -- A_Classic_Fairytale:enemy -- ["Dragon's Lair"] = "", -- A_Classic_Fairytale:dragon --- ["Drill Rocket"] = "", -- Construction_Mode +-- ["Dr. Banting"] = "", -- +-- ["Dr. Barnard"] = "", -- +-- ["Dr. Blackwell"] = "", -- +-- ["Dr. Cornelius"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 +-- ["Dr. Crushing"] = "", -- +-- ["Dr. Drew"] = "", -- +-- ["Dr. Harvey"] = "", -- +-- ["Dr. Hollows"] = "", -- +-- ["Dr. Horace"] = "", -- -- ["Drills"] = "", -- A_Classic_Fairytale:backstab -- ["Drill Strike"] = "", -- Construction_Mode --- ["Drone Hunter!"] = "", +-- ["Dr. Jenner"] = "", -- +-- ["Dr. Jung"] = "", -- +-- ["Drone Hunter! +10 points!"] = "", -- Space_Invasion -- ["Drop a bomb: [Drop some heroic wind that will turn into a bomb on impact]"] = "", -- Continental_supplies - +-- ["- Dropped flags may be returned or recaptured"] = "", -- Capture_the_Flag +-- ["Dropping a weapon while in water would just drown it, but launching one would work."] = "", -- Basic_Training_-_Flying_Saucer -- ["Drowner"] = "", +-- ["Dr. Parkinson"] = "", -- +-- ["Drunk greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Drunk with power, perhaps!"] = "", -- A_Classic_Fairytale:queen +-- ["%d sec"] = "", -- Construction_Mode +-- ["+%d seconds!"] = "", -- Tumbler +-- ["Dubloon Devil"] = "", -- -- ["Dude, all the plants are gone!"] = "", -- A_Classic_Fairytale:family -- ["Dude, can you see Ramon and Spiky?"] = "", -- A_Classic_Fairytale:journey +-- ["Dude, it's unbearable!"] = "", -- A_Classic_Fairytale:queen +-- ["Dude, let me out!"] = "", -- A_Classic_Fairytale:epil +-- ["Dude, that outfit is so cool!"] = "", -- A_Classic_Fairytale:epil -- ["Dude, that's so cool!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, this is boring!"] = "", -- A_Classic_Fairytale:queen -- ["Dude, we really need a new shaman..."] = "", -- A_Classic_Fairytale:shadow -- ["Dude, what's this place?!"] = "", -- A_Classic_Fairytale:dragon -- ["Dude, where are we?"] = "", -- A_Classic_Fairytale:backstab -- ["Dude, wow! I just had the weirdest high!"] = "", -- A_Classic_Fairytale:backstab +-- ["Dude, wow, you're so cute!"] = "", -- A_Classic_Fairytale:queen +-- ["Dud Mine Placement Mode"] = "", -- HedgeEditor +-- ["DUD MINE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Duration"] = "", -- Continental_supplies +-- ["During the final testing of the device an accident happened."] = "", -- A_Space_Adventure:moon02 +-- ["During the game you can get new RC planes by collecting the weapon crates."] = "", -- A_Space_Adventure:desert03 -- ["Dust storm: [Deals 15 damage to all enemies in the circle]"] = "", -- Continental_supplies - --- ["Dynamite"] = "", -- Construction_Mode +-- ["Each time you destroy all the targets on your current level you'll get teleported to the next level."] = "", -- A_Space_Adventure:desert03 +-- ["Each time you play this missions enemy hogs will play in a random order."] = "", -- A_Space_Adventure:death02 -- ["Each turn is only ONE SECOND!"] = "", -- Frenzy -- ["Each turn you get 1-3 random weapons"] = "", -- ["Each turn you get one random weapon"] = "", +-- ["Each turn you'll have only one rope to use."] = "", -- A_Space_Adventure:moon02 -- ["Eagle Eye"] = "", -- A_Classic_Fairytale:backstab -- ["Eagle Eye: [Blink to the impact ~ One shot]"] = "", -- Continental_supplies - -- ["Ear Sniffer"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:epil +-- ["EASY"] = "", -- Continental_supplies +-- ["Eckles"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Eclipse"] = "", -- Big_Armory +-- ["Editing Commands: (Use while no weapon is selected)"] = "", -- HedgeEditor +-- ["Ehm, okay ..."] = "", -- A_Space_Adventure:moon01 -- ["Elderbot"] = "", -- A_Classic_Fairytale:family -- ["Elimate your captor."] = "", -- User_Mission_-_The_Great_Escape - ["Eliminate all enemies"] = "解决全部对手", ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "时间限制内清除全部目标。弹药无限。", --Bazooka, Shotgun, SniperRifle --- ["Eliminate enemy hogs and take their weapons."] = "", -- Highlander - ["Eliminate Poison before the time runs out"] = "时间限制内清除毒素。", - ["Eliminate the Blue Team"] = "解决蓝色队伍", --- ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock +-- ["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 Unit 3378 |- Feeble Resistance must survive"] = "- 打倒 3378 |-反抗者必须存活", +-- ["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 +-- ["Elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Elmo"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Enabled"] = "", -- WxW +-- ["Enemy kills: Collect victim's weapons and +%d%% of its base health"] = "", -- Battalion -- ["Energetic Engineer"] = "", +-- ["Engineer"] = "", -- HedgeEditor, The_Specialists ["Enjoy the swim..."] = "游水愉快", --- ["[Enter]"] = "", +-- ["Entered boredom phase! Discrepancies detected …"] = "", -- A_Classic_Fairytale:queen +-- ["Epilogue"] = "", -- A_Classic_Fairytale:epil +-- ["ERROR [getHogInfo]: Hog is nil!"] = "", -- Battalion +-- ["Eugene"] = "", -- -- ["Europe"] = "", -- Continental_supplies --- [" ever done to you?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."] = "", -- A_Space_Adventure:ice02 +-- ["Every 2 rings you'll get extra flying saucers."] = "", -- A_Space_Adventure:ice02 -- ["Everyone knows this."] = "", -- A_Classic_Fairytale:enemy -- ["Every single time!"] = "", -- A_Classic_Fairytale:dragon -- ["Everything looks OK..."] = "", -- A_Classic_Fairytale:enemy +-- ["Every time you kill an enemy hog your ammo will get reset next turn."] = "", -- A_Space_Adventure:death02 +-- ["Everywhere I look, I see hogs walking around …"] = "", -- A_Classic_Fairytale:epil -- ["Exactly, man! That was my dream."] = "", -- A_Classic_Fairytale:backstab --- ["Extra Damage"] = "", -- Construction_Mode --- ["Extra Time"] = "", -- Construction_Mode +-- ["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 +-- ["Exploring the tunnel"] = "", -- A_Space_Adventure:fruit02 -- ["Eye Chewer"] = "", -- A_Classic_Fairytale:journey +-- ["Fair Wind"] = "", -- -- ["Family Reunion"] = "", -- A_Classic_Fairytale:family ["Fastest lap: "] = "最快记录:", ["Feeble Resistance"] = "反抗者", @@ -269,61 +558,116 @@ -- ["Fell From Heaven"] = "", -- 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 -- ["Fell From Heaven is the best! Fell From Heaven is the greatest!"] = "", -- A_Classic_Fairytale:family -- ["Femur Lover"] = "", -- A_Classic_Fairytale:shadow --- ["Fierce Competition!"] = "", -- Space_Invasion +-- ["Fierce Competition! +8 points!"] = "", -- Space_Invasion -- ["Fiery Water"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Fiery Water?! Are you drunk again?"] = "", -- A_Classic_Fairytale:queen +-- ["Fighting instead of cultivating a beautiful friendship."] = "", -- A_Classic_Fairytale:epil +-- ["Fight: Press [Attack]"] = "", -- A_Space_Adventure:fruit01 -- ["Filthy Blue"] = "", -- User_Mission_-_Dangerous_Ducklings +-- ["Finally you are here!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:ice01 +-- ["Final result"] = "", -- Mutant +-- ["Final team scores:"] = "", -- Space_Invasion +-- ["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 --- ["Fire"] = "", - +-- ["Fire: [Precise]"] = "", -- Space_Invasion, Tumbler -- ["First aid kits?!"] = "", -- A_Classic_Fairytale:united -- ["First Blood"] = "", -- A_Classic_Fairytale:first_blood --- ["FIRST BLOOD MUTATES"] = "", -- Mutant +-- ["First killer will mutate"] = "", -- Mutant -- ["First Steps"] = "", -- A_Classic_Fairytale:first_blood +-- ["- First team to capture the flag wins"] = "", -- Capture_the_Flag +-- ["- First team to score %d captures wins"] = "", -- Capture_the_Flag +-- ["Fishy"] = "", -- ["Flag captured!"] = "夺旗得分!", ["Flag respawned!"] = "旗帜重生!", ["Flag returned!"] = "旗帜归还!", --- ["Flags, and their home base will be placed where each team ends their first turn."] = "", -- ["Flamer"] = "", --- ["Flamethrower"] = "", -- Construction_Mode +-- ["Flamer selected!"] = "", -- Tumbler -- ["Flaming Worm"] = "", -- A_Classic_Fairytale:backstab - +-- ["Flawless victory!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Flee: Press [Jump]"] = "", -- A_Space_Adventure:fruit01 -- ["Flesh for Brainz"] = "", -- A_Classic_Fairytale:journey --- ["Flying Saucer"] = "", -- Construction_Mode, Frenzy --- ["For improved features/stability, play 0.9.18+"] = "", -- WxW +-- ["Fly around and hurl explosives to your enemies."] = "", -- Tumbler +-- ["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 +-- ["Four Eyes"] = "", -- +-- ["Frankie"] = "", -- +-- ["Frank"] = "", -- User_Mission_-_Nobody_Laugh -- ["Free Dense Cloud and continue the mission!"] = "", -- A_Classic_Fairytale:journey --- ["Freezer"] = "", -- Construction_Mode -- ["FRENZY"] = "", -- Frenzy -- ["Friendly Fire!"] = "", --- ["fuel extended!"] = "", --- ["GAME BEGUN!!!"] = "", +-- ["Friendly kills: Clear killer's pool and -%d%% of its base health"] = "", -- Battalion +-- ["From the second turn and beyond the water rises."] = "", -- A_Space_Adventure:desert02 +-- ["Frozen Bandits"] = "", -- A_Space_Adventure:ice01 +-- ["Fruit"] = "", -- +-- ["Fruit Assassins"] = "", -- A_Space_Adventure:fruit02 +-- ["Fruity"] = "", -- +-- ["Fuel: %d"] = "", -- Tumbler +-- ["Fuzzy Beard"] = "", -- +-- ["“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"] = "", -- -- ["GasBomb"] = "", -- Continental_supplies -- ["Gas Gargler"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Generates power."] = "", -- Construction_Mode +-- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode +-- ["Generator: Generates energy."] = "", -- Construction_Mode -- ["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 out of there!"] = "", -- User_Mission_-_The_Great_Escape +-- ["Get past the flower."] = "", -- A_Classic_Fairytale:journey +-- ["Get ready to fight!"] = "", -- A_Space_Adventure:moon01 -- ["Get that crate!"] = "", -- A_Classic_Fairytale:first_blood -- ["Get the crate on the other side of the island!|"] = "", -- A_Classic_Fairytale:journey --- ["Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"] = "", -- Basic_Training_-_Rope +-- ["Get the highest score to win."] = "", -- Space_Invasion +-- ["Getting ready"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:desert01, A_Space_Adventure:desert02, A_Space_Adventure:ice01, A_Space_Adventure:ice02, A_Space_Adventure:moon01 +-- ["Getting to the device"] = "", -- A_Space_Adventure:fruit02 +-- ["Get to the crate using your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Get to the target using your rope!"] = "", -- Basic_Training_-_Rope -- ["Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"] = "", -- A_Classic_Fairytale:family --- ["GG!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Giggles"] = "", -- -- ["Gimme Bones"] = "", -- A_Classic_Fairytale:backstab -- ["Girder"] = "", -- Construction_Mode -- ["Girder Placement Mode"] = "", -- Construction_Mode +-- ["GIRDER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Give a hog a preset identity and weapons"] = "", -- HedgeEditor +-- ["Give an entire team themed hats and names"] = "", -- HedgeEditor -- ["Glark"] = "", -- A_Classic_Fairytale:shadow --- ["Goal"] = "", +-- ["Glasses"] = "", -- +-- ["Glassy"] = "", -- +-- ["Goal Definition Mode"] = "", -- HedgeEditor +-- ["GOAL DEFINITION MODE"] = "", -- HedgeEditor +-- ["Go and collect the crate"] = "", -- A_Space_Adventure:cosmos +-- ["Godai"] = "", -- +-- ["Go down and save these PAotH hogs!"] = "", -- A_Space_Adventure:moon01 +-- ["Go, get him again!"] = "", -- A_Space_Adventure:moon02 +-- ["Goggles"] = "", -- +-- ["Goggs"] = "", -- ["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 +-- ["Good luck!"] = "", -- A_Space_Adventure:desert01, A_Space_Adventure:fruit02 -- ["Good luck...or else!"] = "", -- A_Classic_Fairytale:journey ["Good luck out there!"] = "祝好运", -- ["Good so far!"] = "", @@ -332,159 +676,361 @@ -- ["Go, quick!"] = "", -- A_Classic_Fairytale:backstab -- ["Gorkij"] = "", -- A_Classic_Fairytale:journey -- ["Go surf!"] = "", -- WxW +-- ["Got 1 more saucer and 8 more seconds added to the clock"] = "", -- A_Space_Adventure:ice02 +-- ["Got 1 more saucer"] = "", -- A_Space_Adventure:ice02 -- ["GOTCHA!"] = "", --- ["Grab Mines/Explosives"] = "", --- ["Grants nearby hogs life-regeneration."] = "", -- Construction_Mode --- ["Gravity"] = "", -- Gravity +-- ["Go to Thanta and get the device part!"] = "", -- A_Space_Adventure:ice01 +-- ["Go to the surface!"] = "", -- A_Space_Adventure:fruit02 +-- ["Go to the upper platform and get the weapons in the crates!"] = "", -- A_Space_Adventure:moon01 +-- ["Got the saucer!"] = "", -- A_Space_Adventure:cosmos +-- ["Got to go back."] = "", -- A_Space_Adventure:cosmos +-- ["Got you? You're acting weird."] = "", -- A_Classic_Fairytale:queen +-- ["Grab mines/barrels: [High jump]"] = "", -- Tumbler +-- ["Gravity: 100%"] = "", -- Gravity -- ["Great choice, Steve! Mind if I call you that?"] = "", -- A_Classic_Fairytale:shadow +-- ["Great! Let’s kill all these enemies, using portals."] = "", -- portal -- ["Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"] = "", -- Basic_Training_-_Rope -- ["Great! You will be contacted soon for assistance."] = "", -- A_Classic_Fairytale:shadow - +-- ["Green"] = "", -- +-- ["Green areas are portal-proof and repel portals."] = "", -- A_Space_Adventure:final +-- ["Green areas are portal-proof."] = "", -- A_Space_Adventure:final +-- ["Green Bananas"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Bananas won!"] = "", -- A_Space_Adventure:fruit01 +-- ["Green Hog Grape"] = "", -- A_Space_Adventure:fruit01 +-- ["Green hogs won't intentionally hurt you."] = "", -- A_Space_Adventure:fruit01 +-- ["Greenhorn"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Green lipstick bullet: [Poisonous, deals no damage]"] = "", -- Continental_supplies --- ["Greetings, "] = "", -- A_Classic_Fairytale:dragon -- ["Greetings, cloudy one!"] = "", -- A_Classic_Fairytale:shadow --- ["Grenade"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["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 -- ["Grenade Training"] = "", -- Basic_Training_-_Grenade -- ["Grenadiers"] = "", -- Basic_Training_-_Grenade +-- ["Grenadier"] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard, HedgeEditor +-- ["Grey"] = "", -- +-- ["Guards"] = "", -- A_Space_Adventure:cosmos +-- ["Guile"] = "", -- -- ["Guys, do you think there's more of them?"] = "", -- A_Classic_Fairytale:backstab -- ["HAHA!"] = "", -- A_Classic_Fairytale:enemy -- ["Haha!"] = "", -- A_Classic_Fairytale:united +-- ["Haha! Come!"] = "", -- A_Classic_Fairytale:queen -- ["Hahahaha!"] = "", +-- ["Haha, I love the look on your face!"] = "", -- A_Classic_Fairytale:queen -- ["Haha, now THAT would be something!"] = "", +-- ["Haha, that was just a coincidence!"] = "", -- A_Classic_Fairytale:queen -- ["Hammer"] = "", -- Construction_Mode, Continental_supplies -- ["Hannibal"] = "", -- A_Classic_Fairytale:epil -- ["Hapless Hogs"] = "", -- [" Hapless Hogs left!"] = "", --- [" HAS MUTATED"] = "", -- Mutant +-- ["Happy with your race track?|Then stop building and start racing!"] = "", -- Racer +-- ["HARD"] = "", -- Continental_supplies +-- ["Hard flying"] = "", -- A_Space_Adventure:ice02 +-- ["Harris"] = "", -- +-- ["Harry Potter"] = "", -- +-- ["Harry"] = "", -- User_Mission_-_Nobody_Laugh +-- ["H"] = "", -- A_Space_Adventure:cosmos, A_Space_Adventure:death01 -- ["Hatless Jerry"] = "", -- A_Classic_Fairytale:queen -- ["Have no illusions, your tribe is dead, indifferent of your choice."] = "", -- A_Classic_Fairytale:shadow +-- ["Haven't found it yet ..."] = "", -- A_Space_Adventure:desert01 -- ["Have we ever attacked you first?"] = "", -- A_Classic_Fairytale:enemy +-- ["H confirmed that there isn't such a PAotH activity logged."] = "", -- A_Space_Adventure:desert01 -- ["Healing Station"] = "", -- Construction_Mode +-- ["Healing Station: Heals nearby hogs."] = "", -- Construction_Mode -- ["Health Crate Placement Mode"] = "", -- Construction_Mode --- ["Health crates extend your time."] = "", +-- ["HEALTH CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Health: %d"] = "", -- HedgeEditor +-- ["Health: Hogs lose up to 7% base health per turn"] = "", -- Battalion +-- ["Health Modification Mode"] = "", -- HedgeEditor +-- ["HEALTH MODIFICATION MODE"] = "", -- HedgeEditor +-- ["Heartful"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove -- ["Heavy"] = "", -- ["Heavy Cannfantry"] = "", -- A_Classic_Fairytale:united +-- ["Heckles"] = "", -- +-- ["Heck, you even executed one of your own!"] = "", -- A_Classic_Fairytale:queen -- ["Hedge-cogs"] = "", -- A_Classic_Fairytale:enemy +-- ["HEDGEEDITOR"] = "", -- HedgeEditor +-- ["HedgeEditor tool"] = "", -- HedgeEditor +-- ["Hedgehog"] = "", -- -- ["Hedgehog projectile: [Fire your hog like a Sticky Bomb]"] = "", -- Continental_supplies - - ["Hedgewars-Basketball"] = "刺猬大作战-篮球计划", - ["Hedgewars-Knockball"] = "刺猬大作战-击球计划", +-- ["Hedgehogs can not be deleted."] = "", -- HedgeEditor +-- ["Hedgehogs will be revived after their death."] = "", -- Mutant +-- ["Hedgehogs will start in the first waypoint."] = "", -- Racer -- ["Hedgibal Lecter"] = "", -- A_Classic_Fairytale:backstab +-- ["He doesn't know it but this device is a part of the anti-gravity device."] = "", -- A_Space_Adventure:ice01 +-- ["He has captured the rest of the PAotH team and awaits to capture you!"] = "", -- A_Space_Adventure:moon01 -- ["Heh, it's not that bad."] = "", --- ["Hellish Handgrenade"] = "", -- Construction_Mode --- ["Hello again, "] = "", -- A_Classic_Fairytale:family +-- ["Height over time"] = "", -- ClimbHome +-- ["He is a very tough and very determined hedgehog. I would be extremely careful if I were you."] = "", -- A_Space_Adventure:moon02 +-- ["Helena"] = "", -- A_Space_Adventure:moon01 +-- ["Hell Army"] = "", -- portal +-- ["Hello again, %s!"] = "", -- A_Classic_Fairytale:family +-- ["Help Disabled"] = "", -- HedgeEditor +-- ["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 -- ["He moves like an eagle in the sky."] = "", -- A_Classic_Fairytale:first_blood -- ["He must be in the village already."] = "", -- A_Classic_Fairytale:journey +-- ["HeneK"] = "", -- -- ["Here, let me help you!"] = "", -- A_Classic_Fairytale:backstab -- ["Here, let me help you save her!"] = "", -- A_Classic_Fairytale:family -- ["Here...pick your weapon!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Here! Take it!"] = "", -- A_Space_Adventure:ice01 +-- ["Here we go!"] = "", -- A_Space_Adventure:moon01 +-- ["Here you will learn how to fly the flying saucer|and get so learn some cool tricks."] = "", -- Basic_Training_-_Flying_Saucer -- ["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, 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! Look, someone is stealing the saucer!"] = "", -- A_Space_Adventure:cosmos -- ["Hey! This is cheating!"] = "", -- A_Classic_Fairytale:journey --- ["HIGHLANDER"] = "", -- Highlander +-- ["Hidden"] = "", -- portal +-- ["High Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["--- Highland ---"] = "", -- Battalion +-- ["Highlander: Eliminate hogs to take their weapons"] = "", -- Highlander +-- ["Highland: Hogs get %d random weapons from their pool"] = "", -- Battalion -- ["Hightime"] = "", -- A_Classic_Fairytale:first_blood +-- ["Hightower"] = "", -- +-- ["Hi! Nice to meet you."] = "", -- A_Space_Adventure:ice01 +-- ["--- Hint ---"] = "", -- Battalion -- ["Hint: Double Jump - Press [Backspace] twice"] = "", -- A_Classic_Fairytale:first_blood --- ["Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."] = "", -- A_Classic_Fairytale:journey --- ["Hint: Select the LowGravity and press [Fire]."] = "", -- A_Classic_Fairytale:journey +-- ["Hint: Kills won't transfer a hog's pool to the killer's pool"] = "", -- Battalion +-- ["Hint: Press [Esc] 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: you might want to stay out of sight and take all the crates...|"] = "", -- A_Classic_Fairytale:journey -- ["His arms are so strong!"] = "", -- A_Classic_Fairytale:first_blood --- ["Hit Combo!"] = "", +-- ["hits"] = "", -- Basic_Training_-_Bazooka +-- ["Hmm … it's going slower than expected."] = "", -- A_Classic_Fairytale:queen -- ["Hmmm...actually...I didn't either."] = "", -- A_Classic_Fairytale:enemy --- ["Hmmm, I'll have to find some way of moving him off this anti-portal surface..."] = "", -- portal +-- ["Hmmm, I’ll have to find some way of moving him off this anti-portal surface."] = "", -- portal -- ["Hmmm...it's a draw. How unfortunate!"] = "", -- A_Classic_Fairytale:enemy -- ["Hmmm...perhaps a little more time will help."] = "", -- A_Classic_Fairytale:first_blood ["Hmmm..."] = "呃...", +-- ["Hm ... Now I ran out of fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Hog 100"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 1"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 3x5"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog 7+7"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog D"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog decar"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog dertien"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog EOF"] = "", -- A_Space_Adventure:fruit03 +-- ["Hogera is definitely the last planet I saved!"] = "", -- A_Space_Adventure:final +-- ["Hogera is safe!"] = "", -- A_Space_Adventure:final +-- ["Hog exi"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Hephaestus"] = "", -- A_Space_Adventure:fruit03 +-- ["Hog Identity Mode"] = "", -- HedgeEditor +-- ["HOG IDENTITY MODE"] = "", -- HedgeEditor +-- ["Hog III"] = "", -- A_Space_Adventure:fruit03 -- ["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 --- ["HOLY SHYTE!"] = "", -- Mutant +-- ["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 +-- ["Holy shit!"] = "", -- Mutant -- ["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"] = "", -- -- ["Hostage Situation"] = "", -- A_Classic_Fairytale:family -- ["How can I ever repay you for saving my life?"] = "", -- A_Classic_Fairytale:journey -- ["How come in a village full of warriors, it's up to me to save it?"] = "", -- A_Classic_Fairytale:dragon +-- ["How could you betray us?"] = "", -- A_Classic_Fairytale:queen -- ["How difficult would you like it to be?"] = "", -- A_Classic_Fairytale:first_blood --- ["HOW DO THEY KNOW WHERE WE ARE???"] = "", -- A_Classic_Fairytale:united +-- ["HOW DO THEY KNOW WHERE WE ARE?"] = "", -- A_Classic_Fairytale:united -- ["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 --- [" HP"] = "", -- Mutant +-- ["However, the army of Yellow Watermelons is about to attack any moment now."] = "", -- A_Space_Adventure:fruit01 +-- ["How would you like being discriminated against?"] = "", -- A_Classic_Fairytale:queen +-- ["Huh?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:queen ["Hunter"] = "猎人", --Bazooka, Shotgun, SniperRifle +-- ["I ain't gonna sit around no more!"] = "", -- A_Classic_Fairytale:queen +-- ["I already said I'm sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["I always suspected him!"] = "", -- A_Classic_Fairytale:epil +-- ["I am going to leave the kids play by themselves."] = "", -- A_Classic_Fairytale:queen +-- ["I am not ready for this planet yet. I should visit it when I have found all the other device parts."] = "", -- A_Space_Adventure:cosmos +-- ["I am sorry but I was looking for a device that may be hidden somewhere around here."] = "", -- A_Space_Adventure:fruit02 -- ["I believe there's more of them."] = "", -- A_Classic_Fairytale:backstab +-- ["I cannot let you go any further! … burp …"] = "", -- A_Classic_Fairytale:queen -- ["I can see you have been training diligently."] = "", -- A_Classic_Fairytale:first_blood +-- ["I can't believe how blind we were."] = "", -- A_Classic_Fairytale:epil -- ["I can't believe it worked!"] = "", -- A_Classic_Fairytale:shadow -- ["I can't believe this!"] = "", -- A_Classic_Fairytale:enemy -- ["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 Jake"] = "", -- A_Space_Adventure:ice01 -- ["I could just teleport myself there..."] = "", -- A_Classic_Fairytale:family +-- ["Icy Girder: [3]"] = "", -- HedgeEditor +-- ["Icy Land: [3]"] = "", -- HedgeEditor +-- ["Icy Land"] = "", -- HedgeEditor -- ["I'd better get going myself."] = "", -- A_Classic_Fairytale:journey -- ["I didn't until about a month ago."] = "", -- A_Classic_Fairytale:enemy --- ["I don't know how you did that.. But good work! |The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't care. It's worth a fortune! Good bye, you idiot!"] = "", -- A_Space_Adventure:fruit02 +-- ["I don't know how you did that. But good work!|The next one should be easy as cake for you!"] = "", -- Basic_Training_-_Rope +-- ["I don't know if I can forget what you've done!"] = "", -- A_Classic_Fairytale:epil +-- ["I don't know who I can trust anymore."] = "", -- A_Classic_Fairytale:epil +-- ["I don't like your tone! You're hurting me!"] = "", -- A_Classic_Fairytale:queen -- ["I feel something...a place! They will arrive near the circles!"] = "", -- A_Classic_Fairytale:backstab -- ["If only I had a way..."] = "", -- A_Classic_Fairytale:backstab -- ["If only I were given a chance to explain my being here..."] = "", -- A_Classic_Fairytale:first_blood -- ["I forgot that she's the daughter of the chief, too..."] = "", -- A_Classic_Fairytale:backstab +-- ["I found it! Hooray!"] = "", -- A_Space_Adventure:desert01 +-- ["If some good old explosives were enough to save Hogera …"] = "", -- A_Space_Adventure:final -- ["If they try coming here, they can have a taste of my delicious knuckles!"] = "", -- A_Classic_Fairytale:united -- ["If you agree to provide the information we need, you will be spared!"] = "", -- A_Classic_Fairytale:shadow -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey +-- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 +-- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 +-- ["If you kill a hedgehog with the respective weapon your health points will be set to 100."] = "", -- A_Space_Adventure:death02 -- ["If you know what I mean..."] = "", -- A_Classic_Fairytale:shadow -- ["If you say so..."] = "", -- A_Classic_Fairytale:shadow +-- ["If you skip a turn then the turn time left will be added to your next turn."] = "", -- A_Space_Adventure:fruit03 +-- ["If you wish to replay, there are other possible endings, too!"] = "", -- A_Classic_Fairytale:epil +-- ["Igmund"] = "", -- User_Mission_-_Nobody_Laugh +-- ["I grew sick of the oppression! I broke free!"] = "", -- A_Classic_Fairytale:queen +-- ["I guess I can't go far without fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["I guess we lost him!"] = "", -- A_Space_Adventure:cosmos -- ["I guess you'll have to kill them."] = "", -- A_Classic_Fairytale:dragon -- ["I have come to make you an offering..."] = "", -- A_Classic_Fairytale:shadow +-- ["I have heard that the local tribes say that many years ago some PAotH scientists were dumping their waste here."] = "", -- A_Space_Adventure:desert01 +-- ["I have more important things to do!"] = "", -- A_Classic_Fairytale:queen -- ["I have no idea where that mole disappeared...Can you see it?"] = "", -- A_Classic_Fairytale:shadow +-- ["I have only 3 hogs available and they are all cadets."] = "", -- A_Space_Adventure:fruit01 -- ["I have to follow that alien."] = "", -- A_Classic_Fairytale:backstab -- ["I have to get back to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I have to reach the surface as quickly as I can."] = "", -- A_Space_Adventure:desert02 -- ["I hope you are prepared for a small challenge, young one."] = "", -- A_Classic_Fairytale:first_blood -- ["I just don't want to sink to your level."] = "", -- A_Classic_Fairytale:backstab +-- ["I just forgot all checkpoints of incomplete missions."] = "", -- A_Space_Adventure:cosmos -- ["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 +-- ["I … like being with you, too."] = "", -- A_Classic_Fairytale:epil +-- ["I'll get him!"] = "", -- A_Space_Adventure:cosmos -- ["I'll hold them off while you return to the village!"] = "", -- A_Classic_Fairytale:shadow +-- ["I'll let you know whatever I know about him if you manage to catch me 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["I'll make good use of it."] = "", -- A_Space_Adventure:cosmos +-- ["I'll protect you!"] = "", -- A_Classic_Fairytale:epil +-- ["I love Dense Cloud now!"] = "", -- A_Classic_Fairytale:epil +-- ["I love you."] = "", -- A_Classic_Fairytale:epil +-- ["I'm afraid I can't let you proceed!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm afraid we cannot afford that."] = "", -- A_Classic_Fairytale:queen -- ["Imagine those targets are the wolves that killed your parents! Take your anger out on them!"] = "", -- A_Classic_Fairytale:first_blood -- ["I'm...alive? How? Why?"] = "", -- A_Classic_Fairytale:backstab -- ["I'm a ninja."] = "", -- A_Classic_Fairytale:dragon -- ["I marked the place of their arrival. You're welcome!"] = "", -- A_Classic_Fairytale:backstab +-- ["I may lost this battle, but I haven't lost the war yet!"] = "", -- A_Space_Adventure:moon01 -- ["I'm certain that this is a misunderstanding, fellow hedgehogs!"] = "", -- A_Classic_Fairytale:first_blood -- ["I mean, none of you ceased to live."] = "", -- A_Classic_Fairytale:enemy -- ["I'm getting old for this!"] = "", -- A_Classic_Fairytale:family -- ["I'm getting thirsty..."] = "", -- A_Classic_Fairytale:family +-- ["I'm glad this is over!"] = "", -- A_Classic_Fairytale:epil -- ["I'm here to help you rescue her."] = "", -- A_Classic_Fairytale:family +-- ["I'm living a dream!"] = "", -- A_Classic_Fairytale:queen -- ["I'm not sure about that!"] = "", -- A_Classic_Fairytale:united -- ["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 -- ["I'm so scared!"] = "", -- A_Classic_Fairytale:united --- ["Increase"] = "", -- Continental_supplies +-- ["I'm still low on hogs. If you are not afraid I could use a set of extra hands."] = "", -- A_Space_Adventure:fruit02 +-- ["I'm still with the aliens."] = "", -- A_Classic_Fairytale:queen +-- ["I'm terribly sorry!"] = "", -- A_Classic_Fairytale:queen +-- ["I'm the spy! I've been giving you out!"] = "", -- A_Classic_Fairytale:queen +-- ["In am also entrusting you with some rope."] = "", -- A_Space_Adventure:cosmos +-- ["In case you haven't noticed, I'm a woman, too!"] = "", -- A_Classic_Fairytale:queen -- ["Incredible..."] = "", -- A_Classic_Fairytale:shadow +-- ["Indestructible Girder: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land: [2]"] = "", -- HedgeEditor +-- ["Indestructible Land"] = "", -- HedgeEditor +-- ["In each round, the worst hedgehog of the round is eliminated."] = "", -- TrophyRace -- ["I need to find the others!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to get to the other side of this island, fast!"] = "", -- A_Classic_Fairytale:journey -- ["I need to move the tribe!"] = "", -- A_Classic_Fairytale:united -- ["I need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["I need to warn the others."] = "", -- A_Classic_Fairytale:backstab -- ["In fact, you are the only one that's been acting strangely."] = "", -- A_Classic_Fairytale:backstab --- ["In order to get to the other side, you need to collect the crates first.|"] = "", -- A_Classic_Fairytale:dragon --- ["INSANITY"] = "", -- Mutant +-- ["Initiate escape wish!"] = "", -- A_Classic_Fairytale:queen +-- ["In order to get to the other side, you need to get rid of the crates first."] = "", -- A_Classic_Fairytale:dragon +-- ["Insanity!"] = "", -- Mutant +-- ["Inside %d"] = "", -- WxW +-- ["Inside"] = "", -- WxW +-- ["Instructions"] = "", -- Basic_Training_-_Flying_Saucer ["Instructor"] = "引导员", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings +-- ["Insufficient Power"] = "", -- Construction_Mode -- ["Interesting idea, haha!"] = "", -- A_Classic_Fairytale:enemy -- ["Interesting! Last time you said you killed a cannibal!"] = "", -- A_Classic_Fairytale:backstab +-- ["In the Ice Planet Flying Saucer Stadium ..."] = "", -- A_Space_Adventure:ice02 -- ["In the meantime, take these and return to your \"friend\"!"] = "", -- A_Classic_Fairytale:shadow --- ["invaders destroyed"] = "", +-- ["In this accident, Professor Hogevil lost all his spines on his head!"] = "", -- A_Space_Adventure:moon02 +-- ["In this mission you get %d%% fuel."] = "", -- User_Mission_-_Diver +-- ["In this mission you have infinite time."] = "", -- portal +-- ["Invalid Placement"] = "", -- Construction_Mode -- ["Invasion"] = "", -- A_Classic_Fairytale:united --- ["Invulnerable"] = "", -- Construction_Mode +-- ["In your best (and only) flight you took out %d crates with one RC plane!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["In your best flight you took out %d crates with one RC plane."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["I regret to end your little odyssey."] = "", -- A_Classic_Fairytale:queen -- ["I saw it with my own eyes!"] = "", -- A_Classic_Fairytale:shadow -- ["I see..."] = "", -- A_Classic_Fairytale:shadow +-- ["I see you already took care of your enemies."] = "", -- A_Classic_Fairytale:dragon -- ["I see you have already taken the leap of faith."] = "", -- A_Classic_Fairytale:first_blood -- ["I see you would like his punishment to be more...personal..."] = "", -- A_Classic_Fairytale:first_blood -- ["I sense another wave of cannibals heading my way!"] = "", -- A_Classic_Fairytale:backstab -- ["I sense another wave of cannibals heading our way!"] = "", -- A_Classic_Fairytale:backstab +-- ["%i s"] = "", -- Gravity +-- ["I should get myself a portal device, maybe this crate has one."] = "", -- portal +-- ["I should go now, goodbye!"] = "", -- A_Space_Adventure:moon02 -- ["I shouldn't have drunk that last pint."] = "", -- A_Classic_Fairytale:dragon -- ["Is this place in my head?"] = "", -- A_Classic_Fairytale:dragon +-- ["I still can't believe he sold us out like that."] = "", -- A_Classic_Fairytale:epil +-- ["I still can't believe you forgave her!"] = "", -- A_Classic_Fairytale:epil +-- ["I still have to get rid of the crates."] = "", -- A_Classic_Fairytale:dragon +-- ["Itami"] = "", -- -- ["It doesn't matter. I won't let that alien hurt my daughter!"] = "", -- A_Classic_Fairytale:dragon +-- ["I think I love you!"] = "", -- A_Classic_Fairytale:epil -- ["I think we are safe here."] = "", -- A_Classic_Fairytale:backstab -- ["I thought their shaman died when he tried our medicine!"] = "", -- A_Classic_Fairytale:shadow -- ["It is called 'Hogs of Steel'."] = "", -- A_Classic_Fairytale:enemy @@ -494,541 +1040,1293 @@ -- ["It must be the aliens' deed."] = "", -- A_Classic_Fairytale:backstab -- ["It must be the cyborgs again!"] = "", -- A_Classic_Fairytale:enemy -- ["I told you, I just found them."] = "", -- A_Classic_Fairytale:backstab +-- ["It only works in teleportation nodes of your own clan."] = "", -- Construction_Mode -- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "", +-- ["It's all about the right carrots, you know."] = "", -- A_Classic_Fairytale:epil -- ["It's always up to women to clear up the mess men created!"] = "", -- A_Classic_Fairytale:dragon +-- ["It's amazing how quickly our lives can change."] = "", -- A_Classic_Fairytale:epil +-- ["It's an ancient ritual of theirs."] = "", -- A_Classic_Fairytale:queen +-- ["IT'S A SERIOUS MEDICAL CONDITION!"] = "", -- A_Classic_Fairytale:queen -- ["It's a shame, I forgot how to do that!"] = "", -- A_Classic_Fairytale:family +-- ["It's a shame, really!"] = "", -- A_Classic_Fairytale:queen +-- ["It seems that Professor Hogevil has prepared for your arrival!"] = "", -- A_Space_Adventure:moon01 +-- ["It's empty!"] = "", -- Battalion -- ["It's impossible to communicate with the spirits without a shaman."] = "", -- A_Classic_Fairytale:shadow +-- ["It's not that easy, so listen carefully:"] = "", -- Basic_Training_-_Flying_Saucer -- ["It's over..."] = "", -- A_Classic_Fairytale:shadow +-- ["It's precious to me!"] = "", -- A_Classic_Fairytale:queen -- ["It's time you learned that your actions have consequences!"] = "", -- A_Classic_Fairytale:journey -- ["It's worth more than wood!"] = "", -- A_Classic_Fairytale:enemy +-- ["It's your fault you're there!"] = "", -- A_Classic_Fairytale:epil -- ["It wants our brains!"] = "", -- A_Classic_Fairytale:shadow +-- ["It was all a trick?!"] = "", -- A_Classic_Fairytale:queen +-- ["It was all just bad luck!"] = "", -- ClimbHome +-- ["It was completely useless!"] = "", -- A_Space_Adventure:final +-- ["It was fun to watch."] = "", -- A_Classic_Fairytale:queen +-- ["It was fun to watch, though."] = "", -- A_Classic_Fairytale:queen -- ["It was not a dream, unwise one!"] = "", -- A_Classic_Fairytale:backstab +-- ["It wasn't her fault!"] = "", -- A_Classic_Fairytale:epil +-- ["It would be wiser to steal the space ship while the PAotH guards are taking a brake!"] = "", -- A_Space_Adventure:cosmos +-- ["Ivan"] = "", -- +-- ["I've made it! Yeah!"] = "", -- A_Space_Adventure:moon01 -- ["I've seen this before. They just appear out of thin air."] = "", -- A_Classic_Fairytale:united +-- ["I've thought that the best way to get the device is to let you collect most of the parts for me!"] = "", -- A_Space_Adventure:death01 -- ["I want to play a game..."] = "", -- A_Classic_Fairytale:journey -- ["I want to see how it handles this!"] = "", -- A_Classic_Fairytale:backstab --- ["I wish to help you, "] = "", -- A_Classic_Fairytale:dragon +-- ["I was heading home, you see!"] = "", -- A_Classic_Fairytale:queen +-- ["I was so scared."] = "", -- A_Classic_Fairytale:epil +-- ["I was told that as the leader of the king's guard, no one knows this world better than you!"] = "", -- A_Space_Adventure:fruit01 +-- ["I will never hand you the parts!"] = "", -- A_Space_Adventure:death01 +-- ["I wish to help you, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["I wonder where Dense Cloud is..."] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["I wonder why I'm so angry all the time..."] = "", -- A_Classic_Fairytale:family -- ["I won't let you kill her!"] = "", -- A_Classic_Fairytale:journey +-- ["I won't let you kill the tribe!"] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- A_Space_Adventure:fruit01 -- ["Jack"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen +-- ["Jason"] = "", -- -- ["Jeremiah"] = "", -- A_Classic_Fairytale:dragon +-- ["Jetpack"] = "", -- Big_Armory +-- ["Jigglypuff"] = "", -- +-- ["Jim Morgan"] = "", -- +-- ["Jimmy"] = "", -- +-- ["Jingo"] = "", -- +-- ["Joe"] = "", -- A_Space_Adventure:moon01 -- ["John"] = "", -- A_Classic_Fairytale:journey +-- ["John Snow"] = "", -- A_Space_Adventure:ice01 +-- ["Jolly Roger"] = "", -- +-- ["Jones"] = "", -- -- ["Judas"] = "", -- A_Classic_Fairytale:backstab +-- ["Juicy"] = "", -- -- ["Jumping is disabled"] = "", -- ["Just kidding, none of you have died!"] = "", -- A_Classic_Fairytale:enemy +-- ["Just look at Leaks, may he rest in peace!"] = "", -- A_Classic_Fairytale:queen -- ["Just on a walk."] = "", -- A_Classic_Fairytale:united -- ["Just wait till I get my hands on that trauma! ARGH!"] = "", -- A_Classic_Fairytale:family +-- ["Kaboom!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Kaboom! Hahahaha! Take this, stupid meteorite!"] = "", -- A_Space_Adventure:final -- ["Kamikaze"] = "", -- Construction_Mode --- ["Kamikaze Expert!"] = "", +-- ["Kamikaze Expert! +15 points!"] = "", -- Space_Invasion -- ["Keep it up!"] = "", +-- ["Ken"] = "", -- +-- ["Kenshi"] = "", -- -- ["Kerguelen"] = "", -- Continental_supplies +-- ["key."] = "", -- Continental_supplies +-- ["Kill all enemy hedgehogs in a single turn."] = "", -- Big_Armory +-- ["Kill him or skip your turn."] = "", -- A_Classic_Fairytale:backstab -- ["Killing spree!"] = "", +-- ["Killing the specialists"] = "", -- A_Space_Adventure:death02 -- ["KILL IT!"] = "", -- A_Classic_Fairytale:first_blood --- ["KILLS"] = "", +-- ["Kills: %d"] = "", -- Space_Invasion -- ["Kill the aliens!"] = "", -- A_Classic_Fairytale:dragon -- ["Kill the cannibal!"] = "", -- A_Classic_Fairytale:first_blood --- ["Kill the traitor...or spare his life!|Kill him or press [Precise]!"] = "", -- A_Classic_Fairytale:backstab --- ["Land Sprayer"] = "", -- Construction_Mode --- ["Laser Sight"] = "", -- Construction_Mode +-- ["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 ---"] = "", -- Battalion +-- ["King"] = "", -- Battalion +-- ["King Customer"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["Knight"] = "", -- Battalion +-- ["Knives"] = "", -- +-- ["Knockball"] = "", -- Knockball +-- ["Knockball weapon"] = "", -- Knockball +-- ["Knock off the enemies from the left-most place of the map!"] = "", -- A_Space_Adventure:fruit01 +-- ["koda"] = "", -- +-- ["Kostya"] = "", -- +-- ["Lady Mango"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["LandFlag Modification Mode"] = "", -- HedgeEditor +-- ["Land mines explode instantly."] = "", -- User_Mission_-_Teamwork_2 +-- ["Lassard"] = "", -- +-- ["Last Resort: Having less than 25% base health gives kamikaze"] = "", -- Battalion -- ["Last Target!"] = "", +-- ["Last wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 -- ["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 -- ["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 -- ["Leaks A Lot must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Led Heart"] = "", -- A_Classic_Fairytale:queen -- ["Lee"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["[Left Shift]"] = "", --- ["left shift"] = "", -- Continental_supplies --- ["Let a Continent provide your weapons!"] = "", -- Continental_supplies +-- ["Left and right"] = "", -- WxW +-- ["Left, right and roof"] = "", -- WxW +-- ["[Left], [Right]: Change between identities."] = "", -- HedgeEditor +-- ["[Left], [Right]: Change health value."] = "", -- HedgeEditor +-- ["Left/right: Choose crate contents"] = "", -- Construction_Mode +-- ["Left/right: Choose structure type|Cursor: Build structure"] = "", -- Construction_Mode +-- ["Legs"] = "", -- +-- ["Less tools, more fun"] = "", -- Battalion +-- ["Lestat"] = "", -- portal +-- ["Let a continent provide your weapons!"] = "", -- Continental_supplies -- ["Let me test your skills a little, will you?"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go!"] = "", -- A_Space_Adventure:moon02 -- ["Let's go home!"] = "", -- A_Classic_Fairytale:journey +-- ["Let's go, %s!"] = "", -- WxW -- ["Let's head back to the village!"] = "", -- A_Classic_Fairytale:shadow -- ["Let's see what your comrade does now!"] = "", -- A_Classic_Fairytale:journey -- ["Let's show those cannibals what we're made of!"] = "", -- A_Classic_Fairytale:backstab -- ["Let them have a taste of my fury!"] = "", -- A_Classic_Fairytale:backstab -- ["Let us help, too!"] = "", -- A_Classic_Fairytale:backstab +-- ["Level 1 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level 2 clear!"] = "", -- A_Space_Adventure:desert03 +-- ["Level Data Saved!"] = "", -- HedgeEditor +-- ["Lightbender"] = "", -- -- ["Light Cannfantry"] = "", -- A_Classic_Fairytale:united --- ["Limburger"] = "", -- Construction_Mode +-- ["Listen carefully! The bandit leader, Thanta, has recently found a very strange device."] = "", -- A_Space_Adventure:ice01 ["Listen up, maggot!!"] = "听好,小子!!", -- ["Little did they know that this hunt will mark them forever..."] = "", -- A_Classic_Fairytale:shadow -- ["Lively Lifeguard"] = "", - --- ["Lonely Cries: [Rise the water if no hog is in the circle and deal 7 damage to all enemy hogs]"] = "", -- 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 Live The Queen"] = "", -- A_Classic_Fairytale:queen +-- ["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 --- ["Low Gravity"] = "", -- Construction_Mode, Frenzy +-- ["Loon"] = "", -- The_Specialists +-- ["Loopy"] = "", -- +-- ["Losing Condition: Destroy"] = "", -- HedgeEditor +-- ["Low Gravity: Gravity is %i%%"] = "", -- Gravity +-- ["Loyal Highlander: Eliminate enemy hogs to take their weapons"] = "", -- Highlander +-- ["Lt. Luke"] = "", -- +-- ["Lucifer"] = "", -- portal +-- ["Luck: %d%% (modifier for crates)"] = "", -- Battalion -- ["Luckily, I've managed to snatch some of them."] = "", -- A_Classic_Fairytale:united --- ["LUDICROUS KILL"] = "", -- Mutant +-- ["Ludicrous kill!"] = "", -- Mutant +-- ["Lugia"] = "", -- +-- ["Luigi"] = "", -- -- ["Made it!"] = "", -- ClimbHome +-- ["Mahoney"] = "", -- +-- ["Make fun of me when I fart …"] = "", -- A_Classic_Fairytale:queen +-- ["Manual: https://hedgewars.org/hedgeeditor"] = "", -- HedgeEditor +-- ["Many long forgotten things can be found in the same tunnels that we are about to explore!"] = "", -- A_Space_Adventure:fruit02 +-- ["Many meters below the surface ..."] = "", -- A_Space_Adventure:desert02 +-- ["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 +-- ["Maybe you should try an easier TechRacer map."] = "", -- TechRacer +-- ["Maybe you should try easier waypoints next time."] = "", -- Racer -- ["May the spirits aid you in all your quests!"] = "", -- A_Classic_Fairytale:backstab +-- ["Meals"] = "", -- +-- ["Medic"] = "", -- Battalion -- ["Medicine: [Fire some exploding medicine that will heal all hogs effected by the explosion]"] = "", -- Continental_supplies --- ["MEGA KILL"] = "", -- Mutant +-- ["MEDIUM"] = "", -- Continental_supplies +-- ["Mega kill!"] = "", -- Mutant -- ["Meiwes"] = "", -- A_Classic_Fairytale:backstab +-- ["mikade"] = "", -- +-- ["milliseconds"] = "", -- SpeedShoppa, Racer, TechRacer -- ["Mindy"] = "", -- A_Classic_Fairytale:united --- ["Mine"] = "", -- Construction_Mode, Frenzy -- ["Mine Deployer"] = "", --- ["Mine Eater!"] = "", +-- ["Mine Deployer selected!"] = "", -- Tumbler +-- ["Mine Eater"] = "", -- Tumbler -- ["Mine Placement Mode"] = "", -- Construction_Mode --- ["|- Mines Time:"] = +-- ["MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Mines explode after %d s."] = "", -- Mutant +-- ["Mines time: 0 seconds"] = "", -- portal, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, User_Mission_-_The_Great_Escape, A_Space_Adventure:desert01, A_Space_Adventure:final, A_Space_Adventure:fruit02, A_Space_Adventure:ice01 +-- ["Mines time: 1.5 seconds"] = "", -- A_Space_Adventure:death01 +-- ["Mines time: 1 second"] = "", -- User_Mission_-_Diver, User_Mission_-_Newton_and_the_Hammock, A_Space_Adventure:desert02 +-- ["Mines time: 3 seconds"] = "", -- A_Classic_Fairytale:journey +-- ["Mines time: 5 seconds"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:journey -- ["Mine Strike"] = "", -- Construction_Mode +-- ["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 SUCCESS"] = "", +-- ["Mission failure in %d s"] = "", -- Big_Armory +-- ["Mission lost!"] = "", -- Basic_Training_-_Grenade ["MISSION SUCCESSFUL"] = "任务成功", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork --- ["Molotov Cocktail"] = "", -- Construction_Mode +-- ["Mission won!"] = "", -- Basic_Training_-_Grenade +-- ["Mister Pear"] = "", -- A_Space_Adventure:fruit01, A_Space_Adventure:fruit02 +-- ["Mixed %d"] = "", -- WxW +-- ["Mixed"] = "", -- WxW +-- ["Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, per-hog ammo"] = "", -- Battalion +-- ["Modifiers: Unlimited ammo, shared clan ammo"] = "", -- Battalion +-- ["Modify Sprite under Cursor: [Left Click]"] = "", -- HedgeEditor +-- ["Molly"] = "", -- -- ["Molotov"] = "", -- Continental_supplies --- ["MONSTER KILL"] = "", -- Mutant +-- ["Monster kill!"] = "", -- Mutant +-- ["Monsters"] = "", -- +-- ["Mooney"] = "", -- -- ["More Natives"] = "", -- A_Classic_Fairytale:epil --- ["Mortar"] = "", -- Construction_Mode, A_Space_Adventure:death02 +-- ["Morris"] = "", -- +-- ["Most mines are not active."] = "", -- A_Space_Adventure:desert02 +-- ["Most of the destructible terrain in marked with blue color"] = "", -- A_Space_Adventure:desert01 +-- ["Most of the time you'll be able to use the freezer only."] = "", -- A_Space_Adventure:ice01 -- ["Movement: [Up], [Down], [Left], [Right]"] = "", --- ["Mudball"] = "", -- Construction_Mode --- ["Multi-shot!"] = "", +-- ["Mr Mango"] = "", -- A_Space_Adventure:fruit01 +-- ["Mudkip"] = "", -- +-- ["Multi-shot! +15 points!"] = "", -- Space_Invasion -- ["Muriel"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Muscle Dissolver"] = "", -- A_Classic_Fairytale:shadow --- ["-------"] = "", -- Mutant +-- ["Mushroom Kingdom"] = "", -- -- ["Mutant"] = "", -- Mutant +-- ["My flying saucer stopped working!"] = "", -- A_Space_Adventure:ice01 -- ["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: [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 --- ["New Barrels Per Turn"] = "", --- ["NEW CLAN RECORD: "] = "", +-- ["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 +-- ["nemo"] = "", -- +-- ["Neutralize your enemies and be careful!"] = "", -- A_Space_Adventure:moon01 +-- ["New barrels per turn: %d"] = "", -- Tumbler +-- ["New clan record: %.1fs"] = "", -- Racer, TechRacer ["NEW fastest lap: "] = "新记录", --- ["New Mines Per Turn"] = "", --- ["NEW RACE RECORD: "] = "", --- ["Newton's Hammock"] = "", +-- ["New mines per turn: %d"] = "", -- Tumbler +-- ["New race record: %.1fs"] = "", -- Racer, TechRacer +-- ["Newton and the Hammock"] = "", -- User_Mission_-_Newton_and_the_Hammock +-- ["Next target is ready!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Next time you play \"Searching in the dust\" you'll have an RC plane available."] = "", -- A_Space_Adventure:desert03 +-- ["Next wave in 3 turns"] = "", -- A_Space_Adventure:fruit01 +-- ["Nice!"] = "", -- A_Space_Adventure:cosmos -- ["Nicely done, meatbags!"] = "", -- A_Classic_Fairytale:enemy --- ["Nice work, "] = "", -- A_Classic_Fairytale:dragon +-- ["Nice! Now hurry and get down! You have to rescue my friends!"] = "", -- A_Space_Adventure:moon01 +-- ["Nice, then I should get the part as soon as possible!"] = "", -- A_Space_Adventure:ice01 -- ["Nice work!"] = "", -- A_Classic_Fairytale:enemy +-- ["Nice work, meatbags!"] = "", -- A_Classic_Fairytale:queen +-- ["Nice work, %s!"] = "", -- A_Classic_Fairytale:dragon -- ["Nilarian"] = "", -- A_Classic_Fairytale:queen +-- ["Ninja"] = "", -- Battalion, HedgeEditor, The_Specialists +-- ["Ninpo"] = "", -- -- ["Nobody Laugh"] = "", -- User_Mission_-_Nobody_Laugh +-- ["Nobody managed to finish the race. What a shame!"] = "", -- Racer, TechRacer +-- ["Nobody takes walks every day!"] = "", -- A_Classic_Fairytale:epil +-- ["No, I am afraid I had to travel light."] = "", -- A_Space_Adventure:moon01 -- ["No, I came back to help you out..."] = "", -- A_Classic_Fairytale:shadow -- ["No...I wonder where they disappeared?!"] = "", -- A_Classic_Fairytale:journey -- ["Nom-Nom"] = "", -- A_Classic_Fairytale:journey -- ["NomNom"] = "", -- A_Classic_Fairytale:united +-- ["Noo, Thanta has to stay alive!"] = "", -- A_Space_Adventure:ice01 -- ["Nope. It was one fast mole, that's for sure."] = "", -- A_Classic_Fairytale:shadow -- ["No! Please, help me!"] = "", -- A_Classic_Fairytale:journey +-- ["No problem, Captain!"] = "", -- A_Space_Adventure:fruit01 +-- ["No problem, I would do anything for H!"] = "", -- A_Space_Adventure:desert01 +-- ["No radar pings left!"] = "", -- Space_Invasion -- ["NORMAL"] = "", -- Continental_supplies --- ["Normal players can only score points by killing the mutant."] = "", -- Mutant +-- ["Normal Girder: [1]"] = "", -- HedgeEditor +-- ["Normal Land: [1]"] = "", -- HedgeEditor +-- ["Normal Land"] = "", -- HedgeEditor +-- ["Normal Rubber: [1]"] = "", -- HedgeEditor -- ["North America"] = "", -- Continental_supplies --- ["Not all hogs are born equal."] = "", -- Highlander +-- ["Not being able to fight or hunt."] = "", -- A_Classic_Fairytale:queen -- ["NOT ENOUGH WAYPOINTS"] = "", +-- ["Note: Some weapons have a second option (See continent information). Find and use them with the \""] = "", -- Continental_supplies +-- ["Note: We only give you grenades if you stay in your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Nothing of interest has happened."] = "", -- Space_Invasion -- ["Not now, Fiery Water!"] = "", -- A_Classic_Fairytale:backstab ["Not So Friendly Match"] = "非友善对抗", -- Basketball, Knockball -- ["Not you again! My head still hurts from last time!"] = "", -- A_Classic_Fairytale:shadow +-- ["No waypoint to be removed!"] = "", -- Racer +-- ["Now collect the 2 crates to the far left and right."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now dive just one more time and collect the next crate."] = "", -- Basic_Training_-_Flying_Saucer -- ["No, we made sure of that!"] = "", -- A_Classic_Fairytale:united -- ["Now find the next target! |Tip: Normally you lose health by falling down, so be careful!"] = "", -- Basic_Training_-_Rope +-- ["Now for the supreme discipline of saucer flying, the underwater attack."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now go and don't waste more of my time, you coward!"] = "", -- A_Space_Adventure:fruit01 +-- ["Now go and play the menu mission to complete the campaign."] = "", -- A_Space_Adventure:death01 -- ["No! What have I done?! What have YOU done?!"] = "", -- A_Classic_Fairytale:journey -- ["No. Where did he come from?"] = "", -- A_Classic_Fairytale:shadow -- ["Now how do I get on the other side?!"] = "", -- A_Classic_Fairytale:dragon +-- ["Now I have to climb these trees"] = "", -- A_Space_Adventure:cosmos +-- ["Now let's try to drop weapons while flying!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Now listen carefully! Below us there are tunnels that have been created naturally over the years"] = "", -- A_Space_Adventure:desert01 +-- ["Now use it and go to the moon PAotH station to get more fuel!"] = "", -- A_Space_Adventure:cosmos +-- ["Now you have the chance to try and claim the place that you deserve among the best."] = "", -- A_Space_Adventure:ice02 -- ["No. You and the rest of the tribe are safer there!"] = "", -- A_Classic_Fairytale:backstab --- ["Object Placement Tool"] = "", -- Construction_Mode +-- ["Objective completed! Now land safely."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Objectives"] = "", -- A_Space_Adventure:ice01 +-- ["Object Placer"] = "", -- Construction_Mode -- ["Obliterate them!|Hint: You might want to take cover..."] = "", -- A_Classic_Fairytale:shadow -- ["Obstacle course"] = "", -- A_Classic_Fairytale:dragon +-- ["Of course, but you're … special."] = "", -- A_Classic_Fairytale:epil +-- ["Of course I am!"] = "", -- A_Classic_Fairytale:queen -- ["Of course I have to save her. What did I expect?!"] = "", -- A_Classic_Fairytale:family +-- ["Of course! It's all obvious now!"] = "", -- A_Classic_Fairytale:epil +-- ["Of course, I will observe the battle and intervene if necessary."] = "", -- A_Space_Adventure:fruit01 -- ["OH, COME ON!"] = "", -- A_Classic_Fairytale:journey +-- ["Oh man! Learn how to fly!"] = "", -- A_Space_Adventure:ice02 -- ["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 "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["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! 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 +-- ["Oh, that. We were just having fun!"] = "", -- A_Classic_Fairytale:queen +-- ["Oh yes! I got the device part! Now it belongs to me alone."] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, I'll be extra careful!"] = "", -- A_Space_Adventure:desert01 +-- ["Okay then!"] = "", -- A_Space_Adventure:fruit02 +-- ["Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"] = "", -- A_Space_Adventure:moon01 +-- ["Old One Eye"] = "", -- +-- ["Oleg"] = "", -- -- ["Olive"] = "", -- A_Classic_Fairytale:united -- ["Omnivore"] = "", -- A_Classic_Fairytale:first_blood -- ["Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."] = "", -- A_Classic_Fairytale:first_blood --- ["ONE HOG PER TEAM! KILLING EXCESS HEDGES"] = "", -- Mutant +-- ["Once you set off the proximity trigger, Mr. Mine is not your friend"] = "", -- ClimbHome +-- ["One does not simply rope to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["One flower: Incomplete side missions"] = "", -- A_Space_Adventure:cosmos +-- ["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 --- ["on Skip"] = "", -- Continental_supplies +-- ["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 the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer +-- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 +-- ["On the other side of the moon ..."] = "", -- A_Space_Adventure:moon02 +-- ["On the Planet of Sand, you have to double check your moves ..."] = "", -- A_Space_Adventure:desert01 +-- ["On this map you get %d%% fuel."] = "", -- TechRacer +-- ["On this map you get infinite fuel."] = "", -- TechRacer -- ["Oops...I dropped them."] = "", -- A_Classic_Fairytale:united +-- ["Oops, I've been spotted and I have no weapons! I am doomed!"] = "", -- A_Space_Adventure:moon01 -- ["Open that crate and we will continue!"] = "", -- A_Classic_Fairytale:first_blood - ["Operation Diver"] = "水下行动", ["Opposing Team: "] = "对方队伍", --- ["or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec"] = "", -- Gravity +-- ["Orange"] = "", -- -- ["Orlando Boom!"] = "", -- A_Classic_Fairytale:queen +-- ["Or let the next player place waypoints|if less than 2 waypoints have been placed."] = "", -- Racer +-- ["Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"] = "", -- A_Space_Adventure:final +-- ["Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"] = "", -- Gravity -- ["Other kills don't give you points."] = "", -- Mutant --- ["Ouch!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Ouch! That must have hurt. %s (%s) hit the ground with %d damage points."] = "", -- ClimbHome +-- ["Ouch! That must have hurt. You mutilated your poor hedgehog hog with %d damage."] = "", -- ClimbHome -- ["Our tribe, our beautiful island!"] = "", -- A_Classic_Fairytale:enemy +-- ["Out of ammo!"] = "", -- A_Space_Adventure:desert03, Tumbler +-- ["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 -- ["Parachute"] = "", -- Continental_supplies +-- ["Patches"] = "", -- ["Pathetic Hog #1"] = "可怜刺猬一号", ["Pathetic Hog #2"] = "可怜刺猬二号", --- ["Pathetic Hog #%d"] = -- ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock --- ["Penguin roar: [Deal 15 damage + 15% of your hogs health to all hogs around you and get 2/3 back]"] = "", -- Continental_supplies +-- ["Paul McHoggy"] = "", -- A_Space_Adventure:ice01, A_Space_Adventure:ice02 +-- ["Penalty: If you violate above rule, you have to skip in the next turn."] = "", -- WxW +-- ["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"] = "", --- ["Personal Portal Device"] = "", -- Construction_Mode - +-- ["Per-hog Ammo: Weapons are not shared between hogs"] = "", -- User_Mission_-_Nobody_Laugh -- ["Per team weapons"] = "", -- Continental_supplies -- ["Pfew! That was close!"] = "", -- A_Classic_Fairytale:shadow +-- ["Phosphat"] = "", -- portal +-- ["Physicist"] = "", -- HedgeEditor -- ["Piano Strike"] = "", -- Construction_Mode --- ["Pickhammer"] = "", -- Construction_Mode - --- ["Pings left:"] = "", -- Space_Invasion +-- ["Pikachu"] = "", -- +-- ["Pings left: %d"] = "", -- Space_Invasion +-- ["Pink"] = "", -- +-- ["Pirates"] = "", -- +-- ["Place 2-%d waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place 2 waypoints using the waypoint placement tool."] = "", -- Racer +-- ["Place air mines"] = "", -- HedgeEditor +-- ["Place barrels"] = "", -- HedgeEditor +-- ["Place cleavers"] = "", -- HedgeEditor +-- ["Place/Delete Waypoint: [Left Click]"] = "", -- HedgeEditor +-- ["Place dud mines"] = "", -- HedgeEditor +-- ["Place Gears (and more): Gear Placement Tool"] = "", -- HedgeEditor +-- ["Place Girder: Girder"] = "", -- HedgeEditor +-- ["Place Girder: [Left Click]"] = "", -- HedgeEditor +-- ["Place girders"] = "", -- HedgeEditor +-- ["Place health crates"] = "", -- HedgeEditor +-- ["Place hedgehogs: Place your hedgehogs at the start of the game."] = "", -- WxW +-- ["Placement Mode"] = "", -- HedgeEditor +-- ["Place mines"] = "", -- HedgeEditor +-- ["Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more."] = "", -- HedgeEditor -- ["Place more waypoints using the 'Air Attack' weapon."] = "", +-- ["Place Object: [Left Click]"] = "", -- HedgeEditor +-- ["Place or delete waypoints"] = "", -- HedgeEditor +-- ["Place rubber"] = "", -- HedgeEditor +-- ["Place Rubber: Rubber"] = "", -- HedgeEditor +-- ["Place Sprite: [Left Click]"] = "", -- HedgeEditor +-- ["Place sprites to build land"] = "", -- HedgeEditor +-- ["Place sticky mines"] = "", -- HedgeEditor +-- ["Place targets"] = "", -- HedgeEditor +-- ["Place utility crates"] = "", -- HedgeEditor +-- ["Place Waypoint"] = "", -- HedgeEditor +-- ["Place waypoint"] = "", -- Racer +-- ["Place weapon crates"] = "", -- HedgeEditor +-- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag +-- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos +-- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow --- ["Please place the way-point further from the waterline."] = "", -- Racer --- ["Please place the way-point in the open, within the map boundaries."] = "", -- Racer +-- ["Please click on a crate."] = "", -- HedgeEditor +-- ["Please click on a gear."] = "", -- HedgeEditor +-- ["Please click on a hedgehog, barrel, health crate or dud mine."] = "", -- HedgeEditor +-- ["Please click on a hedgehog."] = "", -- HedgeEditor +-- ["Please place the waypoint further away from the waterline"] = "", -- Racer, TechRacer +-- ["Please place the waypoint in the air and within the map boundaries"] = "", -- TechRacer +-- ["Please place the waypoint in the air, within the map boundaries"] = "", -- Racer +-- ["Please place your hedgehog first!"] = "", -- WxW -- ["Please, stop releasing your \"smoke signals\"!"] = "", -- A_Classic_Fairytale:shadow --- ["Point Blank Combo!"] = "", -- Space_Invasion +-- ["Please wait …"] = "", -- WxW +-- ["Point Blank Combo! +5 points!"] = "", -- Space_Invasion -- ["points"] = --- ["POINTS"] = "", -- Mutant +-- ["--- Points ---"] = "", -- Battalion +-- ["point(s)"] = "", -- TargetPractice, Mutant -- ["Poison"] = +-- ["Poisonous Apple"] = "", -- A_Space_Adventure:fruit02 +-- ["Pokémon"] = "", -- +-- ["Poor %s (%s) died %d times."] = "", -- Mutant -- ["Population"] = "", -- Continental_supplies +-- ["Porkey"] = "", -- -- ["Portal hint: one goes to the destination, and one is the entrance.|"] = "", -- A_Classic_Fairytale:dragon --- ["Portal mission"] = "", -- portal --- ["Power Remaining"] = "", +-- ["Portal Mind Challenge"] = "", -- portal +-- ["Precise flying"] = "", -- A_Space_Adventure:desert03 +-- ["Precise: Remove previous waypoint"] = "", -- Racer +-- ["Precise shooting"] = "", -- A_Space_Adventure:fruit03 +-- ["Predator"] = "", -- portal +-- ["Prepare for battle!"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to fight"] = "", -- A_Space_Adventure:moon01 +-- ["Prepare to flee!"] = "", -- A_Space_Adventure:cosmos -- ["Prepare yourself"] = "", --- ["presice"] = "", -- Continental_supplies --- ["Press [Enter] to accept this configuration."] = "", -- WxW +-- ["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] to begin."] = "", -- A_Classic_Fairytale:first_blood +-- ["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 [Long jump] to accept this configuration and begin placing hedgehogs."] = "", -- WxW +-- ["Press [Long jump] to accept this configuration and start the game."] = "", -- WxW -- ["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 --- ["Private Novak"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["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 +-- ["Prof. Hogevil"] = "", -- A_Space_Adventure:death01, A_Space_Adventure:moon01 +-- ["Pro Killers"] = "", -- Big_Armory -- ["Protect yourselves!|Grenade hint: set the timer with [1-5], aim with [Up]/[Down] and hold [Space] to set power"] = "", -- A_Classic_Fairytale:shadow --- ["Race complexity limit reached."] = "", +-- ["Purple"] = "", -- +-- ["Pyro"] = "", -- HedgeEditor, The_Specialists +-- ["Pyromancer"] = "", -- Battalion +-- ["Race complexity limit reached"] = "", -- Racer, TechRacer -- ["RACER"] = "", +-- ["Racer"] = "", -- Racer +-- ["Racer tool"] = "", -- Racer +-- ["Race"] = "", -- TrophyRace -- ["Rachel"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen --- ["Radar Ping"] = "", -- Space_Invasion +-- ["Radar: Off"] = "", -- WxW +-- ["Radar: On"] = "", -- WxW +-- ["Radar Ping: [High jump]"] = "", -- Space_Invasion +-- ["Radar: Show after crate drop"] = "", -- WxW -- ["Raging Buffalo"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united +-- ["Ramesses"] = "", -- -- ["Ramon"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow --- ["random in range from %i%% to %i%% with period of %i msec"] = "", -- Gravity +-- ["Rank: %s"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Razac"] = "", -- portal +-- ["RC Plane Challenge"] = "", -- User_Mission_-_RCPlane_Challenge -- ["RC Plane"] = "", -- Construction_Mode --- ["RC PLANE TRAINING"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Read the challenge objectives from within the mission for more details."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:desert03, A_Space_Adventure:fruit03 +-- ["Ready for Battle?"] = "", -- A_Space_Adventure:fruit01 -- ["Really?! You thought you could harm me with your little toys?"] = "", -- A_Classic_Fairytale:shadow +-- ["Red"] = "", -- +-- ["Red areas are indestructible."] = "", -- A_Space_Adventure:final -- ["Reflector Shield"] = "", -- Construction_Mode --- ["Reflects enemy projectiles."] = "", -- Construction_Mode +-- ["Reflector Shield: Reflects enemy projectiles."] = "", -- Construction_Mode -- ["Regurgitator"] = "", -- A_Classic_Fairytale:backstab -- ["Reinforcements"] = "", -- A_Classic_Fairytale:backstab +-- ["Remember! Many will seek the anti-gravity device! Now go, hurry up!"] = "", -- A_Space_Adventure:cosmos -- ["Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!"] = "", -- Basic_Training_-_Rope -- ["Remember this, pathetic animal: when the day comes, you will regret your blind loyalty!"] = "", -- A_Classic_Fairytale:shadow --- ["REMOVED"] = "", -- Continental_supplies +-- ["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 --- ["Resurrects dead hedgehogs."] = "", -- Construction_Mode +-- ["- 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! If you get stuck, press [Precise] to try again!"] = "", -- A_Classic_Fairytale:shadow +-- ["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 +-- ["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 --- ["Rope"] = "", -- Construction_Mode --- ["ROPE-KNOCKING"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["Rope to safety"] = "", -- ClimbHome +-- ["Ripe"] = "", -- +-- ["Robert Yellow Apple"] = "", -- A_Space_Adventure:fruit01 +-- ["Rocket"] = "", -- Big_Armory +-- ["Ronald"] = "", -- portal +-- ["Roof"] = "", -- WxW +-- ["Rope-knocking Challenge"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Rope Master"] = "", -- Basic_Training_-_Rope +-- ["Roper"] = "", -- SpeedShoppa +-- ["Ropes and Crates"] = "", -- Challenge_-_Speed_Shoppa_-_Ropes +-- ["Rope Team"] = "", -- Basic_Training_-_Rope -- ["Rope Training"] = "", -- Basic_Training_-_Rope +-- ["Roshi"] = "", -- -- ["Rot Molester"] = "", -- A_Classic_Fairytale:shadow --- ["Round Limit:"] = "", --- ["Round Limit"] = "", --- ["Rounds Complete: "] = "", --- ["Rounds Complete"] = "", --- ["Rubber Band"] = "", -- Construction_Mode +-- ["Rotten"] = "", -- +-- ["Round draw"] = "", -- Racer, TechRacer +-- ["Round %d (Sudden Death in round %d)"] = "", -- Battalion +-- ["Round limit: %d"] = "", -- Racer +-- ["Round Limit: %d"] = "", -- Space_Invasion +-- ["Round limit:"] = "", -- TechRacer +-- ["Rounds complete: %d/%d"] = "", -- Racer, Space_Invasion, TechRacer +-- ["Round score: %d"] = "", -- Space_Invasion +-- ["RS1"] = "", -- A_Space_Adventure:fruit03 +-- ["RS2"] = "", -- A_Space_Adventure:fruit03 +-- ["Rubber"] = "", -- Construction_Mode, HedgeEditor -- ["Rubber Placement Mode"] = "", -- Construction_Mode --- ["RULES"] = "", -- Frenzy, Mutant - ["RULES OF THE GAME [Press ESC to view]"] = "游戏规则 [按下 ESC键 查看]", +-- ["RUBBER PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Rules:"] = "", -- Capture_the_Flag +-- ["RULES:"] = "", -- Frenzy +-- ["Rules: "] = "", -- Mutant +-- ["Run away, you coward!"] = "", -- A_Space_Adventure:desert01 +-- ["Running displacement algorithm …"] = "", -- A_Classic_Fairytale:queen +-- ["Running for survival"] = "", -- A_Space_Adventure:desert02 +-- ["Rusted Diego"] = "", -- -- ["Rusty Joe"] = "", -- A_Classic_Fairytale:queen --- ["s|"] = "", +-- ["Ryu"] = "", -- +-- ["%s: %.1fs"] = "", -- Racer, TechRacer -- ["Sabotage/Flare: [Sabotage all hogs in the circle and deal ~1 dmg OR Fire a cluster up into the air]"] = "", -- Continental_supplies - +-- ["Saint"] = "", -- HedgeEditor, The_Specialists -- ["Salivaslurper"] = "", -- A_Classic_Fairytale:united +-- ["Salty Dog"] = "", -- -- ["Salvation"] = "", -- A_Classic_Fairytale:family -- ["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 +-- ["Sandstorm"] = "", -- A_Space_Adventure:desert01 +-- ["Sandy"] = "", -- A_Space_Adventure:desert01 -- ["Save as many hapless hogs as possible!"] = "", -- ["Save Fell From Heaven!"] = "", -- A_Classic_Fairytale:journey --- ["Save Leaks A Lot!|Hint: The Switch utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."] = "", -- A_Classic_Fairytale:shadow +-- ["Save Level: [Precise]+[4]"] = "", -- HedgeEditor -- ["Save the princess! All your hogs must survive!|Hint: Kill the cyborgs first! Use the ammo very carefully!|Hint: You might want to spare a girder for cover!"] = "", -- A_Classic_Fairytale:family -- ["Save the princess by collecting the crate in under 12 turns!"] = "", -- A_Classic_Fairytale:journey +-- ["Saving Hogera"] = "", -- A_Space_Adventure:cosmos +-- ["%s barely made it past the hogosphere."] = "", -- ClimbHome +-- ["%s bravely climbed up to a dizzy height of %d to reach home."] = "", -- ClimbHome +-- ["Scallywag"] = "", -- -- ["Scalp Muncher"] = "", -- A_Classic_Fairytale:backstab --- ["SCORE"] = "", --- ["Score"] = "", -- Mutant - --- ["sec"] = +-- ["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 +-- ["Scientist"] = "", -- Battalion +-- ["%s climbed home in %d seconds!"] = "", -- ClimbHome +-- ["Score: %d"] = "", -- Space_Invasion +-- ["Score goal: %d"] = "", -- Control +-- ["Score graph"] = "", -- Mutant, Space_Invasion +-- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant +-- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores:"] = "", -- Mutant +-- ["Scores"] = "", -- Mutant +-- ["Scoring: "] = "", -- Mutant +-- ["Script parameter examples:"] = "", -- Gravity +-- ["%s: %d"] = "", -- Capture_the_Flag, Control +-- ["%s: %d (deaths: %d)"] = "", -- Mutant +-- ["%s: Did not finish"] = "", -- Racer, TechRacer +-- ["%s did not finish the race."] = "", -- Racer, TechRacer +-- ["%s didn't expect that."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s doesn’t really know how to handle a rope properly."] = "", -- ClimbHome +-- ["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 find us!"] = "", -- A_Classic_Fairytale:backstab +-- ["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!"] = "再见!", -- ["Segmentation Paul"] = "", -- A_Classic_Fairytale:dragon +-- ["Select a placement mode and read the infos|in the mission panel to learn how to use it."] = "", -- HedgeEditor -- ["Select continent!"] = "", -- Continental_supplies --- ["Select continent first round with the Weapon Menu or by"] = "", -- Continental_supplies --- ["Select difficulty: [Left] - easier or [Right] - harder"] = "", -- A_Classic_Fairytale:first_blood -- ["selected!"] = "", --- ["Set period to negative value for random gravity"] = "", -- Gravity --- ["Setup:|'g=150', where 150 is 150% of normal gravity"] = "", -- Gravity --- ["s"] = "", -- GaudyRacer, Space_Invasion +-- ["Selection Mode"] = "", -- HedgeEditor +-- ["Select, modify, or delete girders, rubbers and sprites"] = "", -- HedgeEditor +-- ["Select/Place/Delete Gear: [Left Click]"] = "", -- HedgeEditor +-- ["Select, reposition and delete gears"] = "", -- HedgeEditor +-- ["Select win/lose condition: [Left], [Right]"] = "", -- HedgeEditor +-- ["Select your continent/weaponset: with the \"Up\" or \"Down\" keys. You can also select one with the weapons menu."] = "", -- Continental_supplies +-- ["Sergey"] = "", -- +-- ["Set Health: [Left Click]"] = "", -- HedgeEditor +-- ["Set Identity: [Left Click]"] = "", -- HedgeEditor +-- ["Set period to negative value for random gravity."] = "", -- Gravity +-- ["Set the health of hogs, health crates, barrels and duds"] = "", -- HedgeEditor +-- ["Set to %d"] = "", -- HedgeEditor +-- ["%s exploded."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell from a high cliff."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s fell too fast."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt unstable."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s felt victim to rope-knocking."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s flew like a rock."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s goes the way of the lemming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sgt. Smith"] = "", -- +-- ["%s had it coming."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s had no chance."] = "", -- User_Mission_-_Rope_Knock_Challenge -- ["... share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey +-- ["%s has been knocked out."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%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 hates Newton."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["She endangered the whole tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["sheepluva"] = "", -- +-- ["Sheepy"] = "", -- -- ["She's behind that tall thingy."] = "", -- A_Classic_Fairytale:family --- ["Shield boosted! +30 power"] = "", --- ["Shield Depleted"] = "", +-- ["Shield boosted! +%d power"] = "", -- Space_Invasion +-- ["Shield depleted"] = "", -- Space_Invasion -- ["Shield is fully recharged!"] = "", --- ["Shield Master!"] = "", --- ["Shield Miser!"] = "", --- ["Shield OFF:"] = "", --- ["Shield ON:"] = "", --- ["Shield Seeker!"] = "", --- ["Shoryuken"] = "", -- Construction_Mode, Frenzy, A_Space_Adventure:death02 +-- ["Shield Master! +10 points!"] = "", -- Space_Invasion +-- ["Shield Miser! +%d points!"] = "", -- Space_Invasion +-- ["Shield OFF: %d power remaining"] = "", -- Space_Invasion +-- ["Shield ON: %d power remaining"] = "", -- Space_Invasion +-- ["Shield Seeker! +10 points!"] = "", -- Space_Invasion +-- ["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 - ["Shotgun Team"] = "霰弹枪队", - ["Shotgun Training"] = "霰弹枪训练", -- ["shots remaining."] = "", +-- ["Sigh."] = "", -- A_Classic_Fairytale:epil -- ["Silly"] = "", --- ["SineGun"] = "", -- Construction_Mode +-- ["Silver"] = "", -- +-- ["Sine Gun"] = "", -- Construction_Mode -- ["Sinky"] = "", -- ["Sirius Lee"] = "", -- A_Classic_Fairytale:enemy - ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s 出局, %d 惩罚分数!", -- Basketball, Knockball - ["%s is out and Team %d|scored a point!| |Score:"] = "%s 出局, %d 得分!", -- Basketball, Knockball +-- ["%s is eliminated!"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Slimer"] = "", -- -- ["Slippery"] = "", -- A_Classic_Fairytale:journey --- ["Slot"] = "", -- Frenzy +-- ["Slot %d: %s"] = "", -- Frenzy -- ["Slot keys save time! (F1-F10 by default)"] = "", -- Frenzy --- ["SLOTS"] = "", -- Frenzy +-- ["Slowpoke"] = "", -- +-- ["%s made it past the hogosphere."] = "", -- ClimbHome +-- ["%s managed to pass half of the distance towards home."] = "", -- ClimbHome +-- ["%s may choose the rules."] = "", -- WxW -- ["Smith 0.97"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.98"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99a"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99b"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 0.99f"] = "", -- A_Classic_Fairytale:enemy -- ["Smith 1.0"] = "", -- A_Classic_Fairytale:enemy +-- ["Smugglers"] = "", -- A_Space_Adventure:desert01 +-- ["%s must skip this turn for rule violation."] = "", -- WxW +-- ["%s never got the ninja diploma."] = "", -- ClimbHome +-- ["%s never wanted to reach for the sky in the first place."] = "", -- ClimbHome +-- ["Sniper! +8 points!"] = "", -- Space_Invasion +-- ["Sniper"] = "", -- HedgeEditor, The_Specialists -- ["Sniper Rifle"] = "", -- Continental_supplies --- ["Sniper!"] = "", -- Space_Invasion ["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 Hog Solo, here we are ..."] = "", -- A_Space_Adventure:cosmos -- ["So humiliating..."] = "", -- A_Classic_Fairytale:first_blood --- ["Some weapons have a second option. Find them with"] = "", -- Continental_supplies +-- ["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 +-- ["So I shook my fist in the air!"] = "", -- A_Classic_Fairytale:epil +-- ["Soldier"] = "", -- HedgeEditor, The_Specialists +-- ["So, let me tell you what I know about Professor Hogevil."] = "", -- A_Space_Adventure:moon02 +-- ["Some parts of the land are indestructible."] = "", -- A_Space_Adventure:fruit03 +-- ["Some sick game of yours?!"] = "", -- A_Classic_Fairytale:queen +-- ["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 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 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"] = "", -- -- ["South America"] = "", -- Continental_supplies -- ["So? What will it be?"] = "", -- A_Classic_Fairytale:shadow --- ["Spawn the crate, and attack!"] = "", -- WxW +-- ["So you are able to launch projectiles into your aiming direction, always at full power."] = "", -- Basic_Training_-_Flying_Saucer +-- ["So you are interested in Professor Hogevil, huh?"] = "", -- A_Space_Adventure:moon02 +-- ["So you basically did the dirty work for us."] = "", -- A_Classic_Fairytale:dragon +-- ["Space Invasion"] = "", -- Space_Invasion +-- ["SPACE INVASION"] = "", -- Space_Invasion +-- ["Spacetrip"] = "", -- A_Space_Adventure:cosmos +-- ["Spawn the crate and attack!"] = "", -- WxW +-- ["Specials: Kings and air generals drop helpers, not weapons"] = "", -- Battalion -- ["Special Weapons:"] = "", -- Continental_supplies +-- ["Speckles"] = "", -- +-- ["Specs"] = "", -- +-- ["Specs Appeal"] = "", -- +-- ["Spectator"] = "", -- +-- ["Speed Shoppa"] = "", -- SpeedShoppa +-- ["Spike"] = "", -- A_Space_Adventure:desert01 +-- ["Spikes"] = "", -- -- ["Spiky Cheese"] = "", -- A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow +-- ["%s, place the first hedgehog!"] = "", -- WxW -- ["Spleenlover"] = "", -- A_Classic_Fairytale:united -- ["Sponge"] = "", ["Spooky Tree"] = "怪树", +-- ["Sprite Erasure Mode"] = "", -- HedgeEditor +-- ["Sprite Modification Mode"] = "", -- HedgeEditor +-- ["SPRITE MODIFICATION MODE"] = "", -- HedgeEditor -- ["Sprite Placement Mode"] = "", -- Construction_Mode +-- ["SPRITE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Sprite Testing Mode"] = "", -- Construction_Mode --- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion +-- ["Squirtle"] = "", -- +-- ["Squishy"] = "", -- +-- ["%s reached home in %.3f seconds. Congratulations!"] = "", -- ClimbHome +-- ["%s (%s) destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s (%s) does not have to feel ashamed for their best height of %d."] = "", -- ClimbHome +-- ["%s (%s) gave short shrift to the invaders: Longest combo of %d!"] = "", -- Space_Invasion +-- ["%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!"] = "", -- Space_Invasion +-- ["%s (%s) hate life and suicided %d times."] = "", -- Mutant +-- ["%s should try the rope training mission first."] = "", -- ClimbHome +-- ["%s (%s) is addicted to killing: %d invaders destroyed in one round."] = "", -- Space_Invasion +-- ["%s (%s) is a hardened hunter: No misses and %d hits in its best round!"] = "", -- Space_Invasion +-- ["%s (%s) is a tumbleweed: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) is good at this: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round."] = "", -- Space_Invasion +-- ["%s skipped ninja classes."] = "", -- ClimbHome +-- ["%s spawned at a really bad position."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s splatted."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) reached a decent peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached a peak height of %d."] = "", -- ClimbHome +-- ["%s (%s) reached for the sky and beyond with a height of %d!"] = "", -- ClimbHome +-- ["%s (%s) reached home in %.3f seconds."] = "", -- ClimbHome +-- ["%s (%s) shot %d invaders and never missed in the best round!"] = "", -- Space_Invasion +-- ["%s (%s) struck like a meteor: %d points in only one round!"] = "", -- Space_Invasion +-- ["%s still had a long way to go."] = "", -- ClimbHome +-- ["%s (%s) tumbles like no other: %d points in one round."] = "", -- Space_Invasion +-- ["%s stumpled."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s (%s) was certainly not afraid of heights: Peak height of %d!"] = "", -- ClimbHome +-- ["%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!"] = "", -- Space_Invasion +-- ["%s (%s) was on fire: Longest combo of %d."] = "", -- Space_Invasion +-- ["%s (%s) was panicly afraid of the water and decided to get in a safe distance of %d from it."] = "", -- ClimbHome +-- ["%s (%s) was the best baby tumbler: %d points in one round."] = "", -- Space_Invasion +-- ["%s (%s) was the greediest hedgehog and collected %d crates."] = "", -- Mutant +-- ["%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!"] = "", -- Space_Invasion +-- ["Star"] = "", -- Big_Armory +-- ["Status update"] = "", -- Racer, TechRacer +-- ["Status Update"] = "", -- Space_Invasion +-- ["Stay away from our weapons!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stay there to flee!"] = "", -- A_Space_Adventure:fruit01 -- ["Steel Eye"] = "", -- A_Classic_Fairytale:queen +-- ["Step 1: Activate your flying saucer but do NOT move yet!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 2: Select your grenade."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 3: Start flying and get yourself right above the target."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 4: Drop your grenade by pressing the [Long jump] key."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Step 5: Get away quickly and land safely anywhere."] = "", -- Basic_Training_-_Flying_Saucer -- ["Step By Step"] = "", -- A_Classic_Fairytale:first_blood -- ["Steve"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["Sticky Mine"] = "", -- Continental_supplies -- ["Sticky Mine Placement Mode"] = "", -- Construction_Mode +-- ["STICKY MINE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Stop, comrades!"] = "", -- A_Classic_Fairytale:queen +-- ["Stop right there, puny worms!"] = "", -- A_Classic_Fairytale:queen +-- ["Street Fighters"] = "", -- +-- ["Strength: %d (multiplier for ammo)"] = "", -- Battalion -- ["Stronglings"] = "", -- A_Classic_Fairytale:shadow - -- ["Structure Placement Mode"] = "", -- Construction_Mode --- ["Structure Placement Tool"] = "", -- 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 -- ["Sundaland"] = "", -- Continental_supplies --- ["Super Weapons"] = "", -- WxW +-- ["Sunflame"] = "", -- Big_Armory +-- ["Super weapons: A few crates contain very powerful weapons."] = "", -- WxW +-- ["Super weapons: %s"] = "", -- WxW +-- ["Support Station: Allows placement of crates."] = "", -- Construction_Mode -- ["Support Station"] = "", -- Construction_Mode --- ["Surf Before Crate"] = "", -- WxW +-- ["Sure!"] = "", -- A_Classic_Fairytale:epil +-- ["Surf Before Crate: %s"] = "", -- WxW +-- ["Surf Before Crate: You must bounce off the water once before you can get crates."] = "", -- WxW -- ["Surfer! +15 points!"] = "", -- Space_Invasion -- ["Surfer!"] = "", -- WxW -- ["Survive!|Hint: Cinematics can be skipped with the [Precise] key."] = "", -- 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 +-- ["%s was a good target."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was close to home."] = "", -- ClimbHome +-- ["%s was damn close to home."] = "", -- ClimbHome +-- ["%s was doomed from the beginning."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was good, but not good enough."] = "", -- ClimbHome +-- ["%s was knocked away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was really unlucky."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was shoved away."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["%s was smashed."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Sweet"] = "", -- +-- ["%s went over a quarter of the way towards home."] = "", -- ClimbHome +-- ["%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 +-- ["%s wins!"] = "", -- Racer, Space_Invasion, TechRacer, ClimbHome +-- ["%s wins with a best time of %.1fs."] = "", -- Racer, TechRacer -- ["switch"] = "", -- Continental_supplies -- ["Switched to "] = "", -- ["Switch Hog"] = "", -- Construction_Mode +-- ["Switch: Toggle crate radar"] = "", -- WxW -- ["Syntax Errol"] = "", -- A_Classic_Fairytale:dragon --- ["tab"] = "", -- Continental_supplies --- ["Tagging Mode"] = "", -- Construction_Mode +-- ["%s, you may choose the rules."] = "", -- WxW +-- ["szczur"] = "", -- +-- ["Tackleberry"] = "", -- +-- ["Tails"] = "", -- -- ["Talk about mixed signals..."] = "", -- A_Classic_Fairytale:dragon --- ["Tardis"] = "", -- Construction_Mode +-- ["Tall Potato"] = "", -- A_Space_Adventure:fruit01 +-- ["Target"] = "", -- HedgeEditor -- ["Target Placement Mode"] = "", -- Construction_Mode +-- ["TARGET PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Target Practice: Bazooka (easy)"] = "", -- Target_Practice_-_Bazooka_easy +-- ["Target Practice: Bazooka (hard)"] = "", -- Target_Practice_-_Bazooka_hard +-- ["Target Practice: Grenade (easy)"] = "", -- Target_Practice_-_Grenade_easy +-- ["Target Practice: Grenade (hard)"] = "", -- Target_Practice_-_Grenade_hard +-- ["Target Practice: Homing Bee"] = "", -- Target_Practice_-_Homing_Bee +-- ["Target Practice: Shotgun"] = "", -- Target_Practice_-_Shotgun +-- ["Targets left: %d"] = "", -- TargetPractice +-- ["Tatsujin"] = "", -- +-- ["Tatters"] = "", -- ["Team %d: "] = "队伍 %d", --- ["Team Scores"] = "", -- Control, Space_Invasion +-- ["Team Identity Mode"] = "", -- HedgeEditor +-- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor +-- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Team Scores:"] = "", -- Control +-- ["Team scores:"] = "", -- Space_Invasion +-- ["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 +-- ["Teleportation Node: Allows teleportation| between other nodes."] = "", -- Construction_Mode -- ["Teleportation Node"] = "", -- Construction_Mode -- ["Teleport"] = "", -- Construction_Mode, Frenzy -- ["Teleport hint: just use the mouse to select the destination!"] = "", -- A_Classic_Fairytale:dragon -- ["Teleport Unsuccessful. Please teleport within a clan teleporter's sphere of influence."] = "", -- Construction_Mode -- ["Thanks!"] = "", -- A_Classic_Fairytale:family +-- ["Thanks, dude! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thanks, man! It really means a lot to me."] = "", -- A_Classic_Fairytale:epil +-- ["Thank you, Dr. Cornelius."] = "", -- A_Space_Adventure:cosmos +-- ["Thank you for meeting me on such a short notice!"] = "", -- A_Space_Adventure:desert01 -- ["Thank you, my hero!"] = "", -- A_Classic_Fairytale:family -- ["Thank you, oh, thank you, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey -- ["Thank you, oh, thank you, my heroes!"] = "", -- A_Classic_Fairytale:journey +-- ["Thanta"] = "", -- A_Space_Adventure:ice01 -- ["That is, indeed, very weird..."] = "", -- A_Classic_Fairytale:united -- ["That makes it almost invaluable!"] = "", -- A_Classic_Fairytale:enemy -- ["That ought to show them!"] = "", -- A_Classic_Fairytale:backstab +-- ["That's all, folks!"] = "", -- A_Classic_Fairytale:epil -- ["That's for my father!"] = "", -- A_Classic_Fairytale:backstab -- ["That shaman sure knows what he's doing!"] = "", -- A_Classic_Fairytale:shadow -- ["That Sinking Feeling"] = "", +-- ["That's just the way it works, you know."] = "", -- A_Classic_Fairytale:queen -- ["That's not our problem!"] = "", -- A_Classic_Fairytale:enemy -- ["That's typical of you!"] = "", -- A_Classic_Fairytale:family +-- ["That's why he always wears a hat since then."] = "", -- A_Space_Adventure:moon02 +-- ["That traitor won't be killing us anymore!"] = "", -- A_Classic_Fairytale:queen -- ["That was just mean!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["That was pointless."] = +-- ["That was pointless. The flag will respawn next round."] = "", -- CTF_Blizzard +-- ["The adventure begins!"] = "", -- A_Space_Adventure:cosmos +-- ["The air bombs are weaker than usual."] = "", -- Battalion +-- ["The aliens respect me, even worship me!"] = "", -- A_Classic_Fairytale:queen +-- ["The ally units share their ammo."] = "", -- A_Space_Adventure:fruit01 -- ["The answer is...entertaintment. You'll see what I mean."] = "", -- A_Classic_Fairytale:backstab --- ["The anti-portal zone is all over the floor, and I have nothing to kill him...Droping something could hurt him enough to kill him..."] = "", -- portal --- ["The Bottom Feeder can score points by killing anyone."] = "", -- Mutant +-- ["The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."] = "", -- portal +-- ["The big bang"] = "", -- A_Space_Adventure:final +-- ["The Boss"] = "", -- +-- ["The boss has fallen! Retreat!"] = "", -- A_Space_Adventure:moon01 -- ["The Bull's Eye"] = "", -- A_Classic_Fairytale:first_blood -- ["The caves are well hidden, they won't find us there!"] = "", -- A_Classic_Fairytale:united +-- ["The clan of the Red Strawberry wants to take over the dominion and overthrow King Pineapple."] = "", -- A_Space_Adventure:fruit01 -- ["The Crate Frenzy"] = "", -- A_Classic_Fairytale:first_blood +-- ["The Customer is King"] = "", -- Challenge_-_Speed_Shoppa_-_ShoppaKing +-- ["The device part has been stolen!"] = "", -- A_Space_Adventure:fruit02 +-- ["The device part is hidden in one of the crates! Go and get it!"] = "", -- A_Space_Adventure:desert01 +-- ["The Devs"] = "", -- -- ["The Dilemma"] = "", -- A_Classic_Fairytale:shadow --- ["The enemy can't move but it might be a good idea to stay out of sight!|"] = "", -- A_Classic_Fairytale:dragon +-- ["The editor weapons and tools have been added!"] = "", -- HedgeEditor +-- ["The editor weapons and tools have been removed!"] = "", -- HedgeEditor +-- ["The enemies aren't many anyway, it is going to be easy!"] = "", -- A_Space_Adventure:fruit01 +-- ["The enemy can't move but it might be a good idea to stay out of sight!"] = "", -- A_Classic_Fairytale:dragon ["The enemy is hiding out on yonder ducky!"] = "敌人藏在那边!", -- ["The Enemy Of My Enemy"] = "", -- A_Classic_Fairytale:enemy +-- ["The explosion is weaker than usual."] = "", -- Battalion +-- ["The fight begins!"] = "", -- A_Space_Adventure:moon01 +-- ["The final part"] = "", -- A_Space_Adventure:death01 -- ["The First Blood"] = "", -- A_Classic_Fairytale:first_blood -- ["The First Encounter"] = "", -- A_Classic_Fairytale:shadow --- ["The first player to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog to kill someone becomes the Mutant."] = "", -- Mutant +-- ["The first hedgehog which scores %d or more wins the game."] = "", -- Mutant +-- ["The first stop"] = "", -- A_Space_Adventure:moon01 +-- ["The first turn will last 25 sec and every other turn 15 sec."] = "", -- A_Space_Adventure:fruit03 -- ["The flag will respawn next round."] = +-- ["The flood has stopped! Challenge over."] = "", -- User_Mission_-_That_Sinking_Feeling -- ["The food bites back"] = "", -- A_Classic_Fairytale:backstab -- ["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 Great Hog in the sky sees your sadness and grants you a boon."] = "", -- Construction_Mode +-- ["The Green Bananas lost, try again!"] = "", -- A_Space_Adventure:fruit01 -- ["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 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 +-- ["The Iron Curtain"] = "", -- -- ["The Journey Back"] = "", -- A_Classic_Fairytale:journey +-- ["The king of %s has died!"] = "", -- Battalion +-- ["The last encounter"] = "", -- A_Space_Adventure:death01 +-- ["The last surviving clan wins."] = "", -- TrophyRace +-- ["The leader escaped. Defeat the rest of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The leader seems scared, he will probably flee."] = "", -- A_Classic_Fairytale:queen -- ["The Leap of Faith"] = "", -- A_Classic_Fairytale:first_blood +-- ["The meteorite has come too close and the anti-gravity device isn't powerful enough to stop it now."] = "", -- A_Space_Adventure:cosmos -- ["The Moonwalk"] = "", -- A_Classic_Fairytale:journey -- ["The Mutant has super-weapons and a lot of health."] = "", -- 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 one is pretty hard! |Tip: You have to do multiple swings!"] = "", -- Basic_Training_-_Rope -- ["Then how do they keep appearing?"] = "", -- A_Classic_Fairytale:shadow +-- ["The Ninja-Samurai Alliance"] = "", -- +-- ["Then prepare for battle!"] = "", -- A_Space_Adventure:death01 +-- ["Then what am I?"] = "", -- A_Classic_Fairytale:epil +-- ["The only woman, huh?"] = "", -- A_Classic_Fairytale:epil +-- ["The opression of the elders, of course!"] = "", -- A_Classic_Fairytale:queen -- ["The other one were all cannibals, spending their time eating the organs of fellow hedgehogs..."] = "", -- A_Classic_Fairytale:first_blood --- ["The player with least points (or most deaths) becomes the Bottom Feeder."] = "", -- Mutant +-- ["The Police"] = "", -- +-- ["The power of love! No, wait, the power of the aliens!"] = "", -- A_Classic_Fairytale:queen +-- ["The RC plane only carries 2 weak bombs."] = "", -- Battalion -- ["There are a variety of structures available to aid you."] = "", -- Construction_Mode +-- ["There are no snarky comments this time."] = "", -- Space_Invasion +-- ["There is one below us!"] = "", -- A_Space_Adventure:ice01 -- ["There must be a spy among us!"] = "", -- A_Classic_Fairytale:backstab -- ["There's more of them? When did they become so hungry?"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["There's nothing more satisfying for me than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty..."] = "", -- A_Classic_Fairytale:journey -- ["There's nothing more satisfying to us than seeing you share your beauty with the world every morning, my princess!"] = "", -- A_Classic_Fairytale:journey -- ["The Rising"] = "", -- A_Classic_Fairytale:first_blood +-- ["The rope won't get reset."] = "", -- A_Space_Adventure:death02 -- ["The Savior"] = "", -- A_Classic_Fairytale:journey -- ["These primitive people are so funny!"] = "", -- A_Classic_Fairytale:backstab -- ["The Shadow Falls"] = "", -- A_Classic_Fairytale:shadow -- ["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 spirits of the ancerstors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood +-- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood +-- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 +-- ["The tunnel entrance is over there."] = "", -- A_Space_Adventure:desert01 +-- ["The tunnel is about to get flooded!"] = "", -- A_Space_Adventure:desert02 -- ["The Tunnel Maker"] = "", -- A_Classic_Fairytale:journey -- ["The Ultimate Weapon"] = "", -- A_Classic_Fairytale:first_blood -- ["The Union"] = "", -- A_Classic_Fairytale:enemy -- ["The village, unprepared, was destroyed by the cyborgs..."] = "", -- A_Classic_Fairytale:journey -- ["The walk of Fame"] = "", -- A_Classic_Fairytale:shadow -- ["The wasted youth"] = "", -- A_Classic_Fairytale:first_blood +-- ["The way you handled your little internal conflicts …"] = "", -- A_Classic_Fairytale:queen -- ["The weapon in that last crate was bestowed upon us by the ancients!"] = "", -- A_Classic_Fairytale:first_blood -- ["The what?!"] = "", -- A_Classic_Fairytale:dragon -- ["The wind whispers that you are ready to become familiar with tools, now..."] = "", -- A_Classic_Fairytale:first_blood -- ["They are all waiting back in the village, haha."] = "", -- A_Classic_Fairytale:enemy --- ["They Call Me Bullseye!"] = "", -- Space_Invasion +-- ["They are up there! Take this rope and hurry!"] = "", -- A_Space_Adventure:moon01 +-- ["They Call Me Bullseye! +16 points!"] = "", -- Space_Invasion -- ["They have weapons we've never seen before!"] = "", -- A_Classic_Fairytale:united -- ["They keep appearing like this. It's weird!"] = "", -- A_Classic_Fairytale:united --- ["They killed "] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["They killed %s! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united -- ["They must be trying to weaken us!"] = "", -- A_Classic_Fairytale:enemy -- ["They never learn"] = "", -- A_Classic_Fairytale:journey +-- ["They stumbled upon a pile of weapons, they seemed to be getting closer."] = "", -- A_Classic_Fairytale:queen -- ["They told us to wear these clothes. They said that this is the newest trend."] = "", -- A_Classic_Fairytale:enemy -- ["They've been manipulating us all this time!"] = "", -- A_Classic_Fairytale:enemy +-- ["They won't hesitate to attack you in order to rob you!"] = "", -- A_Space_Adventure:desert01 +-- ["The Zoo"] = "", -- -- ["Thighlicker"] = "", -- A_Classic_Fairytale:united +-- ["Things are going to get messy around here."] = "", -- A_Space_Adventure:fruit01 +-- ["This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy."] = "", -- Construction_Mode +-- ["This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object"] = "", -- Construction_Mode +-- ["This almost concludes our tutorial."] = "", -- Basic_Training_-_Flying_Saucer +-- ["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 it! It's time to make Fell From Heaven fall for me..."] = "", -- A_Classic_Fairytale:first_blood -- ["This island is the only place left on Earth with grass on it!"] = "", -- A_Classic_Fairytale:enemy +-- ["This is seems like a wealthy hedgehog, nice ..."] = "", -- A_Space_Adventure:desert01 +-- ["This is the Olympic stadium of saucer flying."] = "", -- A_Space_Adventure:ice02 -- ["This is typical!"] = "", -- A_Classic_Fairytale:dragon -- ["This must be some kind of sorcery!"] = "", -- A_Classic_Fairytale:shadow -- ["This must be the caves!"] = "", -- A_Classic_Fairytale:backstab -- ["This one's tricky."] = "", +-- ["This planet seems dangerous!"] = "", -- A_Space_Adventure:cosmos -- ["This rain is really something..."] = "", +-- ["This round’s award for ultimate disappointment goes to: Everyone!"] = "", -- ClimbHome +-- ["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 +-- ["This will certianly come in handy."] = "", -- User_Mission_-_Teamwork_2 +-- ["Thompson"] = "", -- -- ["Those aliens are destroying the island!"] = "", -- A_Classic_Fairytale:family --- ["TIME: "] = "", --- ["Timed Kamikaze!"] = "", --- ["Time Extended!"] = "", --- ["Time Extension"] = "", +-- ["Those were scheduled for disposal anyway."] = "", -- A_Classic_Fairytale:dragon +-- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball +-- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Timbers"] = "", -- +-- ["Time: %.1fs"] = "", -- Racer, TechRacer +-- ["Time Box"] = "", -- Construction_Mode +-- ["Timed Kamikaze! +10 points!"] = "", -- Space_Invasion +-- ["Time extended! +%dsec"] = "", -- Space_Invasion +-- ["Time extension: %ds"] = "", -- Tumbler +-- ["Time for a more interesting stunt, but first just collect the next crate!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Time's up!"] = "", -- Basic_Training_-_Sniper_Rifle, SpeedShoppa, Space_Invasion +-- ["Time’s up!"] = "", -- TargetPractice +-- ["Time to run!"] = "", -- A_Space_Adventure:fruit01 +-- ["Tip: Changing your aim while flying is very difficult, so adjust it before you take off."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: Don't remain for too long in the water, or you won't make it."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: If you get stuck in this training, use \"Skip turn\" to restart the current objective."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tip: See the \"esc\" key (this menu) if you want to see the currently playing teams continent, or that continents specials."] = "", -- Continental_supplies -- ["Tip: The rope physics are different than in the real world, |use it to your advantage!"] = "", -- Basic_Training_-_Rope --- ["Toggle Shield"] = "", +-- ["Tip: You can change your flying saucer|in mid-flight by hitting the [Attack] key twice."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tiyuri"] = "", -- +-- ["Toad"] = "", -- +-- ["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 -- ["To help you, of course!"] = "", -- A_Classic_Fairytale:journey +-- ["To launch a projectile in mid-flight, hold [Precise] and press [Long jump]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Tony"] = "", -- +-- ["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 -- ["Torn Muscle"] = "", -- A_Classic_Fairytale:journey --- [" to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["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 +-- ["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 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 +-- ["To win the game you have to pass into the rings in time."] = "", -- A_Space_Adventure:ice02 +-- ["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"] = "", - --- ["training"] = "", -- portal +-- ["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 +-- ["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 -- ["Tribe"] = "", -- A_Classic_Fairytale:backstab ["TrophyRace"] = "竞速", +-- ["Trunks"] = "", -- +-- ["Try again!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try it now and dive here to collect the crate on the right girder."] = "", -- Basic_Training_-_Flying_Saucer +-- ["Try not to get spotted by the guards!"] = "", -- A_Space_Adventure:cosmos +-- ["Try to be smart and eliminate them quickly. This way you might scare off the rest!"] = "", -- A_Space_Adventure:fruit01 +-- ["Try to keep as many allies alive as possible."] = "", -- A_Space_Adventure:fruit01 +-- ["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 ["T_T"] = "T_T", --- ["Tumbling Time Extended!"] = "", --- ["Turns until Sudden Death: "] = "", -- A_Classic_Fairytale:dragon --- [" turns until Sudden Death! Better hurry!"] = "", -- A_Classic_Fairytale:dragon --- ["Turn Time"] = "", +-- ["Tumbler"] = "", -- Tumbler +-- ["Turns: Hogs get %d random weapon(s) from their pool"] = "", -- Battalion +-- ["Turns: King's health is set to %d%% of the team health"] = "", -- Battalion +-- ["Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"] = "", -- Battalion +-- ["Turns until arrival: %d"] = "", -- A_Classic_Fairytale:backstab +-- ["Turn Time: %dsec"] = "", -- Space_Invasion +-- ["Twenty-Twenty"] = "", -- +-- ["Two flowers: All missions complete"] = "", -- A_Space_Adventure:cosmos -- ["Two little hogs cooperating, getting past obstacles..."] = "", -- A_Classic_Fairytale:journey +-- ["Ugly Mug"] = "", -- -- ["Uhm...I met one of them and took his weapons."] = "", -- A_Classic_Fairytale:shadow +-- ["Uhmm, it's … uhm … my ring!"] = "", -- A_Classic_Fairytale:queen -- ["Uhmm...ok no."] = "", -- A_Classic_Fairytale:enemy --- ["ULTRA KILL"] = "", -- Mutant +-- ["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 +-- ["Under the meteorites shadow ..."] = "", -- A_Space_Adventure:cosmos -- ["Unexpected Igor"] = "", -- A_Classic_Fairytale:dragon -- ["Unique new weapons"] = "", -- Continental_supplies -- ["Unit"] = "", -- ["Unit 0x0007"] = "", -- A_Classic_Fairytale:family +-- ["Unit 189"] = "", -- +-- ["Unit 234"] = "", -- +-- ["Unit 333"] = "", -- -- ["Unit 334a$7%;.*"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:queen, A_Classic_Fairytale:united ["Unit 3378"] = "3378", +-- ["Unit 485"] = "", -- +-- ["Unit 527"] = "", -- +-- ["Unit 638"] = "", -- +-- ["Unit 709"] = "", -- -- ["Unit 835"] = "", +-- ["Unit 883"] = "", -- -- ["United We Stand"] = "", -- A_Classic_Fairytale:united -- ["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!"] = "", -- ["Unsuspecting Louts"] = "", -- User_Mission_-_Rope_Knock_Challenge --- ["[Up], [Down] to aim, [Space] to shoot!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Up/Down: Change placement mode"] = "", -- HedgeEditor +-- ["Up/down: Choose crate type"] = "", -- Construction_Mode +-- ["Upper-class elite pilot"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Use it wisely!"] = "", -- A_Classic_Fairytale:dragon -- ["Use it with precaution!"] = "", -- A_Classic_Fairytale:first_blood -- ["User Challenge"] = "", --- ["Use the air-attack weapons and the arrow keys to select structures."] = "", -- Construction_Mode +-- ["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 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 -- ["Use the rope to get on the head of the mole, young one!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Use the rope to get to the crate"] = "", -- A_Space_Adventure:cosmos -- ["Use the rope to knock your enemies to their doom."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Use the rope to quickly get to the surface!"] = "", -- A_Space_Adventure:desert02 +-- ["Use the saucer and fly away"] = "", -- A_Space_Adventure:cosmos +-- ["Use the saucer and fly to the moon"] = "", -- A_Space_Adventure:cosmos +-- ["Use the shield to protect yourself from bazookas."] = "", -- Space_Invasion +-- ["Use the structure placer to place structures."] = "", -- Construction_Mode +-- ["Use your ammo wisely."] = "", -- A_Space_Adventure:desert01 +-- ["Use your available weapons in order to eliminate the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 -- ["Use your ready time to think."] = "", -- Frenzy +-- ["Use your rope to collect all crates as fast as possible."] = "", -- SpeedShoppa ["Use your rope to get from start to finish as fast as you can!"] = "抓起绳子飞向目的地,越快越好。", -- ["Utility Crate Placement Mode"] = "", -- Construction_Mode --- ["Vampirism"] = "", -- Construction_Mode +-- ["UTILITY CRATE PLACEMENT MODE"] = "", -- HedgeEditor +-- ["Utility crates extend your time."] = "", -- Tumbler +-- ["Variants: Hogs will be randomized from 12 different variants"] = "", -- Battalion +-- ["Variants: Kings and air generals are disabled"] = "", -- Battalion +-- ["Variants: The last hog of each team will be a king"] = "", -- Battalion -- ["Vedgies"] = "", -- A_Classic_Fairytale:journey +-- ["Vega"] = "", -- -- ["Vegan Jack"] = "", -- A_Classic_Fairytale:enemy +-- ["Very valuable, haha!"] = "", -- A_Classic_Fairytale:queen -- ["Victory!"] = "", -- Basic_Training_-_Rope +-- ["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 --- ["Walls Left"] = "", -- WxW --- ["Walls Required"] = "", -- WxW --- ["WALL TO WALL"] = "", -- WxW +-- ["Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"] = "", -- A_Space_Adventure:cosmos +-- ["Vladimir"] = "", -- +-- ["Void"] = "", -- Big_Armory +-- ["Voldemort"] = "", -- portal +-- ["Voltorb"] = "", -- +-- ["Wait a moment …"] = "", -- A_Space_Adventure:final +-- ["Wall Before Crate: You must touch the marked wall before you can get crates."] = "", -- WxW +-- ["Walls Before Crate: You must touch the %d marked walls before you can get crates."] = "", -- WxW +-- ["Wall set: No walls"] = "", -- WxW +-- ["Wall set: %s (%d walls)"] = "", -- WxW +-- ["Wall set: %s"] = "", -- WxW +-- ["Walls left: %d"] = "", -- WxW +-- ["Wall to wall"] = "", -- WxW +-- ["Waluigi"] = "", -- -- ["Wannabe Flyboys"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Wannabe Shoppsta"] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["Wario"] = "", -- +-- ["Warning: Never ever leave the flying saucer while in water!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["WARNING: Sabotage detected!"] = "", -- Continental_supplies +-- ["Warrior"] = "", -- Battalion +-- [" was extracted from the scheme|- This continent will be able to use the specials from the other continents!"] = "", -- Continental_supplies +-- ["WatchBot 4000"] = "", -- User_Mission_-_Teamwork_2 -- ["Watch your steps, young one!"] = "", -- A_Classic_Fairytale:first_blood --- ["Watermelon Bomb"] = "", -- Construction_Mode +-- ["Watermelon Heart"] = "", -- A_Space_Adventure:fruit02 +-- ["Water: Rises by 37 per turn"] = "", -- Battalion +-- ["Waypoint Editing Mode"] = "", -- HedgeEditor +-- ["WAYPOINT EDITING MODE"] = "", -- HedgeEditor -- ["Waypoint placed."] = "", --- ["Way-Points Remaining"] = "", +-- ["Waypoint placed. Available points remaining: %d"] = "", -- Racer +-- ["Waypoint placement phase"] = "", -- Racer +-- ["Waypoint removed. Available points: %d"] = "", -- Racer +-- ["Waypoints remaining: %d"] = "", -- Racer, TechRacer -- ["Weaklings"] = "", -- A_Classic_Fairytale:shadow -- ["We all know what happens when you get frightened..."] = "", -- A_Classic_Fairytale:first_blood -- ["Weapon Crate Placement Mode"] = "", -- Construction_Mode +-- ["WEAPON CRATE PLACEMENT MODE"] = "", -- HedgeEditor -- ["Weapon Filter"] = "", -- Construction_Mode +-- ["Weapon Filter: Dematerializes all ammo| carried by enemies entering it."] = "", -- Construction_Mode -- ["weaponschemes"] = "", -- Continental_supplies +-- ["Weapons: Each team starts with %d weapon points"] = "", -- Battalion +-- ["Weapons: Hogs will get 1 out of 3 weapons randomly each turn"] = "", -- Battalion +-- ["Weapons: Nearly every hog variant gets 1 kamikaze"] = "", -- Battalion -- ["Weapons Reset"] = "", --- ["Weapons reset."] = "", -- Highlander +-- ["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 -- ["We can't hold them up much longer!"] = "", -- A_Classic_Fairytale:united -- ["We can't let them take over our little island!"] = "", -- A_Classic_Fairytale:enemy +-- ["We come in peace! Just let our friends go!"] = "", -- A_Classic_Fairytale:queen +-- ["We could just have blown up the meteorite from the the beginning!"] = "", -- A_Space_Adventure:final +-- ["We don't have time for that now!"] = "", -- A_Classic_Fairytale:queen -- ["We have no time to waste..."] = "", -- A_Classic_Fairytale:journey -- ["We have nowhere else to live!"] = "", -- A_Classic_Fairytale:enemy +-- ["We have spotted the enemy! We'll attack when the enemies start gathering!"] = "", -- A_Space_Adventure:fruit02 +-- ["We have to find our folk!"] = "", -- A_Classic_Fairytale:queen +-- ["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, Leaks A Lot!"] = "", -- A_Classic_Fairytale:journey +-- ["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 +-- ["Welcome to the meteorite!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["Welcome to the Planet of Ice!"] = "", -- A_Space_Adventure:cosmos -- ["Well done."] = "", -- ["We'll give you a problem then!"] = "", -- A_Classic_Fairytale:enemy +-- ["We'll play a game first."] = "", -- A_Space_Adventure:moon02 -- ["We'll spare your life for now!"] = "", -- A_Classic_Fairytale:backstab +-- ["Well, that escalated quickly!"] = "", -- ClimbHome +-- ["Well that was an unnecessary act of violence."] = "", -- A_Classic_Fairytale:epil -- ["Well, that was a waste of time."] = "", -- A_Classic_Fairytale:dragon +-- ["We'll use our communicators to contact you."] = "", -- A_Space_Adventure:cosmos -- ["Well, well! Isn't that the cutest thing you've ever seen?"] = "", -- A_Classic_Fairytale:journey -- ["Well, yes. This was a cyborg television show."] = "", -- A_Classic_Fairytale:enemy +-- ["Well, you're about to wake up!"] = "", -- A_Classic_Fairytale:queen -- ["We made sure noone followed us!"] = "", -- A_Classic_Fairytale:backstab +-- ["We need it to get split into at least two parts."] = "", -- A_Space_Adventure:cosmos +-- ["We need to go back!"] = "", -- A_Classic_Fairytale:queen +-- ["We need to hurry!"] = "", -- A_Classic_Fairytale:queen -- ["We need to move!"] = "", -- A_Classic_Fairytale:united -- ["We need to prevent their arrival!"] = "", -- A_Classic_Fairytale:backstab -- ["We need to warn the village."] = "", -- A_Classic_Fairytale:shadow +-- ["We need you to go there and detonate them yourself! Good luck!"] = "", -- A_Space_Adventure:cosmos +-- ["We oppressed her, the only woman in the tribe!"] = "", -- A_Classic_Fairytale:epil +-- ["We're terribly sorry!"] = "", -- A_Classic_Fairytale:epil +-- ["We risk our lives going through challenges."] = "", -- A_Classic_Fairytale:queen +-- ["We should better report this and continue our watch!"] = "", -- A_Space_Adventure:cosmos -- ["We should head back to the village now."] = "", -- A_Classic_Fairytale:shadow +-- ["We, the youth, have to constantly prove our value."] = "", -- A_Classic_Fairytale:queen +-- ["We trusted you, you fool!"] = "", -- A_Classic_Fairytale:queen -- ["We were trying to save her and we got lost."] = "", -- A_Classic_Fairytale:family +-- ["We were your home! Your family!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't accept you destroying our village!"] = "", -- A_Classic_Fairytale:queen +-- ["We won't let you hurt any more of us!"] = "", -- A_Classic_Fairytale:queen -- ["We won't let you hurt her!"] = "", -- A_Classic_Fairytale:journey +-- ["We work and work until we sweat blood."] = "", -- A_Classic_Fairytale:queen -- ["What?! A cannibal? Here? There is no time to waste! Come, you are prepared."] = "", -- A_Classic_Fairytale:first_blood +-- ["What?!"] = "", -- A_Classic_Fairytale:queen -- ["What a douche!"] = "", -- A_Classic_Fairytale:enemy -- ["What am I gonna...eat, yo?"] = "", -- A_Classic_Fairytale:family -- ["What are you doing at a distance so great, young one?"] = "", -- A_Classic_Fairytale:first_blood @@ -1036,13 +2334,22 @@ -- ["What a ride!"] = "", -- A_Classic_Fairytale:shadow -- ["What a strange cave!"] = "", -- A_Classic_Fairytale:dragon -- ["What a strange feeling!"] = "", -- A_Classic_Fairytale:backstab +-- ["What could you possibly forget in that cage?"] = "", -- A_Classic_Fairytale:queen +-- ["What does it look like?"] = "", -- A_Classic_Fairytale:queen -- ["What do my faulty eyes observe? A spy!"] = "", -- A_Classic_Fairytale:first_blood +-- ["What do you say? Are you in?"] = "", -- A_Space_Adventure:fruit02 +-- ["What do you say? Will you fight for us?"] = "", -- A_Space_Adventure:fruit01 +-- ["What do you want to do?"] = "", -- A_Space_Adventure:fruit01 -- ["Whatever floats your boat..."] = "", -- A_Classic_Fairytale:shadow --- [" What !! For all of this struggle i just win some ... TIME o0"] = "", -- portal --- ["What has "] = "", -- A_Classic_Fairytale:backstab +-- ["What?! For all this struggle I just win some ... time? Oh dear!"] = "", -- portal +-- ["What has %s ever done to you?"] = "", -- A_Classic_Fairytale:backstab -- ["What? Here? How did they find us?!"] = "", -- A_Classic_Fairytale:backstab +-- ["What? Is it over already?"] = "", -- ClimbHome +-- ["What is it that you forgot?"] = "", -- A_Classic_Fairytale:queen -- ["What is this place?"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy +-- ["What oppression? You were the most unoppressed member of the tribe!"] = "", -- A_Classic_Fairytale:queen -- ["What shall we do with the traitor?"] = "", -- A_Classic_Fairytale:backstab +-- ["What the?"] = "", -- A_Classic_Fairytale:queen -- ["WHAT?! You're the ones attacking us!"] = "", -- A_Classic_Fairytale:enemy -- ["When?"] = "", -- A_Classic_Fairytale:enemy -- ["When I find it..."] = "", -- A_Classic_Fairytale:dragon @@ -1056,31 +2363,39 @@ -- ["Where do you get that?!"] = "", -- A_Classic_Fairytale:enemy -- ["Where have you been?!"] = "", -- A_Classic_Fairytale:backstab -- ["Where have you been?"] = "", -- A_Classic_Fairytale:united --- ["Whip"] = "", -- Construction_Mode --- ["? Why?"] = "", -- A_Classic_Fairytale:backstab --- ["Why "] = "", -- A_Classic_Fairytale:backstab --- ["! Why?!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united +-- ["While in modification mode, you can change|the LandFlag by clicking on an object."] = "", -- HedgeEditor +-- ["White Tee"] = "", -- A_Space_Adventure:ice01 +-- ["Who's there?! I'll get you!"] = "", -- A_Space_Adventure:desert01 +-- ["Why?"] = "", -- A_Classic_Fairytale:queen -- ["Why are you doing this?"] = "", -- A_Classic_Fairytale:journey -- ["Why are you helping us, uhm...?"] = "", -- A_Classic_Fairytale:family -- ["Why can't he just let her go?!"] = "", -- A_Classic_Fairytale:family +-- ["… why did I risk my life to collect all the parts of the anti-gravity device?"] = "", -- A_Space_Adventure:final +-- ["Why did you do this?"] = "", -- A_Classic_Fairytale:queen +-- ["Why did you kill your father?"] = "", -- A_Classic_Fairytale:queen -- ["Why do men keep hurting me?"] = "", -- A_Classic_Fairytale:first_blood +-- ["Why do you always have to call me names?"] = "", -- A_Classic_Fairytale:queen +-- ["Why do you keep betraying us?"] = "", -- A_Classic_Fairytale:queen -- ["Why do you not like me?"] = "", -- A_Classic_Fairytale:shadow -- ["Why do you want to take over our island?"] = "", -- A_Classic_Fairytale:enemy -- ["Why me?!"] = "", -- A_Classic_Fairytale:backstab +-- ["Why %s? Why?"] = "", -- A_Classic_Fairytale:backstab +-- ["Why, why, why, why!"] = "", -- A_Classic_Fairytale:queen -- ["Why would they do this?"] = "", -- A_Classic_Fairytale:backstab -- ["- Will Get 1-3 random weapons"] = "", -- Continental_supplies --- ["- Will give you an airstrike every fifth turn."] = "", -- Continental_supplies -- ["- Will give you a parachute every second turn."] = "", -- Continental_supplies - - -- ["Will this ever end?"] = "", --- ["WINNER IS "] = "", -- Mutant --- ["WINNING TIME: "] = "", +-- ["Will you give me the other parts?"] = "", -- A_Space_Adventure:death01 +-- ["Win"] = "", -- A_Space_Adventure:ice01 +-- ["Winner: %s"] = "", -- Mutant +-- ["Winning time: %s"] = "", -- Racer, TechRacer -- ["Wise Oak"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:epil, A_Classic_Fairytale:family, A_Classic_Fairytale:queen -- ["With Dense Cloud on the land of shadows, I'm the village's only hope..."] = "", -- A_Classic_Fairytale:journey --- ["With the rest of the tribe gone, it was up to "] = "", -- A_Classic_Fairytale:dragon +-- ["With the rest of the tribe gone, it was up to %s to save the village."] = "", -- A_Classic_Fairytale:dragon -- ["Worry not, for it is a peaceful animal! There is no reason to be afraid..."] = "", -- A_Classic_Fairytale:first_blood -- ["Wow, what a dream!"] = "", -- A_Classic_Fairytale:backstab +-- ["Xeli"] = "", -- +-- ["Xerxes"] = "", -- -- ["Y3K1337"] = "", -- A_Classic_Fairytale:journey, A_Classic_Fairytale:shadow -- ["Yay, we won!"] = "", -- A_Classic_Fairytale:enemy -- ["Y Chwiliad"] = "", -- A_Classic_Fairytale:dragon @@ -1088,69 +2403,226 @@ -- ["Yeah, sure! I died. Hillarious!"] = "", -- A_Classic_Fairytale:backstab -- ["Yeah, take that!"] = "", -- A_Classic_Fairytale:dragon -- ["Yeah? Watcha gonna do? Cry?"] = "", -- A_Classic_Fairytale:journey +-- ["Yeah, well, for some dude to be happy, some other dude has to suffer."] = "", -- A_Classic_Fairytale:queen +-- ["Yellow"] = "", -- +-- ["Yellow Pepper"] = "", -- A_Space_Adventure:fruit01 +-- ["Yellow Watermelons"] = "", -- A_Space_Adventure:fruit01 -- ["Yes!"] = "", -- A_Classic_Fairytale:enemy +-- ["Yes, but you're … different!"] = "", -- A_Classic_Fairytale:queen -- ["Yes, yeees! You are now ready to enter the real world!"] = "", -- A_Classic_Fairytale:first_blood +-- ["Yeti"] = "", -- +-- ["Yikes!"] = "", -- A_Space_Adventure:desert01 +-- ["Yo, dude! Get away from our weapons!"] = "", -- A_Classic_Fairytale:queen -- ["Yo, dude, we're here, too!"] = "", -- A_Classic_Fairytale:family --- ["You are far from home, and the water is rising, climb up as high as you can!"] = "", -- ClimbHome +-- ["Yo, escort my buttocks!"] = "", -- A_Classic_Fairytale:queen +-- ["Yoshi"] = "", -- +-- ["Yo, the aliens gave me plants. Medicinal plants. Lots of it."] = "", -- A_Classic_Fairytale:queen +-- ["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."] = "", -- ClimbHome -- ["You are given the chance to turn your life around..."] = "", -- A_Classic_Fairytale:shadow +-- ["You are in control of all the active ally units."] = "", -- A_Space_Adventure:fruit01 +-- ["You are indeed the best PAotH pilot."] = "", -- A_Space_Adventure:desert03 +-- ["You are out of danger, time to go to the moon!"] = "", -- A_Space_Adventure:cosmos -- ["You are playing with our lives here!"] = "", -- A_Classic_Fairytale:enemy --- ["! You bastards!"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:united --- ["You bear impressive skills, "] = "", -- A_Classic_Fairytale:dragon --- ["You can't fire a portal on the blue surface"] = "", -- portal +-- ["You are sabotaged, RUN!"] = "", -- Continental_supplies +-- ["You are the one who fled! So, you are alive."] = "", -- A_Space_Adventure:fruit02 +-- ["You bear impressive skills, %s!"] = "", -- A_Classic_Fairytale:dragon +-- ["You can always trust me!"] = "", -- A_Classic_Fairytale:epil +-- ["You can always trust me! I love you!"] = "", -- A_Classic_Fairytale:epil +-- ["You can avoid some battles."] = "", -- A_Space_Adventure:desert01 +-- ["You can choose another planet by replaying this mission."] = "", -- A_Space_Adventure:cosmos +-- ["You can dive with your flying saucer!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can even change your aiming direction in mid-flight if you first hold [Precice] and then press [Up] or [Down]."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You can further customize the race by changing the scheme script paramater."] = "", -- TechRacer +-- ["You can only use the sniper rifle or the watermelon bomb."] = "", -- A_Space_Adventure:fruit03 +-- ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "", -- A_Classic_Fairytale:epil +-- ["- You can switch between hogs at the start of your turns. (Not first one)"] = "", -- Continental_supplies +-- ["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 choose well, Hog Solo!"] = "", -- 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 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 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 +-- ["You drove the minions away."] = "", -- A_Space_Adventure:moon01 +-- ["You earned the \"Rope Master\" achievement for finishing in under 50 seconds."] = "", -- Basic_Training_-_Rope +-- ["You endangered your whole tribe, you bastard!"] = "", -- A_Classic_Fairytale:queen +-- ["You failed!"] = "", -- Basic_Training_-_Rope +-- ["You failed to kill all enemies in a single turn."] = "", -- Big_Armory +-- ["You failed to kill all enemies in this turn."] = "", -- Big_Armory +-- ["You fought bravely and you helped us win this battle!"] = "", -- A_Space_Adventure:fruit02 +-- ["You give me no choice!"] = "", -- A_Classic_Fairytale:queen +-- ["You got a killer mask there, amigo!"] = "", -- A_Classic_Fairytale:epil +-- ["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 "] = "", -- A_Classic_Fairytale:dragon +-- ["You have acquired the last device part."] = "", -- A_Space_Adventure:death01 +-- ["You have beaten the challenge!"] = "", -- ClimbHome -- ["You have been giving us out to the enemy, haven't you!"] = "", -- A_Classic_Fairytale:backstab --- ["You have been respawned, at your last checkpoint!"] = "", -- Basic_Training_-_Rope --- ["You have been respawned, be more carefull next time!"] = "", -- Basic_Training_-_Rope -- ["You have chosen the perfect moment to leave."] = "", -- A_Classic_Fairytale:united +-- ["You have chosen to fight!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have chosen to flee."] = "", -- A_Space_Adventure:fruit01 +-- ["You have collected %d out of %d crate(s)."] = "", -- SpeedShoppa +-- ["You have completed this challenge in %.2f s (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have destroyed all targets!"] = "", -- TargetPractice +-- ["You have destroyed all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have destroyed %d of %d targets."] = "", -- Basic_Training_-_Bazooka +-- ["You have destroyed %d of %d targets (+%d points)."] = "", -- Basic_Training_-_Sniper_Rifle, TargetPractice +-- ["You have dropped %d missiles."] = "", -- User_Mission_-_RCPlane_Challenge +-- ["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 -- ["You have finally figured it out!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have finished the Basic Rope Training!"] = "", -- Basic_Training_-_Rope +-- ["You have finished the bazooka training!"] = "", -- Basic_Training_-_Bazooka +-- ["You have finished the challenge in %.3f s."] = "", -- SpeedShoppa +-- ["You have finished the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["You have finished the Flying Saucer Training!"] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have finished the target practice!"] = "", -- TargetPractice -- ["You have kidnapped our whole tribe!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have killed all enemies."] = "", -- Big_Armory -- ["You have killed an innocent hedgehog!"] = "", -- A_Classic_Fairytale:backstab +-- ["You have killed %d of 16 hedgehogs (+%d points)."] = "", -- User_Mission_-_Rope_Knock_Challenge +-- ["You have launched %d bazookas."] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard, Basic_Training_-_Bazooka +-- ["You have launched %d homing bees."] = "", -- Target_Practice_-_Homing_Bee +-- ["You have made %d shots."] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have managed to catch the blue hedgehog in %.3f seconds."] = "", -- A_Space_Adventure:moon02 +-- ["You have never worked a bit in your life!"] = "", -- A_Classic_Fairytale:queen +-- ["You have nothing to be afraid of now."] = "", -- A_Classic_Fairytale:epil +-- ["You haven't rescued anyone."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have obtained an achievement: Lively Lifeguard"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You have perfectly beaten the challenge!"] = "", -- User_Mission_-_RCPlane_Challenge -- ["You have proven yourself worthy to see our most ancient secret!"] = "", -- A_Classic_Fairytale:first_blood -- ["You have proven yourselves worthy!"] = "", -- A_Classic_Fairytale:enemy +-- ["You have reached the take-off area successfully!"] = "", -- A_Space_Adventure:fruit01 +-- ["You have rescued H and Dr. Cornelius."] = "", -- A_Space_Adventure:death01 ["You have SCORED!!"] = "得分", --- ["You have to destroy 12 targets in 180 seconds"] = "", -- Basic_Training_-_Cluster_Bomb +-- ["You have shot %d times."] = "", -- TargetPractice +-- ["You have successfully eliminated Professor Hogevil."] = "", -- A_Space_Adventure:death01 +-- ["You have successfully finished the campaign!"] = "", -- A_Classic_Fairytale:epil +-- ["You have successfully finished the sniper rifle training!"] = "", -- Basic_Training_-_Sniper_Rifle +-- ["You have thrown %d cluster bombs."] = "", -- Target_Practice_-_Cluster_Bomb +-- ["You have thrown %d grenades."] = "", -- Target_Practice_-_Grenade_easy, Target_Practice_-_Grenade_hard +-- ["You have to be careful and must not die!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to catch the other hog 3 times."] = "", -- A_Space_Adventure:moon02 +-- ["You have to complete the main mission on moon in order to travel to other planets."] = "", -- A_Space_Adventure:cosmos +-- ["You have to continue alone from now on."] = "", -- A_Space_Adventure:cosmos +-- ["You have to destroy all the explosives without dying!"] = "", -- A_Space_Adventure:final +-- ["You have to destroy all the targets."] = "", -- A_Space_Adventure:desert03 +-- ["You have to destroy the target above by dropping a grenade on it from your flying saucer."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to destroy two targets, but the previous technique would be very difficult or dangerous to use."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You have to eliminate all the enemies."] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["You have to eliminate all the visible enemies."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to get the weapons and rescue the PAotH researchers."] = "", -- A_Space_Adventure:moon01 +-- ["You have to get to the left-most land and remove any enemy hog from there."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to go back to the moon!"] = "", -- A_Space_Adventure:cosmos +-- ["You have to move upwards, not downwards, %s!"] = "", -- ClimbHome +-- ["You have to reach the left-most place on the map."] = "", -- A_Space_Adventure:fruit01 +-- ["You have to stand very close to him"] = "", -- A_Space_Adventure:moon02 +-- ["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 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 +-- ["You have violated PAotH regulations!"] = "", -- A_Space_Adventure:cosmos -- ["You have won the game by proving true cooperative skills!"] = "", -- A_Classic_Fairytale:enemy -- ["You just appeared out of thin air!"] = "", -- A_Classic_Fairytale:backstab +-- ["You just can't let it go, can you!"] = "", -- A_Classic_Fairytale:queen -- ["You just committed suicide..."] = "", -- A_Classic_Fairytale:shadow -- ["You killed my father, you monster!"] = "", -- A_Classic_Fairytale:backstab -- ["You know...taking a stroll."] = "", -- A_Classic_Fairytale:backstab -- ["You know what? I don't even regret anything!"] = "", -- A_Classic_Fairytale:backstab +-- ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."] = "", -- A_Space_Adventure:fruit03 +-- ["You'll get extra time in case you need it when you pass a ring."] = "", -- A_Space_Adventure:ice02 +-- ["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 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 --- ["You may only spawn 5 crates per turn."] = "", -- Construction_Mode --- ["You may only use 1 Extra Time per turn."] = "", -- Construction_Mode +-- ["You may only place 1 Extra Time crate per turn."] = "", -- Construction_Mode +-- ["You may only place %d crates per round."] = "", -- Construction_Mode +-- ["- You may only score when your flag is in your base"] = "", -- Capture_the_Flag -- ["You meatbags are pretty slow, you know!"] = "", -- A_Classic_Fairytale:enemy -- ["You might want to find a way to instantly kill arriving cannibals!"] = "", -- A_Classic_Fairytale:backstab +-- ["You must attack from a rope, after you collected a crate!"] = "", -- WxW +-- ["You must first collect a crate before you attack!"] = "", -- WxW +-- ["You must survive the flood in order to score."] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["You never give me plants!"] = "", -- A_Classic_Fairytale:queen -- ["Young one, you are telling us that they can instantly change location without a shaman?"] = "", -- A_Classic_Fairytale:united +-- ["You now have infinite fuel, grenades and bazookas for fun."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have 2 flying saucers this time."] = "", -- Basic_Training_-_Flying_Saucer +-- ["You only have one flying saucer this time."] = "", -- Basic_Training_-_Flying_Saucer -- ["You probably know what to do next..."] = "", -- A_Classic_Fairytale:first_blood --- ["Your deaths will be avenged, cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your accuracy was %.1f%%."] = "", -- Basic_Training_-_Bazooka, TargetPractice +-- ["Your accuracy was %.1f%% (+%d points)."] = "", -- TargetPractice +-- ["Your deaths will be avenged, Cannibals!"] = "", -- A_Classic_Fairytale:enemy +-- ["Your deaths will be avenged, Natives!"] = "", -- 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 -- ["You're a pathetic liar!"] = "", -- A_Classic_Fairytale:backstab -- ["You're funny!"] = "", -- A_Classic_Fairytale:journey --- ["You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower"] = "", -- Basic_Training_-_Rope +-- ["You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower."] = "", -- Basic_Training_-_Rope +-- ["You're on your way to freeing your tribe!"] = "", -- A_Classic_Fairytale:queen -- ["You're pathetic! You are not worthy of my attention..."] = "", -- A_Classic_Fairytale:shadow -- ["You're probably wondering why I bought you back..."] = "", -- A_Classic_Fairytale:backstab +-- ["Your escape took you %d turns."] = "", -- A_Space_Adventure:desert02 +-- ["You're so brave! I feel safe with you."] = "", -- A_Classic_Fairytale:epil +-- ["You're some piece of hypocrite junkie!"] = "", -- A_Classic_Fairytale:queen -- ["You're terrorizing the forest...We won't catch anything like this!"] = "", -- A_Classic_Fairytale:shadow +-- ["You retrieved the lost part."] = "", -- A_Space_Adventure:fruit02 +-- ["Your fastest escape so far: %d turns"] = "", -- A_Space_Adventure:desert02 +-- ["Your fastest victory so far: %d rounds"] = "", -- A_Space_Adventure:death02, A_Space_Adventure:fruit03 +-- ["Your first destination is the moon in order to get more fuel."] = "", -- A_Space_Adventure:cosmos +-- ["Your hedgehog died!"] = "", -- User_Mission_-_That_Sinking_Feeling +-- ["Your hedgehog was panicly afraid of the water and decided to go in a safe distance of %d from it."] = "", -- ClimbHome +-- ["Your height over time"] = "", -- ClimbHome -- ["Your hogs must survive!"] = "", -- A_Classic_Fairytale:journey -- ["Your movement skills will be evaluated now."] = "", -- A_Classic_Fairytale:first_blood --- ["You saved"] = "", +-- ["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 +-- ["You see, hedgehog spikes are very, very valuable."] = "", -- A_Classic_Fairytale:queen +-- ["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"] = "", -- -- ["Zealandia"] = "", -- Continental_supplies +-- ["Zombie"] = "", -- +-- ["Zombi"] = "", -- portal ["'Zooka Team"] = "火箭队", +-- ["Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard -- ["Zork"] = "", -- A_Classic_Fairytale:dragon, A_Classic_Fairytale:family, A_Classic_Fairytale:queen - [":("] = "囧", - } +} diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/zh_CN.txt --- a/share/hedgewars/Data/Locale/zh_CN.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/zh_CN.txt Sun Dec 17 00:09:24 2017 +0100 @@ -3,7 +3,7 @@ 00:00=手榴弹 00:01=子母炸弹 00:02=火箭炮 -00:03=UFO +00:03=蜜蜂枪 00:04=散弹枪 00:05=气锤 00:06=掠过 @@ -29,16 +29,39 @@ 00:26=西瓜炸弹 00:27=地狱礼花 00:28=钻地火箭 -00:29=弹珠炮 +00:29=弹珠枪 00:30=燃烧弹 -00:31=轰炸机 +00:31=遥控飞机 00:32=低重力 00:33=附加伤害 00:34=刀枪不入 00:35=加时 00:36=激光瞄准 +00:37=吸血 +00:38=狙击枪 +00:39=飞碟 +00:40=燃烧瓶 +00:41=鸟人 +00:42=传送门枪 +00:43=钢琴空袭 +00:44=老芝士 +00:45=正弦枪 +00:46=火焰喷射器 +00:47=黏性地雷 +00:48=锤子 +00:49=复活 +00:50=钻地火箭空袭 +00:51=泥球 +00:52=没有选择武器 +00:53=时光箱 +; 00:54=建筑 +00:54=土地喷雾 +00:55=急冻枪 +00:56=菜刀 +00:57=橡皮筋 +00:58=浮空雷 -01:00=战斗啦! +; 01:00=Loading … 01:01=平手 01:02= %1 胜! 01:03=音量 %1% diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Locale/zh_TW.txt --- a/share/hedgewars/Data/Locale/zh_TW.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Locale/zh_TW.txt Sun Dec 17 00:09:24 2017 +0100 @@ -3,7 +3,7 @@ 00:00=手榴彈 00:01=集束炸彈 00:02=反坦克火箭筒 -00:03=飛碟 +00:03=蜜蜂槍 00:04=霰彈槍 00:05=鶴嘴錘 00:06=跳過回合 @@ -12,12 +12,12 @@ 00:09=沙漠之鷹 00:10=炸藥 00:11=球棒 -00:12=Shoryuken +00:12=昇龍拳 00:13=秒 -00:14=空降 +00:14=降落傘 00:15=空襲 00:16=地雷空襲 -00:17=噴火燈 +00:17=噴燈 00:18=建造 00:19=傳送 00:20=切換刺蝟 @@ -29,9 +29,9 @@ 00:26=西瓜炸彈 00:27=地獄禮花 00:28=鑽地火箭 -00:29=彈珠炮 -00:30=汽油彈 -00:31=轟炸機 +00:29=彈珠槍 +00:30=燒夷彈 +00:31=遙控飛機 00:32=低重力 00:33=額外傷害 00:34=無敵 @@ -39,624 +39,398 @@ 00:36=激光瞄準 00:37=吸血 00:38=狙擊槍 -00:39=飛盤 -00:40=燃燒瓶 +00:39=飛碟 +00:40=汽油彈 +00:41=鳥哥 +00:42=傳送門槍 +00:43=鋼琴空襲 +00:44=老起司 +00:45=正弦槍 +00:46=火焰噴射器 +00:47=黏性地雷 +00:48=錘子 +00:49=復活 +00:50=鑽地火箭空襲 +00:51=泥球 +00:52=沒有選擇武器 +00:53=時光箱 +; 00:54=建築 +00:54=土地噴霧 +00:55=急凍槍 +00:56=菜刀 +00:57=橡皮筋 +00:58=浮空雷 -01:00=開戰! +; 01:00=Loading … 01:01=平局 -01:02= %1 勝利! +01:02=%1 勝利! 01:03=音量 %1% 01:04=暫停 01:05=確定要退出 (是Y/否Esc)? -01:06=突然死亡! +01:06=意外死亡模式! 01:07=%1 剩餘 01:08=燃料 01:09=同步中... -01:10=使用本工具不會結束回合! -01:11=本武器/工具解凍中! +01:10=使用本工具不會結束回合! +01:11=本武器/工具解凍中! +01:12=意外死亡模式前,最後一回合! +01:13=意外死亡模式前,倒數%1回合! +01:14=預備,%1! +01:15=輕微 +01:16=低 +01:17=正常 +01:18=高 +01:19=極端 +01:20=%1 彈跳 +01:21=靜音 +01:22=自動跳過回合模式 +01:23=關閉自動鏡頭功能 +01:24=啟動自動鏡頭功能 +01:25=按目標鍵來標記目標 ; Event messages ; Hog (%1) died -; 02:00=%1 has kicked the bucket! 02:00=%1 踢到了炸藥桶! -; 02:00=%1 has seen the light! 02:00=%1 看到了聖光! -; 02:00=%1 never saw that coming! 02:00=%1 沒料到會這樣。。。 -; 02:00=%1 waves goodbye! 02:00=%1 向大家揮手道別。。。 -; 02:00=%1 has gone to a better place! 02:00=%1 去了西方極樂世界! -; 02:00=%1 meets his maker! 02:00=%1 去見造物主了! -; 02:00=%1 can hang on no longer! -02:00=%1 再也受不了了! -; 02:00=%1 has done his duty! +02:00=%1 再也受不了了! 02:00=%1 完成了他的使命! -; 02:00=%1 makes the ultimate sacrifice! 02:00=%1 做了最大的犧牲! -; 02:00=%1 departs this mortal coil! 02:00=%1 擺脫了命運的束縛! -; 02:00=%1 makes like a tree and leaves! 02:00=%1 葉落歸根了! -; 02:00=%1 has timed out! 02:00=%1 大限到了。。。 -; 02:00=%1 says peace out! -02:00=%1 悄然離場了。。。 -; 02:00=%1 will be fondly remembered! +02:00=%1 說再見啦! 02:00=%1 永遠活在我們心中! -; 02:00=%1 has an aneurysm! -02:00=%1 身患絕症不治而亡。。。 -; 02:00=%1 leaves behind a wife and child 02:00=%1 留下一家孤兒寡母。。。 -; 02:00=%1 has launched his last bazooka 02:00=%1 發射了最後一發火箭彈 -; 02:00=%1 has tossed his last grenade 02:00=%1 扔出了最後一枚手榴彈 -; 02:00=%1 has baked his last cake 02:00=%1 烘烤了最後一塊蛋糕 -; 02:00=%1 has swung on his last rope 02:00=%1 甩出了最後一根繩索 -; 02:00=%1 has called his last airstrike 02:00=%1 呼叫了最後一次空襲 -; 02:00=%1 has pumped his last shotgun 02:00=%1 抽出了最後一把霰彈槍 -; 02:00=%1 has thrown his last melon 02:00=%1 扔出了最後一個西瓜炸彈 -; 02:00=%1 has drawn his last deagle 02:00=%1 拔出了最後一把沙鷹 -; 02:00=%1 took one shot too many 02:00=%1 挨了太多槍了 -; 02:00=%1 could really have used a health crate 02:00=%1 真該用下醫療包的 -; 02:00=%1 has gone to play a better game 02:00=%1 去玩更有意思的遊戲去了 -; 02:00=%1 has ragequit life 02:00=%1 拔網線了! -; 02:00=%1 fails 02:00=%1 失敗了 -; 02:00=Poor poor %1... 02:00=可憐的 %1... -; 02:00=%1 prefers wormux 02:00=%1 更喜歡玩百戰癲蟲 -; 02:00=%1 has been blocking shots with his face 02:00=%1 被爆頭了 -; 02:00=%1 is a hero amongst me...err..hogs 02:00=%1 是我的英雄! -; 02:00=%1 finds his place in Valhalla 02:00=%1 在天堂找到房子了 -; 02:00=%1 has left the building 02:00=%1 離開了這間屋子 -; 02:00=%1 goes the way of the dinosaurs 02:00=%1 去找恐龍了 -; 02:00=%1 brings hedgehogs one step closer to extinction 02:00=%1 讓刺蝟物種滅絕更近了一步 -; 02:00=%1 brings a tear to my eye 02:00=%1 讓我為他的離去而落淚 -; 02:00=%1 is an ex-hog 02:00=%1 生前是一隻刺蝟 -; 02:00=%1 is pushing up the daisies 02:00=%1 被菊花簇擁 -; 02:00=%1 has ceased to be 02:00=%1 被「刪除」了 -; 02:00=Say goodbye to %1 -02:00=對%1 說永別吧 -; 02:00=No hope left for %1 +02:00=對 %1 說永別吧 02:00=%1 沒有倖存的希望了 -; 02:00=%1 faces the final curtain 02:00=%1 落下了最後的帷幕 -; 02:00=Smoke 'em if you got 'em, %1 02:00=%1 抓緊時間實現你最後的願望吧 -; 02:00=%1 suffers a Spontaneous Massive Existence Failure -02:00=%1 遭遇了自發性大規模故障(出自星河艦隊) -; 02:00=%1 has passed on +02:00=%1 遭遇了自發性大規模故障 02:00=%1 逝去了 -; 02:00=%1 is stone dead 02:00=%1 永垂不朽 -; 02:00=%1 is no more 02:00=%1 不在了 -; 02:00=%1 has expired 02:00=%1 斷氣了 -; 02:00=Bereft of life, %1 rests in peace 02:00=%1 安詳地躺著 -; 02:00=%1 joins the choir invisible 02:00=%1 加入了隱形唱詩班 -; 02:00=Farewell %1, we hardly knew ye! 02:00=%1 永別了,我們還不認識你呢! -; 02:00=%1 had a low tolerance for being shot 02:00=%1 抗打擊能力不足 -; 02:00=%1 could have used an extra life 02:00=%1 本該用另一條命的 -; 02:00=Is there a doctor in the house? -02:00=快打120! +02:00=快打119! ; Hog (%1) drowned -; 02:01=%1 plays submarine! -02:01=%1 以為自己是潛水艇! -; 02:01=%1 mimics the Titanic! -02:01=%1 學泰坦尼克去了! -; 02:01=%1 swims like a stone! -02:01=%1 石沉大海! -;02:01=%1 checks out the deep end +02:01=%1 以為自己是潛水艇! +02:01=%1 學泰坦尼克去了! +02:01=%1 石沉大海! +02:01=%1 像磚塊一樣下沉! 02:01=%1 說要去檢查深水區 -;02:01=%1 goes glug glug glug 02:01=%1 :「咕嚕咕嚕咕嚕……」 -02:01=%1 goes splash -02:01=%1 forgot his armbands -;02:01=%1 really should have taken swimming lessons -02:01=%1 真的該去學游泳的 -;02:01=%1 left his surfboard at home -02:01=%1 把救生圈忘家了 -;02:01=%1 is washed up +02:01=%1 :「噗通」 +02:01=%1 忘記帶他的充氣手臂圈了 +02:01=%1 真的該去上游泳課 +02:01=%1 把衝浪板留在家裡了 02:01=%1 沖走了 -;02:01=%1 is one soggy hog 02:01=%1 濕掉了 -;02:01=%1 forgot to bring his life jacket 02:01=%1 忘記帶他的救生衣了 -02:01=%1 goes splish splash splish -;02:01=%1 is sleeping with the fishes +02:01=%1 濺起了水花 02:01=%1 將會和魚睡在一起 -;02:01=%1 thinks the water physics suck in this game 02:01=%1 認為這遊戲的設定糟糕透了 -;02:01=%1 looks thirsty 02:01=%1 好像很渴 -;02:01=the sea claims %1 02:01=大海吞沒了 %1 -;02:01=%1 is lost at sea 02:01=%1 在海上迷失了 -;02:01=%1 should have brought his scuba gear 02:01=%1 應該要帶潛水工具的 -;02:01=%1 gets a burial at sea 02:01=%1 享受到了海葬待遇 -;02:01=%1 has that sinking feeling 02:01=%1 覺得自己老在下沉 -;02:01=%1 is practicing his backstroke 02:01=%1 終於能實踐自己的游泳理論了 -;02:01=%1 goes in search of the Titanic 02:01=%1 去泰坦尼克號尋寶了 -;02:01=%1 is not Jesus 02:01=很遺憾 %1 不是耶穌 -;02:01=%1 is finding Nemo 02:01=%1 找尼莫去了 -02:01=%1 springs a leak -;02:01=You've gotta wonder how many hogs are down there +02:01=%1 尿褲子了 02:01=你會知道海底還會有多少同伴的 -;02:01=%1 makes the ocean slightly higher -02:01=%1 讓海平面高了那麼一點, 就一點 -;02:01=%1 didn't enlist in the Navy +02:01=%1 讓海平面高了那麼一點,就一點 02:01=很明顯 %1 沒在海軍服役過 -;02:01=%1 is doing his impersonation of a dead fish 02:01=%1 其實是在模仿死魚啦 -;02:01=At least you didn't go down the toilet, %1 02:01=還好 %1 你不是掉進了廁所 -;02:01=Sonic couldn't swim and neither can %1 -02:01=和索尼克一樣, %1 也不會游泳的 -;02:01=%1 wants to play Ecco the dolphin +02:01=和索尼克一樣,%1 也不會游泳的 02:01=%1 想玩海底漫步 -;02:01=%1 has gone to visit Aquaria 02:01=%1 去水族館報到了 -;02:01=%1 has found the lost city of Atlantis 02:01=%1 找到了傳說中的亞特蘭蒂斯城 -;02:01=Your doggy paddle could use a little work, %1 -02:01=狗爬式會有用的, %1 -;02:01=%1 should have brought a jet ski +02:01=狗爬式會有用的,%1 02:01=%1 居然沒帶摩托艇 -;02:01=%1 doesn't like watersports 02:01=%1 不喜歡水上運動 -;02:01=%1 is forever blowing bubbles 02:01=%1 學會了絕技: 神風吹泡泡 -;02:01=%1 is short of a raft 02:01=%1 腿太短了 -;02:01=%1 thinks salt water is good for the skin 02:01=%1 認為鹽水對皮膚有好處 -;02:01=%1 gets salt water in his wounds 02:01=%1 的傷口沾上了鹽水 -;02:01=%1 has walked the plank 02:01=%1 錯過了那塊木板 -;02:01=%1 has a bath 02:01=%1 洗澡去了 -;02:01=%1 is wet wet wet 02:01=%1 全身是水 -;02:01=%1 gets his quills wet 02:01=%1 把剛毛弄濕了 -;02:01=It's Davy Jones' locker for %1 02:01=深海閻王正在等待 %1 ; Round starts -; 02:02=Let's fight! -; 02:02=Armed and ready! -02:02=開戰! -02:02=準備! -;02:02=Let's get ready to rumble! -02:02=準備對轟! -;02:02=Let's get it on! -02:02=讓我們得到勝利! -;02:02=Let's get this party started +02:02=開戰! +02:02=準備! +02:02=準備對轟! +02:02=讓我們得到勝利! 02:02=這個Party要開始了 -;02:02=Last hog standing wins 02:02=勝利屬於最後一個生還者 -;02:02=Let's go! -02:02=出發吧! -;02:02=Let's rock! -;02:02=Let's jam! -;02:02=It's beginning... +02:02=出發吧! +02:02=開始狂歡吧! +02:02=開始演奏吧! 02:02=開始了... -;02:02=This is the start of something big 02:02=這是一個偉大的開始 -;02:02=Welcome to Hedgewars 02:02=歡迎來到刺蝟大作戰 -;02:02=Welcome to the front lines 02:02=歡迎來到前線 -;02:02=Crush your enemies! -02:02=目標:粉碎你的敵人! -;02:02=May the best hog win -02:02=勝利屬於最厲害的那只! -;02:02=Victory or death +02:02=目標:粉碎你的敵人! +02:02=勝利屬於最厲害的那只! 02:02=勝利或死亡 -;02:02=To the victor goes the spoils 02:02=戰利品只屬於勝利者 -;02:02=Losing is not an option 02:02=字典裡面應該沒有"輸"這個字的 -;02:02=Cry havoc! Let loose the hogs of war! -02:02=哭吧! 這是刺蝟的戰爭 -;02:02=Hedgewars, brought to you by Hedgewars.org -02:02=歡迎來到刺蝟大作戰, 官方網站 Hedgewars.org -02:02=GL HF -;02:02=Just count yourself lucky you're not up against Tiyuri +02:02=哭吧! 這是刺蝟的戰爭 +02:02=歡迎來到刺蝟大作戰,官方網站 Hedgewars.org +02:02=盡量玩阿,祝你好運 02:02=你看你多幸運你不是在對戰 Tiyuri -;02:02=Just count yourself lucky you're not up against unC0Rr 02:02=你看你多幸運你不是在對戰 unC0Rr -;02:02=Just count yourself lucky you're not up against Nemo 02:02=你看你多幸運你不是在對戰 Nemo -;02:02=Just count yourself lucky you're not up against Smaxx 02:02=你看你多幸運你不是在對戰 Smaxx -;02:02=Just count yourself lucky you're not up against Jessor 02:02=你看你多幸運你不是在對戰 Jessor -;02:02=Give it your all! -02:02=展現你的一切吧! -;02:02=The losers do the cleaning up! -02:02=輸的要罰掃廁所! -;02:02=Let the fight of the millenium begin +02:02=展現你的一切吧! +02:02=輸的要罰掃廁所! 02:02=宇宙之戰開始了 -;02:02=Let the fight of the century begin 02:02=世紀之戰開始了 -;02:02=Let the fight of the decade begin 02:02=正義之戰開始了 -;02:02=Let the fight of the year begin 02:02=年度爭霸戰開始了 -;02:02=Let the fight of the month begin 02:02=本月之星爭霸戰開始了 -;02:02=Let the fight of the week begin 02:02=每週擂主爭霸戰開始了 -;02:02=Let the fight of the day begin 02:02=本日最強入圍賽開始了 -;02:02=Let the fight of the hour begin -02:02=我們能戰一小時! -;02:02=Do your best! -02:02=諸君努力! -;02:02=Destroy the enemy! +02:02=我們能戰一小時! +02:02=諸君努力! 02:02=目標: 摧毀敵人 -;02:02=Good luck 02:02=祝你好運 -02:02=Have fun~ -;02:02=開心玩~ -;02:02=Fight the good fight -02:02=要贏! -;02:02=Fight dirty -02:02=不擇手段也行! -;02:02=Fight with honour +02:02=盡量玩阿 +02:02=要贏! +02:02=不擇手段也行! 02:02=請注意文明用語 -;02:02=Don't give up 02:02=教練告訴你: 別放棄 -;02:02=Never surrender -02:02=永不屈服! -;02:02=Rock 'em and sock 'em! -02:02=殺!殺!殺! -;02:02=Let the fragfest begin! -02:02=積分賽開始! -;02:02=I hope you're ready for a tussle! +02:02=永不屈服! +02:02=鐺!開始戰鬥! +02:02=積分賽開始! 02:02=你準備好惡戰了麼? -02:02=Go Go Go! -;02:02=Hedgehogs advance! -02:02=刺蝟歷險記! -;02:02=Bring it to them! -02:02=炸飛他們! -;02:02=Have no fear! -02:02=勇敢前進! -;02:02=Be brave and conquer -02:02=敢於征服! -; Round ends (win; unused atm) -02:03=回合結束(勝利) +02:02=殺!殺!殺! +02:02=刺蝟歷險記! +02:02=炸飛他們! +02:02=勇敢前進! +02:02=敢於征服! -; Round ends (draw; unused atm) -02:04=回合結束(平局) +; Round ends (%1 wins) +02:03=%1 勝利! + +; Round ends (draw) +02:04=平局 ; New health crate -; 02:05=Incoming aid! -02:05=醫療包! -;02:05=Medic! -02:05=急救包! -;02:05=First aid from the skies! -02:05=救援物資空運來了! -;02:05=A health pack for you +02:05=醫療包! +02:05=急救包! +02:05=救援物資空運來了! 02:05=你的醫療包到了 -;02:05=Good health.. in box form! -02:05=生命就在那箱子裡! -;02:05=The doctor calls +02:05=生命就在那箱子裡! 02:05=急救醫生到了 -;02:05=Fresh band-aids! -02:05=新鮮創可貼! -;02:05=This will make you feel better +02:05=新鮮創可貼! 02:05=吃了這個感覺會好些的... -;02:05=A Hi-Potion! Whoops wrong game -;02:05=A pick-me-up! -02:05=萬金油! -;02:05=Grab it -02:05=就是他了! -;02:05=A healthy snack -02:05=半吊子春哥來了(無復活技能) -;02:05=A remedy to pain +02:05=萬金油! +02:05=提神的來了! +02:05=就是他了! +02:05=健康的點心來了 02:05=止痛餅來了 -;02:05=Correct Dosage: as many as you can find! 02:05=使用方法: 吃得越多越好 -;02:05=Urgent delivery 02:05=緊急物資 -;02:05=Supplies! -02:05=補給用品! +02:05=補給用品! ; New ammo crate -; 02:06=More weapons! -02:06=武器! -;02:06=Reinforcements! -02:06=增援! -;02:06=Lock and load! -02:06=準備! -;02:06=I wonder what weapon is in there? +02:06=武器! +02:06=增援! +02:06=準備! 02:06=我要的那個會在的吧... -;02:06=Supplies! -02:06=補給用品! -;02:06=What could be inside? +02:06=補給用品! 02:06=裡面會有啥呢? -;02:06=Christmas comes early in Hedgewars 02:06=刺蝟大作戰每天都是聖誕節 -;02:06=A present! -02:06=禮物送到! -;02:06=Special delivery! -02:06=特快專遞! -;02:06=It was a nightmare getting this through customs +02:06=禮物送到! +02:06=特快專遞! 02:06=本局的噩夢來了 -;02:06=Destructive toys from the heavens 02:06=有個玩具在天堂掉下來了 -;02:06=Warning! Contents Volatile -02:06=警告! 危險品 -;02:06=Pick it up or blow it up, choice is yours -02:06=拿走或打掉, 隨你 -;02:06=Goodies! -02:06=好玩的玩意! -;02:06=Mmmmm Ammo -02:06=彈藥!!!! -;02:06=A box of destructive power +02:06=警告! 危險品 +02:06=拿走或打掉,隨你 +02:06=好玩的玩意! +02:06=彈藥!!!! 02:06=潘朵拉之盒 -;02:06=Airmail! -02:06=天降之物! -;02:06=Whatever's in that box, it ain't pizza -02:06=無論裡面是啥, 那肯定不會是軟妹子 -;02:06=Get it! -02:06=拿走它! -;02:06=Weapon drop incoming -02:06=武器掉下來了! -;02:06=Don't let the enemy grab that! -02:06=別讓敵人拿了! -;02:06=Shiny new toys! -02:06=新玩具! -;02:06=A mysterious box! +02:06=天降之物! +02:06=無論裡面是啥,那肯定不會是軟妹子 +02:06=拿走它! +02:06=武器掉下來了! +02:06=別讓敵人拿了! +02:06=新玩具! 02:06=謎的箱子... + ; New utility crate -; 02:07=Tooltime! -02:07=工具箱! -;02:07=This could come in handy... +02:07=工具箱! 02:07=這可能派上用場 -;02:07=Utilities! -02:07=工具! -;02:07=Utilise this box -02:07=工具在這裡! -;02:07=Watch out below -02:07=快看這裡! -;02:07=More utilities! -02:07=更多選擇更多歡笑, 盡在工具包 -;02:07=Tools for you! -02:07=一堆工具, 送給你! -;02:07=This should be good! +02:07=工具! +02:07=工具在這裡! +02:07=快看這裡! +02:07=更多選擇更多歡笑,盡在工具包 +02:07=一堆工具,送給你! 02:07=這看見起來蠻好... -;02:07=Use this wisely 02:07=使用這個才是明智的選擇 -;02:07=Ooo this box is heavy 02:07=好重...好重... -;02:07=You might need this 02:07=會有用的 + ; Hog (%1) skips his turn -; 02:08=%1 is sooo boring... 02:08=%1 太無聊了... -;02:08=%1 couldn't be bothered -02:08=%1 不想被打擾! -;02:08=%1 is one lazy hog +02:08=%1 不想被打擾! 02:08=%1 太懶了 -;02:08=%1 is thoughtless 02:08=%1 太輕率了 -;02:08=%1 gave up 02:08=%1 放棄了 -;02:08=You snooze you lose, %1 -02:08=不認真你就輸了, %1 -;02:08=%1 shamelessly skips +02:08=不認真你就輸了,%1 02:08=%1 無恥的跳過了本回合 -;02:08=%1 is really lazy 02:08=%1 真的太懶了 -;02:08=%1 needs a little more motivation 02:08=%1 沒有動力了 -;02:08=%1 is a pacifist 02:08=%1 是和平主義者 -;02:08=%1 has a breather 02:08=%1 需要喘息一下 -;02:08=%1 has a rest 02:08=%1 需要休息 -;02:08=%1 chills out 02:08=%1 發冷了 -;02:08=%1 has no faith in his own abilities 02:08=%1 做啥都沒信心了 -;02:08=%1 decides to do nothing at all 02:08=%1 決定啥都不做 -;02:08=%1 lets the enemy destroy itself 02:08=%1 認為敵人會自殺的 -;02:08=%1 would be terrible at parties 02:08=%1 將會陷入可怕的事件中 -;02:08=%1 hides out 02:08=%1 說:「你看不到我,你看不到我……」 -;02:08=%1 has decided to pass on this opportunity 02:08=%1 已經決定放棄這個機會 -;02:08=%1 decides the best thing he can do is...nothing 02:08=%1 決定他現在最應該做的是......坐著不動 -;02:08=%1 is a big wuss -02:08=%1 大笨蛋! -;02:08=Buck Buck Buck, %1 is a chicken +02:08=%1 大笨蛋! 02:08=%1 是小雞雞 -;02:08=%1 is looking a little yellow 02:08=%1 看來有點印堂發黑 -;02:08=%1 is a coward! -02:08=%1 是懦夫! -;02:08=%1 is waiting for sudden death -02:08=%1 在等待突然死亡模式 -;02:08=%1 is not the fighting type +02:08=%1 是懦夫! +02:08=%1 在等待意外死亡模式 02:08=%1 不是戰鬥系的 -;02:08=%1 is reconsidering his purpose in life 02:08=%1 正在重新尋找他的人生 -;02:08=%1 was never much of a good shot anyway 02:08=%1 從來沒一次打准的 -;02:08=%1 didn't want to join the army in the first place 02:08=%1 不想參軍 -;02:08=Stop wasting our time, %1 -02:08=別浪費時間了! %1 -;02:08=I'm dissapointed in you, %1 -02:08=我對你失望了, %1 -;02:08=Come on, you can do better than that %1 +02:08=別浪費時間了! %1 +02:08=我對你失望了,%1 02:08=%1 明明就能做的更好的 -;02:08=%1's will has broken 02:08=%1 會被打飛的 -;02:08=%1 apparently has better things to do 02:08=%1 顯然有更好的事情等著做 -;02:08=%1 is scared stiff 02:08=%1 怕刺激 -;02:08=%1 has fallen asleep 02:08=%1 睡著了 ; Hog (%1) hurts himself only -; 02:09=%1 should practice aiming! -02:09=%1 該練練瞄準了! -; 02:09=%1 seems to hate himself. +02:09=%1 該練練瞄準了! 02:09=%1 似乎看自己很不爽。 -; 02:09=%1 is standing on the wrong side! 02:09=%1 在表演烏龍! -; 02:09=%1 makes like an emo 02:09=%1 以為自己無敵 -; 02:09=%1 was holding his weapon the wrong way around 02:09=%1 好像把武器拿錯方向了 -;02:09=%1 is a little sadistic 02:09=%1 有點施虐狂 -;02:09=%1 is a masochist 02:09=%1 是受虐狂 -;02:09=%1 has no instinct of self-preservation 02:09=%1 根本不會自我保護 -;02:09=%1 messed up 02:09=%1 亂套了 -;02:09=%1 screwed up 02:09=%1 搞砸了 -;02:09=That was a poor shot, %1 02:09=%1 這一發真渣 -;02:09=%1 is a little too careless with dangerous weapons 02:09=%1 太不小心用那些危險的玩意了 -;02:09=%1 should consider a change of career 02:09=%1 正在考慮轉職 -;02:09=Worst. Shot. Ever! -02:09=更差! 最差! 非常差! -;02:09=No no no %1, you shoot at the ENEMY! -02:09=No no no %1, 你要打敵人! -;02:09=%1 should only be destroying the enemy +02:09=更差! 最差! 非常差! +02:09=不,%1 你要打敵人! 02:09=%1 應該消滅敵人才對 -;02:09=%1 moves one step closer to suicide 02:09=%1 正在走向自殺 -;02:09=%1 aids the enemy -02:09=%1 造反了! -;02:09=That was stupid %1 +02:09=%1 造反了! 02:09=%1 是笨蛋 -;02:09=%1 lives by the mantra of "no pain, no gain" 02:09=%1 試驗苦肉計 -;02:09=%1 is confused 02:09=%1 搞混隊伍了 -;02:09=%1 hurt itself in its confusion 02:09=%1 在混亂中攻擊自己 -;02:09=%1 has a knack for embarrassing himself 02:09=%1 正在為自己的點子尷尬 -;02:09=%1 is a klutz! -02:09=%1 就是一個笨蛋! -;02:09=%1 is clumsy +02:09=%1 就是一個笨蛋! 02:09=%1 太笨了 -;02:09=%1 shows the enemy what he's capable of 02:09=%1 把自己的能力讓對手知道了 -;02:09=%1 can't be expected to be perfect all the time 02:09=%1 不是每次都是完美的 -;02:09=Don't worry %1, pobody's nerfect -02:09=不用擔心 %1 , 每人都不是完美的 -;02:09=%1 totally did that on purpose +02:09=不用擔心 %1 ,每人都不是完美的 02:09=%1 真的沒有任何目的 -;02:09=I won't tell anyone if you don't, %1 02:09=我不會把 %1 的事情到處說的 -;02:09=How embarrassing! -02:09=這是何等的失態! -;02:09=I'm sure nobody saw that %1 +02:09=這是何等的失態! 02:09=真的沒人看到 %1 在做什麼 -;02:09=%1 needs to review his field manual 02:09=%1 需要看看說明書了 -;02:09=%1's weapon clearly malfunctioned 02:09=%1 的武器很明顯壞了 + ; Hog shot an home run (using the bat and another hog) -; 02:10=Home Run! 02:10=全壘打! -; 02:10=A bird, a plane, ... 02:10=看到鳥了!飛機!飛碟! -; 02:10=That one is out! -02:10=那一位出界了! +02:10=那一位出局了! + +; Hog (%1) has to leave (team is gone) +02:11=%1 必須上床睡覺了! +02:11=%1 好像沒空玩 +02:11=Scotty,把他傳送走! +02:11=%1 必須離開 + ; Weapon Categories 03:00=定時手雷 03:01=定時手雷 03:02=彈道武器 -03:03=制導武器 +03:03=導引武器 03:04=槍 (多發子彈) -03:05=鑽孔工具 +03:05=挖掘工具 03:06=動作 03:07=移動工具 -03:08=接近式炸彈 +03:08=鄰近觸發炸彈 03:09=槍 (多發子彈) -03:10=BOOM! -03:11=Bonk! +03:10=BOOM! +03:11=Bonk! 03:12=武術 03:13=UNUSED 03:14=移動工具 03:15=空投打擊 03:16=空投打擊 -03:17=鑽孔工具 +03:17=挖掘工具 03:18=工具 03:19=移動工具 03:20=動作 03:21=彈道武器 -03:22=叫我主人! -03:23=武術 (真的!) -03:24=蛋糕不是謊言! +03:22=叫我主人! +03:23=武術 (真的!) +03:24=蛋糕不是謊言! 03:25=兒童不宜 03:26=果汁手雷 03:27=燙手手雷 03:28=彈道武器 03:29=彈道武器 03:30=空投打擊 -03:31=遙控飛機(不是玩具!) +03:31=遙控炸彈 03:32=額外效果 03:33=額外效果 03:34=額外效果 @@ -666,45 +440,108 @@ 03:38=槍 (多發子彈) 03:39=移動工具 03:40=燃燒彈 +03:41=Squawks的大粉絲 +03:42=我在這裡註記 ... +; the misspelled "Beethoven" is intentional (-> to beat) +03:43=演奏背多分的死亡奏鳴曲 +03:44=最好是西元1923年以前的 +03:45=科學的力量 +03:46=小心燙 +03:47=黏在某處是有用的! +03:48=It's Hammer Time! +03:49=帶領死者回到地獄! +03:50=鼴鼠迷 +03:51=從地上找到的 +03:52=UNUSED +03:53=40型 +;03:54=建造某物 +03:54=工具 +03:55=沒什麼比這更酷的! +03:56=請使用或濫用 +03:57=工具 +03:58=浮空的鄰近觸發炸彈 + ; Weapon Descriptions (use | as line breaks) -04:00=使用簡單的手榴彈攻擊敵人.|定時器倒數到0就會爆炸.|1-5: 設定定時器|攻擊鍵: 按住蓄力. -04:01=使用集束手雷攻擊敵人.|定時器倒數到0就會爆炸並裂開成幾塊.|1-5: 設定定時器|攻擊鍵: 按住蓄力. +04:00=使用純手榴彈攻擊敵人.|定時器倒數到0就會爆炸.|1-5: 設定定時器|微調鍵+1-5: 設定彈跳強度|攻擊鍵: 按住蓄力. +04:01=使用集束手雷攻擊敵人.|定時器倒數到0就會爆炸並裂開成幾塊小炸彈.|1-5: 設定定時器|微調鍵+1-5: 設定彈跳強度|攻擊鍵: 按住蓄力. 04:02=使用彈道導彈攻擊敵人.|受風力影響.|攻擊鍵: 按住蓄力. -04:03=發射一個制導導彈攻擊所選目標.|如果要精確打擊就不要使用全力發射.|鼠標: 選定目標|攻擊鍵: 按住蓄力. -04:04=霰彈槍有兩顆子彈.|因為是霰彈槍所以不一定要對準敵人.|攻擊鍵: 開槍 (可以開幾槍) -04:05=向地底出發! 使用他就能在地面|打個洞, 就能去其他地方.|攻擊鍵: 開始/停止打洞 -04:06=悶了? 沒法打? 保存體力? 沒問題!|跳過這回合就可以了, 懦夫!|攻擊鍵: 跳過回合 -04:07=用繩索就可以去很遠的地方.|還能空降到別的刺蝟身上丟手榴彈呢.|攻擊鍵: 發射/收回繩索|長跳鍵: 發射手榴彈或其他武器 -04:08=你能用地雷阻止敵人靠近.|還能靜悄悄的放在敵人腳下.|一定要在爆炸前逃離到安全的地方!|攻擊鍵: 把地雷放在你的腳下 -04:09=自我感覺準頭不行? |沙漠之鷹有4顆子彈呢.|攻擊鍵: 開槍 (可以開幾槍) +04:03=發射一隻爆炸蜂攻擊所選目標.|如果要精確打擊就不要使用全力發射.|游標: 選定目標|攻擊鍵: 按住蓄力. +04:04=使用兩顆子彈的霰彈槍攻擊敵人.|因為是霰彈槍所以不一定要對準敵人.|攻擊鍵: 開槍 (多次) +04:05=向地底前進! 使用他就能在地面|打個洞,就能去其他地方.|攻擊鍵: 開始/停止打洞|左/右方向鍵: 打洞中移動 +04:06=悶了? 沒法打? 節約彈藥? 沒問題!|跳過這回合就可以了,懦夫!|攻擊鍵: 跳過回合 +04:07=用繩索就可以去很遠的地方.|還能空降到別的刺蝟身上丟手榴彈呢.|攻擊鍵: 發射/收回繩索|上/下方向鍵: 收/放長繩索|跳遠鍵: 丟手榴彈之類的武器 +04:08=你能用地雷阻止敵人靠近.|還能靜悄悄的放在敵人腳下.|一定要在爆炸前逃離到安全的地方!|攻擊鍵: 把地雷放在你的腳下|微調鍵+1-5: 設定彈跳強度 +04:09=自我感覺準頭不行? |沙漠之鷹有4顆子彈呢.|攻擊鍵: 開槍 (多次) 04:10=使用強力炸藥就是一個明智的選擇.|這是最經典的轟炸方式.|攻擊鍵: 把炸藥放在你的腳下 -04:11=把敵人打飛, 飛出地圖或者飛進水裡.|或者把地雷打過去?|攻擊鍵: 敲打你面前的所有東西 -04:12=這就是武術的威力!|致命的氣功!|攻擊鍵: 使用升龍拳 +04:11=把敵人打飛,飛出地圖或者飛進水裡.|或者把地雷打過去?|攻擊鍵: 敲打你面前的所有東西 +04:12=靠近對方來發揮這致命武技的威力!|攻擊鍵: 施展這驚人的招式 04:13=UNUSED -04:14=有恐高症? 拿降落傘吧.|他能慢慢的安全的把你帶到地面.|攻擊鍵: 展開降落傘 -04:15=呼叫一架飛機轟炸你的敵人.|左/右方向鍵: 決定攻擊方向|鼠標: 選定目標 -04:16=呼叫一架飛機投下大量地雷.|左/右方向鍵: 決定攻擊方向|鼠標: 選定目標 -04:17=需要個安全的地方? 使用噴燈為你挖掘一條安全的隧道!|攻擊鍵: 開始/停止挖掘 -04:18=噴燈還不夠?還要個更安全的地方?|建造若干條大梁擋住吧.|左/右方向鍵: 選擇梁的方向|鼠標: 建造 -04:19=適當的時候撤退是比所有的攻擊|更安全的選擇|鼠標: 選擇傳送目標 -04:20=可以讓你更換當前使用的刺蝟.|攻擊鍵: 啟動切換功能 -04:21=用炮彈發射器發射一個手榴彈樣|的東西. 在爆炸之後會裂開成小塊|攻擊鍵: 用全力發射 -04:22=這不只是女王才用的東西!|這鞭子能解決很多問題, 比如說那些|喜歡站在懸崖邊上的小屁孩.|攻擊鍵: 鞭打你面前的一切東西 -04:23=自殺式炸彈襲擊向來好用!|用你的一條命攻擊直線上的一切東西並爆炸.|攻擊鍵: 啟動自殺性攻擊 -04:24=生日快樂! 拿, 放下這個蛋糕, 他|就會走到敵人身邊然後爆炸.| 而且能貼著地形走.|攻擊鍵: 讓蛋糕開始/結束走路 +04:14=有恐高症? 拿降落傘吧.|他能慢慢的安全的把你帶到地面.|攻擊鍵: 展開降落傘|左/右/上/下方向鍵: 控制飛行方向|跳遠鍵: 丟手榴彈之類的武器 +04:15=呼叫一架飛機轟炸你的敵人.|左/右方向鍵: 決定攻擊方向|游標: 選定目標 +04:16=呼叫一架飛機投下大量地雷.|左/右方向鍵: 決定攻擊方向|游標: 選定目標 +04:17=需要個安全的地方? 使用噴燈為你挖掘一條安全的隧道!|攻擊鍵: 開始/停止挖掘|上/下方向鍵: 改變挖掘方向 +04:18=噴燈還不夠?還要個更安全的地方?|建造若干條大梁擋住吧.|左/右方向鍵: 選擇梁的方向|游標: 建造 +04:19=在適當的時候撤退|是比所有攻擊更有利的選擇|游標: 選擇傳送目標|左/右方向鍵: 選擇面朝左/右 +04:20=可以讓你更換當前使用的刺蝟.|攻擊鍵: 啟動切換功能|切換鍵: 選則下一隻刺蝟|微調鍵+切換鍵: 選則前一隻刺蝟 +04:21=用炮彈發射器發射一個手榴彈樣|的東西. 在爆炸之後會裂開成小塊.|攻擊鍵: 用全力發射 +04:22=這不只是女王才用的東西!|這鞭子能解決很多問題,比如說那些|喜歡站在懸崖邊上的小屁孩.|攻擊鍵: 鞭打你面前的一切東西 +04:23=自殺式炸彈襲擊向來好用!|用你的一條命攻擊直線上的一切東西並爆炸.|攻擊鍵: 啟動自殺性攻擊 +04:24=生日快樂!放下這個蛋糕,|他就會走到敵人身邊然後爆炸.|而且能貼著地形走.|攻擊鍵: 讓蛋糕開始/結束走路 04:25=使用美人計讓敵人向著你這個方向跳|(比如跳進海裡).|攻擊鍵: 使用本工具誘惑敵人 -04:26=把這個多汁的西瓜扔向敵人!| 一旦定時器倒數完, 就會|炸成幾塊更強力的炸彈.|攻擊鍵: 按住蓄力. -04:27=讓地獄的禮花在敵人頭上綻放!|這真的是危險品, 使用時候記得原理|爆炸之後還會燃燒好一陣子|攻擊鍵: 按住蓄力. +04:26=把這個多汁的西瓜扔向敵人!| 一旦定時器倒數完,就會|炸成幾塊更強力的炸彈|1-5: 設定定時器|攻擊鍵: 按住蓄力. +04:27=讓地獄的禮花在敵人頭上綻放!|這真的是危險品,使用時候記得原理|爆炸之後還會燃燒好一陣子.|攻擊鍵: 按住蓄力. 04:28=本火箭在發射後將會鑽到地裡|一旦燃料用完或者打穿地面就會爆炸.|攻擊鍵: 按住蓄力. 04:29=還記得小時候玩的玻璃球麼?|不過這個是炸彈版. 發射大量的小玻|璃球然後爆炸|攻擊鍵: 全力發射|上/下方向鍵: 發射過程中更換方向 -04:30=呼叫一架飛機空投燃燒彈.|用得好的話會造成巨大傷害.|左/右方向鍵: 決定攻擊方向|鼠標: 選定目標 -04:31=啊哈, 遙控飛機除了能幫你|收集物品之外. 還能空投炸彈.|攻擊鍵: 飛機起飛/投放炸彈|長跳鍵: Let the valkyries ride into battle|上/下方向鍵: 控制方向 -04:32=低重力裝置能影響更多東西!| 除了跳得更遠之外還能讓|敵人飛得更遠.|攻擊鍵: 激活 +04:30=呼叫一架飛機空投燃燒彈.|用得好的話會造成巨大傷害.|左/右方向鍵: 決定攻擊方向|游標: 選定目標 +04:31=啊哈,遙控飛機除了能幫你|收集物品之外. 還能空投炸彈.|攻擊鍵: 飛機起飛/投放炸彈|跳遠鍵: Let the valkyries ride into battle|左/右方向鍵: 控制方向 +04:32=低重力裝置能影響更多東西!| 除了跳得更遠之外還能讓|敵人飛得更遠.|攻擊鍵: 激活 04:33=有時候致命打擊還是不夠過癮.|攻擊鍵: 激活 -04:34=你打不到我!|攻擊鍵: 激活 -04:35=時間流逝得很快, 你也知道|刺蝟腿短.|攻擊鍵: 激活 -04:36=好吧, 你最後還是承認自己眼神不好.|高科技還是能幫你不少的.|攻擊鍵: 激活 -04:37=不用害怕白天.|這只能本回合有效, 可以把造成的傷害變|成自己的血量 .|攻擊鍵: 激活 -04:38=你也知道CS裡狙擊槍的威力,|能打比較遠的地方.|攻擊鍵: 射擊 (2發子彈) -04:39=用飛盤可以飛到地圖上的任何角落.|不過這個東西連發明者都|認為很難用.|攻擊鍵: 激活|上/左/右方向鍵: 向某方向飛 -04:40=把地面填滿汽油然後....|攻擊鍵: 按住蓄力. +04:34=你打不到我!|攻擊鍵: 激活 +04:35=時間流逝得很快,你也知道|刺蝟腿短.|攻擊鍵: 激活 +04:36=好吧,你最後還是承認自己眼神不好.|高科技還是能幫你不少的.|攻擊鍵: 激活 +04:37=不用害怕白天.|這只能本回合有效,可以把造成的傷害變|成自己的血量 .|攻擊鍵: 激活 +04:38=你也知道CS裡狙擊槍的威力,|能打比較遠的地方.|攻擊鍵: 射擊 (2發子彈) +04:39=用飛碟可以飛到地圖上的任何角落.|不過這個東西連發明者都認為很難用.|攻擊鍵: 激活/停止|上/左/右方向鍵: 向某方向飛|跳遠鍵: 丟手榴彈之類的武器|微調鍵+跳遠鍵: 行進中往目標發射|微調鍵+上/下方向鍵: 行進中調整目標 +04:40=使用這即將燃燒的汽油瓶讓地面著火.|攻擊鍵: 按住蓄力. +04:41=鳥哥可不會飛得比飛碟來的低.|鳥哥可以載著你的刺蝟,用鳥蛋對敵人下毒!|盡快行動,鳥哥是會累的!|攻擊鍵: 激活&丟鳥蛋|上/左/右方向鍵: 向指定的方向振翅 +04:42=此可攜式傳送裝置可以在兩點間瞬間轉移你的刺蝟或武器.|善用此工具,將讓你獲得巨大的成功!|聲明一下,它不能用在橡皮筋上.|攻擊鍵: 發射可攜式開關|切換鍵: 切換顏色 +04:43=使你的首次演奏獲得大成功!|從天上掉落一架大鋼琴,|摧毀它路徑上的所有物體,|但注意必須犧牲你的刺蝟來演奏此鋼琴.|游標: 選定目標|F1-F9: 用來彈鋼琴 +04:44=這不僅是一個起司,還是一種生化武器!|不會造成爆炸傷害,但會毒害不幸聞到它味道的刺蝟!|1-5: 設定定時器|微調鍵+1-5: 設定彈跳強度|攻擊鍵: 按住蓄力. +04:45=物理課不是白上的!|發射一道毀滅性的正弦波,無視地形的厚度直接燒毀.|注意,此武器有很大的後座力.|攻擊鍵: 發射 +04:46=用火熱的液體覆蓋你的敵人.|攻擊鍵: 激活|上/下方向鍵: 發射中移動準心|左/右方向鍵: 更改發射力道 +04:47=利用兩顆黏性地雷設計連鎖攻擊或陷阱|攻擊鍵: 按住蓄力 (2發) +04:48=你以為只有鼴鼠才喜歡挖地嗎?|重擊刺蝟(地雷/炸藥筒)你也可以享受這種樂趣!|使用錘子攻擊讓刺蝟被打入地下並造成1/3的生命傷害.|攻擊鍵: 激活 +04:49=花費生命來復活隊友!|需注意這也會復活你的敵人.|攻擊鍵: 按住持續復活儀式|上方向鍵: 加速復活 +04:50=有人躲在地下嗎?|用鑽地火箭空襲將它挖出來!|定時器控制挖掘的深度.|左/右方向鍵: 決定攻擊方向|1-5: 設定定時器|游標: 選定目標 +04:51=使用泥球攻擊不會結束回合.|沒有攻擊力,但可以擊退刺蝟與物體.|攻擊鍵: 按住蓄力 +04:52=UNUSED +04:53=離開隊友,進行一趟時空之旅.|準備隨時回歸,或強制回歸由於進入意外死亡模式,或只剩下一隻刺蝟.|注意,不能在以下狀況使用: 意外死亡模式,剩下一隻刺蝟時,與國王身上.|攻擊鍵: 激活 +04:54=噴灑一串神奇薄片來產生地形.|可用來: 搭建橋樑,埋葬敵人,封鎖隧道.|攻擊鍵: 激活|上/下方向鍵: 發射中移動準心|左/右方向鍵: 更改發射力道 +04:55=回到冰河時期!|可冷凍刺蝟,使地面變滑|或凍結水面避免淹死.|攻擊鍵: 激活/停止冷凍射線|上/下方向鍵: 發射中移動準心 +04:56=你可以丟兩把菜刀用來攻擊/擋住敵人|也可以用來擋住隧道或利用它來攀爬!|請小心!玩刀是很危險的.|攻擊鍵: 按住蓄力(兩次) +04:57=建立一條非常有彈性的橡皮筋,|刺蝟或其他東西掉在上面會被彈開不會受傷.|左/右方向鍵: 旋轉|游標: 放置 +04:58=這顆接近觸發炸彈將浮在空中,|追蹤攻擊太靠近的刺蝟.|然而,它的爆炸威力弱於一般地雷.|攻擊鍵: 按住蓄力. + +; Game goal strings +05:00=遊戲模式 +05:01=採用以下規則 +05:02=堡壘戰: 保衛你的堡壘; 同時擊敗你的敵人! +05:03=低重力: 注意你的步伐 +05:04=無敵模式: 刺蝟幾乎是無懈可擊的 +05:05=吸血模式: 80%的攻擊傷害將加到生命 +05:06=因果報應: 刺蝟將承受產生的攻擊傷害 +05:07=保護國王: 不要讓你的國王死了!|放置國王: 替你的國王選一個好的起始位置 +05:08=放置刺蝟: 開局前放置你的刺蝟 +05:09=砲術模式: 刺蝟不能用走的移動位置 +05:10=牢不可破: 大部分的武器不能摧毀邊界 +05:11=共享彈藥: 同樣顏色的隊伍共享彈藥 +05:12=地雷定時: 地雷將在 %1 秒後爆炸 +05:13=地雷定時: 地雷將在立刻爆炸 +05:14=地雷定時: 地雷將在0 - 5秒後爆炸 +05:15=傷害修正: (幾乎)所有武器的傷害變成%1% +05:16=每回合生命被重置 +05:17=AI死亡後重生 +05:18=不限制攻擊次數 +05:19=每回合武器被重置 +05:20=刺蝟間不共享武器 +05:21=雙打模式: 同樣顏色的隊伍間,每回合的動作順序會變動|共享時間: 同樣顏色的隊伍需共享回合時間 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Basketball/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Basketball/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Basketball/desc.txt --- a/share/hedgewars/Data/Maps/Basketball/desc.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/Basketball/desc.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,3 @@ -en_US=Who said hedgehogs can't play basketball? +en=Bat your opponents through the hoops. +de=Schlag deine Gegner durch die Körbe. +pl=Wrzuć kijem swoich przeciwników do koszy. diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Basketball/map.lua --- a/share/hedgewars/Data/Maps/Basketball/map.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/Basketball/map.lua Sun Dec 17 00:09:24 2017 +0100 @@ -2,8 +2,6 @@ HedgewarsScriptLoad("/Scripts/Locale.lua") -local score = {[0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0} - local started = false function onGameInit() @@ -13,48 +11,22 @@ MinesNum = 0 Explosives = 0 Delay = 500 - SuddenDeathTurns = 99999 -- "disable" sudden death Map = 'BasketballField' + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 end function onGameStart() - ShowMission(loc("Hedgewars-Basketball"), loc("Not So Friendly Match"), loc("Bat your opponents through the|baskets and out of the map!"), -amBaseballBat, 0) + ShowMission(loc("Basketball"), loc("Not So Friendly Match"), loc("Bat your opponents through the|baskets and out of the map!"), -amBaseballBat, 0) started = true end -function onGameTick() -end - function onAmmoStoreInit() SetAmmo(amBaseballBat, 9, 0, 0, 0) SetAmmo(amSkip, 9, 0, 0, 0) end -function onGearAdd(gear) -end - -function onGearDelete(gear) - if not started then - return - end - if (GetGearType(gear) == gtHedgehog) and CurrentHedgehog ~= nil then - local clan = GetHogClan(CurrentHedgehog) - local s - if clan ~= nil then - if GetHogClan(CurrentHedgehog) ~= GetHogClan(gear) then - score[clan] = score[clan] + 1 - s = string.format(loc("%s is out and Team %d|scored a point!| |Score:"), GetHogName(gear), clan + 1) - else - score[clan] = score[clan] - 1 - s = string.format(loc("%s is out and Team %d|scored a penalty!| |Score:"), GetHogName(gear), clan + 1) - end - s = s .. " " .. score[0] - for i = 1, ClansCount - 1 do s = s .. " - " .. score[i] end - ShowMission(loc("Hedgewars-Basketball"), loc("Not So Friendly Match"), s, -amBaseballBat, 0) - end - end -end - function onNewTurn() SetWeapon(amBaseballBat) end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Basketball/preview.png Binary file share/hedgewars/Data/Maps/Basketball/preview.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/BasketballField/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/BasketballField/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/BasketballField/preview.png Binary file share/hedgewars/Data/Maps/BasketballField/preview.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Battlefield/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Battlefield/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +nickstu diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Blizzard/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Blizzard/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Palewolf diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Blox/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Blox/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Josh diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Bubbleflow/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Bubbleflow/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/CTF_Blizzard/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/CTF_Blizzard/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Palewolf diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/CTF_Blizzard/desc.txt --- a/share/hedgewars/Data/Maps/CTF_Blizzard/desc.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/CTF_Blizzard/desc.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,3 @@ -en_US=Capture the Flag\, blizzard style! +en=Capture the enemy flag and bring it to your own. +de=Klau die feindliche Flagge und bring sie zu deiner eigenen. +pl=Zabierz flagę wroga i przynieś ją do swojej. diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/CTF_Blizzard/map.lua --- a/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Sun Dec 17 00:09:24 2017 +0100 @@ -310,7 +310,7 @@ HandleRespawns() -- this will set fIsMissing[wtf] to false :) AddCaption(loc("Flag returned!")) elseif fIsMissing[wtf] == false then - AddCaption(loc("That was pointless.") .. loc("The flag will respawn next round.")) + AddCaption(loc("That was pointless. The flag will respawn next round.")) end --fIsMissing[wtf] = false @@ -573,8 +573,9 @@ MinesTime = 2000 Explosives = 0 -- The number of explosives being placed Delay = 10 -- The delay between each round - WaterRise = 0 -- I sure hope this works - --SuddenDeathTurns = 99 -- suddendeath is off, effectively + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 Map = "Blizzard" -- The map to be played Theme = "Snow" -- The theme to be used "Nature" @@ -583,7 +584,7 @@ function onGameStart() - ShowMission("CTF_BLIZZARD", "", 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 | - 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) -- initialize teleporters diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Cake/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Cake/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Josh diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Cheese/cheese.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Cheese/cheese.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1365 @@ + + + +image/svg+xml diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Cheese/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Cheese/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +CopherNeue diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Cheese/map.png Binary file share/hedgewars/Data/Maps/Cheese/map.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Cheese/mask.png Binary file share/hedgewars/Data/Maps/Cheese/mask.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Cheese/preview.png Binary file share/hedgewars/Data/Maps/Cheese/preview.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Cheese/preview@2x.png Binary file share/hedgewars/Data/Maps/Cheese/preview@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/ClimbHome/CMakeLists.txt --- a/share/hedgewars/Data/Maps/ClimbHome/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/ClimbHome/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -3,4 +3,5 @@ map.cfg map.lua preview.png + desc.txt DESTINATION ${SHAREPATH}Data/Maps/ClimbHome) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/ClimbHome/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/ClimbHome/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Derek Pomery diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/ClimbHome/desc.txt --- a/share/hedgewars/Data/Maps/ClimbHome/desc.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/ClimbHome/desc.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,3 @@ -en_US=You are far from home and the water is rising. Climb as fast as you can. +en=You are far from home and the water is rising. Climb as fast as you can. +de=Du bist fern von Zuhause und das Wasser steigt. Klettere so schnell du kannst. +pl=Jesteś daleko od domu_c a woda się podwyższa. Wspinaj się najszybciej_c jak potrafisz. diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/ClimbHome/map.cfg --- a/share/hedgewars/Data/Maps/ClimbHome/map.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/ClimbHome/map.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,4 +1,4 @@ EarthRise 48 Timeless -Shoppa +locked diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/ClimbHome/map.lua --- a/share/hedgewars/Data/Maps/ClimbHome/map.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/ClimbHome/map.lua Sun Dec 17 00:09:24 2017 +0100 @@ -34,9 +34,6 @@ local jokeAwardSpeed = nil local jokeAwardDamage = nil local recordBroken = false -local ready = false -local showWaterStats = false -- uses the AI team to draw water height. -local scaleGraph = false local dummyHog = nil local dummySkip = 0 local baseWaterSpeed = 2 @@ -48,6 +45,22 @@ local airMineY = {} local airMine = {} local init = true +local multiplayerVictoryDelay = -1 +local multiplayerWinningHogs = {} +local multiplayerWins = 0 +local racing = false + +-- Placement positions of winning hogs +local victoryPosses = { } +do + local m = 0 + for y=108, 39, -32 do + for x=1820+m, 1972-m, 22 do + table.insert(victoryPosses, {x=x, y=y}) + end + m = m + 32 + end +end function onParameters() parseParams() @@ -80,18 +93,9 @@ --EnableGameFlags(gfDisableLandObjects) -- force seed instead. Some themes will still be easier, but at least you won't luck out on the same theme Seed = ClimbHome - if showWaterStats then - AddTeam(" ", 0x545C9D, "Simple", "Island", "Default") - elseif scaleGraph then - AddTeam(" ", 0x050505, "Simple", "Island", "Default") - end - if showWaterStats or scaleGraph then - dummyHog = AddHog(" ", 0, 1, "NoHat") - HH[dummyHog] = nil - totalHedgehogs = totalHedgehogs - 1 - teams[GetHogTeamName(dummyHog)] = nil - SendStat(siClanHealth, tostring(32640), " ") - end + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 end function onGearAdd(gear) @@ -106,9 +110,9 @@ function onGearDelete(gear) if gear == MrMine then - AddCaption("Once you set off the proximity trigger, Mr. Mine is not your friend",0xffffff,0) + AddCaption(loc("Once you set off the proximity trigger, Mr. Mine is not your friend"), 0xFFFFFFFF, capgrpMessage) MrMine = nil - elseif gear == Cake then + elseif GetGearType(gear) == gtCake then Cake = nil elseif GetGearType(gear) == gtHedgehog then onGameTick20() @@ -118,13 +122,10 @@ end function onGameStart() - if showWaterStats or scaleGraph then - DeleteGear(dummyHog) - end --SetClanColor(ClansCount-1, 0x0000ffff) appears to be broken SendHealthStatsOff() ShowMission(loc("Climb Home"), - loc("Rope to safety"), + 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."), -amRope, 0) local x = 1818 @@ -168,7 +169,6 @@ end end - ready = false startTime = GameTime --disable to preserve highest over multiple turns --will need to change water check too ofc @@ -181,17 +181,20 @@ recordBroken = false currTeam = GetHogTeamName(CurrentHedgehog) if CurrentHedgehog ~= nil then - if CurrentHedgehog ~= dummyHog then + if CurrentHedgehog ~= dummyHog or multiplayerWinningHogs[CurrentHedgehog] == true then SetGearPosition(CurrentHedgehog, 1951,32640) + HogTurnLeft(CurrentHedgehog, true) if not HogsAreInvulnerable then SetEffect(CurrentHedgehog,heInvulnerable,0) end AddVisualGear(1951,32640,vgtExplosion,0,false) SetState(CurrentHedgehog,band(GetState(CurrentHedgehog),bnot(gstInvisible))) SetWeapon(amRope) - ready = true else dummySkip = GameTime+1 end end + for hog, _ in pairs(multiplayerWinningHogs) do + SetEffect(hog, heInvulnerable, 1) + end for f,i in pairs(Fire) do DeleteGear(f) end @@ -245,6 +248,7 @@ function onGameTick20() local x,y + if math.random(20) == 1 then AddVisualGear(2012,56,vgtSmoke,0,false) end if CurrentHedgehog == dummyHog and dummySkip ~= 0 and dummySkip < GameTime then ParseCommand("/skip") @@ -271,21 +275,61 @@ --end end - if CurrentHedgehog ~= nil then x,y = GetGearPosition(CurrentHedgehog) end - if Cake ~= nil and CurrentHedgehog ~= nil then - local cx,cy = GetGearPosition(Cake) - if y < cy-1500 then - DeleteGear(Cake) - Cake = nil - end + -- This will be executed if a player reached home in multiplayer + if multiplayerVictoryDelay > 0 then + multiplayerVictoryDelay = multiplayerVictoryDelay - 20 + if multiplayerVictoryDelay <= 0 then + -- If delay's over, the game will continue with the next hog + if CurrentHedgehog then + + multiplayerWinningHogs[CurrentHedgehog] = true + multiplayerWins = multiplayerWins + 1 - if Cake ~= nil and GetHealth(Cake) < 999980 and gearIsInCircle(CurrentHedgehog,cx,cy,450) then - FireBoom(cx,cy,200) -- todo animate - DeleteGear(Cake) - Cake = nil + local victoryX, victoryY + if multiplayerWins <= #victoryPosses then + victoryX, victoryY = victoryPosses[multiplayerWins].x, victoryPosses[multiplayerWins].y + else + victoryX, victoryY = victoryPosses[#victoryPosses].x, victoryPosses[#victoryPosses].y + end + SetGearPosition(CurrentHedgehog, victoryX, victoryY) + SetEffect(CurrentHedgehog, heInvulnerable, 1) + SetHealth(CurrentHedgehog, 1) + + if (deadHedgehogs + multiplayerWins) >= totalHedgehogs then + makeFinalMultiPlayerStats() + EndGame() + onAchievementsDeclaration() + else + EndTurn(true) + SetInputMask(0xFFFFFFFF) + end + return + end end end + if CurrentHedgehog ~= nil then + x,y = GetGearPosition(CurrentHedgehog) + if Cake ~= nil then + local cx,cy = GetGearPosition(Cake) + if y < cy-1500 then DeleteGear(Cake) end + + if Cake ~= nil and GetHealth(Cake) < 999980 and gearIsInCircle(CurrentHedgehog,cx,cy,450) then + FireBoom(cx,cy,200) -- todo animate + DeleteGear(Cake) + end + end + if band(GetState(CurrentHedgehog),gstHHDriven) == 0 then + for f,i in pairs(Fire) do -- takes too long to fall otherwise + DeleteGear(f) + end + if Cake ~= nil then + DeleteGear(Cake) + end + end + end + + if CurrentHedgehog ~= nil and TurnTimeLeft > 0 and band(GetState(CurrentHedgehog),gstHHDriven) ~= 0 then if MaxHeight < delayHeight and TurnTimeLeft<(999999999-delayTime) and @@ -306,26 +350,14 @@ math.random(360), 0, 999999999, -- frameticks - 171, -- star + sprStar, -- star 0, c) --, 0xFFCC00FF) -- could be fun to make colour shift as you rise... Stars[s] = 1 - end - end - - if CurrentHedgehog ~= nil and band(GetState(CurrentHedgehog),gstHHDriven) == 0 then - for f,i in pairs(Fire) do -- takes too long to fall otherwise - DeleteGear(f) end - if Cake ~= nil then - DeleteGear(Cake) - Cake = nil - end - end - if CurrentHedgehog ~= nil and TurnTimeLeft > 0 then local vx, vy = GetGearVelocity(CurrentHedgehog) - local distanceFromWater = WaterLine - y + local distanceFromWater = WaterLine - y --[[ check joke awards ]] -- navy award: when distance from main map is over 1000 @@ -368,33 +400,36 @@ } end end - if isSinglePlayer then - if distanceFromWater < 0 and not YouLost and not YouWon then - makeSinglePlayerLoserStats() - YouLost = true - end - if not YouWon and not YouLost and gearIsInBox(CurrentHedgehog, 1920, 252, 50, 50) then - local finishTime = (GameTime-startTime)/1000 - local roundedFinishTime = math.ceil(math.floor(finishTime+0.5)) - AddCaption(loc("Victory!")) - 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!"), loc(GetHogName(CurrentHedgehog)), finishTime)) - SendStat(siCustomAchievement, string.format(loc("%s bravely climbed up to a dizzy height of %d to reach home."),loc(GetHogName(CurrentHedgehog)), getActualHeight(RecordHeight))) - SendStat(siPointType, loc("seconds")) - SendStat(siPlayerKills, tostring(roundedFinishTime), loc(GetHogTeamName(CurrentHedgehog))) - EndGame() - onAchievementsDeclaration() - YouWon = true - end - elseif distanceFromWater < 0 and not YouLost then + local finishTime = (GameTime-startTime)/1000 + local roundedFinishTime = math.ceil(math.floor(finishTime+0.5)) + if isSinglePlayer then + if distanceFromWater < 0 and not YouLost and not YouWon then + makeSinglePlayerLoserStats() + YouLost = true + 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 + AddCaption(loc("Victory!")) + 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)) + 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)) + + EndGame() + onAchievementsDeclaration() + YouWon = true + end + else + if distanceFromWater < 0 and not YouLost and not YouWon then makeMultiPlayerLoserStat(CurrentHedgehog) deadHedgehogs = deadHedgehogs + 1 YouLost = true @@ -404,20 +439,37 @@ onAchievementsDeclaration() end end + -- Check victory + if not YouWon and not YouLost and gearIsInBox(CurrentHedgehog, 1920, 252, 50, 50) and + -- Delay victory if MrMine is triggered + (not MrMine or (MrMine and band(GetState(MrMine), gstAttacking) == 0)) then + -- Player managed to reach home in multiplayer. + -- Stop hog, disable controls, celebrate victory and continue the game after 4 seconds. + AddCaption(string.format(loc("%s climbed home in %d seconds!"), GetHogName(CurrentHedgehog), roundedFinishTime)) + SendStat(siCustomAchievement, string.format(loc("%s (%s) reached home in %.3f seconds."), GetHogName(CurrentHedgehog), GetHogTeamName(CurrentHedgehog), finishTime)) + makeMultiPlayerWinnerStat(CurrentHedgehog) + PlaySound(sndVictory, CurrentHedgehog) + -- TODO: Unselect weapon. + -- Note: SetWeapon(amNothing) does not work. :-( + SetGearMessage(CurrentHedgehog, band(GetGearMessage(CurrentHedgehog), bnot(gmLeft+gmRight+gmUp+gmDown+gmHJump+gmLJump+gmPrecise))) + SetInputMask(0x00) + -- TODO: Add stupid winner grin. + multiplayerVictoryDelay = 4000 + YouWon = true + end + end if GameTime % 500 == 0 then - --if isSinglePlayer and MaxHeight < 32000 and WaterRise == nil then - -- WaterRise = AddGear(0,0,gtWaterUp, 0, 0, 0, 0) - --end - if showWaterStats == true then - SendStat(siClanHealth, tostring(getActualHeight(WaterLine)), " ") - end - for t,i in pairs(teams) do - if currTeam == t then - SendStat(siClanHealth, tostring(getActualHeight(y)), t) - else - SendStat(siClanHealth, '0', t) + if not isSinglePlayer then + for t,i in pairs(teams) do + if currTeam == t then + SendStat(siClanHealth, tostring(getActualHeight(y)), t) + else + SendStat(siClanHealth, '0', t) + end end + else + SendStat(siClanHealth, tostring(getActualHeight(y)), GetHogTeamName(CurrentHedgehog)) end -- play taunts @@ -431,7 +483,7 @@ end end - if addCake and CakeTries < 10 and y < 32600 and y > 3000 and Cake == nil and band(GetState(CurrentHedgehog),gstHHDriven) ~= 0 then + 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 if y > 31000 then cy = 24585 elseif @@ -557,12 +609,12 @@ makeSinglePlayerLoserStats() else deadHedgehogs = deadHedgehogs + 1 - if deadHedgehogs >= totalHedgehogs then + makeMultiPlayerLoserStat(gear) + if (deadHedgehogs + multiplayerWins) >= totalHedgehogs then makeFinalMultiPlayerStats() EndGame() onAchievementsDeclaration() end - makeMultiPlayerLoserStat(gear) end YouLost = true end @@ -607,7 +659,7 @@ SendStat(siCustomAchievement, string.format(text, RecordHeightHogName)) end SendStat(siPointType, loc("points")) - SendStat(siPlayerKills, actualHeight, loc(GetHogTeamName(CurrentHedgehog))) + SendStat(siPlayerKills, actualHeight, GetHogTeamName(CurrentHedgehog)) EndGame() onAchievementsDeclaration() end @@ -622,6 +674,10 @@ --SendStat(siClanHealth, tostring(teamBests[teamName]), teamName) end +function makeMultiPlayerWinnerStat(gear) + return makeMultiPlayerLoserStat(gear) +end + function makeFinalMultiPlayerStats() local ranking = {} for k,v in pairs(teamBests) do @@ -639,7 +695,7 @@ local winner = ranking[#ranking] local loser = ranking[1] SendStat(siGameResult, string.format(loc("%s wins!"), winner.name)) - SendStat(siGraphTitle, string.format(loc("Team’s best heights per round"))) + SendStat(siGraphTitle, string.format(loc("Height over time"))) if winner.score < 1500 then SendStat(siCustomAchievement, string.format(loc("This round’s award for ultimate disappointment goes to: Everyone!"))) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Cogs/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Cogs/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Josh diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Control/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Control/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +mikade diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Control/desc.txt --- a/share/hedgewars/Data/Maps/Control/desc.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/Control/desc.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,3 @@ -en_US=Islands scattered everywhere\, full set of weapons. +en=Stand on the pillars as long as you can. +de=Steh auf den Säulen so lange du kannst. +pl=Stój na kolumnach tak długo_c jak możesz. diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Control/map.lua --- a/share/hedgewars/Data/Maps/Control/map.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/Control/map.lua Sun Dec 17 00:09:24 2017 +0100 @@ -62,6 +62,10 @@ local gameWon = false local pointLimit = 300 +local missionName = loc("Control") +local missionCaption = loc("Domination game") +local missionHelp + local vCirc = {} local vCircCount = 0 @@ -309,6 +313,7 @@ GameFlags = band(bor(GameFlags, gfInfAttack + gfSolidLand), bnot(gfKing + gfForts)) WaterRise = 0 + HealthDecrease = 0 end @@ -354,6 +359,9 @@ for i = 0, (numTeams-1) do pointLimit = pointLimit - 25 end + + missionHelp = loc("Control pillars to score points.") .. "|" .. + 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 @@ -369,11 +377,7 @@ --AddCaption(zz) -- number of times it took to work end - ShowMission(loc("CONTROL"), - "", - loc("Control pillars to score points.") .. "|" .. - loc("Goal") .. ": " .. pointLimit .. " " .. loc("points"), 0, 0) - + ShowMission(missionName, missionCaption, missionHelp, 0, 0) end @@ -410,16 +414,18 @@ totalComment = "" for i = 0,(TeamsCount-1) do - if teamNameArr[i] ~= " " then -- i - teamComment[i] = teamNameArr[i] .. ": " .. teamScore[teamClan[i]] .. " " .. loc("points") .. "|" + if teamNameArr[i] ~= " " then + -- Team scores (“: ”) + teamComment[i] = string.format(loc("%s: %d"), teamNameArr[i], teamScore[teamClan[i]]) .. "|" totalComment = totalComment .. teamComment[i] elseif teamNameArr[i] == " " then teamComment[i] = "|" end end - ShowMission(loc("CONTROL"), - loc("Team Scores") .. ":", + ShowMission(missionName, missionCaption, + missionHelp .. "|" .. + loc("Team Scores:") .. "|" .. totalComment, 0, 1600) end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/FlightJoust/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/FlightJoust/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Hammock/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Hammock/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Hedgewars/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Hedgewars/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Knockball/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Knockball/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/Knockball/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,6 +1,7 @@ install(FILES map.png map.cfg + map.hwp map.lua preview.png desc.txt diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Knockball/desc.txt --- a/share/hedgewars/Data/Maps/Knockball/desc.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/Knockball/desc.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,3 @@ -en_US=Knock your opponents off the platforms using only a bat! +en=Knock your opponents off the platforms using only a bat! +de=Schubs deine Gegner von den Plattformen nur mit einem Baseball-Schläger! +pl=Zrzuć swoich przeciwników z platform_c używając tylko kija! diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Knockball/map.hwp Binary file share/hedgewars/Data/Maps/Knockball/map.hwp has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Knockball/map.lua --- a/share/hedgewars/Data/Maps/Knockball/map.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/Knockball/map.lua Sun Dec 17 00:09:24 2017 +0100 @@ -2,12 +2,8 @@ HedgewarsScriptLoad("/Scripts/Locale.lua") -local score = {[0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0} - local ball = nil -local started = false - function onGameInit() GameFlags = gfSolidLand + gfInvulnerable + gfDivideTeams TurnTime = 20000 @@ -15,12 +11,14 @@ MinesNum = 0 Explosives = 0 Delay = 500 - SuddenDeathTurns = 99999 -- "disable" sudden death + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 end function onGameStart() - ShowMission(loc("Hedgewars-Knockball"), loc("Not So Friendly Match"), loc("Bat balls at your enemies and|push them into the sea!"), -amBaseballBat, 0) - started = true + ShowMission(loc("Knockball"), loc("Not So Friendly Match"), loc("Bat balls at your enemies and|push them into the sea!"), -amBaseballBat, 0) + SetAmmoTexts(amBaseballBat, loc("Baseball Bat with Ball"), loc("Knockball weapon"), loc("Throw a baseball at your foes|and send them flying!") .. "|" .. loc("Attack: Throw ball")) end function onGameTick() @@ -46,26 +44,8 @@ end function onGearDelete(gear) - if not started then - return - end if gear == ball then ball = nil - elseif (GetGearType(gear) == gtHedgehog) and CurrentHedgehog ~= nil then - local clan = GetHogClan(CurrentHedgehog) - local s - if clan ~= nil then - if GetHogClan(CurrentHedgehog) ~= GetHogClan(gear) then - score[clan] = score[clan] + 1 - s = string.format(loc("%s is out and Team %d|scored a point!| |Score:"), GetHogName(gear), clan + 1) - else - score[clan] = score[clan] - 1 - s = string.format(loc("%s is out and Team %d|scored a penalty!| |Score:"), GetHogName(gear), clan + 1) - end - s = s .. " " .. score[0] - for i = 1, ClansCount - 1 do s = s .. " - " .. score[i] end - ShowMission(loc("Hedgewars-Knockball"), loc("Not So Friendly Match"), s, -amBaseballBat, 0) - end end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Lonely_Island/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Lonely_Island/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Maciej Mroziński diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Octorama/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Octorama/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +jessor diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Ropes/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Ropes/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Ruler/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Ruler/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Guillaume Englert diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/SB_Bones/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/SB_Bones/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Chucklefish, Ltd diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/SB_Crystal/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/SB_Crystal/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Chucklefish, Ltd diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/SB_Grassy/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/SB_Grassy/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Chucklefish, Ltd diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/SB_Haunty/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/SB_Haunty/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Chucklefish, Ltd diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/SB_Oaks/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/SB_Oaks/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Chucklefish, Ltd diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/SB_Shrooms/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/SB_Shrooms/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Chucklefish, Ltd diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/SB_Tentacles/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/SB_Tentacles/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Chucklefish, Ltd diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/Tree/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/Tree/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/TrophyRace/desc.txt --- a/share/hedgewars/Data/Maps/TrophyRace/desc.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/TrophyRace/desc.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,3 @@ -en_US=Ready\, set\, go! Who is going to be the first in this crazy race? \ No newline at end of file +en=Use your rope to reach the finish line faster than anyone else! +de=Benutze dein Seil_c um die Ziellinie schneller als alle anderen zu erreichen! +pl=Użyj swojej liny_c by dostać się do linii mety szybciej_c niż ktokolwiek inny! diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/TrophyRace/map.lua --- a/share/hedgewars/Data/Maps/TrophyRace/map.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Maps/TrophyRace/map.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,5 +1,10 @@ -- Hedgewars - Roperace for 2+ Players +-- DEVELOPER WARNING - FOR OFFICIAL DEVELOPMENT -- +-- Be careful when editig this script, do not introduce changes lightly! +-- This script is used for time records on the official Hedgewars server. +-- Introducing breaking changes means we have to invalidate past time records! + HedgewarsScriptLoad("/Scripts/Locale.lua") -- store number of hedgehogs @@ -52,12 +57,18 @@ MinesNum = 0 Explosives = 0 Delay = 500 - SuddenDeathTurns = 99999 -- "disable" sudden death Theme = 'Olympics' + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 end function onGameStart() - ShowMission(loc("TrophyRace"), "", loc("Use your rope to get from start to finish as fast as you can!"), -amRope, 0) + ShowMission(loc("TrophyRace"), loc("Race"), + loc("Use your rope to get from start to finish as fast as you can!") .. "|" .. + loc("In each round, the worst hedgehog of the round is eliminated.") .. "|" .. + loc("The last surviving clan wins."), + -amRope, 0) started = true p=1820 for i = 0, numhhs - 1 do @@ -161,9 +172,9 @@ --Place a grenade to make inactive slowest hog active x, y = GetGearPosition(worsthog) AddGear(x, y, gtShell, 0, 0, 0, 0) - worsttime = 0 - worsthog = nil end + worsttime = 0 + worsthog = nil end for i=0, ClansCount -1 do @@ -174,8 +185,8 @@ hscore = hscore .. "|" .. string.format(loc("Team %d: "), i+1) .. tt end - ShowMission(loc("TrophyRace"), "", loc("You've reached the goal!| |Time: ") .. (ttime / 1000) .. " s" .. hscore, 0, 0) - TurnTimeLeft = 0 + ShowMission(loc("TrophyRace"), loc("Race"), loc("You've reached the goal!| |Time: ") .. (ttime / 1000) .. " s" .. hscore, 0, 0) + EndTurn(true) end end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Maps/portal/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Maps/portal/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +sphrix diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/CMakeLists.txt --- a/share/hedgewars/Data/Missions/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,4 @@ add_subdirectory(Training) +add_subdirectory(Challenge) +add_subdirectory(Scenario) add_subdirectory(Campaign) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/backstab.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,53 @@ +--[[ +A Classic Fairytale: Backstab + += SUMMARY = +It is revealed that there's a traitor among the natives. +Player decides whether to kill him or not. +After the natives must defeat 3 waves of cannibals. + += FLOW CHART = + +== Linear events == + +- Cut scene: startScene (traitor is revealed) +- Player is instructed to decide what to do with the traitor +| Player kills traitor + - Cut scene: afterChoiceAnim +| Player spares traitor + - Cut scene: afterChoiceAnim (different) +| Player kills any other hog or own hog + > Game over +- First turn of cannibals +- TBS +- First wave of cannibals dead +- Cut scene: wave2Anim +- Spawn 2nd cannibal wave +- TBS +- 2nd wave dead +- Cut scene: wave2DeadAnim +- All natives but one are encaged +- 7 turns till arrival of 3rd wave +- Arrival points are marked with circles +- One hero is deployed near the circles +- Player now only controls the hero, switch hog is removed +- TBS +- 3rd wave appears +- TBS +- 3rd wave dead +- Final cut scene +> Victory + +=== The traitor === +The traitor is chosen based on the past player decisions in the campaign. + +== Non-linear events == + +| Any native hog dies after traitor decision: + - Another hog (if alive) mourns the loss + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -70,6 +120,9 @@ spyHog = nil deployedHog = nil deployedDead = false +nativesTeleported = false +nativesIsolated = false +hogDeployed = false cyborgHidden = false needToAct = 0 @@ -193,7 +246,7 @@ AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], loc("Do not laugh, inexperienced one, for he speaks the truth!"), SAY_SAY, 10000}}) AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], loc("Yeah, sure! I died. Hillarious!"), SAY_SAY, 6000}}) AnimInsertStepNext({func = AnimSay, args = {gearr, loc("You're...alive!? But we saw you die!"), SAY_SAY, 6000}}) - AnimInsertStepNext({func = AnimSay, args = {gearr, loc("???"), SAY_SAY, 2000}}) + AnimInsertStepNext({func = AnimSay, args = {gearr, loc("Huh?"), SAY_SAY, 2000}}) AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], loc("Wow, what a dream!"), SAY_SAY, 3000}}) if nativeDead[chiefNum] ~= true then AnimInsertStepNext({func = AnimTurn, args = {natives[chiefNum], "Right"}}) @@ -207,7 +260,7 @@ AnimInsertStepNext({func = AnimSay, args = {natives[wiseNum], loc("It was not a dream, unwise one!"), SAY_SAY, 5000}}) AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], loc("Exactly, man! That was my dream."), SAY_SAY, 5000}}) AnimInsertStepNext({func = AnimSay, args = {gearr, loc("You're...alive!? But we saw you die!"), SAY_SAY, 6000}}) - AnimInsertStepNext({func = AnimSay, args = {gearr, loc("???"), SAY_SAY, 2000}}) + AnimInsertStepNext({func = AnimSay, args = {gearr, loc("Huh?"), SAY_SAY, 2000}}) AnimInsertStepNext({func = AnimSay, args = {natives[denseNum], loc("Dude, wow! I just had the weirdest high!"), SAY_SAY, 6000}}) if nativeDead[chiefNum] ~= true then AnimInsertStepNext({func = AnimTurn, args = {natives[chiefNum], "Right"}}) @@ -256,7 +309,7 @@ AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], loc("You know what? I don't even regret anything!"), SAY_SAY, 7000}}) AnimInsertStepNext({func = AnimSay, args = {natives[girlNum], loc("In fact, you are the only one that's been acting strangely."), SAY_SAY, 8000}}) AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], loc("Are you accusing me of something?"), SAY_SAY, 3500}}) - AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], loc("Seems like every time you take a \"walk\", the enemy find us!"), SAY_SAY, 8000}}) + AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], loc("Seems like every time you take a \"walk\", the enemy finds us!"), SAY_SAY, 8000}}) AnimInsertStepNext({func = AnimSay, args = {natives[waterNum], loc("You know...taking a stroll."), SAY_SAY, 3500}}) AnimInsertStepNext({func = AnimSay, args = {natives[leaksNum], loc("Where have you been?!"), SAY_SAY, 3000}}) end @@ -395,28 +448,31 @@ end function IsolateNatives() - PlaceGirder(710, 299, 6) - PlaceGirder(690, 299, 6) - PlaceGirder(761, 209, 4) - PlaceGirder(921, 209, 4) - PlaceGirder(1081, 209, 4) - PlaceGirder(761, 189, 4) - PlaceGirder(921, 189, 4) - PlaceGirder(1081, 189, 4) - PlaceGirder(761, 169, 4) - PlaceGirder(921, 169, 4) - PlaceGirder(1081, 169, 4) - PlaceGirder(761, 149, 4) - PlaceGirder(921, 149, 4) - PlaceGirder(1081, 149, 4) - PlaceGirder(761, 129, 4) - PlaceGirder(921, 129, 4) - PlaceGirder(1081, 129, 4) - PlaceGirder(1120, 261, 2) - PlaceGirder(1140, 261, 2) - PlaceGirder(1160, 261, 2) - AddAmmo(deployedHog, amDEagle, 0) - AddAmmo(deployedHog, amFirePunch, 0) + if not nativesIsolated then + PlaceGirder(710, 299, 6) + PlaceGirder(690, 299, 6) + PlaceGirder(761, 209, 4) + PlaceGirder(921, 209, 4) + PlaceGirder(1081, 209, 4) + PlaceGirder(761, 189, 4) + PlaceGirder(921, 189, 4) + PlaceGirder(1081, 189, 4) + PlaceGirder(761, 169, 4) + PlaceGirder(921, 169, 4) + PlaceGirder(1081, 169, 4) + PlaceGirder(761, 149, 4) + PlaceGirder(921, 149, 4) + PlaceGirder(1081, 149, 4) + PlaceGirder(761, 129, 4) + PlaceGirder(921, 129, 4) + PlaceGirder(1081, 129, 4) + PlaceGirder(1120, 261, 2) + PlaceGirder(1140, 261, 2) + PlaceGirder(1160, 261, 2) + AddAmmo(deployedHog, amDEagle, 0) + AddAmmo(deployedHog, amFirePunch, 0) + nativesIsolated = true + end end function PutCGI() @@ -443,11 +499,14 @@ end function TeleportNatives() - nativePos[waterNum] = {1100, 288} - for i = 1, 7 do - if nativeDead[i] ~= true then - AnimTeleportGear(natives[i], unpack(nativePos[i])) - end + if not nativesTeleported then + nativePos[waterNum] = {1100, 288} + for i = 1, 7 do + if nativeDead[i] ~= true then + AnimTeleportGear(natives[i], unpack(nativePos[i])) + end + end + nativesTeleported = true end end @@ -464,10 +523,15 @@ end function DeployHog() - AnimSwitchHog(deployedHog) - AnimTeleportGear(deployedHog, unpack(deployedPos)) - if deployedHog ~= natives[wiseNum] then - AnimSay(deployedHog, loc("Why me?!"), SAY_THINK, 2000) + if not hogDeployed then + -- Steal switch to force the deployed hog to be on its own + AddAmmo(deployedHog, amSwitch, 0) + AnimSwitchHog(deployedHog) + AnimTeleportGear(deployedHog, unpack(deployedPos)) + if deployedHog ~= natives[wiseNum] then + AnimSay(deployedHog, loc("Why me?!"), SAY_THINK, 2000) + end + hogDeployed = true end end @@ -504,12 +568,12 @@ if nativesNum == 0 then return end - local hogDeadStrings = {loc("They killed ") .. gear .. loc("! You bastards!"), - gear .. loc("! Why?!"), + local hogDeadStrings = {string.format(loc("They killed %s! You bastards!"), gear), + string.format(loc("%s! Why?!"), gear), loc("That was just mean!"), - loc("Oh no, not ") .. gear .. "!", - loc("Why ") .. gear .. loc("? Why?"), - loc("What has ") .. gear .. loc(" ever done to you?!")} + string.format(loc("Oh no, not %s!"), gear), + string.format(loc("Why %s? Why?"), gear), + string.format(loc("What has %s ever done to you?"), gear)} table.insert(hogDeadAnim, {func = AnimSay, args = {CurrentHedgehog, hogDeadStrings[7 - nativesNum], SAY_SHOUT, 4000}}) end @@ -546,10 +610,10 @@ function SkipWave2DeadAnim() TeleportNatives() - IsolateNatives() + PutCircles() DeployHog() + IsolateNatives() HideCyborg() - PutCircles() end function SpawnPlatformCrates() @@ -557,8 +621,8 @@ SpawnAmmoCrate(2574, 1279, amSMine) SpawnAmmoCrate(2575, 1267, amMine) SpawnAmmoCrate(2617, 1259, amSMine) - SpawnUtilityCrate(2579, 1254, amMine) - SpawnUtilityCrate(2478, 1243, amMine) + SpawnAmmoCrate(2579, 1254, amMine) + SpawnAmmoCrate(2478, 1243, amMine) end function AfterWave2DeadAnim() @@ -569,7 +633,7 @@ AddEvent(CheckTurnsOver, {}, DoTurnsOver, {3}, 0) AddEvent(CheckWaveDead, {3}, DoWaveDead, {3}, 0) AddEvent(CheckDeployedDead, {}, DoDeployedDead, {}, 0) - TurnTimeLeft = 0 + EndTurn(true) 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 @@ -583,9 +647,9 @@ end function SkipStartAnim() + ReviveNatives() AnimSetGearPosition(natives[waterNum], nativePos[denseNum][1] + 50, nativePos[denseNum][2]) RestoreWave(1) - ReviveNatives() SetGearMessage(CurrentHedgehog, 0) SetState(CurrentHedgehog, 0) if m2Choice == choiceAccepted then @@ -598,12 +662,15 @@ function AfterStartAnim() AnimSwitchHog(natives[leaksNum]) - TurnTimeLeft = 0 + EndTurn(true) stage = spyKillStage AddEvent(CheckChoice, {}, DoChoice, {}, 0) AddEvent(CheckKilledOther, {}, DoKilledOther, {}, 0) AddEvent(CheckChoiceRefuse, {}, DoChoiceRefuse, {}, 0) - ShowMission(loc("Backstab"), loc("Judas"), loc("Kill the traitor...or spare his life!|Kill him or press [Precise]!"), 1, 8000) + 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) end -----------------------------Events------------------------------------ @@ -620,7 +687,7 @@ DismissTeam(loc("Natives")) DismissTeam(loc("Tribe")) DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end function CheckChoice() @@ -664,7 +731,7 @@ ShowMission(loc("Backstab"), loc("Brutus"), loc("You have killed an innocent hedgehog!"), 0, 6000) DismissTeam(loc("Natives")) DismissTeam(loc("Tribe")) - TurnTimeLeft = 0 + EndTurn(true) end function CheckWaveDead(index) @@ -677,7 +744,7 @@ end function DoWaveDead(index) - TurnTimeLeft = 0 + EndTurn(true) needToAct = index end @@ -711,7 +778,7 @@ table.insert(wave3DeadAnim, {func = AnimCustomFunction, args = {deployedHog, RestoreCyborg, {}}}) table.insert(wave3DeadAnim, {func = AnimOutOfNowhere, args = {cyborg, 4040, 782}}) 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}}) + table.insert(wave3DeadAnim, {func = AnimMove, args = {cyborg, "Right", 4060, 0, 7000}}) table.insert(wave3DeadAnim, {func = AnimSwitchHog, args = {deployedHog}}) table.insert(wave3DeadAnim, {func = AnimWait, args = {deployedHog, 1}}) table.insert(wave3DeadAnim, {func = AnimCustomFunction, args = {deployedHog, HideCyborg, {}}}) @@ -774,7 +841,7 @@ DismissTeam(loc("Assault Team")) DismissTeam(loc("Reinforcements")) DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end -----------------------------Misc-------------------------------------- @@ -842,8 +909,7 @@ function SetupPlace() startNativesNum = nativesNum - HideHog(cyborg) - cyborgHidden = true + HideCyborg() for i = 1, 9 do HideHog(cannibals[i]) cannibalHidden[i] = true @@ -906,17 +972,17 @@ end - AddTeam(loc("Assault Team"), 14483456, "Skull", "Island", "Pirate", "cm_vampire") + AddTeam(loc("Assault Team"), 14483456, "skull", "Island", "Pirate", "cm_vampire") for i = 1, 6 do cannibals[i] = AddHog(cannibalNames[i], 1, 50, "vampirichog") end - AddTeam(loc("Reinforcements"), 14483456, "Skull", "Island", "Pirate", "cm_vampire") + AddTeam(loc("Reinforcements"), 14483456, "skull", "Island", "Pirate", "cm_vampire") for i = 7, 9 do cannibals[i] = AddHog(cannibalNames[i], 1, 50, "vampirichog") end - AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1") for i = 1, 9 do @@ -954,12 +1020,12 @@ MinesTime = 3000 Explosives = 0 Delay = 10 - Map = "Cave" + Map = "Cave" Theme = "Nature" - SuddenDeathTurns = 3000 - - AddHogs() - AnimInit() + WaterRise = 0 + HealthDecrease = 0 + AddHogs() + AnimInit() end function onGameStart() @@ -1020,7 +1086,7 @@ SetAmmo(amGirder, 4, 0, 0, 2) SetAmmo(amParachute, 4, 0, 0, 2) SetAmmo(amSwitch, 8, 0, 0, 2) - SetAmmo(amSkip, 8, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) SetAmmo(amRope, 5, 0, 0, 3) SetAmmo(amBlowTorch, 3, 0, 0, 3) SetAmmo(amPickHammer, 0, 0, 0, 3) @@ -1048,18 +1114,23 @@ end if GetHogTeamName(CurrentHedgehog) == loc("Tribe") then - TurnTimeLeft = 0 + EndTurn(true) return end TurnsLeft = TurnsLeft - 1 if stage == platformStage then - AddCaption(TurnsLeft .. " turns until arrival!") + AddCaption(string.format(loc("Turns until arrival: %d"), TurnsLeft)) + end + if deployedHog then + if GetHogTeamName(CurrentHedgehog) == loc("Natives") then + AnimSwitchHog(deployedHog) + end end if stage == spyKillStage then if CurrentHedgehog == spyHog or GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then - TurnTimeLeft = 0 + EndTurn(true) else SetGearMessage(CurrentHedgehog, 0) --AnimSwitchHog(natives[leaksNum]) @@ -1095,7 +1166,10 @@ SetAnimSkip(true) return end - if stage == spyKillStage then +end + +function onHogAttack(ammoType) + if stage == spyKillStage and ammoType == amSkip then highJumped = true end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/dragon.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/dragon.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/dragon.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,34 @@ +--[[ +A Classic Fairytale: Dragon's Lair + += SUMMARY = +Hero must collect an utility crate on the other side of the river. +To accomplish that, hero must first collect a series of crates with +the rope and wipe out the cyborgs. + += GOALS = +- Mission goal (leads to immediate victory): Collect utility crate at the right side of the river +- First sub-goal: Collect (or destroy) a series of crates (all other utility crates) +- Second sub-goal: Wipe out the cyborgs + += FLOW CHART = +- Cut scene: Intro +- TBS +| Player accomplishes first sub-goal first: + - Cut scene: Cyborg reveals second goal + - A ton of weapon crates and some rope crates spawn on the long platform +| Player accomplshed second sub-goal first: + - Hero reminds player to collect/destroy remaining crates +- Player accomplished both goals +- Cut scene: Cyborg teleports hero to the long platform and congrats hero +- Hero's ammo is cleared, all crates, mines, sticky mines and barrels are removed from platform +- Spawn a portal gun crate on the long platform and also a teleportation crate further to the right +- (These utilities can be used to finish the mission) +- Player takes final crate at the very right +> Victory + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -138,16 +169,16 @@ cyborgsDir = {"Left", "Left", "Left", "Right"} cratePos = { - {788, 1919, amGirder, 2}, {412, 1615, amGirder, 1}, - {209, 1474, amSniperRifle, 1}, {1178, 637, amDEagle, 1}, - {633, 268, amDEagle, 1}, {3016, 1545, amDEagle, 1}, - {249, 1377, amRope, 3}, {330, 1018, amGirder, 1}, - {888, 647, amRope, 3}, {2116, 337, amRope, 3}, - {1779, 948, amRope, 3}, {3090, 1066, amRope, 3}, - {947, 480, amBazooka, 3}, {1097, 480, amMortar, 3}, - {1139, 451, amSnowball, 3}, {1207, 468, amShotgun, 3}, - {1024, 393, amSniperRifle, 2}, {998, 391, amDynamite, 2}, - {1024, 343, amRope, 2}, {998, 341, amRope, 2} + {{788, 1919, amGirder, 2}, true}, {{412, 1615, amGirder, 1}, true}, + {{209, 1474, amSniperRifle, 1}}, {{1178, 637, amDEagle, 1}}, + {{633, 268, amDEagle, 1}}, {{3016, 1545, amDEagle, 1}}, + {{249, 1377, amRope, 3}, true}, {{330, 1018, amGirder, 1}, true}, + {{888, 647, amRope, 3}, true}, {{2116, 337, amRope, 3}, true}, + {{1779, 948, amRope, 3}, true}, {{3090, 1066, amRope, 3}, true}, + {{947, 480, amBazooka, 3}}, {{1097, 480, amMortar, 3}}, + {{1139, 451, amSnowball, 3}}, {{1207, 468, amShotgun, 3}}, + {{1024, 393, amSniperRifle, 2}}, {{998, 391, amDynamite, 2}}, + {{1024, 343, amRope, 2}, true}, {{998, 341, amRope, 2}, true}, } reactions = {loc("Yeah, take that!"), loc("Bullseye"), loc("Die, die, die!")} @@ -171,6 +202,13 @@ crates = {} cratesNum = 0 jetCrate = nil + +firstTurn = true +cyborgsKilledBeforeCrates = false +cratesTaken = false +doneCyborgsDead = false + +annoyingGearsForPortalScene = {} -----------------------------Animations-------------------------------- function EmitDenseClouds(dir) local dif @@ -193,7 +231,7 @@ startAnim = {} local m = m5DeployedNum table.insert(startAnim, {func = AnimWait, args = {native, 3000}}) - table.insert(startAnim, {func = AnimCaption, args = {native, loc("With the rest of the tribe gone, it was up to ") .. nativeNames[m5DeployedNum] .. loc(" to save the village."), 5000}}) + table.insert(startAnim, {func = AnimCaption, args = {native, string.format(loc("With the rest of the tribe gone, it was up to %s to save the village."), nativeNames[m5DeployedNum]), 5000}}) table.insert(startAnim, {func = AnimCaption, args = {native, loc("But it proved to be no easy task!"), 2000}}) for i = 1, 4 do table.insert(startAnim, {func = FollowGear, swh = false, args = {cyborgs[i]}}) @@ -241,9 +279,9 @@ table.insert(startAnim, {func = AnimCustomFunction, args = {native, RestoreHedge, {cyborg, unpack(cyborgPos)}}}) table.insert(startAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(cyborgPos)}}) table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Left"}}) - table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("Greetings, ") .. nativeUnNames[m] .. "!", SAY_SAY, 2500}}) + table.insert(startAnim, {func = AnimSay, args = {cyborg, string.format(loc("Greetings, %s!"), nativeUnNames[m]), SAY_SAY, 2500}}) table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("As you can see, there is no way to get on the other side!"), SAY_SAY, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("I wish to help you, ") .. nativeUnNames[m] .. "!", SAY_SAY, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {cyborg, string.format(loc("I wish to help you, %s!"), nativeUnNames[m]), SAY_SAY, 4000}}) table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("Beware, though! If you are slow, you die!"), SAY_SAY, 7000}}) table.insert(startAnim, {func = AnimDisappear, args = {cyborg, unpack(cyborgPos)}}) table.insert(startAnim, {func = AnimSwitchHog, args = {native}}) @@ -257,13 +295,28 @@ table.insert(killAnim, {func = AnimCustomFunction, args = {native, RestoreHedge, {cyborg, unpack(cyborgPos)}}}) table.insert(killAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(cyborgPos)}}) table.insert(killAnim, {func = AnimCustomFunction, args = {cyborg, CondNeedToTurn, {cyborg, native}}}) - table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("You bear impressive skills, ") .. nativeUnNames[m5DeployedNum] .. "!", SAY_SHOUT, 4000}}) - table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("However, my mates don't agree with me on letting you go..."), SAY_SHOUT, 7000}}) - table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("I guess you'll have to kill them."), SAY_SHOUT, 4000}}) + table.insert(killAnim, {func = AnimSay, args = {cyborg, string.format(loc("You bear impressive skills, %s!"), nativeUnNames[m5DeployedNum]), SAY_SHOUT, 4000}}) + if CheckCyborgsDead() then + table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("I see you already took care of your enemies."), SAY_SHOUT, 7000}}) + table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("Those were scheduled for disposal anyway."), SAY_SHOUT, 4000}}) + table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("So you basically did the dirty work for us."), SAY_SHOUT, 4000}}) + cyborgsKilledBeforeCrates = true + else + table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("However, my mates don't agree with me on letting you go..."), SAY_SHOUT, 7000}}) + table.insert(killAnim, {func = AnimSay, args = {cyborg, loc("I guess you'll have to kill them."), SAY_SHOUT, 4000}}) + end table.insert(killAnim, {func = AnimDisappear, args = {cyborg, unpack(cyborgPos)}}) table.insert(killAnim, {func = AnimSwitchHog, args = {native}}) table.insert(killAnim, {func = AnimWait, args = {native, 1}}) table.insert(killAnim, {func = AnimCustomFunction, args = {native, HideHedge, {cyborg}}}) + + local function checkCyborgsAgain() + if CheckCyborgsDead() then + DoCyborgsDead() + end + end + table.insert(killAnim, {func = AnimCustomFunction, args = {native, checkCyborgsAgain, {}}}) + AddSkipFunction(killAnim, SkipKillAnim, {}) end @@ -272,7 +325,9 @@ table.insert(killedAnim, {func = AnimOutOfNowhere, args = {cyborg, unpack(secondPos[2])}}) table.insert(killedAnim, {func = AnimOutOfNowhere, args = {native, unpack(secondPos[1])}}) table.insert(killedAnim, {func = AnimCustomFunction, args = {cyborg, CondNeedToTurn, {cyborg, native}}}) - table.insert(killedAnim, {func = AnimSay, args = {cyborg, loc("Nice work, ") .. nativeUnNames[m5DeployedNum] .. "!", SAY_SHOUT, 4000}}) + if not cyborgsKilledBeforeCrates then + table.insert(killedAnim, {func = AnimSay, args = {cyborg, string.format(loc("Nice work, %s!"), nativeUnNames[m5DeployedNum]), SAY_SHOUT, 4000}}) + end table.insert(killedAnim, {func = AnimSay, args = {cyborg, loc("As a reward for your performance, here's some new technology!"), SAY_SHOUT, 8000}}) table.insert(killedAnim, {func = AnimSay, args = {cyborg, loc("Use it wisely!"), SAY_SHOUT, 3000}}) table.insert(killedAnim, {func = AnimDisappear, args = {cyborg, unpack(secondPos[2])}}) @@ -281,39 +336,53 @@ end --------------------------Anim skip functions-------------------------- function SkipStartAnim() + AnimSetGearPosition(native, 457, 1955) AnimSwitchHog(native) AnimWait(native, 1) AddFunction({func = HideHedge, args = {cyborg}}) end +function SpawnCrateByID(id) + if cratePos[id][2] == true then + crates[id] = SpawnUtilityCrate(unpack(cratePos[id][1])) + else + crates[id] = SpawnAmmoCrate(unpack(cratePos[id][1])) + end + return crates[id] +end + function AfterStartAnim() SetGearMessage(native, 0) cratesNum = 0 for i = 1, 6 do - crates[i] = SpawnAmmoCrate(unpack(cratePos[i])) + SpawnCrateByID(i) cratesNum = cratesNum + 1 end FollowGear(native) AddNewEvent(CheckGearsDead, {{crates[1], crates[2]}}, PutCrates, {2}, 0) TurnTimeLeft = TurnTime - ShowMission(loc("Dragon's Lair"), loc("Obstacle course"), loc("In order to get to the other side, you need to collect the crates first.|") .. - loc("As the ammo is sparse, you might want to reuse ropes while mid-air.|") .. - loc("If you wish to restart the course, hold [Precise] while your turn ends (e.g with Skip)!|") .. - loc("The enemy can't move but it might be a good idea to stay out of sight!|") .. - loc("You have ") .. SuddenDeathTurns .. loc(" turns until Sudden Death! Better hurry!"), 1, 0) + ShowMission(loc("Dragon's Lair"), loc("Obstacle course"), loc("In order to get to the other side, you need to get rid of the crates first.") .. "|" .. + loc("As the ammo is sparse, you might want to reuse ropes while mid-air.") .. "|" .. + loc("The enemy can't move but it might be a good idea to stay out of sight!") .. "|" .. + loc("Mines time: 5 seconds"), 1, 0) end function SkipKillAnim() AnimSwitchHog(native) AnimWait(native, 1) AddFunction({func = HideHedge, args = {cyborg}}) + if CheckCyborgsDead() then + DoCyborgsDead() + end end function AfterKillAnim() - PutWeaponCrates() - TurnTimeLeft = TurnTime - AddEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0) - ShowMission(loc("Dragon's Lair"), loc("The Slaughter"), loc("Kill the aliens!"), 1, 2000) + if not cyborgsKilledBeforeCrates then + PutWeaponCrates() + TurnTimeLeft = TurnTime + AddEvent(CheckCyborgsDead, {}, DoCyborgsDead, {}, 0) + ShowMission(loc("Dragon's Lair"), loc("The Slaughter"), loc("Kill the aliens!").."|"..loc("Mines time: 5 seconds"), 1, 2000) + end end function SkipKilledAnim() @@ -323,15 +392,17 @@ end function AfterKilledAnim() + -- Final mission segment with the portal gun HideHedge(cyborg) TurnTimeLeft = TurnTime SetGearMessage(native, 0) - AddAmmo(native, amPortalGun, 100) + SpawnUtilityCrate(1184, 399, amPortalGun, 100) SpawnUtilityCrate(2259, 755, amTeleport, 2) - SpawnHealthCrate(secondPos[1][1] + 30, secondPos[1][2]) + SpawnHealthCrate(secondPos[1][1] + 50, secondPos[1][2] - 20) ShowMission(loc("Dragon's Lair"), loc("The what?!"), loc("Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|").. loc("Portal hint: one goes to the destination, and one is the entrance.|").. - loc("Teleport hint: just use the mouse to select the destination!"), 1, 0) + loc("Teleport hint: just use the mouse to select the destination!").."|".. + loc("Mines time: 5 seconds"), 1, 8000) end -----------------------------Events------------------------------------ @@ -340,6 +411,7 @@ end function NullifyAmmo() + -- Clear the ammo and delete all inappropirate gears on the long platform for the portal scene AddAmmo(native, amRope, 0) AddAmmo(native, amGirder, 0) AddAmmo(native, amLowGravity, 0) @@ -352,41 +424,60 @@ AddAmmo(native, amMortar, 0) AddAmmo(native, amSnowball, 0) AddAmmo(native, amShotgun, 0) + + for i=1, #annoyingGearsForPortalScene do + local gear = annoyingGearsForPortalScene[i] + if not gearDead[gear] and GetY(gear) > 100 and GetY(gear) < 571 and GetX(gear) > 840 and GetX(gear) < 1550 then + DeleteGear(annoyingGearsForPortalScene[i]) + end + end end function DoCyborgsDead() - NullifyAmmo() - RestoreHedge(cyborg) - SetupKilledAnim() - SetGearMessage(CurrentHedgehog, 0) - AddAnim(killedAnim) - AddFunction({func = AfterKilledAnim, args = {}}) + if cratesTaken and not doneCyborgsDead then + NullifyAmmo() + RestoreHedge(cyborg) + SetupKilledAnim() + SetGearMessage(CurrentHedgehog, 0) + AddAnim(killedAnim) + AddFunction({func = AfterKilledAnim, args = {}}) + doneCyborgsDead = true + end end function PutWeaponCrates() for i = 1, 8 do cratesNum = cratesNum + 1 - crates[cratesNum] = SpawnAmmoCrate(unpack(cratePos[cratesNum])) + SpawnCrateByID(cratesNum) end FollowGear(native) end function DoCratesTaken() + cratesTaken = true SetupKillAnim() SetGearMessage(CurrentHedgehog, 0) AddAnim(killAnim) AddFunction({func = AfterKillAnim, args = {}}) end +function CheckPutCrates(gear) + if gear and GetHealth(gear) then + return StoppedGear(gear) + else + return false + end +end + function PutCrates(index) if index <= 7 then cratesNum = cratesNum + 1 - crates[cratesNum] = SpawnUtilityCrate(unpack(cratePos[cratesNum])) + SpawnCrateByID(cratesNum) AddNewEvent(CheckGearDead, {crates[cratesNum]}, PutCrates, {index + 1}, 0) FollowGear(native) else - AddEvent(StoppedGear, {native}, DoCratesTaken, {}, 0) + AddEvent(CheckPutCrates, {native}, DoCratesTaken, {}, 0) end if index == 4 then AnimSay(native, loc("I'm a ninja."), SAY_THINK, 0) @@ -404,7 +495,7 @@ end RestoreHedge(cyborg) DeleteGear(cyborg) - TurnTimeLeft = 0 + EndTurn(true) end function CheckGearsDead(gearList) @@ -424,7 +515,7 @@ function EndMission() RestoreHedge(cyborg) DeleteGear(cyborg) - TurnTimeLeft = 0 + EndTurn(true) end function CheckFreshDead() @@ -434,6 +525,9 @@ function CyborgDeadReact() freshDead = nil if cyborgsLeft == 0 then + if not cratesTaken then + AnimSay(native, loc("I still have to get rid of the crates."), SAY_THINK, 8000) + end return end AnimSay(native, reactions[cyborgsLeft]) @@ -469,24 +563,31 @@ HideHedge(cyborg) jetCrate = SpawnUtilityCrate(3915, 1723, amJetpack) - SetTimer(AddGear(1071, 1913, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1098, 1919, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1136, 1923, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1170, 1930, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1203, 1924, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1228, 1939, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1264, 1931, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1309, 1938, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1352, 1936, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1386, 1939, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1432, 1942, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1483, 1950, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1530, 1954, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1579, 1959, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1000, 1903, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(957, 1903, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(909, 1910, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(889, 1917, gtMine, 0, 0, 0, 0), 5000) + --[[ Block the left entrance. + Otherwise the player could rope out of the map and + go all the way around to the final crate. ]] + PlaceGirder(90, 1709, 6) + PlaceGirder(90, 1875, 6) + + -- Place mines on the ground floor + AddGear(1071, 1913, gtMine, 0, 0, 0, 0) + AddGear(1098, 1919, gtMine, 0, 0, 0, 0) + AddGear(1136, 1923, gtMine, 0, 0, 0, 0) + AddGear(1170, 1930, gtMine, 0, 0, 0, 0) + AddGear(1203, 1924, gtMine, 0, 0, 0, 0) + AddGear(1228, 1939, gtMine, 0, 0, 0, 0) + AddGear(1264, 1931, gtMine, 0, 0, 0, 0) + AddGear(1309, 1938, gtMine, 0, 0, 0, 0) + AddGear(1352, 1936, gtMine, 0, 0, 0, 0) + AddGear(1386, 1939, gtMine, 0, 0, 0, 0) + AddGear(1432, 1942, gtMine, 0, 0, 0, 0) + AddGear(1483, 1950, gtMine, 0, 0, 0, 0) + AddGear(1530, 1954, gtMine, 0, 0, 0, 0) + AddGear(1579, 1959, gtMine, 0, 0, 0, 0) + AddGear(1000, 1903, gtMine, 0, 0, 0, 0) + AddGear(957, 1903, gtMine, 0, 0, 0, 0) + AddGear(909, 1910, gtMine, 0, 0, 0, 0) + AddGear(889, 1917, gtMine, 0, 0, 0, 0) ------ STICKY MINE LIST ------ tempG = AddGear(1199, 733, gtSMine, 0, 0, 0, 0) tempG = AddGear(1195, 793, gtSMine, 0, 0, 0, 0) @@ -503,7 +604,6 @@ function SetupAmmo() AddAmmo(cyborgs[1], amBazooka, 100) --- AddAmmo(cyborgs[1], amSniperRifle, 100) AddAmmo(cyborgs[1], amShotgun, 100) AddAmmo(cyborgs[1], amSwitch, 100) end @@ -515,11 +615,11 @@ gearDead[natives[i]] = false end - AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1") gearDead[cyborg] = false - AddTeam(loc("011101000"), 14483455, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101000"), 14483455, "ring", "UFO", "Robot", "cm_binary") for i = 1, 4 do cyborgs[i] = AddHog(cyborgNames[i], 2, 100, "cyborg2") gearDead[cyborgs[i]] = false @@ -553,24 +653,24 @@ -----------------------------Main Functions---------------------------- function onGameInit() - Seed = 0 - GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableWind + gfDisableGirders - TurnTime = 60000 - CaseFreq = 0 - MinesNum = 20 - MinesTime = 3000 - Explosives = 6 - Delay = 10 + Seed = 0 + GameFlags = gfSolidLand + gfDisableLandObjects + gfDisableWind + gfDisableGirders + TurnTime = 60000 + CaseFreq = 0 + MinesNum = 20 + MinesTime = 5000 + Explosives = 6 + Delay = 10 MapGen = mgDrawn - Theme = "City" + Theme = "City" SuddenDeathTurns = 25 - for i = 1, #map do - ParseCommand('draw ' .. map[i]) - end + for i = 1, #map do + ParseCommand('draw ' .. map[i]) + end AddHogs() - AnimInit() + AnimInit(true) end function onGameStart() @@ -579,8 +679,6 @@ SetupPlace() AnimationSetup() SetupEvents() - AddAnim(startAnim) - AddFunction({func = AfterStartAnim, args = {}}) ShowMission(loc("Dragon's Lair"), loc("Y Chwiliad"), loc("Find your tribe!|Cross the lake!"), 1, 0) end @@ -603,18 +701,28 @@ end end +function onGearAdd(gear) + -- Track gears for removal when reaching the portal segment + local gt = GetGearType(gear) + if gt == gtMine or gt == gtSMine or gt == gtCase or gt == gtExplosives then + table.insert(annoyingGearsForPortalScene, gear) + end +end + function onAmmoStoreInit() SetAmmo(amFirePunch, 3, 0, 0, 0) SetAmmo(amBaseballBat, 2, 0, 0, 0) SetAmmo(amGirder, 0, 0, 0, 2) SetAmmo(amLowGravity, 0, 0, 0, 1) + SetAmmo(amJetpack, 0, 0, 0, 1) SetAmmo(amSkip, 9, 0, 0, 0) end function onNewTurn() - if AnimInProgress() then - TurnTimeLeft = -1 - return + if firstTurn then + AddAnim(startAnim) + AddFunction({func = AfterStartAnim, args = {}}) + firstTurn = false end if GetHogTeamName(CurrentHedgehog) == loc("011101000") then SetInputMask(band(0xFFFFFFFF, bnot(gmLeft + gmRight + gmLJump + gmHJump))) @@ -633,10 +741,9 @@ end TurnTimeLeft = 30000 elseif GetHogTeamName(CurrentHedgehog) == loc("011101001") then - TurnTimeLeft = 0 + EndTurn(true) else SetInputMask(0xFFFFFFFF) - AddCaption(loc("Turns until Sudden Death: ") .. SuddenDeathTurns - TotalRounds) end end @@ -644,9 +751,4 @@ if GameTime > 2500 and AnimInProgress() then SetAnimSkip(true) end - if AnimInProgress() == false then - end end - -function onPreciseUp() -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/enemy.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/enemy.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/enemy.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,21 @@ +--[[ +A Classic Fairytale: The enemy of my enemy + += SUMMARY = +Simple deathmatch on the Islands map. + += GOAL = +Wipe out the Hedge-cogs and Leader teams + += FLOW CHART = +- Cut scene: startAnim +- TBS +- Goal completed +- Cut scene: finalAnim +> Victory + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -286,7 +304,7 @@ ShowMission(loc("The Enemy Of My Enemy"), loc("The Union"), loc("Defeat the cyborgs!"), 1, 0) PutWeaponCrates() PutHealthCrates() - TurnTimeLeft = 0 + EndTurn(true) end function PutHealthCrates() @@ -331,12 +349,12 @@ function DoNativesDead() nativesDeadFresh = true - TurnTimeLeft = 0 + EndTurn(true) end function DoCannibalsDead() cannibalsDeadFresh = true - TurnTimeLeft = 0 + EndTurn(true) end function DoPlayersDead() @@ -344,14 +362,14 @@ RemoveEventFunc(CheckCannibalsDead) RemoveEventFunc(CheckCyborgsDead) playersDeadFresh = true - TurnTimeLeft = 0 + EndTurn(true) end function DoCyborgsDead() -- RemoveEventFunc(CheckNativesDead) -- RemoveEventFunc(CheckCannibalsDead) cyborgsDeadFresh= true - TurnTimeLeft = 0 + EndTurn(true) end function CheckGearsDead(gearList) @@ -388,7 +406,7 @@ DismissTeam(loc("Natives")) DismissTeam(loc("Cannibals")) DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end function WonMission() @@ -404,7 +422,7 @@ SaveCampaignVar("Progress", "9") end DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end -----------------------------Misc-------------------------------------- function HideHedge(hedge) @@ -485,7 +503,7 @@ end function AddHogs() - AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1") AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy") @@ -513,13 +531,13 @@ playersNum = #players playersLeft = playersNum - AddTeam(loc("Hedge-cogs"), 14483455, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("Hedge-cogs"), 14483455, "ring", "UFO", "Robot", "cm_cyborg") for i = 1, cyborgsNum do cyborgs[i] = AddHog(cyborgNames[i], 2, 80, "cyborg2") end if m8EnemyFled == 1 then - AddTeam(loc("Leader"), 14483455, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("Leader"), 14483455, "ring", "UFO", "Robot", "cm_cyborg") if m8Scene == denseScene then leader = AddHog(loc("Dense Cloud"), 2, 200, nativeHats[denseNum]) elseif m8Scene == waterScene then @@ -651,10 +669,10 @@ cyborgsDeadFresh = false WonMission() elseif nativesDeadFresh and GetHogTeamName(CurrentHedgehog) == loc("Cannibals") then - AnimSay(CurrentHedgehog, loc("Your deaths will be avenged, cannibals!"), SAY_SHOUT, 0) + AnimSay(CurrentHedgehog, loc("Your deaths will be avenged, Natives!"), 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) + AnimSay(CurrentHedgehog, loc("Your deaths will be avenged, Cannibals!"), SAY_SHOUT, 0) cannibalsDeadFresh = false end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/epil.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/epil.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/epil.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,44 @@ +--[[ +A Classic Fairytale: Epilogue + += SUMMARY = +The epilogue, a final animated sequence (with 4 possible endings), +plus a sandbox mode. + += GOALS = +You only need to finish the cut scene and quit. +The cut scene can be skipped, this is OK, too. + += FLOW CHART = +== Linear events == +- Long cut scene. This is one of four possible endings. +- The chosen ending depends on the enemy leader chosen in ACF8: +| ACF8 leader: Dense Cloud + - Dense Cloud is the traitor and in prison + - See SetupAnimDense +| ACF8 leader: Fell from Heaven + - Fell from Heaven is the traitor + - See SetupAnimPrincess +| ACF8 leader: Fiery Water + - Fiery Water is the traitor and in prison + - See SetupAnimWater +| ACF8 leader: Nancy Screw (cyborg) + - No traitors + - See SetupAnimCyborg +- Mission is marked as completed after cut scene, but does not exit +- Mission panel with congratulation message appears +- Sandbox mode activated +- All hogs except the traitor are now playable + +Note: This mission does not exit on its own. +The player has either to kill everyone or use the Esc key. + +== Non-linear events == +| All hogs except the traitor are dead + - It's the traitor's turn now + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -71,6 +112,7 @@ startAnim = {} gearDead = {} +hogDead = {} --------------------------Anim skip functions-------------------------- function SkipStartAnim() SetGearMessage(CurrentHedgehog, 0) @@ -81,8 +123,13 @@ crate = SpawnHealthCrate(0, 0) SetGearMessage(CurrentHedgehog, 0) AddNewEvent(CheckCrateTaken, {}, DoCrateTaken, {}, 1) - TurnTimeLeft = 0 - ShowMission("Epilogue", "That's all folks!", "You have successfully finished the campaign!|If you wish to replay, there are other possible endings, too!|You can practice moving around and using utilities in this mission.|However, it will never end!", 1, 0) + EndTurn(true) + 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) + SaveCampaignVar("Progress", "10") + SaveCampaignVar("Won", "true") end ---------------------------Events------------------------------------- @@ -110,41 +157,41 @@ function SetupAnimWater() startAnim = { {func = AnimWait, args = {natives[1], 3000}}, - {func = AnimCaption, args = {natives[ramonNum], "Back in the village, the two tribes finally started to live in harmony.", 5000}}, - {func = AnimSay, args = {natives[ramonNum], "You got a killer mask there, amigo!", SAY_SAY, 5500}}, - {func = AnimSay, args = {cannibals[brainNum], "Thanks, man! It really means a lot to me.", SAY_SAY, 6000}}, - {func = AnimSay, args = {natives[wiseNum], "So, uhmm, how did you manage to teleport them so far?", SAY_SAY, 8000}}, - {func = AnimSay, args = {cannibals[corpseNum], "It's all about the right carrots, you know.", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[wiseNum], "Of course! It's all obvious now!", SAY_SAY, 4500}}, - {func = AnimSay, args = {natives[chiefNum], "I can't believe how blind we were...", SAY_SAY, 4500}}, - {func = AnimSay, args = {natives[chiefNum], "Fighting instead of cultivating a beautiful friendship.", SAY_SAY, 8500}}, - {func = AnimSay, args = {cannibals[hanniNum], "One shall not judge one by one's appearance!", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[chiefNum], "You speak great truth, Hannibal. Here, take a sip!", SAY_SAY, 7500}}, + {func = AnimCaption, args = {natives[ramonNum], loc("Back in the village, the two tribes finally started to live in harmony."), 5000}}, + {func = AnimSay, args = {natives[ramonNum], loc("You got a killer mask there, amigo!"), SAY_SAY, 5500}}, + {func = AnimSay, args = {cannibals[brainNum], loc("Thanks, man! It really means a lot to me."), SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[wiseNum], loc("So, uhmm, how did you manage to teleport them so far?"), SAY_SAY, 8000}}, + {func = AnimSay, args = {cannibals[corpseNum], loc("It's all about the right carrots, you know."), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[wiseNum], loc("Of course! It's all obvious now!"), SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[chiefNum], loc("I can't believe how blind we were."), SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[chiefNum], loc("Fighting instead of cultivating a beautiful friendship."), SAY_SAY, 8500}}, + {func = AnimSay, args = {cannibals[hanniNum], loc("One shall not judge one by one's appearance!"), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[chiefNum], loc("You speak great truth, Hannibal. Here, take a sip!"), SAY_SAY, 7500}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, - {func = AnimSay, args = {natives[leaksNum], "It's amazing how quickly our lives can change...", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[waterNum], "Aye! Fellow! Let me exit this chamber of doom!", SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[leaksNum], loc("It's amazing how quickly our lives can change."), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[waterNum], loc("Aye! Fellow! Let me exit this chamber of doom!"), SAY_SAY, 7000}}, {func = AnimTurn, args = {natives[princessNum], "Right"}}, - {func = AnimSay, args = {natives[princessNum], "It's your fault you're there!", SAY_SAY, 5000}}, + {func = AnimSay, args = {natives[princessNum], loc("It's your fault you're there!"), SAY_SAY, 5000}}, {func = AnimTurn, args = {natives[princessNum], "Left"}}, - {func = AnimSay, args = {natives[leaksNum], "I always suspected him!", SAY_SAY, 3000}}, - {func = AnimSay, args = {natives[leaksNum], "Nobody takes walks every day!", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[princessNum], "I don't know who I can trust anymore.", SAY_SAY, 6000}}, - {func = AnimSay, args = {natives[princessNum], "Everywhere I look, I see hogs walking around...", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[princessNum], "...and I think they are up to something. Something bad!", SAY_SAY, 8000}}, + {func = AnimSay, args = {natives[leaksNum], loc("I always suspected him!"), SAY_SAY, 3000}}, + {func = AnimSay, args = {natives[leaksNum], loc("Nobody takes walks every day!"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[princessNum], loc("I don't know who I can trust anymore."), SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[princessNum], loc("Everywhere I look, I see hogs walking around …"), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[princessNum], loc("… and I think they are up to something. Something bad!"), SAY_SAY, 8000}}, {func = AnimMove, args = {natives[leaksNum], "Right", nativePosWater[princessNum][1] - 30, nativePosWater[princessNum][2]}}, - {func = AnimSay, args = {natives[leaksNum], "You can always trust me! I love you!", SAY_SAY, 6000}}, - {func = AnimSay, args = {natives[princessNum], "I know and I'm terribly sorry!", SAY_SAY, 5000}}, - {func = AnimSay, args = {natives[princessNum], "I love Dense Cloud now!", SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[leaksNum], loc("You can always trust me! I love you!"), SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[princessNum], loc("I know and I'm terribly sorry!"), SAY_SAY, 5000}}, + {func = AnimSay, args = {natives[princessNum], loc("I love Dense Cloud now!"), SAY_SAY, 4000}}, {func = AnimTurn, args = {natives[princessNum], "Right"}}, {func = AnimMove, args = {natives[denseNum], "Left", nativePosWater[princessNum][1] + 20, nativePosWater[princessNum][2]}}, - {func = AnimSay, args = {natives[denseNum], "Problems, dude? Chillax!", SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[denseNum], loc("Problems, dude? Chillax!"), SAY_SAY, 4000}}, {func = AnimTurn, args = {natives[leaksNum], "Left"}}, - {func = AnimSay, args = {natives[leaksNum], "(T_T)", SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[leaksNum], loc("Sigh."), SAY_SAY, 6000}}, {func = AnimSwitchHog, args = {natives[leaksNum]}}, } end @@ -152,35 +199,35 @@ function SetupAnimDense() startAnim = { {func = AnimWait, args = {natives[1], 3000}}, - {func = AnimCaption, args = {natives[ramonNum], "Back in the village, the two tribes finally started to live in harmony.", 5000}}, - {func = AnimSay, args = {natives[ramonNum], "You got a killer mask there, amigo!", SAY_SAY, 5500}}, - {func = AnimSay, args = {cannibals[brainNum], "Thanks, man! It really means a lot to me.", SAY_SAY, 6000}}, - {func = AnimSay, args = {natives[wiseNum], "So, uhmm, how did you manage to teleport them so far?", SAY_SAY, 8000}}, - {func = AnimSay, args = {cannibals[corpseNum], "It's all about the right carrots, you know.", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[wiseNum], "Of course! It's all obvious now!", SAY_SAY, 4500}}, - {func = AnimSay, args = {natives[chiefNum], "I can't believe how blind we were...", SAY_SAY, 4500}}, - {func = AnimSay, args = {natives[chiefNum], "Fighting instead of cultivating a beautiful friendship.", SAY_SAY, 8500}}, - {func = AnimSay, args = {cannibals[hanniNum], "One shall not judge one by one's appearance!", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[chiefNum], "You speak great truth, Hannibal. Here, take a sip!", SAY_SAY, 7500}}, + {func = AnimCaption, args = {natives[ramonNum], loc("Back in the village, the two tribes finally started to live in harmony."), 5000}}, + {func = AnimSay, args = {natives[ramonNum], loc("You got a killer mask there, amigo!"), SAY_SAY, 5500}}, + {func = AnimSay, args = {cannibals[brainNum], loc("Thanks, man! It really means a lot to me."), SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[wiseNum], loc("So, uhmm, how did you manage to teleport them so far?"), SAY_SAY, 8000}}, + {func = AnimSay, args = {cannibals[corpseNum], loc("It's all about the right carrots, you know."), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[wiseNum], loc("Of course! It's all obvious now!"), SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[chiefNum], loc("I can't believe how blind we were."), SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[chiefNum], loc("Fighting instead of cultivating a beautiful friendship."), SAY_SAY, 8500}}, + {func = AnimSay, args = {cannibals[hanniNum], loc("One shall not judge one by one's appearance!"), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[chiefNum], loc("You speak great truth, Hannibal. Here, take a sip!"), SAY_SAY, 7500}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, - {func = AnimSay, args = {natives[waterNum], "...And then I took a stroll...", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[leaksNum], "It's amazing how quickly our lives can change...", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[denseNum], "Dude, let me out!", SAY_SAY, 3000}}, - {func = AnimSay, args = {natives[denseNum], "I already said I'm sorry!", SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[waterNum], loc("… and then I took a stroll …"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[leaksNum], loc("It's amazing how quickly our lives can change."), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[denseNum], loc("Dude, let me out!"), SAY_SAY, 3000}}, + {func = AnimSay, args = {natives[denseNum], loc("I already said I'm sorry!"), SAY_SAY, 4000}}, {func = AnimTurn, args = {natives[princessNum], "Right"}}, - {func = AnimSay, args = {natives[princessNum], "Traitors don't get to shout around here!", SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[princessNum], loc("Traitors don't get to shout around here!"), SAY_SAY, 7000}}, {func = AnimTurn, args = {natives[princessNum], "Left"}}, - {func = AnimSay, args = {natives[leaksNum], "I still can't believe he sold us out like that.", SAY_SAY, 8000}}, - {func = AnimSay, args = {natives[princessNum], "I don't know who I can trust anymore.", SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[leaksNum], loc("I still can't believe he sold us out like that."), SAY_SAY, 8000}}, + {func = AnimSay, args = {natives[princessNum], loc("I don't know who I can trust anymore."), SAY_SAY, 6000}}, {func = AnimMove, args = {natives[leaksNum], "Right", nativePosDense[princessNum][1] - 30, nativePosDense[princessNum][2]}}, - {func = AnimSay, args = {natives[leaksNum], "You can always trust me!", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[princessNum], "I know, my hero!", SAY_SAY, 3000}}, - {func = AnimSay, args = {natives[princessNum], "...xoxo...", SAY_SAY, 2000}}, + {func = AnimSay, args = {natives[leaksNum], loc("You can always trust me!"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[princessNum], loc("I know, my hero!"), SAY_SAY, 3000}}, + {func = AnimSay, args = {natives[princessNum], loc("I love you."), SAY_SAY, 2000}}, {func = AnimSwitchHog, args = {natives[leaksNum]}}, } end @@ -188,70 +235,70 @@ function SetupAnimCyborg() startAnim = { {func = AnimWait, args = {natives[1], 3000}}, - {func = AnimCaption, args = {natives[denseNum], "Back in the village, the two tribes finally started to live in harmony.", 5000}}, - {func = AnimSay, args = {natives[denseNum], "Dude, that outfit is so kool!", SAY_SAY, 4500}}, - {func = AnimSay, args = {cannibals[brainNum], "Thanks, dude! It really means a lot to me.", SAY_SAY, 6000}}, - {func = AnimSay, args = {natives[wiseNum], "So, uhmm, how did you manage to teleport them so far?", SAY_SAY, 8000}}, - {func = AnimSay, args = {cannibals[corpseNum], "It's all about the right carrots, you know.", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[wiseNum], "Of course! It's all obvious now!", SAY_SAY, 4500}}, - {func = AnimSay, args = {natives[chiefNum], "I can't believe how blind we were...", SAY_SAY, 4500}}, - {func = AnimSay, args = {natives[chiefNum], "Fighting instead of cultivating a beautiful friendship.", SAY_SAY, 8500}}, - {func = AnimSay, args = {cannibals[hanniNum], "One shall not judge one by one's appearance!", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[chiefNum], "You speak great truth, Hannibal. Here, take a sip!", SAY_SAY, 7500}}, + {func = AnimCaption, args = {natives[denseNum], loc("Back in the village, the two tribes finally started to live in harmony."), 5000}}, + {func = AnimSay, args = {natives[denseNum], loc("Dude, that outfit is so cool!"), SAY_SAY, 4500}}, + {func = AnimSay, args = {cannibals[brainNum], loc("Thanks, dude! It really means a lot to me."), SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[wiseNum], loc("So, uhmm, how did you manage to teleport them so far?"), SAY_SAY, 8000}}, + {func = AnimSay, args = {cannibals[corpseNum], loc("It's all about the right carrots, you know."), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[wiseNum], loc("Of course! It's all obvious now!"), SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[chiefNum], loc("I can't believe how blind we were."), SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[chiefNum], loc("Fighting instead of cultivating a beautiful friendship."), SAY_SAY, 8500}}, + {func = AnimSay, args = {cannibals[hanniNum], loc("One shall not judge one by one's appearance!"), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[chiefNum], loc("You speak great truth, Hannibal. Here, take a sip!"), SAY_SAY, 7500}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, - {func = AnimSay, args = {natives[waterNum], "...And then I took a stroll...", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[leaksNum], "I'm glad this is over!", SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[waterNum], loc("… and then I took a stroll …"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[leaksNum], loc("I'm glad this is over!"), SAY_SAY, 4000}}, {func = AnimMove, args = {natives[princessNum], "Right", nativePosCyborg[princessNum][1] + 30, nativePosCyborg[princessNum][2]}}, - {func = AnimSay, args = {natives[princessNum], "I was so scared.", SAY_SAY, 2500}}, + {func = AnimSay, args = {natives[princessNum], loc("I was so scared."), SAY_SAY, 2500}}, {func = AnimMove, args = {natives[leaksNum], "Right", nativePosCyborg[princessNum][1], nativePosCyborg[princessNum][2]}}, - {func = AnimSay, args = {natives[leaksNum], "You have nothing to be afraid of now.", SAY_SAY, 6000}}, - {func = AnimSay, args = {natives[leaksNum], "I'll protect you!", SAY_SAY, 3000}}, + {func = AnimSay, args = {natives[leaksNum], loc("You have nothing to be afraid of now."), SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[leaksNum], loc("I'll protect you!"), SAY_SAY, 3000}}, {func = AnimTurn, args = {natives[princessNum], "Left"}}, - {func = AnimSay, args = {natives[princessNum], "You're so brave...I feel safe with you.", SAY_SAY, 6500}}, - {func = AnimSay, args = {natives[princessNum], "I think I love you!", SAY_SAY, 3500}}, - {func = AnimSay, args = {natives[leaksNum], "I...like being with you too.", SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[princessNum], loc("You're so brave! I feel safe with you."), SAY_SAY, 6500}}, + {func = AnimSay, args = {natives[princessNum], loc("I think I love you!"), SAY_SAY, 3500}}, + {func = AnimSay, args = {natives[leaksNum], loc("I … like being with you, too."), SAY_SAY, 4500}}, } end function SetupAnimPrincess() startAnim = { {func = AnimWait, args = {natives[1], 3000}}, - {func = AnimCaption, args = {natives[denseNum], "Back in the village, the two tribes finally started to live in harmony.", 5000}}, - {func = AnimSay, args = {natives[denseNum], "Dude, that outfit is so kool!", SAY_SAY, 4500}}, - {func = AnimSay, args = {cannibals[brainNum], "Thanks, dude! It really means a lot to me.", SAY_SAY, 6000}}, - {func = AnimSay, args = {natives[wiseNum], "So, uhmm, how did you manage to teleport them so far?", SAY_SAY, 8000}}, - {func = AnimSay, args = {cannibals[corpseNum], "It's all about the right carrots, you know.", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[wiseNum], "Of course! It's all obvious now!", SAY_SAY, 4500}}, - {func = AnimSay, args = {natives[chiefNum], "I can't believe how blind we were...", SAY_SAY, 4500}}, - {func = AnimSay, args = {natives[chiefNum], "Fighting instead of cultivating a beautiful friendship.", SAY_SAY, 8500}}, - {func = AnimSay, args = {cannibals[hanniNum], "One shall not judge one by one's appearance!", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[chiefNum], "You speak great truth, Hannibal. Here, take a sip!", SAY_SAY, 7500}}, + {func = AnimCaption, args = {natives[denseNum], loc("Back in the village, the two tribes finally started to live in harmony."), 5000}}, + {func = AnimSay, args = {natives[denseNum], loc("Dude, that outfit is so cool!"), SAY_SAY, 4500}}, + {func = AnimSay, args = {cannibals[brainNum], loc("Thanks, dude! It really means a lot to me."), SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[wiseNum], loc("So, uhmm, how did you manage to teleport them so far?"), SAY_SAY, 8000}}, + {func = AnimSay, args = {cannibals[corpseNum], loc("It's all about the right carrots, you know."), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[wiseNum], loc("Of course! It's all obvious now!"), SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[chiefNum], loc("I can't believe how blind we were."), SAY_SAY, 4500}}, + {func = AnimSay, args = {natives[chiefNum], loc("Fighting instead of cultivating a beautiful friendship."), SAY_SAY, 8500}}, + {func = AnimSay, args = {cannibals[hanniNum], loc("One shall not judge one by one's appearance!"), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[chiefNum], loc("You speak great truth, Hannibal. Here, take a sip!"), SAY_SAY, 7500}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, {func = AnimVisualGear, args = {cannibals[hanniNum], cannibalPos[hanniNum][1], cannibalPos[hanniNum][2], vgtSmoke, 0, true}}, {func = AnimWait, args = {natives[1], 1000}}, - {func = AnimSay, args = {natives[buffaloNum], "So I shook my fist in the air!", SAY_SAY, 5000}}, - {func = AnimSay, args = {cannibals[brutalNum], "Well that was an unnecessary act of violence.", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[waterNum], "...And then I took a stroll...", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[leaksNum], "I'm glad this is over!", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[girlNum], "I still can't believe you forgave her!", SAY_SAY, 6000}}, - {func = AnimSay, args = {natives[girlNum], "She endangered the whole tribe!", SAY_SAY, 5000}}, - {func = AnimSay, args = {natives[leaksNum], "It wasn't her fault!", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[leaksNum], "We oppressed her, the only woman in the tribe!", SAY_SAY, 7000}}, - {func = AnimSay, args = {natives[girlNum], "The only woman, huh?", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[girlNum], "Then what am I?", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[leaksNum], "Of course, but you're...special.", SAY_SAY, 5000}}, - {func = AnimSay, args = {natives[girlNum], "Sure!", SAY_SAY, 2000}}, + {func = AnimSay, args = {natives[buffaloNum], loc("So I shook my fist in the air!"), SAY_SAY, 5000}}, + {func = AnimSay, args = {cannibals[brutalNum], loc("Well that was an unnecessary act of violence."), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[waterNum], loc("… and then I took a stroll …"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[leaksNum], loc("I'm glad this is over!"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[girlNum], loc("I still can't believe you forgave her!"), SAY_SAY, 6000}}, + {func = AnimSay, args = {natives[girlNum], loc("She endangered the whole tribe!"), SAY_SAY, 5000}}, + {func = AnimSay, args = {natives[leaksNum], loc("It wasn't her fault!"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[leaksNum], loc("We oppressed her, the only woman in the tribe!"), SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[girlNum], loc("The only woman, huh?"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[girlNum], loc("Then what am I?"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[leaksNum], loc("Of course, but you're … special."), SAY_SAY, 5000}}, + {func = AnimSay, args = {natives[girlNum], loc("Sure!"), SAY_SAY, 2000}}, {func = AnimTurn, args = {natives[leaksNum], "Left"}}, - {func = AnimSay, args = {natives[leaksNum], "We're terribly sorry!", SAY_SAY, 4000}}, - {func = AnimSay, args = {natives[princessNum], "I don't know if I can forget what you've done!", SAY_SAY, 7000}}, + {func = AnimSay, args = {natives[leaksNum], loc("We're terribly sorry!"), SAY_SAY, 4000}}, + {func = AnimSay, args = {natives[princessNum], loc("I don't know if I can forget what you've done!"), SAY_SAY, 7000}}, {func = AnimTurn, args = {natives[princessNum], "Left"}}, {func = AnimMove, args = {natives[princessNum], "Left", nativePosPrincess[princessNum][1] - 10, nativePosPrincess[princessNum][2]}}, {func = AnimSwitchHog, args = {natives[leaksNum]}} @@ -259,7 +306,8 @@ end -----------------------------Misc-------------------------------------- function GetVariables() - m8Scene = tonumber(GetCampaignVar("M8Scene")) + m8Scene = tonumber(GetCampaignVar("M8Scene")) or waterScene + -- waterScene is for fallback if campaign var was not found end function AddHogs() @@ -273,13 +321,13 @@ natives[i] = AddHog(nativeNames[i], 0, 100, nativeHats[i]) end - AddTeam(loc("Cannibals"), 29439, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(loc("Cannibals"), 29439, "skull", "Island", "HillBilly", "cm_birdy") 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"), 29439, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(loc("Traitors"), 29439, "Bone", "Island", "HillBilly", "cm_bloodyblade") if m8Scene == denseScene then DeleteGear(natives[2]) natives[2] = AddHog(nativeNames[2], 0, 100, nativeHats[2]) @@ -350,7 +398,9 @@ Delay = 10 Map = "Hogville" Theme = "Nature" - SuddenDeathTurns = 3000 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 GetVariables() AddHogs() @@ -373,8 +423,17 @@ CheckEvents() end +function onGearAdd(gear) + if GetGearType(gear) == gtHedgehog then + hogDead[gear] = false + end +end + function onGearDelete(gear) gearDead[gear] = true + if GetGearType(gear) == gtHedgehog then + hogDead[gear] = true + end end function onAmmoStoreInit() @@ -414,13 +473,23 @@ SetAmmo(amWhip, 9, 0, 0, 0) end +function IsEveryoneExceptTraitorDead() + for id, isDead in pairs(hogDead) do + if id ~= traitor and not isDead then + return false + end + end + return true +end + function onNewTurn() if AnimInProgress() then TurnTimeLeft = -1 return end - if CurrentHedgehog == traitor then - TurnTimeLeft = 0 + -- 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 TurnTimeLeft = -1 end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/family.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,30 @@ +--[[ +A Classic Fairytale: Family Reunion + += GOALS = +Kill all visible cyborgs (not the princess). +Then move hero to princess and Ramon and Spike Cheese to the surface. + += FLOW CHART = +== Linear events == + +- Cut scene: Intro +- First goal: Kill all visible cyborgs (princess is not a cyborg) +- First goal completed +- Cut scene: Cyborg reveals second goal +- A ton of 5s mines spawn on the surface +- Second goal: Hero must reach princess; Ramon and Spiky Cheese must reach the surface +- Second goal completed +> Victory + +== Non-linear events == +| Princess dead: + > Game over +| Ramon, Spiky Cheese or hero dead: + > Game over + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -96,10 +123,13 @@ startAnim = {} midAnim = {} +princessFreedAnim = {} freshDead = nil crates = {} cratesNum = 0 + +princessFreed = false -----------------------------Animations-------------------------------- function EmitDenseClouds(dir) local dif @@ -146,7 +176,7 @@ table.insert(startAnim, {func = AnimTurn, args = {cyborg, "Left"}}) table.insert(startAnim, {func = AnimTurn, args = {natives[2], "Left"}}) table.insert(startAnim, {func = AnimTurn, args = {natives[3], "Left"}}) - table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("Hello again, ") .. nativeUnNames[m5DeployedNum] .. "!", SAY_SAY, 2500}}) + table.insert(startAnim, {func = AnimSay, args = {cyborg, string.format(loc("Hello again, %s!"), nativeUnNames[m5DeployedNum]), SAY_SAY, 2500}}) table.insert(startAnim, {func = AnimSay, args = {cyborg, loc("I just found out that they have captured your princess!"), SAY_SAY, 7000}}) if m5DeployedNum == girlNum then table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Of course I have to save her. What did I expect?!"), SAY_SAY, 7000}}) @@ -177,6 +207,10 @@ table.insert(midAnim, {func = AnimTeleportGear, args = {natives[1], unpack(nativeMidPos2)}}) table.insert(midAnim, {func = AnimSay, args = {natives[1], loc("Why can't he just let her go?!"), SAY_THINK, 5000}}) AddSkipFunction(midAnim, SkipMidAnim, {}) + + table.insert(princessFreedAnim, {func = AnimSay, args = {princess, loc("Thank you, my hero!"), SAY_SAY, 4000}}) + table.insert(princessFreedAnim, {func = Victory, args = {}}) + AddSkipFunction(princessFreedAnim, SkipPrincessFreedAnim, {}) end --------------------------Anim skip functions-------------------------- @@ -185,12 +219,16 @@ SetupPlace3() SetGearMessage(natives[1], 0) AddNewEvent(CheckPrincessFreed, {}, DoPrincessFreed, {}, 0) - TurnTimeLeft = 0 - ShowMission(loc("Family Reunion"), loc("Salvation"), loc("Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!"), 1, 7000) + EndTurn(true) + ShowMission(loc("Family Reunion"), loc("Salvation"), loc("Get your teammates out of their natural prison and save the princess!|Hint: Drilling holes should solve everything.|Hint: It might be a good idea to place a girder before starting to drill. Just saying.|Hint: All your hedgehogs need to be above the marked height!|Hint: Leaks A Lot needs to get really close to the princess!") .. "|" .. loc("Mines time: 5 seconds"), 1, 7000) vCirc = AddVisualGear(0,0,vgtCircle,0,true) SetVisualGearValues(vCirc, 2625, 1500, 100, 255, 1, 10, 0, 120, 3, 0xff00ffff) end - + +function SkipPrincessFreedAnim() + Victory() +end + function SkipMidAnim() AnimTeleportGear(natives[1], unpack(nativeMidPos2)) SkipStartAnim() @@ -198,9 +236,9 @@ function SetupPlace3() SpawnUtilityCrate(2086, 1887, amRope, 1) - SpawnUtilityCrate(2147, 728, amBlowTorch, 2) - SpawnUtilityCrate(2778, 1372, amPickHammer, 3) - SpawnUtilityCrate(2579, 1886, amPickHammer, 3) + SpawnAmmoCrate(2147, 728, amBlowTorch, 2) + SpawnAmmoCrate(2778, 1372, amPickHammer, 3) + SpawnAmmoCrate(2579, 1886, amPickHammer, 3) SpawnUtilityCrate(2622, 1893, amGirder, 1) SpawnUtilityCrate(2671, 1883, amPortalGun, 3) SpawnUtilityCrate(2831, 1384, amGirder, 3) @@ -226,6 +264,7 @@ end function SkipStartAnim() + AnimSetGearPosition(natives[1], unpack(nativePos2)) AnimSwitchHog(natives[1]) AnimWait(natives[1], 1) end @@ -267,7 +306,7 @@ SpawnAmmoCrate(2077, 847, amWatermelon, 3) grenadeCrate2 = SpawnAmmoCrate(2122, 847, amGrenade, 3) - SpawnUtilityCrate(747, 1577, amPickHammer, 1) + SpawnAmmoCrate(747, 1577, amPickHammer, 1) SpawnUtilityCrate(496, 1757, amGirder, 2) SpawnUtilityCrate(1809, 1880, amGirder, 1) SpawnUtilityCrate(530, 1747, amPortalGun, 1) @@ -283,12 +322,18 @@ end function DoPrincessFreed() - AnimSay(princess, loc("Thank you, my hero!"), SAY_SAY, 0) - if progress and progress<7 then - SaveCampaignVar("Progress", "7") + AddAnim(princessFreedAnim) +end + +function Victory() + if not princessFreed then + if progress and progress<7 then + SaveCampaignVar("Progress", "7") + end + princessFreed = true + DismissTeam(loc("011101001")) + EndTurn(true) end - DismissTeam(loc("011101001")) - TurnTimeLeft = 0 end function CheckCyborgsDead() @@ -337,11 +382,13 @@ end function EndMission() - RemoveEventFunc(CheckPrincessFreed) - AddCaption("So the princess was never heard of again...") - DismissTeam(loc("Natives")) - DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + if not princessFreed then + RemoveEventFunc(CheckPrincessFreed) + AddCaption(loc("So the princess was never heard of again ...")) + DismissTeam(loc("Natives")) + DismissTeam(loc("011101001")) + EndTurn(true) + end end function CheckOutOfCluster() @@ -428,13 +475,13 @@ gearDead[natives[i-6]] = false end - AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1") princess = AddHog(loc("Fell From Heaven"), 0, 333, "tiara") gearDead[cyborg] = false gearDead[princess] = false - AddTeam(loc("Biomechanic Team"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("Biomechanic Team"), 14483456, "ring", "UFO", "Robot", "cm_cyborg") for i = 1, cyborgsNum do cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2") gearDead[cyborgs[i]] = false @@ -546,7 +593,7 @@ end end end - TurnTimeLeft = 0 + EndTurn(true) else for i = 1, 3 do if gearDead[natives[i]] ~= true then diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/first_blood.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,90 @@ +--[[ +A Classic Fairytale: First Blood + += SUMMARY = +Simple introduction to the most basic aspects of gameplay. +Basically a story-driven mini-tutorial. Does not replace +a real tutorial, however. + += GOAL = +To complete the various tasks the chief gives to the player. + += FLOW CHART = +This section explains how this mission is (roughly) +*supposed* to work, with a step-to-step list. +Use this to hunt down bugs or for testing. + +All other missions in ACF will have the same section. + +These symbols are used: +- Event +| Choice (only one of these can happen) +> End of mission +: Go to another event in the flow chart + +“TBS” stands for “Turn-Based Stragegy”. It is used when the game switches from +heavily scripted events to the default turn-based stragegy gameplay. This +is not used in the first mission, however. + +== Linear events == +This is the expected course of events in chronological order. + +- Introduction; movement (left/right/jump) instructions +- Player moves to mushroom +- Double jump instructions, move to flower +- Collect first crate (rope) +- Rope instructions +- Parachute crate appears in the right pit +- Player collects parachute +- Instruct player to move to mole head +| If player stopped on mole head: + - Cut scene + - Place girder to block off right pit + - Spawn rope crate in left pit + - Player must collect crate safely + - If hurt: Reset player to mole head +| If player skipped the mole (e.g. by roping) and instead went down the pit left from the mole: + - Different cut scene + - Place girder to block off right pit + - Spawn rope crate in left pit + - Player must collect this crate +- Shoryuken crate spawns +- Player destroys all targets +- Rope challenge + - Player chooses rope challenge difficulty + - Crates spawn, one-by-one, while player collects them + | If player collects all crates in time: + - Proceed + | If player fails to collect all crates in time: + : Rope challenge restarts +- Deagle crate spawns +- Player collects deagle crate +- Deagle targets spawn +- Deagle targets destroyd +- Cannibal and lots of ammo crates appear +| Player kills cannibal + > Victory +| Player moves close to cannibal + - Many weapon crates with melee weapons spawn + - Cut scene + - Player kills cannibal + > Victory + +== Non-linear events == +These events can be triggered at (theoretically) any time and interrupt +the normal flow. Obvious events like “all player hogs dead” are omitted here. + +- Player hog damages princess: + - Princess complains +- Player hog damages chief + - Chief complains +- Player hog, Princess or Chief dead: + > Game over +- Player hurt itself without dying: + - Chief mocks player + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -31,7 +118,8 @@ targetPosX = {{821, 866, 789}, {614, 656, 638}, {1238, 1237, 1200}} targetPosY = {{1342, 1347, 1326}, {1112, 1121, 1061}, {1152, 1111, 1111}} crateNum = {6, 8} - +rope2GirderX = 3245 +rope2GirderY = 1190 stage = 1 cratesCollected = 0 @@ -39,7 +127,7 @@ targetsDestroyed = 0 targsWave = 1 tTime = -1 -difficulty = 0 +difficulty = 1 cannibalVisible = false cannibalKilles = false @@ -52,6 +140,7 @@ rope1Taken = false paraTaken = false rope2Taken = false +rope2InProgress = false punchTaken = false canKilled = false desertTaken = false @@ -63,15 +152,15 @@ 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"), 1, 4000}, + [onShroomAnim] = {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}, [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("Do the deed"), 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("Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"), 1, 5000}, + [challengeCompletedAnim] = {loc("First Blood"), loc("The Ultimate Weapon"), loc("Get that crate!"), 1, 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} } @@ -88,7 +177,7 @@ function SkipDamageAnim(anim) SwitchHog(youngh) - SetInputMask(0xFFFFFFFF) + AnimSetInputMask(0xFFFFFFFF) end function SkipOnShroom() @@ -111,7 +200,7 @@ table.insert(elderDamagedAnim, {func = AnimWait, args = {elderh, 500}, skipFunc = Skipanim, skipArgs = elderDamagedAnim}) table.insert(elderDamagedAnim, {func = AnimSay, args = {elderh, loc("Violence is not the answer to your problems!"), SAY_SAY, 3000}}) table.insert(elderDamagedAnim, {func = AnimGearWait, args = {youngh, 500}}) - + AddSkipFunction(startDialogue, Skipanim, {startDialogue}) table.insert(startDialogue, {func = AnimWait, args = {youngh, 3500}, skipFunc = Skipanim, skipArgs = startDialogue}) table.insert(startDialogue, {func = AnimCaption, args = {youngh, loc("Once upon a time, on an island with great natural resources, lived two tribes in heated conflict..."), 5000}}) @@ -124,7 +213,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, loc("First Blood"), loc("First Steps"), loc("Press [Left] or [Right] to move around, [Enter] to jump"), 1, 4000}}) 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}) @@ -134,29 +223,29 @@ 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"), 1, 4000}}) + 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}}) 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, 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}}) + AddSkipFunction(tookParaAnim, Skipanim, {tookParaAnim}) table.insert(tookParaAnim, {func = AnimGearWait, args = {youngh, 1000}, skipFunc = Skipanim, skipArgs = tookParaAnim}) table.insert(tookParaAnim, {func = AnimSay, args = {elderh, loc("Use the rope to get on the head of the mole, young one!"), SAY_SHOUT, 4000}}) 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, loc("First Blood"), loc("Omnivore"), loc("Get on the head of the mole"), 1, 4000}}) 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, 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 = AnimSwitchHog, args = {youngh}}) AddSkipFunction(pastMoleHeadAnim, Skipanim, {pastMoleHeadAnim}) @@ -167,13 +256,13 @@ 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("Do the deed"), 1, 4000}}) + table.insert(tookRope2Anim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Rising"), loc("Get that crate!"), 1, 4000}}) 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, 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 = AnimSwitchHog, args = {youngh}}) AddSkipFunction(challengeAnim, Skipanim, {challengeAnim}) @@ -186,7 +275,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, 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 = AnimSwitchHog, args = {youngh}}) AddSkipFunction(challengeCompletedAnim, Skipanim, {challengeCompletedAnim}) @@ -194,25 +283,26 @@ 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("Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"), 1, 5000}}) + table.insert(challengeCompletedAnim, {func = AnimShowMission, args = {youngh, loc("First Blood"), loc("The Ultimate Weapon"), loc("Get that crate!"), 1, 5000}}) table.insert(challengeCompletedAnim, {func = AnimSwitchHog, args = {youngh}}) AddSkipFunction(beforeKillAnim, Skipanim, {beforeKillAnim}) + table.insert(beforeKillAnim, {func = AnimWait, args = {elderh, 100}}) table.insert(beforeKillAnim, {func = AnimSay, args = {elderh, loc("What do my faulty eyes observe? A spy!"), SAY_SHOUT, 4000}, skipFunc = Skipanim, skipArgs = beforeKillAnim}) table.insert(beforeKillAnim, {func = AnimFollowGear, args = {cannibal}}) 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, loc("First Blood"), loc("The First Blood"), loc("Kill the cannibal!"), 1, 5000}}) table.insert(beforeKillAnim, {func = AnimSwitchHog, args = {youngh}}) - + AddSkipFunction(closeCannim, Skipanim, {closeCannim}) table.insert(closeCannim, {func = AnimSay, args = {elderh, loc("I see you would like his punishment to be more...personal..."), SAY_SAY, 4000}, skipFunc = Skipanim, skipArgs = closeCannim}) table.insert(closeCannim, {func = AnimSay, args = {cannibal, loc("I'm certain that this is a misunderstanding, fellow hedgehogs!"), SAY_SAY, 4000}}) 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, loc("First Blood"), loc("The First Blood"), loc("KILL IT!"), 1, 5000}}) 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}}) @@ -245,7 +335,7 @@ end function DoNeedToTurn(gear) - if gear == princess then + if gear == princess and not princessDamaged then if GetX(princess) > GetX(youngh) then HogTurnLeft(princess, true) princessFace = "Left" @@ -253,7 +343,7 @@ HogTurnLeft(princess, false) princessFace = "Right" end - else + elseif gear == elderh and not elderDamaged then if GetX(elderh) > GetX(youngh) then HogTurnLeft(elderh, true) elderFace = "Left" @@ -265,11 +355,14 @@ end function CheckDamage() - return youngdamaged and StoppedGear(youngh) + return youngdamaged and StoppedGear(youngh) end function DoOnDamage() AddAnim(damageAnim) + if rope2InProgress and not rope2Taken then + AnimSetGearPosition(youngh, 3040, 1221) + end youngdamaged = false AddFunction({func = ResetTurnTime, args = {}}) end @@ -325,7 +418,7 @@ end function DoOnShroom() - ropeCrate1 = SpawnUtilityCrate(2751, 1194, amRope) + ropeCrate1 = SpawnUtilityCrate(2751, 1194, amRope, 100) SetGearMessage(CurrentHedgehog, 0) AddAnim(onShroomAnim) AddEvent(CheckOnFlower, {}, DoOnFlower, {}, 0) @@ -337,7 +430,7 @@ function DoOnFlower() AddAmmo(youngh, amRope, 100) - paraCrate = SpawnUtilityCrate(3245, 1758, amParachute) + paraCrate = SpawnUtilityCrate(3245, 1758, amParachute, 100) SetGearMessage(CurrentHedgehog, 0) AddAnim(onFlowerAnim) AddEvent(CheckTookParaCrate, {}, DoTookParaCrate, {}, 0) @@ -363,23 +456,31 @@ function CheckPastMoleHead() x = GetX(youngh) y = GetY(youngh) - return x < 3005 and y > 1500 and StoppedGear(youngh) + return x < 3005 and y > 1500 and StoppedGear(youngh) end function DoPastMoleHead() + -- Initiate parachute challenge RemoveEventFunc(CheckOnMoleHead) - ropeCrate2 = SpawnUtilityCrate(2782, 1720, amRope) + ropeCrate2 = SpawnUtilityCrate(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 = SpawnUtilityCrate(2782, 1720, amRope) + ropeCrate2 = SpawnUtilityCrate(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) AddEvent(CheckTookRope2, {}, DoTookRope2, {}, 0) end @@ -392,7 +493,7 @@ AddAmmo(youngh, amRope, 100) SetGearMessage(CurrentHedgehog, 0) AddAnim(tookRope2Anim) - punchCrate = SpawnAmmoCrate(2460, 1321, amFirePunch) + punchCrate = SpawnAmmoCrate(2460, 1321, amFirePunch, 100) AddEvent(CheckTookPunch, {}, DoTookPunch, {}) end @@ -418,24 +519,24 @@ end function DoTargDestroyed() + AddAmmo(youngh, amFirePunch, 0) SetGearMessage(CurrentHedgehog, 0) AddAnim(challengeAnim) targetsDestroyed = 0 AddFunction({func = SetChoice, args = {}}) - ropeCrate3 = SpawnAmmoCrate(2000, 1200, amRope) + ropeCrate3 = SpawnUtilityCrate(2000, 1200, amRope, 100) AddEvent(CheckTookRope3, {}, AddAmmo, {youngh, amRope, 100}, 0) AddEvent(CheckCratesColled, {}, DoCratesColled, {}, 0) AddEvent(CheckChallengeWon, {}, DoChallengeWon, {}, 0) AddEvent(CheckTimesUp, {}, DoTimesUp, {}, 1) -end - -function CheckChoice() - return difficulty ~= 0 + -- Remove up the old mole blockade from the parachute challenge + EraseSprite(rope2GirderX, rope2GirderY, sprAmGirder, 6) end function DoChoice() + PlaySound(sndPlaced) difficultyChoice = false - SetInputMask(0xFFFFFFFF) + AnimSetInputMask(0xFFFFFFFF) StartChallenge(120000 + chalTries * 20000) end @@ -454,7 +555,7 @@ end function DoChallengeWon() - desertCrate = SpawnAmmoCrate(1240, 1212, amDEagle) + desertCrate = SpawnAmmoCrate(1240, 1212, amDEagle, 100) SetGearMessage(CurrentHedgehog, 0) AddAnim(challengeCompletedAnim) AddEvent(CheckDesertColled, {}, DoDesertColled, {}, 0) @@ -473,7 +574,7 @@ deleteCrate = true DeleteGear(crates[1]) TurnTimeLeft = -1 - AddCaption(loc("And so happenned that Leaks A Lot failed to complete the challenge! He landed, pressured by shame...")) + AddCaption(loc("And so happened that Leaks A Lot failed to complete the challenge! He landed, pressured by shame ...")) AddEvent(CheckChallengeFailed, {}, DoChallengeFailed, {}, 0) end @@ -499,7 +600,7 @@ PutTargets(1) AddEvent(CheckTargetsKilled, {}, DoTargetsKilled, {}, 1) AddEvent(CheckCannibalKilled, {}, DoCannibalKilledEarly, {}, 0) - ShowMission(loc("First Blood"), loc("The Bull's Eye"), loc("[Up], [Down] to aim, [Space] to shoot!"), 1, 5000) + ShowMission(loc("First Blood"), loc("The Bull's Eye"), loc("Destroy the targets!|Hint: [Up], [Down] to aim, [Space] to shoot"), 1, 5000) end function CheckTargetsKilled() @@ -558,14 +659,28 @@ cratesCollected = 0 PutCrate(1) TurnTimeLeft = 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."), 1, 5000) +end + +function ChoiceDialog() + local dstr + if difficulty == 2 then + dstr = loc("Difficulty: Hard") + else + dstr = loc("Difficulty: Easy") + end + ShowMission(loc("First Blood"), loc("The Torment"), + loc("Your next task is to collect some crates by using the rope!") .. "|" .. + loc("Press [Left] and [Right] to change the difficulty.") .. "| |" .. + dstr .. "| |" .. + loc("Press [Attack] to begin."), + 0, 9999000) end function SetChoice() - SetInputMask(band(0xFFFFFFFF, bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLJump+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon))) + AnimSetInputMask(0) difficultyChoice = true - ShowMission(loc("First Blood"), loc("The Torment"), loc("Select difficulty: [Left] - easier or [Right] - harder"), 0, 4000) - AddEvent(CheckChoice, {}, DoChoice, {}, 0) + ChoiceDialog() end function SetTime(time) @@ -582,9 +697,9 @@ return end if difficulty == 1 then - crates[1] = SpawnAmmoCrate(targXdif1[i], targYdif1[i], amRope) + crates[1] = SpawnFakeAmmoCrate(targXdif1[i], targYdif1[i], false, false) else - crates[1] = SpawnAmmoCrate(targXdif2[i], targYdif2[i], amRope) + crates[1] = SpawnFakeAmmoCrate(targXdif2[i], targYdif2[i], false, false) end end @@ -602,14 +717,14 @@ -----------------------------Main Functions---------------------------- function onGameInit() - Seed = 69 - GameFlags = gfInfAttack + gfSolidLand + gfDisableWind - TurnTime = 100000 + Seed = 69 + GameFlags = gfInfAttack + gfSolidLand + gfDisableWind + TurnTime = 100000 CaseFreq = 0 MinesNum = 0 MinesTime = 3000 Explosives = 0 - Delay = 10 + Delay = 10 Map = "A_Classic_Fairytale_first_blood" Theme = "Nature" @@ -625,11 +740,11 @@ AnimSetGearPosition(youngh, 1862, 1362) HogTurnLeft(youngh, false) - AddTeam(loc("Cannibals"), 14483456, "Skull", "Island", "Pirate","cm_vampire") + AddTeam(loc("Cannibals"), 14483456, "skull", "Island", "Pirate","cm_vampire") cannibal = AddHog(loc("Brainiac"), 0, 5, "Zombi") AnimSetGearPosition(cannibal, 525, 1256) HogTurnLeft(cannibal, false) - + AnimInit() AnimationSetup() end @@ -661,6 +776,18 @@ CheckEvents() end +local choiceDialogTimer = 0 +function onGameTick20() + -- Make sure the choice dialog never disappears while it is active + if difficultyChoice then + choiceDialogTimer = choiceDialogTimer + 20 + if choiceDialogTimer > 9990000 then + ChoiceDialog() + choiceDialogTimer = 0 + end + end +end + function onGearDelete(gear) if gear == ropeCrate1 then rope1Taken = true @@ -668,14 +795,23 @@ paraTaken = true elseif gear == ropeCrate2 then rope2Taken = true + rope2InProgress = false elseif gear == ropeCrate3 then rope3Taken = true - elseif gear == crates[1] and deleteCrate == true then - deleteCrate = false - elseif gear == crates[1] and challengeFailed == false then - crates[1] = nil - cratesCollected = cratesCollected + 1 - PutCrate(cratesCollected + 1) + elseif gear == crates[1] then + -- Play sound if challenge crate (fake crate) collected + if band(GetGearMessage(gear), gmDestroy) ~= 0 then + PlaySound(sndShotgunReload) + end + + -- Update crate challenge + if deleteCrate == true then + deleteCrate = false + elseif challengeFailed == false then + crates[1] = nil + cratesCollected = cratesCollected + 1 + PutCrate(cratesCollected + 1) + end elseif gear == punchCrate then punchTaken = true elseif gear == desertCrate then @@ -686,7 +822,7 @@ i = i + 1 end targets[i] = nil - targetsDestroyed = targetsDestroyed + 1 + targetsDestroyed = targetsDestroyed + 1 elseif gear == cannibal then cannibalKilled = true elseif gear == princess then @@ -738,13 +874,19 @@ function onLeft() if difficultyChoice == true then - difficulty = 1 + if difficulty ~= 1 then + difficulty = 1 + else + difficulty = 2 + end + PlaySound(sndSwitchHog) + ChoiceDialog() end end +onRight = onLeft -function onRight() +function onAttack() if difficultyChoice == true then - difficulty = 2 + DoChoice() end end - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/journey.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,106 @@ +--[[ +A Classic Fairytale: The Journey Back + += SUMMARY = +This is a very complex and heavily scripted mission with +2 major gameplay variants and 2 sub-variants each. + +This mission is mostly about movement and overcoming obstacles, +and not much about fighting. + +The player has either 1 or 2 hogs (depending on previous mission) +and must reach the left coast. The cyborg will show up from time +to time and constantly annoys the heroes with obstacles and additional +challenges. + +The mission's gameplay is affected by whether Dense Cloud survived +in the previous mission. The mission's dialogues are affected by +the decision of the player in the previous mission. + += GOALS = +- Collect the crate at the left coast +- (Need to accomplish various sub-goals before this is possible) +- Then kill the cyborg + += FLOW CHART = +== Linear events == + +Note: This mission's gameplay is significantly affected by the choices of the previous mission (The Shadow Falls). +There are two major paths, and each of them has two variants. + +=== PATH ONE (AL) === +Condition: Cyborg's offer in ACF2 accepted and Dense Cloud survived. + +- Mission starts with Dense Cloud and Leaks a Lot +- Mines time: 5s +- Cut scene: startAnimAL (initial instructions) +- Hog moves past flower (via teamwork) +- Animation: pastFlowerAnimAL +- Player jumps up the tree +- Cut scene: outPutAnimAL +- Cyborg teleports one hog to the pit, while the other hog remains +- TBS +- Trapped hog walks out of pit +- Cut scene: midAnimAL +- Trapped hog is teleported below bridge (and trapped again) +- A huge barricade at the bridge is erected, and mines spawn on bridge +- Now any hog needs to collect the final crate +- TBS +- Final crate collected +- Cut scene: endAnimAL +- Cyborg and princess apear, player must kill cyborg +| Cyborg killed + - Cut scene: winAnim + > Victory +| Princess killed + - Cut scene: endFailAnim + > Game over + +=== PATH TWO (AD) === +Condition: Cyborg's offer in ACF2 accepted, but Dense Cloud died afterwards. + +- Mission starts with Leaks a Lot only +- Cut scene: startAnimAD (initial instructions) +- Hog moves past flower (via blowtorch) +- Animation: pastFlowerAnimAD +- TBS +- Hog proceeds all the way to the bridge +- Cut scene: outPutAnimAD (the “Princess Game”) +- Hog is teleported to the pit +- TBS +- Hog must reach goal crate within a given number of turns +| Hog reaches goal crate within the turn limit + - Cut scene: endAnimAD + - Cyborg and princess spawn + | Cyborg killed + - Cut scene: winAnim + > Victory + | Princess killed + - Cut scene: endFailAnim + > Game over +| Turn limit exceeded + - Cut scene: failAnimAD (princess is caged and killed by cyborg) + > Game over + +=== PATH THREE (RL) === +Condition: Cyborg's offer in ACF2 rejected. + +This is almost identical to Path One, only the dialogues differ. +All AL animations are replaced with RL animations. + +=== PATH FOUR (attacked) === +Condition: Cyborg from ACF2 was attacked. + +This is almost identical to Path Two, only the dialogues differ. +Uses startAnim and midAnim from SetupAnimAttacked. + + +== Non-linear events == +- Any of the Natives dies + > Game over + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -32,19 +135,15 @@ TurnsLeft = 0 stage = 0 ---cyborgHidden = false ---princessHidden = false blowTaken = false fireTaken = false gravityTaken = false sniperTaken = false -girderTaken = false -girder1Taken = false -girder2Taken = false leaksDead = false denseDead = false princessDead = false cyborgDead = false +victory = false cannibalDead = {} hedgeHidden = {} @@ -73,7 +172,6 @@ endAnimRL = {} endFailAnim = {} -endFailAnimAD = {} winAnim = {} winAnimAD = {} @@ -81,7 +179,7 @@ --/////////////////////////Animation Functions/////////////////////// function AfterMidFailAnim() DismissTeam(loc("Natives")) - TurnTimeLeft = 0 + EndTurn(true) end function AfterMidAnimAlone() @@ -93,16 +191,16 @@ AddAmmo(cannibals[5], amDEagle, 0) - AddEvent(CheckGirderTaken, {}, DoGirderTaken, {}, 0) AddEvent(CheckOnFirstGirder, {}, DoOnFirstGirder, {}, 0) AddEvent(CheckTookSniper, {}, DoTookSniper, {}, 0) AddEvent(CheckFailedCourse, {}, DoFailedCourse, {}, 0) SetGearMessage(leaks, 0) TurnsLeft = 12 TurnTimeLeft = TurnTime - ShowMission(loc("The Journey Back"), loc("Collateral Damage"), loc("Save the princess by collecting the crate in under 12 turns!"), 0, 6000) + 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) -----------------------///////////////------------ - --AnimSetGearPosition(leaks, 417, 1800) end function SkipEndAnimAlone() @@ -185,44 +283,45 @@ end function PlaceMinesDuo() - SetTimer(AddGear(2920, 1448, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2985, 1338, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(3005, 1302, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(3030, 1270, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(3046, 1257, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2954, 1400, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2967, 1385, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2849, 1449, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2811, 1436, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2773, 1411, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2732, 1390, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2700, 1362, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2642, 1321, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2172, 1417, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2190, 1363, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2219, 1332, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1201, 1207, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1247, 1205, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1295, 1212, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1356, 1209, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1416, 1201, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1466, 1201, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1678, 1198, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1738, 1198, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1796, 1198, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1637, 1217, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1519, 1213, gtMine, 0, 0, 0, 0), 5000) + AddGear(2920, 1448, gtMine, 0, 0, 0, 0) + AddGear(2985, 1338, gtMine, 0, 0, 0, 0) + AddGear(3005, 1302, gtMine, 0, 0, 0, 0) + AddGear(3030, 1270, gtMine, 0, 0, 0, 0) + AddGear(3046, 1257, gtMine, 0, 0, 0, 0) + AddGear(2954, 1400, gtMine, 0, 0, 0, 0) + AddGear(2967, 1385, gtMine, 0, 0, 0, 0) + AddGear(2849, 1449, gtMine, 0, 0, 0, 0) + AddGear(2811, 1436, gtMine, 0, 0, 0, 0) + AddGear(2773, 1411, gtMine, 0, 0, 0, 0) + AddGear(2732, 1390, gtMine, 0, 0, 0, 0) + AddGear(2700, 1362, gtMine, 0, 0, 0, 0) + AddGear(2642, 1321, gtMine, 0, 0, 0, 0) + AddGear(2172, 1417, gtMine, 0, 0, 0, 0) + AddGear(2190, 1363, gtMine, 0, 0, 0, 0) + AddGear(2219, 1332, gtMine, 0, 0, 0, 0) + AddGear(1201, 1207, gtMine, 0, 0, 0, 0) + AddGear(1247, 1205, gtMine, 0, 0, 0, 0) + AddGear(1295, 1212, gtMine, 0, 0, 0, 0) + AddGear(1356, 1209, gtMine, 0, 0, 0, 0) + AddGear(1416, 1201, gtMine, 0, 0, 0, 0) + AddGear(1466, 1201, gtMine, 0, 0, 0, 0) + AddGear(1678, 1198, gtMine, 0, 0, 0, 0) + AddGear(1738, 1198, gtMine, 0, 0, 0, 0) + AddGear(1796, 1198, gtMine, 0, 0, 0, 0) + AddGear(1637, 1217, gtMine, 0, 0, 0, 0) + AddGear(1519, 1213, gtMine, 0, 0, 0, 0) end function AfterPastFlowerAnim() PlaceMinesDuo() AddEvent(CheckDensePit, {}, DoDensePit, {}, 0) - AddEvent(CheckTookGirder1, {}, DoTookGirder1, {}, 0) - AddEvent(CheckTookGirder2, {}, DoTookGirder2, {}, 0) SetGearMessage(leaks, 0) SetGearMessage(dense, 0) - TurnTimeLeft = 0 - ShowMission(loc("The Journey Back"), loc("The Savior"), loc("Get Dense Cloud out of the pit!"), 1, 5000) + EndTurn(0) + 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) end function SkipPastFlowerAnim() @@ -240,8 +339,12 @@ AddEvent(CheckTookFire, {}, DoTookFire, {}, 0) SetGearMessage(leaks, 0) SetGearMessage(dense, 0) - TurnTimeLeft = 0 - ShowMission(loc("The Journey Back"), loc("They never learn"), loc("Free Dense Cloud and continue the mission!"), 1, 5000) + EndTurn(true) + ShowMission(loc("The Journey Back"), loc("They never learn"), + loc("Free Dense Cloud and continue the mission!") .. "|" .. + loc("Collect the weapon crate at the left coast!") .. "|" .. + loc("Your hogs must survive!") .. "|" .. + loc("Mines time: 5 seconds"), 1, 5000) end function SkipOutPitAnim() @@ -306,47 +409,61 @@ PlaceGirder(952, 650, 0) fireCrate = SpawnAmmoCrate(1846, 1100, amFirePunch) - SpawnUtilityCrate(1900, 1100, amPickHammer) + SpawnAmmoCrate(1900, 1100, amPickHammer) SpawnAmmoCrate(950, 674, amDynamite) SpawnUtilityCrate(994, 825, amRope) SpawnUtilityCrate(570, 1357, amLowGravity) end +local trackedGears = {} + +-- Remove mines and crates for the princess cage scene. +-- Some annoying gears might get in the way for this scene, like a dropped +-- mine, or the crate on the leaf. +function ClearTrashForPrincessCage() + for gear, _ in pairs(trackedGears) do + if GetY(gear) > 1600 and GetX(gear) > 1800 and GetX(gear) < 2700 then + DeleteGear(gear) + end + end +end + +-- Dump mines in princess cage function DumpMines() - SetTimer(AddGear(2261, 1835, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2280, 1831, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2272, 1809, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2290, 1815, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2278, 1815, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2307, 1811, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2286, 1820, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2309, 1813, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2303, 1822, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2317, 1827, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2312, 1816, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2316, 1812, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2307, 1802, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2276, 1818, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2284, 1816, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2292, 1811, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2295, 1814, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2306, 1811, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2292, 1815, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2314, 1815, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2286, 1813, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2275, 1813, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2269, 1814, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2273, 1812, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2300, 1808, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2322, 1812, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2323, 1813, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2311, 1811, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2303, 1809, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2287, 1808, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2282, 1808, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2277, 1809, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2296, 1809, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(2314, 1818, gtMine, 0, 0, 0, 0), 5000) + AddGear(2261, 1835, gtMine, 0, 0, 0, 0) + AddGear(2280, 1831, gtMine, 0, 0, 0, 0) + AddGear(2272, 1809, gtMine, 0, 0, 0, 0) + AddGear(2290, 1815, gtMine, 0, 0, 0, 0) + AddGear(2278, 1815, gtMine, 0, 0, 0, 0) + AddGear(2307, 1811, gtMine, 0, 0, 0, 0) + AddGear(2286, 1820, gtMine, 0, 0, 0, 0) + AddGear(2309, 1813, gtMine, 0, 0, 0, 0) + AddGear(2303, 1822, gtMine, 0, 0, 0, 0) + AddGear(2317, 1827, gtMine, 0, 0, 0, 0) + AddGear(2312, 1816, gtMine, 0, 0, 0, 0) + AddGear(2316, 1812, gtMine, 0, 0, 0, 0) + AddGear(2307, 1802, gtMine, 0, 0, 0, 0) + AddGear(2276, 1818, gtMine, 0, 0, 0, 0) + AddGear(2284, 1816, gtMine, 0, 0, 0, 0) + AddGear(2292, 1811, gtMine, 0, 0, 0, 0) + AddGear(2295, 1814, gtMine, 0, 0, 0, 0) + AddGear(2306, 1811, gtMine, 0, 0, 0, 0) + AddGear(2292, 1815, gtMine, 0, 0, 0, 0) + AddGear(2314, 1815, gtMine, 0, 0, 0, 0) + AddGear(2286, 1813, gtMine, 0, 0, 0, 0) + AddGear(2275, 1813, gtMine, 0, 0, 0, 0) + AddGear(2269, 1814, gtMine, 0, 0, 0, 0) + AddGear(2273, 1812, gtMine, 0, 0, 0, 0) + AddGear(2300, 1808, gtMine, 0, 0, 0, 0) + AddGear(2322, 1812, gtMine, 0, 0, 0, 0) + AddGear(2323, 1813, gtMine, 0, 0, 0, 0) + AddGear(2311, 1811, gtMine, 0, 0, 0, 0) + AddGear(2303, 1809, gtMine, 0, 0, 0, 0) + AddGear(2287, 1808, gtMine, 0, 0, 0, 0) + AddGear(2282, 1808, gtMine, 0, 0, 0, 0) + AddGear(2277, 1809, gtMine, 0, 0, 0, 0) + AddGear(2296, 1809, gtMine, 0, 0, 0, 0) + AddGear(2314, 1818, gtMine, 0, 0, 0, 0) end function SetupAnimRefusedDied() @@ -401,6 +518,7 @@ 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 = {cyborg, SetupKillRoom, {}}}) @@ -414,8 +532,9 @@ table.insert(failAnimAD, {func = AnimSwitchHog, args = {cyborg}}) table.insert(failAnimAD, {func = AnimCustomFunction, args = {cyborg, DumpMines, {}}}) table.insert(failAnimAD, {func = AnimCustomFunction, args = {cyborg, KillPrincess, {}}}) - table.insert(failAnimAD, {func = AnimWait, args = {cyborg, 12000}}) - table.insert(failAnimAD, {func = AnimSay, args = {leaks, loc("No! What have I done?! What have YOU done?!"), SAY_SHOUT, 6000}}) + table.insert(failAnimAD, {func = AnimWait, args = {cyborg, 500}}) + table.insert(failAnimAD, {func = AnimSay, args = {leaks, loc("No! What have I done?! What have YOU done?!"), SAY_SHOUT, 3000}}) + table.insert(failAnimAD, {func = AnimSwitchHog, args = {princess}}) table.insert(endAnimAD, {func = AnimCustomFunction, swh = false, args = {leaks, RestoreCyborg, {437, 1700, 519, 1722}}}) table.insert(endAnimAD, {func = AnimTurn, swh = false, args = {cyborg, "Right"}}) @@ -439,7 +558,6 @@ midAnim = midAnimAD failAnim = failAnimAD endAnim = endAnimAD - endFailAnim = endFailAnimAD winAnim = winAnimAD end @@ -568,8 +686,7 @@ end function KillPrincess() - DismissTeam(loc("Cannibal Sentry")) - TurnTimeLeft = 0 + EndTurn(true) end --/////////////////////////////Misc Functions//////////////////////// @@ -600,33 +717,31 @@ function SetupPlaceAlone() ------ AMMO CRATE LIST ------ - --SpawnAmmoCrate(3122, 994, amShotgun) SpawnAmmoCrate(3124, 952, amBaseballBat) SpawnAmmoCrate(2508, 1110, amFirePunch) ------ UTILITY CRATE LIST ------ - blowCrate = SpawnUtilityCrate(3675, 1480, amBlowTorch) + blowCrate = SpawnAmmoCrate(3675, 1480, amBlowTorch) gravityCrate = SpawnUtilityCrate(3448, 1349, amLowGravity) SpawnUtilityCrate(3212, 1256, amGirder) SpawnUtilityCrate(3113, 911, amParachute) sniperCrate = SpawnAmmoCrate(784, 1715, amSniperRifle) ------ MINE LIST ------ - SetTimer(AddGear(3328, 1399, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(3028, 1262, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2994, 1274, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2956, 1277, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2925, 1282, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2838, 1276, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2822, 1278, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2786, 1283, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2766, 1270, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2749, 1231, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2717, 1354, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2167, 1330, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2201, 1321, gtMine, 0, 0, 0, 0), 3000) - SetTimer(AddGear(2239, 1295, gtMine, 0, 0, 0, 0), 3000) + AddGear(3328, 1399, gtMine, 0, 0, 0, 0) + AddGear(3028, 1262, gtMine, 0, 0, 0, 0) + AddGear(2994, 1274, gtMine, 0, 0, 0, 0) + AddGear(2956, 1277, gtMine, 0, 0, 0, 0) + AddGear(2925, 1282, gtMine, 0, 0, 0, 0) + AddGear(2838, 1276, gtMine, 0, 0, 0, 0) + AddGear(2822, 1278, gtMine, 0, 0, 0, 0) + AddGear(2786, 1283, gtMine, 0, 0, 0, 0) + AddGear(2766, 1270, gtMine, 0, 0, 0, 0) + AddGear(2749, 1231, gtMine, 0, 0, 0, 0) + AddGear(2717, 1354, gtMine, 0, 0, 0, 0) + AddGear(2167, 1330, gtMine, 0, 0, 0, 0) + AddGear(2201, 1321, gtMine, 0, 0, 0, 0) + AddGear(2239, 1295, gtMine, 0, 0, 0, 0) AnimSetGearPosition(leaks, 3781, 1583) - --AnimSetGearPosition(leaks, 1650, 1583) AddAmmo(cannibals[1], amShotgun, 100) AddAmmo(leaks, amSwitch, 0) end @@ -720,9 +835,9 @@ SpawnUtilityCrate(1590, 628, amParachute) SpawnAmmoCrate(1540, 100, amDynamite) SpawnUtilityCrate(2175, 1815, amLowGravity) - SpawnUtilityCrate(2210, 1499, amFirePunch) + SpawnAmmoCrate(2210, 1499, amFirePunch) girderCrate = SpawnUtilityCrate(2300, 1663, amGirder) - SpawnUtilityCrate(610, 1394, amPickHammer) + SpawnAmmoCrate(610, 1394, amPickHammer) ------ BARREL LIST ------ SetHealth(AddGear(1148, 736, gtExplosives, 0, 0, 0, 0), 20) @@ -730,17 +845,17 @@ end function PlaceCourseMines() - SetTimer(AddGear(1215, 1193, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1259, 1199, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1310, 1198, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1346, 1196, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1383, 1192, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1436, 1196, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1487, 1199, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1651, 1209, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1708, 1209, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1759, 1190, gtMine, 0, 0, 0, 0), 5000) - SetTimer(AddGear(1815, 1184, gtMine, 0, 0, 0, 0), 5000) + AddGear(1215, 1193, gtMine, 0, 0, 0, 0) + AddGear(1259, 1199, gtMine, 0, 0, 0, 0) + AddGear(1310, 1198, gtMine, 0, 0, 0, 0) + AddGear(1346, 1196, gtMine, 0, 0, 0, 0) + AddGear(1383, 1192, gtMine, 0, 0, 0, 0) + AddGear(1436, 1196, gtMine, 0, 0, 0, 0) + AddGear(1487, 1199, gtMine, 0, 0, 0, 0) + AddGear(1651, 1209, gtMine, 0, 0, 0, 0) + AddGear(1708, 1209, gtMine, 0, 0, 0, 0) + AddGear(1759, 1190, gtMine, 0, 0, 0, 0) + AddGear(1815, 1184, gtMine, 0, 0, 0, 0) end @@ -753,28 +868,16 @@ AddAmmo(leaks, amFirePunch, 100) end -function CheckTookGirder1() - return girder1Taken -end - -function CheckTookGirder2() - return girder2Taken -end - -function DoTookGirder1() - AddAmmo(dense, amGirder, 2) -end - -function DoTookGirder2() - AddAmmo(dense, amGirder, 3) -end - function CheckDensePit() - return GetY(dense) < 1250 and StoppedGear(dense) + if GetHealth(dense) ~= nil then + return GetY(dense) < 1250 and StoppedGear(dense) + else + return false + end end function DoDensePit() - TurnTimeLeft = 0 + EndTurn(0) RestoreHedge(cyborg) AnimWait(cyborg, 1) AddFunction({func = AddAnim, args = {outPitAnim}}) @@ -790,7 +893,7 @@ end function DoPastFlower() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) AnimWait(cyborg, 1) AddFunction({func = AddAnim, args = {pastFlowerAnim}}) @@ -803,8 +906,11 @@ end function DoLeaksDead() - AddCaption(loc("The village, unprepared, was destroyed by the cyborgs...")) - DismissTeam(loc("Natives")) + if not princessDead then + EndTurn(true) + AddCaption(loc("The village, unprepared, was destroyed by the cyborgs...")) + DismissTeam(loc("Natives")) + end end function CheckDenseDead() @@ -812,8 +918,11 @@ end function DoDenseDead() - AddCaption(loc("The village, unprepared, was destroyed by the cyborgs...")) - DismissTeam(loc("Natives")) + if not princessDead then + EndTurn(true) + AddCaption(loc("The village, unprepared, was destroyed by the cyborgs...")) + DismissTeam(loc("Natives")) + end end function CheckTookBlowTorch() @@ -821,7 +930,10 @@ end function DoTookBlowTorch() - ShowMission(loc("The Journey Back"), loc("The Tunnel Maker"), loc("Hint: Select the BlowTorch, aim and press [Fire]. Press [Fire] again to stop.|Don't blow up the crate."), 0, 6000) + 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) end function CheckTookLowGravity() @@ -829,7 +941,10 @@ end function DoTookLowGravity() - ShowMission(loc("The Journey Back"), loc("The Moonwalk"), loc("Hint: Select the LowGravity and press [Fire]."), 0, 6000) + 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) end function CheckOnBridge() @@ -837,7 +952,7 @@ end function DoOnBridge() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) RestoreHedge(princess) AnimWait(cyborg, 1) @@ -845,22 +960,16 @@ AddFunction({func = AddFunction, args = {{func = AfterMidAnimAlone, args = {}}}}) end -function CheckGirderTaken() - return girderTaken -end - -function DoGirderTaken() - AddAmmo(leaks, amGirder, 2) --- AddAmmo(leaks, amGirder, 3) -end - function CheckOnFirstGirder() return leaksDead == false and GetX(leaks) < 1160 and StoppedGear(leaks) end function DoOnFirstGirder() PlaceCourseMines() - ShowMission(loc("The Journey Back"), loc("Slippery"), loc("You'd better watch your steps..."), 0, 4000) + 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) end function CheckTookSniper() @@ -868,7 +977,7 @@ end function DoTookSniper() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) RestoreHedge(princess) AnimWait(cyborg, 1) @@ -881,7 +990,7 @@ end function DoTookSniper2() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) RestoreHedge(princess) AnimWait(cyborg, 1) @@ -894,8 +1003,12 @@ end function DoLost() + if not cyborgDead then + SwitchHog(cyborg) + end AddAnim(endFailAnim) - AddFunction({func = DismissTeam, args = {loc('Natives')}}) + AddFunction({func = DismissTeam, args = {loc("Natives")}}) + AddFunction({func = EndTurn, args = {true}}) end function CheckWon() @@ -903,6 +1016,7 @@ end function DoWon() + victory = true if progress and progress<3 then SaveCampaignVar("Progress", "3") end @@ -914,7 +1028,7 @@ SwitchHog(leaks) DismissTeam(loc("Cannibal Sentry")) DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end function CheckFailedCourse() @@ -922,7 +1036,7 @@ end function DoFailedCourse() - TurnTimeLeft = 0 + EndTurn(true) RestoreHedge(cyborg) RestoreHedge(princess) AnimWait(cyborg, 1) @@ -933,24 +1047,37 @@ --////////////////////////////Main Functions///////////////////////// function onGameInit() + progress = tonumber(GetCampaignVar("Progress")) + m2Choice = tonumber(GetCampaignVar("M2Choice")) + m2DenseDead = tonumber(GetCampaignVar("M2DenseDead")) + m2RamonDead = tonumber(GetCampaignVar("M2RamonDead")) + m2SpikyDead = tonumber(GetCampaignVar("M2SpikyDead")) + Seed = 0 GameFlags = gfSolidLand + gfDisableWind TurnTime = 40000 CaseFreq = 0 MinesNum = 0 - MinesTime = 3000 + + if m2DenseDead == 1 then + MinesTime = 3000 + else + MinesTime = 5000 + end Explosives = 0 Delay = 5 Map = "A_Classic_Fairytale_journey" Theme = "Nature" - SuddenDeathTurns = 3000 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 AddTeam(loc("Natives"), 29439, "Bone", "Island", "HillBilly", "cm_birdy") leaks = AddHog(loc("Leaks A Lot"), 0, 100, "Rambo") dense = AddHog(loc("Dense Cloud"), 0, 100, "RobinHood") - AddTeam(loc("Cannibal Sentry"), 14483456, "Skull", "Island", "Pirate","cm_vampire") + AddTeam(loc("Cannibal Sentry"), 14483456, "skull", "Island", "Pirate","cm_vampire") cannibals = {} for i = 1, 4 do cannibals[i] = AddHog(cannibalNames[i], 3, 40, "Zombi") @@ -962,7 +1089,7 @@ AnimSetGearPosition(cannibals[i], 0, 0) end - AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Y3K1337"), 0, 200, "cyborg1") princess = AddHog(loc("Fell From Heaven"), 0, 200, "tiara") @@ -975,11 +1102,6 @@ end function onGameStart() - progress = tonumber(GetCampaignVar("Progress")) - m2Choice = tonumber(GetCampaignVar("M2Choice")) - m2DenseDead = tonumber(GetCampaignVar("M2DenseDead")) - m2RamonDead = tonumber(GetCampaignVar("M2RamonDead")) - m2SpikyDead = tonumber(GetCampaignVar("M2SpikyDead")) StartMission() end @@ -992,27 +1114,32 @@ CheckEvents() end +-- Track gears for princess cage cleanup +function onGearAdd(gear) + local gt = GetGearType(gear) + if gt == gtCase or gt == gtMine then + trackedGears[gear] = true + end +end + function onGearDelete(gear) + if trackedGears[gear] then + trackedGears[gear] = nil + end if gear == blowCrate then blowTaken = true elseif gear == fireCrate then fireTaken = true elseif gear == gravityCrate then gravityTaken = true - elseif gear == leaks then + elseif gear == leaks and not victory then leaksDead = true - elseif gear == dense then + elseif gear == dense and not victory then denseDead = true elseif gear == cyborg then cyborgDead = true - elseif gear == princess then + elseif gear == princess and not victory then princessDead = true - elseif gear == girderCrate then - girderTaken = true - elseif gear == girderCrate1 then - girder1Taken = true - elseif gear == girderCrate2 then - girder2Taken = true elseif gear == sniperCrate then sniperTaken = true else @@ -1043,13 +1170,15 @@ function onNewTurn() if AnimInProgress() then TurnTimeLeft = -1 + elseif victory then + EndTurn(true) elseif stage == endStage and CurrentHedgehog ~= leaks then AnimSwitchHog(leaks) SetGearMessage(leaks, 0) TurnTimeLeft = -1 elseif GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then for i = 1, 4 do - if cannibalDead[i] ~= true then + if cannibalDead[i] ~= true and leaksDead ~= true then if GetX(cannibals[i]) < GetX(leaks) then HogTurnLeft(cannibals[i], false) else @@ -1070,8 +1199,5 @@ SetAnimSkip(true) return end --- AddAmmo(leaks, amRope, 100) --- RemoveEventFunc(CheckPastFlower) --- DeleteGear(sniperCrate) end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/queen.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/queen.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/queen.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,34 @@ +--[[ +A Classic Fairytale: Long live the Queen + += SUMMARY = +Deathmatch against a leader of a pack of cyborgs with 4 different storylines (but mostly identical gameplay). + += GOALS = +Defeat Biomechanic Team. + += FLOW CHART = +- Show one of 4 possible storylines which affect the choice of the enemy leader (only minor effect on gameplay): + | 1) If offer accepted in ACF2 and traitor not executed in ACF5: Dense Cloud + | 2) Otherwise: If offer accepted in ACF2: Nancy Screw (cyborg) + | 3) Otherwise: If traitor was executed in ACF5: Fell from Heaven + | 4) Otherwise: Fiery Water +- Cut scene: startAnim +- TBS +- Biomechanic Team defeated. +- Cut scene: finalAnim +> Victory + +== Non-linear events == +| Leader dead + - Cut scene: leaderDeadAnim +| Played more than 6 rounds and leader is still in game + - Cut scene: fleeAnim + - Leader flees + - Instructions: Kill remaining enemies + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -100,6 +131,8 @@ fleeAnim = {} finalAnim = {} leaderDeadAnim = {} + +nativeAwaitingDeletion = nil -----------------------------Animations-------------------------------- function EmitDenseClouds(dir) local dif @@ -128,8 +161,8 @@ function AnimationSetup() table.insert(startAnim, {func = AnimWait, args = {enemy, 3000}}) - table.insert(startAnim, {func = AnimCaption, swh = false, args = {natives[1], "The team continued their quest of finding the rest of the tribe.", 4000}}) - table.insert(startAnim, {func = AnimCaption, swh = false, args = {natives[1], "They stumbled upon a pile of weapons, they seemed to be getting closer.", 4500}}) + table.insert(startAnim, {func = AnimCaption, swh = false, args = {natives[1], loc("The team continued their quest of finding the rest of the tribe."), 4000}}) + table.insert(startAnim, {func = AnimCaption, swh = false, args = {natives[1], loc("They stumbled upon a pile of weapons, they seemed to be getting closer."), 4500}}) if scene == denseScene then if m5DeployedNum == denseNum then deployedLeader = "1" @@ -170,38 +203,39 @@ return end table.insert(leaderDeadAnim, {func = AnimFollowGear, args = {gear}}) - table.insert(leaderDeadAnim, {func = AnimSay, args = {gear, "That traitor won't be killing us anymore!", SAY_THINK, 6000}}) + table.insert(leaderDeadAnim, {func = AnimSay, args = {gear, loc("That traitor won't be killing us anymore!"), SAY_THINK, 6000}}) end function SetupDenseAnim() - table.insert(startAnim, {func = AnimSay, args = {enemy, "Yo, dude! Get away from our weapons!", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Dense Cloud?! What are you doing?!", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "What does it look like?", SAY_SHOUT, 3500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Are you helping the aliens?!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Lolz, I love the look on your face!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Did you really think that I'd changed?", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "But why did you betray us?!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Yo, the aliens gave me plants...medicinal plants...lots of it.", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "You never give me plants!", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Besides, why would I choose certain death?", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Do you have any idea how bad an exploding arrow hurts?", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Dude, it's unbearable!", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "You're a coward!", SAY_SHOUT, 3000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "You endangered your whole tribe, you bastard!", SAY_SHOUT, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Yeah, well, for some dude to be happy, some other dude has to suffer.", SAY_SHOUT, 11000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "That's just the way it works, you know.", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "You're some piece of hypocrite junkie!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Why do you always have to call me names?", SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yo, dude! Get away from our weapons!"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Dense Cloud?! What are you doing?!"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("What does it look like?"), SAY_SHOUT, 3500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Are you helping the aliens?"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Haha, I love the look on your face!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Did you really think that I've changed?"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("But why did you betray us?!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yo, the aliens gave me plants. Medicinal plants. Lots of it."), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You never give me plants!"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Besides, why would I choose certain death?"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Do you have any idea how bad an exploding arrow hurts?"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Dude, it's unbearable!"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You're a coward!"), SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You endangered your whole tribe, you bastard!"), SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yeah, well, for some dude to be happy, some other dude has to suffer."), SAY_SHOUT, 11000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("That's just the way it works, you know."), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You're some piece of hypocrite junkie!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Why do you always have to call me names?"), SAY_SHOUT, 6000}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, EmitDenseClouds, {}}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Make fun of me when I fart...", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "IT'S A SERIOUS MEDICAL CONDITION!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "You don't deserve my sacrifice!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "I won't let you kill the tribe!", SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Make fun of me when I fart …"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("IT'S A SERIOUS MEDICAL CONDITION!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You don't deserve my sacrifice!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I won't let you kill the tribe!"), SAY_SHOUT, 5000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Dude, this is boring!", SAY_SAY, 3000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "I ain't gonna sit around no more!", SAY_SAY, 5000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Dude, this is boring!"), SAY_SAY, 3000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I ain't gonna sit around no more!"), SAY_SAY, 5000}}) + table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Yo, escort my buttocks!", SAY_SHOUT, 3500}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Yo, escort my buttocks!"), SAY_SHOUT, 3500}}) table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}}) table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}}) table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}}) @@ -212,79 +246,79 @@ table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I'm afraid I can't let you proceed!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "???", SAY_THINK, 0}}) - table.insert(startAnim, {func = AnimSay, args = {natives[2], "???", SAY_THINK, 0}}) - table.insert(startAnim, {func = AnimSay, args = {natives[3], "???", SAY_THINK, 1000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Dude, wow, you're so cute!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Did you really think I'd change?", SAY_SHOUT, 4500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I'm still with the aliens.", SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm afraid I can't let you proceed!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Huh?"), SAY_THINK, 0}}) + table.insert(startAnim, {func = AnimSay, args = {natives[2], loc("What the?"), SAY_THINK, 0}}) + table.insert(startAnim, {func = AnimSay, args = {natives[3], loc("Why?"), SAY_SAY, 1000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Dude, wow, you're so cute!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Did you really think I've changed?"), SAY_SHOUT, 4500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm still with the aliens."), SAY_SHOUT, 4000}}) table.insert(startAnim, {func = AnimTeleportGear, args = {enemy, unpack(enemyPos)}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "WHAT?!", SAY_THINK, 1000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[3], "But you saved me!", SAY_THINK, 2500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Haha, that was just a coincidence!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I was heading home, you see!", SAY_SHOUT, 3500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We were your home! Your family...", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "How could you betray us?!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Yo, the aliens gave me plants...medicinal plants...lots of it.", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "You never give me plants!", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Besides, why would I choose certain death?", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Do you have any idea how bad an exploding arrow hurts?", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Dude, it's unbearable!", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "You're a coward!", SAY_SHOUT, 3000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "You endangered your whole tribe, you bastard!", SAY_SHOUT, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Yeah, well, for some dude to be happy, some other dude has to suffer.", SAY_SHOUT, 11000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "That's just the way it works, you know.", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "You're some piece of hypocrite junkie!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Why do you always have to call me names?", SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What?!"), SAY_THINK, 1000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[3], loc("But you saved me!"), SAY_SAY, 2500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Haha, that was just a coincidence!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I was heading home, you see!"), SAY_SHOUT, 3500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We were your home! Your family!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("How could you betray us?"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yo, the aliens gave me plants. Medicinal plants. Lots of it."), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You never give me plants!"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Besides, why would I choose certain death?"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Do you have any idea how bad an exploding arrow hurts?"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Dude, it's unbearable!"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You're a coward!"), SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You endangered your whole tribe, you bastard!"), SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yeah, well, for some dude to be happy, some other dude has to suffer."), SAY_SHOUT, 11000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("That's just the way it works, you know."), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You're some piece of hypocrite junkie!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Why do you always have to call me names?"), SAY_SHOUT, 6000}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, EmitDenseClouds, {}}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Make fun of me when I fart...", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "IT'S A SERIOUS MEDICAL CONDITION!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "You don't deserve my sacrifice!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "I won't let you kill the tribe!", SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Make fun of me when I fart …"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("IT'S A SERIOUS MEDICAL CONDITION!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You don't deserve my sacrifice!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I won't let you kill the tribe!"), SAY_SHOUT, 5000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Dude, this is boring!", SAY_SAY, 3000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "I ain't gonna sit around no more!", SAY_SAY, 5000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Dude, this is boring!"), SAY_SAY, 3000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I ain't gonna sit around no more!"), SAY_SAY, 5000}}) table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Yo, escort my buttocks!", SAY_SHOUT, 3500}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Yo, escort my buttocks!"), SAY_SHOUT, 3500}}) table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}}) table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}}) table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}}) end function SetupWaterAnim() - table.insert(startAnim, {func = AnimSay, args = {enemy, "Stay there, comrades!", SAY_SHOUT, 2500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Come closer and die...burp!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Fiery Water?! Are you drunk again?", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Drunk with power, perhappss!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "The power of love! No, wait, the power of the aliens!", SAY_SHOUT, 7500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We trusted you, you fool!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Why do you keep betraying us?", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Why, why, why, why!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I grew sick of the oppression! I brock free!", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "What oppression?! You were the most unoppressed member of the tribe!", SAY_SHOUT, 10000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "The opression of the elders, of course!", SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Stay there, comrades!"), SAY_SHOUT, 2500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Come closer and die! … burp …"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Fiery Water?! Are you drunk again?"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Drunk with power, perhaps!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The power of love! No, wait, the power of the aliens!"), SAY_SHOUT, 7500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We trusted you, you fool!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why do you keep betraying us?"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Why, why, why, why!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I grew sick of the oppression! I broke free!"), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What oppression? You were the most unoppressed member of the tribe!"), SAY_SHOUT, 10000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The opression of the elders, of course!"), SAY_SHOUT, 6500}}) if m5DeployedNum == leaksNum then - table.insert(startAnim, {func = AnimSay, args = {enemy, "You should know this more than anyone, Leaks!", SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You should know this more than anyone, Leaks!"), SAY_SHOUT, 7000}}) elseif m5LeaksDead == 1 then - table.insert(startAnim, {func = AnimSay, args = {enemy, "Just look at Leaks, may he rest in peace!", SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Just look at Leaks, may he rest in peace!"), SAY_SHOUT, 6500}}) end - table.insert(startAnim, {func = AnimSay, args = {enemy, "We, the youth, have to constantly prove our value...", SAY_SHOUT, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "We work and work until we sweat blood...", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "We risk our lives going through challenges...", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "All this to please our beloved 'elders'...hick...", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "And what do they do in the meantime? NOTHING!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "All they do is sit around and judge us!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "You have never worked a bit in your life!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "All *you* do is take long walks when everyone else works.", SAY_SHOUT, 9000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Anyway, the aliens accept me for who I am.", SAY_SHOUT, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We won't accept you destroying our village!", SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We, the youth, have to constantly prove our value."), SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We work and work until we sweat blood."), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We risk our lives going through challenges."), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All this to please our beloved “elders” … hick …"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("And what do they do in the meantime? Nothing!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All they do is sit around and judge us!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You have never worked a bit in your life!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("All you do is take long walks when everyone else works."), SAY_SHOUT, 9000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Anyway, the aliens accept me for who I am."), SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We won't accept you destroying our village!"), SAY_SHOUT, 7000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Argh, the borrdommm!", SAY_SAY, 3000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "I have more important things to do!", SAY_SAY, 5000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Argh, the boredom!"), SAY_SAY, 3000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I have more important things to do!"), SAY_SAY, 5000}}) table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Comrades! Sail me away!", SAY_SHOUT, 3500}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Comrades! Sail me away!"), SAY_SHOUT, 3500}}) table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}}) table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}}) table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}}) @@ -294,37 +328,37 @@ table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Stop, comrades!", SAY_SHOUT, 2500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I cannot let you go any farther...burp!", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Fiery Water?! Are you drunk again?", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Drunk with power, perhappss!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "The power of love! No, wait, the power of the aliens!", SAY_SHOUT, 7500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Stop, comrades!"), SAY_SHOUT, 2500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I cannot let you go any further! … burp …"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Fiery Water?! Are you drunk again?"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Drunk with power, perhaps!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The power of love! No, wait, the power of the aliens!"), SAY_SHOUT, 7500}}) table.insert(startAnim, {func = AnimTeleportGear, args = {enemy, unpack(enemyPos)}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We trusted you, you fool!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Why do you keep betraying us?", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Why, why, why, why!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I grew sick of the oppression! I brock free!", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "What oppression?! You were the most unoppressed member of the tribe!", SAY_SHOUT, 10000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "The opression of the elders, of course!", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Just look at Leaks, may he rest in peace!", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "We, the youth, have to constantly prove our value...", SAY_SHOUT, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "We work and work until we sweat blood...", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "We risk our lives going through challenges...", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "All this to please our beloved 'elders'...hick...", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "And what do they do in the meantime? NOTHING!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "All they do is sit around and judge us!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "You have never worked a bit in your life!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "All *you* do is take long walks when everyone else works.", SAY_SHOUT, 9000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Anyway, the aliens accept me for who I am.", SAY_SHOUT, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We won't accept you destroying our village!", SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We trusted you, you fool!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why do you keep betraying us?"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Why, why, why, why!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I grew sick of the oppression! I broke free!"), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What oppression? You were the most unoppressed member of the tribe!"), SAY_SHOUT, 10000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The opression of the elders, of course!"), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Just look at Leaks, may he rest in peace!"), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We, the youth, have to constantly prove our value."), SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We work and work until we sweat blood."), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We risk our lives going through challenges."), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All this to please our beloved “elders” … hick …"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("And what do they do in the meantime? Nothing!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All they do is sit around and judge us!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("You have never worked a bit in your life!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("All you do is take long walks when everyone else works."), SAY_SHOUT, 9000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Anyway, the aliens accept me for who I am."), SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We won't accept you destroying our village!"), SAY_SHOUT, 7000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Argh, the borrdommm!", SAY_SAY, 3000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "I have more important things to do!", SAY_SAY, 5000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Argh, the boredom!"), SAY_SAY, 3000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I have more important things to do!"), SAY_SAY, 5000}}) table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Comrades! Sail me away!", SAY_SHOUT, 3500}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Comrades! Sail me away!"), SAY_SHOUT, 3500}}) table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}}) table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}}) table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}}) @@ -334,87 +368,87 @@ table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Oh, my! I forgot something!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "We need to go back!", SAY_SHOUT, 3000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "What could you possibly forget in that cage?", SAY_SHOUT, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I don't like your tone! You're hurting me!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "I'm terribly sorry!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "What is it that you forgot?", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Uhmm, it's...uhm...my ring!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "It's precious to me!", SAY_SHOUT, 3000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We don't have time for that now!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We have to find our folk!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "But I want my sandals!", SAY_SHOUT, 3000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Sandals?! I thought you left your ring!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "All right, you got me...", SAY_SHOUT, 3000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Got you? You're acting weird...", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "You just can't let it go, can you!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "All right, I'll admit it!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Admit what?", SAY_SHOUT, 2000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "You give me no choice!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I can't let you go further because...", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I'm the spy! I've been giving you out!", SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Oh, my! I forgot something!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("We need to go back!"), SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What could you possibly forget in that cage?"), SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I don't like your tone! You're hurting me!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("I'm terribly sorry!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("What is it that you forgot?"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Uhmm, it's … uhm … my ring!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It's precious to me!"), SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We don't have time for that now!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We have to find our folk!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("But I want my sandals!"), SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Sandals?! I thought you left your ring!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All right, you got me!"), SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Got you? You're acting weird."), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You just can't let it go, can you!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("All right, I'll admit it!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Admit what?"), SAY_SHOUT, 2000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You give me no choice!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I can't let you go further because …"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm the spy! I've been giving you out!"), SAY_SHOUT, 6000}}) table.insert(startAnim, {func = AnimTeleportGear, args = {enemy, unpack(enemyPos)}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[3], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[2], enemy}}}) table.insert(startAnim, {func = AnimCustomFunction, args = {enemy, CondNeedToTurn, {natives[1], enemy}}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "But...they kidnapped you!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Oh, that. We were just having fun!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "It's an ancient ritual of theirs.", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Why did you do this?", SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("But … they kidnapped you!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Oh, that. We were just having fun!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It's an ancient ritual of theirs."), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why did you do this?"), SAY_SHOUT, 4000}}) if m5ChiefDead == 1 then - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Why did you kill your father?", SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Why did you kill your father?"), SAY_SHOUT, 5000}}) end - table.insert(startAnim, {func = AnimSay, args = {enemy, "Do you have any idea what it's like in the village for a woman?", SAY_SHOUT, 10000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "How would you like being discriminated against?", SAY_SHOUT, 7000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Not being able to fight, hunt...", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Gathering fruits all day long...", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Doing stuff a monkey could do...", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Always being considered weak and fragile...", SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Do you have any idea what it's like in the village for a woman?"), SAY_SHOUT, 10000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("How would you like being discriminated against?"), SAY_SHOUT, 7000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Not being able to fight or hunt."), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Gathering fruits all day long."), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Doing stuff a monkey could do."), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Always being considered weak and fragile."), SAY_SHOUT, 6000}}) if m5DeployedNum == girlNum then - table.insert(startAnim, {func = AnimSay, args = {natives[1], "In case you haven't noticed, I'm a woman, too!", SAY_SHOUT, 8000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Yes, but you're...different!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Of course I am...", SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("In case you haven't noticed, I'm a woman, too!"), SAY_SHOUT, 8000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Yes, but you're … different!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Of course I am!"), SAY_SHOUT, 3000}}) end - table.insert(startAnim, {func = AnimSay, args = {enemy, "The aliens respect me, even worship me!", SAY_SHOUT, 6000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I'm living a dream!", SAY_SHOUT, 3000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Well, you're about to wake up!", SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The aliens respect me, even worship me!"), SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm living a dream!"), SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Well, you're about to wake up!"), SAY_SHOUT, 5000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Hmm...it's going slower than expected.", SAY_SAY, 5000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "I am going to leave the kids play by themselves.", SAY_SAY, 6000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Hmm … it's going slower than expected."), SAY_SAY, 5000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("I am going to leave the kids play by themselves."), SAY_SAY, 6000}}) table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Alien! I wish to be moved!", SAY_SHOUT, 4000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Alien! I wish to be moved!"), SAY_SHOUT, 4000}}) table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}}) table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}}) table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}}) end function SetupCyborgAnim() - table.insert(startAnim, {func = AnimSay, args = {enemy, "Stop right there, puny worms!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Stay away from our weapons!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We come in peace! Just let our friends go!", SAY_SHOUT, 5500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I'm afraid we cannot afford that...", SAY_SHOUT, 4500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "You see, hedgehog spikes are very very valuable.", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Very valuable, haha!", SAY_SHOUT, 3500}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Don't you dare harm our tribe!", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "It's a shame, really!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "I regret to end your little odyssey.", SAY_SHOUT, 5000}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "It was fun to watch...", SAY_SHOUT, 3500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "The way you handled your little internal conflicts...", SAY_SHOUT, 6500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "Did you really think that we needed the help of one of you?", SAY_SHOUT, 7500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "You should have known that we don't rely on meatbags!", SAY_SHOUT, 7500}}) - table.insert(startAnim, {func = AnimSay, args = {enemy, "It was fun to watch though...", SAY_SHOUT, 3500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Stop right there, puny worms!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Stay away from our weapons!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We come in peace! Just let our friends go!"), SAY_SHOUT, 5500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I'm afraid we cannot afford that."), SAY_SHOUT, 4500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You see, hedgehog spikes are very, very valuable."), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Very valuable, haha!"), SAY_SHOUT, 3500}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Don't you dare harming our tribe!"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It's a shame, really!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("I regret to end your little odyssey."), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It was fun to watch."), SAY_SHOUT, 3500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("The way you handled your little internal conflicts …"), SAY_SHOUT, 6500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Did you really think that we needed the help of one of you?"), SAY_SHOUT, 7500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("You should have known that we don't rely on meatbags!"), SAY_SHOUT, 7500}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("It was fun to watch, though."), SAY_SHOUT, 3500}}) if m5Choice == choiceEliminate then - table.insert(startAnim, {func = AnimSay, args = {enemy, "Heck, you even executed one of your own!", SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {enemy, loc("Heck, you even executed one of your own!"), SAY_SHOUT, 6000}}) end - table.insert(startAnim, {func = AnimSay, args = {natives[1], "It was all a trick?!", SAY_SHOUT, 3000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "Some sick game of yours?!", SAY_SHOUT, 4000}}) - table.insert(startAnim, {func = AnimSay, args = {natives[1], "We won't let you hurt any more of us!", SAY_SHOUT, 6000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("It was all a trick?!"), SAY_SHOUT, 3000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("Some sick game of yours?!"), SAY_SHOUT, 4000}}) + table.insert(startAnim, {func = AnimSay, args = {natives[1], loc("We won't let you hurt any more of us!"), SAY_SHOUT, 6000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Entered boredom phase! Discrepancies detected...", SAY_SAY, 5000}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Initiate escape wish!", SAY_SAY, 6000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Entered boredom phase! Discrepancies detected …"), SAY_SAY, 5000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Initiate escape wish!"), SAY_SAY, 6000}}) table.insert(fleeAnim, {func = AnimTurn, args = {enemy, "Right"}}) - table.insert(fleeAnim, {func = AnimSay, args = {enemy, "Running displacement algorithm...", SAY_SHOUT, 4000}}) + table.insert(fleeAnim, {func = AnimSay, args = {enemy, loc("Running displacement algorithm …"), SAY_SHOUT, 4000}}) table.insert(fleeAnim, {func = AnimSwitchHog, args = {natives[1]}}) table.insert(fleeAnim, {func = AnimWait, args = {natives[1], 1}}) table.insert(fleeAnim, {func = AnimDisappear, swh = false, args = {enemy, 0, 0}}) @@ -435,11 +469,11 @@ for i = 1, found do table.insert(finalAnim, {func = AnimCustomFunction, args = {gears[1], CondNeedToTurn, {cyborg, gears[i]}}}) end - table.insert(finalAnim, {func = AnimSay, args = {cyborg, "Nice work, meatbags!", SAY_SAY, 3000}}) - table.insert(finalAnim, {func = AnimSay, args = {cyborg, "You're on your way to freeing your tribe!", SAY_SAY, 5500}}) - table.insert(finalAnim, {func = AnimSay, args = {gears[1], "Do you know where they are?", SAY_SAY, 4000}}) - table.insert(finalAnim, {func = AnimSay, args = {gears[found], "We need to hurry!", SAY_SAY, 3000}}) - table.insert(finalAnim, {func = AnimSay, args = {cyborg, "Haha! Come!", SAY_SAY, 2000}}) + table.insert(finalAnim, {func = AnimSay, args = {cyborg, loc("Nice work, meatbags!"), SAY_SAY, 3000}}) + table.insert(finalAnim, {func = AnimSay, args = {cyborg, loc("You're on your way to freeing your tribe!"), SAY_SAY, 5500}}) + table.insert(finalAnim, {func = AnimSay, args = {gears[1], loc("Do you know where they are?"), SAY_SAY, 4000}}) + table.insert(finalAnim, {func = AnimSay, args = {gears[found], loc("We need to hurry!"), SAY_SAY, 3000}}) + table.insert(finalAnim, {func = AnimSay, args = {cyborg, loc("Haha! Come!"), SAY_SAY, 2000}}) table.insert(finalAnim, {func = AnimJump, args = {cyborg, "high"}}) table.insert(finalAnim, {func = AnimDisappear, args = {cyborg, GetGearPosition(cyborg)}}) for i = 1, found do @@ -453,7 +487,7 @@ --------------------------Anim skip functions-------------------------- function AfterStartAnim() SetGearMessage(natives[1], 0) - ShowMission("Long Live The Queen", "Closing in", "Defeat the enemy!|The leader seems scared, he will probably flee.", 1, 0) + ShowMission(loc("Long Live The Queen"), loc("Closing in"), loc("Defeat the enemy!").."|"..loc("The leader seems scared, he will probably flee."), 1, 0) SetHealth(SpawnHealthCrate(2207, 44), 25) SetHealth(SpawnHealthCrate(519, 1519), 25) SetHealth(SpawnHealthCrate(826, 895), 25) @@ -466,7 +500,7 @@ SetGearPosition(enemy, unpack(enemyPos)) end if GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then - TurnTimeLeft = 0 + EndTurn(true) end AnimWait(enemy, 1) end @@ -478,7 +512,7 @@ SetHealth(SpawnHealthCrate(70, 1308), 25) SetGearMessage(CurrentHedgehog, 0) HideHedge(enemy) - ShowMission("Long Live The Queen", "Coward", "The leader escaped. Defeat the rest of the aliens!", 1, 0) + ShowMission(loc("Long Live The Queen"), loc("Coward"), loc("The leader escaped. Defeat the rest of the aliens!"), 1, 0) TurnTimeLeft = TurnTime end @@ -487,8 +521,8 @@ SetHealth(SpawnHealthCrate(2087, 50), 25) SetHealth(SpawnHealthCrate(2143, 54), 25) SetHealth(SpawnHealthCrate(70, 1308), 25) - ShowMission("Long Live The Queen", "Bullseye", "Good Job! Defeat the rest of the aliens!", 1, 0) - TurnTimeLeft = 0 + ShowMission(loc("Long Live The Queen"), loc("Bullseye"), loc("Good job! Defeat the rest of the aliens!"), 1, 0) + EndTurn(true) end -----------------------------Events------------------------------------ function CheckTurnsOver() @@ -511,8 +545,8 @@ RemoveEventFunc(CheckTurnsOver) RemoveEventFunc(CheckGearDead) RemoveEventFunc(CheckCyborgsDead) - AddCaption("...and the cyborgs took over the island.") - TurnTimeLeft = 0 + AddCaption(loc("And so the cyborgs took over the island.")) + EndTurn(true) end function CheckCyborgsDead() @@ -524,7 +558,7 @@ DismissTeam(loc("Leaderbot")) end DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end function DoCyborgsDead() @@ -538,12 +572,14 @@ end function DoLeaderDead() - leaderDead = true - SetGearMessage(CurrentHedgehog, 0) - SetupLeaderDeadAnim() - AddAnim(leaderDeadAnim) - AddFunction({func = AfterLeaderDeadAnim, args = {}}) - RemoveEventFunc(CheckTurnsOver) + if enemyFled ~= "1" then + leaderDead = true + SetGearMessage(CurrentHedgehog, 0) + SetupLeaderDeadAnim() + AddAnim(leaderDeadAnim) + AddFunction({func = AfterLeaderDeadAnim, args = {}}) + RemoveEventFunc(CheckTurnsOver) + end end function CheckGearsDead(gearList) @@ -645,22 +681,29 @@ if GetHogName(natives[i]) == GetHogName(enemy) then AnimSetGearPosition(enemy, GetGearPosition(natives[i])) DeleteGear(natives[i]) + -- triggers AfterSetupPlace when the gear is *actually* deleted + nativeAwaitingDeletion = natives[i] DeleteGear(cyborgs[cyborgsLeft]) + break end end - SpawnAmmoCrate(34, 395, amBee, 2) + SpawnAmmoCrate(34, 410, amBee, 2) SpawnAmmoCrate(33, 374, amRCPlane, 1) - SpawnAmmoCrate(74, 393, amAirAttack, 3) + SpawnAmmoCrate(74, 410, amAirAttack, 3) SpawnAmmoCrate(1313, 1481, amBazooka, 8) SpawnAmmoCrate(80, 360, amSniperRifle, 4) - SpawnAmmoCrate(1037, 1494, amShotgun, 7) + SpawnAmmoCrate(1037, 1508, amShotgun, 7) SpawnAmmoCrate(1037, 1472, amMolotov, 3) - SpawnAmmoCrate(1146, 1503, amMortar, 8) + SpawnAmmoCrate(1146, 1576, amMortar, 8) SpawnUtilityCrate(1147, 1431, amPortalGun, 2) SpawnUtilityCrate(1219, 1542, amRope, 5) SpawnUtilityCrate(1259, 1501, amJetpack, 2) + + if not nativeAwaitingDeletion then + AfterSetupPlace() + end end function SetupEvents() @@ -689,21 +732,21 @@ origNatives[4] = natives[4] nativesLeft = nativesNum - AddTeam(loc("Beep Loopers"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("Beep Loopers"), 14483456, "ring", "UFO", "Robot", "cm_cyborg") for i = 1, cyborgsTeamNum[1] do cyborgs[i] = AddHog(cyborgNames[i], cyborgsDif[i], cyborgsHealth[i], "cyborg2") end - AddTeam(loc("Corporationals"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("Corporationals"), 14483456, "ring", "UFO", "Robot", "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"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("Leaderbot"), 14483456, "ring", "UFO", "Robot", "cm_cyborg") enemy = AddHog(loc("Name"), 2, 200, "cyborg1") - AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1") SetGearPosition(cyborg, 0, 0) @@ -759,6 +802,10 @@ function onGameStart() SetupAmmo() SetupPlace() + -- Animation is setup in AfterSetupPlace +end + +function AfterSetupPlace() AnimationSetup() SetupEvents() AddAnim(startAnim) @@ -788,6 +835,10 @@ end table.remove(natives, toRemove) nativesLeft = nativesLeft - 1 + if nativeAwaitingDeletion and gear == nativeAwaitingDeletion then + AfterSetupPlace() + nativeAwaitingDeletion = nil + end end end end @@ -800,7 +851,7 @@ SetAmmo(amSwitch, 9, 0, 0, 0) SetAmmo(amBazooka, 9, 0, 0, 0) SetAmmo(amGrenade, 9, 0, 0, 0) - SetAmmo(amAirStrike, 1, 0, 0, 0) + SetAmmo(amAirAttack, 1, 0, 0, 0) SetAmmo(amMolotov, 5, 0, 0, 0) SetAmmo(amShotgun, 9, 0, 0, 0) end @@ -811,7 +862,7 @@ return end if GetHogTeamName(CurrentHedgehog) == loc("011101001") then - TurnTimeLeft = 0 + EndTurn(true) end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/shadow.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/shadow.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/shadow.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,66 @@ +--[[ +A Classic Fairytale: The Shadow Falls + += SUMMARY = +Dense Cloud and Leaks a Lot fight against waves of cannibals. Then a +cyborg shows up and offers one of the natives goodies in exchange for +betraying his tribe. + +The decision affects the rest of the story. The survival of Dense +Cloud is important for the gameplay of the next mission. + += GOALS = +Kill Weaklings and Stronglings. + += FLOW CHART = +== Linear events == + +- Initial hog spawns: Dense Cloud, Leaks a Lot and Brainiac (Weaklings) +- Cut scene: startDialogue +- TBS +- Brainiac dead +- Cut scene: weaklingsAnim +- The remaining Weaklings spawn +- TBS +- All Weaklings dead +- Cut scene: stronglingsAnim: Stronglings spawn, hero 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 +| Reject: Player walks away + - Cut scene: refusedAnim + - Leaks a Lot teleports back to tree at the start (automatically) + - Spiky Cheese and Ramon appear together with crates + - Spiky Cheese gains control + - TBS + - Stronglings defeated + - Cut scene: refusedFinalAnim + > Victory +| Attack: Player attacks cyborg + - Cut scene: attackAnim + - Cyborg kills hero + - Other native's turn to defeat Stronglings + - TBS + - Stronglings defeated + - Cut scene: attackedFinalAnim + > Victory + +== Non-linear events == +| Dense Cloud or Leaks A Lot dead (exceptions: killed by cyborg; or Leaks A Lot died in the battle against the Stronglings): + > Game over + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -65,7 +128,6 @@ leaksHidden = false denseHidden = false cyborgAttacked = false -retryReturn = false shotgunTaken = false grenadeTaken = false spikyDead = false @@ -85,21 +147,26 @@ --------------------------Anim skip functions-------------------------- function AfterRefusedAnim() + if stage == loseStage then + return + end SpawnUtilityCrate(2045, 1575, amSwitch) - SpawnUtilityCrate(2365, 1495, amShotgun) - SpawnUtilityCrate(2495, 1519, amGrenade) + SpawnAmmoCrate(2365, 1495, amShotgun) + SpawnAmmoCrate(2495, 1519, amGrenade) SpawnUtilityCrate(2620, 1524, amRope) - ShowMission(loc("The Shadow Falls"), loc("The Showdown"), loc("Save Leaks A Lot!|Hint: The Switch utility might be of help to you."), 1, 6000) + ShowMission(loc("The Shadow Falls"), loc("The Showdown"), loc("Save Leaks A Lot!|Hint: The switch hedgehog utility might be of help to you."), 1, 6000) RemoveEventFunc(CheckDenseDead) AddEvent(CheckStronglingsDead, {}, DoStronglingsDeadRefused, {}, 0) AddAmmo(cannibals[6], amGrenade, 1) AddAmmo(cannibals[7], amGrenade, 1) AddAmmo(cannibals[8], amGrenade, 1) AddAmmo(cannibals[9], amGrenade, 1) + AddAmmo(dense, amSkip, 100) + AddAmmo(leaks, amSkip, 100) stage = ramonStage SwitchHog(cannibals[9]) FollowGear(ramon) - TurnTimeLeft = 0 + EndTurn(true) SetGearMessage(ramon, 0) SetGearMessage(leaks, 0) AnimWait(ramon, 1) @@ -107,6 +174,9 @@ end function SkipRefusedAnim() + if stage == loseStage then + return + end RefusedStart() AnimSetGearPosition(dense, 2645, 1146) AnimSetGearPosition(ramon, 2218, 1675) @@ -114,13 +184,19 @@ end function AfterStartDialogue() + if stage == loseStage then + return + end stage = spyStage - ShowMission(loc("The Shadow Falls"), loc("Play with me!"), loc("Defend yourself!|Hint: You can get tips on using weapons by moving your mouse over them in the weapon selection menu"), 1, 6000) + ShowMission(loc("The Shadow Falls"), loc("Play with me!"), loc("Kill the cannibal!").."|"..loc("Both your hedgehogs must survive."), 1, 6000) TurnTimeLeft = TurnTime end function StartSkipFunc() + if stage == loseStage then + return + end SetState(cannibals[1], 0) AnimTurn(leaks, "Right") AnimSwitchHog(leaks) @@ -128,6 +204,9 @@ end function AfterWeaklingsAnim() + if stage == loseStage then + return + end AddAmmo(cannibals[2], amShotgun, 1) AddAmmo(cannibals[2], amGrenade, 1) AddAmmo(cannibals[3], amShotgun, 1) @@ -136,8 +215,8 @@ AddAmmo(cannibals[4], amGrenade, 1) AddAmmo(cannibals[5], amShotgun, 1) AddAmmo(cannibals[5], amGrenade, 1) - AddAmmo(leaks, amSkip, 4) - AddAmmo(dense, amSkip, 4) + AddAmmo(leaks, amSkip, 100) + AddAmmo(dense, amSkip, 100) AddEvent(CheckWeaklingsKilled, {}, DoWeaklingsKilled, {}, 0) SetHealth(SpawnHealthCrate(2757, 1030), 50) SetHealth(SpawnHealthCrate(2899, 1009), 50) @@ -146,10 +225,13 @@ SetGearMessage(dense, 0) SetGearMessage(leaks, 0) TurnTimeLeft = TurnTime - ShowMission(loc("The Shadow Falls"), loc("Why do you not like me?"), loc("Obliterate them!|Hint: You might want to take cover..."), 1, 6000) + 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 function SkipWeaklingsAnim() + if stage == loseStage then + return + end for i = 2, 5 do if isHidden[cannibals[i]] == true then RestoreHog(cannibals[i]) @@ -162,6 +244,9 @@ end function AfterStronglingsAnim() + if stage == loseStage then + 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) AddEvent(CheckChoice, {}, DoChoice, {}, 0) @@ -174,10 +259,13 @@ AddAmmo(leaks, amSkip, 0) SetHealth(SpawnHealthCrate(2557, 1030), 50) SetHealth(SpawnHealthCrate(3599, 1009), 50) - TurnTimeLeft = 0 + EndTurn(true) end function SkipStronglingsAnim() + if stage == loseStage then + return + end for i = 6, 9 do if isHidden[cannibals[i]] == true then RestoreHog(cannibals[i]) @@ -200,28 +288,17 @@ SetInputMask(0xFFFFFFFF) end -function RestartReturnAccepted() - retryReturn = false - AnimSetGearPosition(dense, 1350, 1310) - AddAmmo(dense, amGirder, 2) - AddAmmo(dense, amParachute, 2) - ShowMission(loc("The Shadow Falls"), loc("The walk of Fame"), loc("Return to Leaks A Lot! If you get stuck, press [Precise] to try again!"), 1, 6000) - RemoveEventFunc(CheckNeedGirder) - RemoveEventFunc(CheckNeedWeapons) +function AfterAcceptedAnim() + if stage == loseStage then + return + end + stage = acceptedReturnStage + SpawnUtilityCrate(1370, 810, amGirder) + SpawnUtilityCrate(1300, 810, amParachute) + ShowMission(loc("The Shadow Falls"), loc("The walk of Fame"), loc("Return to Leaks A Lot!"), 1, 6000) + AddEvent(CheckReadyForStronglings, {}, DoReadyForStronglings, {}, 0) AddEvent(CheckNeedGirder, {}, DoNeedGirder, {}, 0) AddEvent(CheckNeedWeapons, {}, DoNeedWeapons, {}, 0) -end - - -function AfterAcceptedAnim() - stage = acceptedReturnStage - SpawnAmmoCrate(1370, 810, amGirder) - SpawnAmmoCrate(1300, 810, amParachute) - ShowMission(loc("The Shadow Falls"), loc("The walk of Fame"), loc("Return to Leaks A Lot! If you get stuck, press [Precise] to try again!"), 1, 6000) - AddEvent(CheckTookWeapons, {}, DoTookWeapons, {}, 0) - AddEvent(CheckNeedGirder, {}, DoNeedGirder, {}, 0) - AddEvent(CheckNeedWeapons, {}, DoNeedWeapons, {}, 0) - AddEvent(CheckRestartReturnAccepted, {}, RestartReturnAccepted, {}, 1) RemoveEventFunc(CheckDenseDead) SwitchHog(dense) AnimWait(dense, 1) @@ -229,6 +306,9 @@ end function SkipAcceptedAnim() + if stage == loseStage then + return + end AnimSetGearPosition(cyborg, unpack(cyborgPos)) SetState(cyborg, gstInvisible) AnimSwitchHog(dense) @@ -236,6 +316,9 @@ end function AfterAttackedAnim() + if stage == loseStage then + 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) AddAmmo(cannibals[6], amGrenade, 1) @@ -259,6 +342,9 @@ end function SkipAttackedAnim() + if stage == loseStage then + return + end if denseDead == false then DeleteGear(dense) end @@ -284,6 +370,9 @@ end function EmitDenseClouds(anim, dir) + if stage == loseStage then + return + end local dif if dir == "Left" then dif = 10 @@ -301,6 +390,9 @@ end function BlowDenseCloud() + if stage == loseStage then + return + end AnimInsertStepNext({func = DeleteGear, args = {dense}, swh = false}) AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense), GetY(dense), vgtBigExplosion, 0, true}, swh = false}) AnimInsertStepNext({func = AnimWait, args = {dense, 1200}}) @@ -497,6 +589,9 @@ function RefusedStart() + if stage == loseStage then + return + end if ramonHidden == true then RestoreHog(ramon) ramonHidden = false @@ -519,7 +614,7 @@ dense = AddHog(loc("Dense Cloud"), 0, 100, "RobinHood") spiky = AddHog(loc("Spiky Cheese"), 0, 100, "hair_yellow") - AddTeam(loc("Weaklings"), 14483456, "Skull", "Island", "Pirate","cm_vampire") + AddTeam(loc("Weaklings"), 14483456, "skull", "Island", "Pirate","cm_vampire") cannibals = {} cannibals[1] = AddHog(loc("Brainiac"), 5, 20, "Zombi") @@ -528,14 +623,14 @@ hogNr[cannibals[i]] = i - 2 end - AddTeam(loc("Stronglings"), 14483456, "Skull", "Island", "Pirate","cm_vampire") + AddTeam(loc("Stronglings"), 14483456, "skull", "Island", "Pirate","cm_vampire") for i = 6, 9 do cannibals[i] = AddHog(HogNames[i], 2, 30, "vampirichog") hogNr[cannibals[i]] = i - 2 end - AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Y3K1337"), 0, 200, "cyborg1") end @@ -568,13 +663,18 @@ end function CondNeedToTurn(hog1, hog2) + if stage == loseStage then + return + end xl, xd = GetX(hog1), GetX(hog2) - if xl > xd then - AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}}) - AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}}) - elseif xl < xd then - AnimInsertStepNext({func = AnimTurn, args = {hog2, "Left"}}) - AnimInsertStepNext({func = AnimTurn, args = {hog1, "Right"}}) + if xl and xd then + if xl > xd then + AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}}) + AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}}) + elseif xl < xd then + AnimInsertStepNext({func = AnimTurn, args = {hog2, "Left"}}) + AnimInsertStepNext({func = AnimTurn, args = {hog1, "Right"}}) + end end end @@ -592,6 +692,9 @@ end function HideStronglings() + if stage == loseStage then + return + end for i = 6, 9 do HideHog(cannibals[i]) isHidden[cannibals[i]] = true @@ -599,6 +702,9 @@ end function UnHideWeaklings() + if stage == loseStage then + return + end for i = 2, 5 do RestoreHog(cannibals[i]) isHidden[cannibals[i]] = false @@ -607,6 +713,9 @@ end function UnHideStronglings() + if stage == loseStage then + return + end for i = 6, 9 do RestoreHog(cannibals[i]) isHidden[cannibals[i]] = false @@ -618,6 +727,9 @@ end function ChoiceTaken() + if stage == loseStage then + return + end SetGearMessage(CurrentHedgehog, 0) if choice == choiceAccept then AddAnim(acceptedAnim) @@ -632,9 +744,12 @@ end function KillCyborg() + if stage == loseStage then + return + end RestoreHog(cyborg) DeleteGear(cyborg) - TurnTimeLeft = 0 + EndTurn(true) end -----------------------------Events------------------------------------ @@ -643,7 +758,10 @@ end function DoBrainiacDead() - TurnTimeLeft = 0 + if stage == loseStage then + return + end + EndTurn(true) SetGearMessage(CurrentHedgehog, 0) AddAnim(weaklingsAnim) AddFunction({func = AfterWeaklingsAnim, args = {}}) @@ -660,6 +778,12 @@ end function DoWeaklingsKilled() + if stage == loseStage then + return + end + if denseDead or GetHealth(dense) == 0 or leaksDead or GetHealth(leaks) == 0 then + return + end SetGearMessage(CurrentHedgehog, 0) AddAnim(stronglingsAnim) AddFunction({func = AfterStronglingsAnim, args = {}}) @@ -672,6 +796,9 @@ end function DoRefuse() + if stage == loseStage then + return + end choice = choiceRefuse end @@ -680,6 +807,9 @@ end function DoAccept() + if stage == loseStage then + return + end choice = choiceAccept end @@ -688,6 +818,9 @@ end function DoConfront() + if stage == loseStage then + return + end choice = choiceAttack end @@ -696,6 +829,9 @@ end function DoChoice() + if stage == loseStage then + return + end RemoveEventFunc(CheckConfront) RemoveEventFunc(CheckAccept) RemoveEventFunc(CheckRefuse) @@ -703,29 +839,47 @@ end function CheckNeedGirder() + if stage == loseStage then + return false + end return GetX(dense) > 1640 and StoppedGear(dense) end function DoNeedGirder() - ShowMission(loc("The Shadow Falls"), loc("Under Construction"), loc("To place a girder, select it, use [Left] and [Right] to select angle and length, place with [Left Click]"), 1, 6000) + 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) end function CheckNeedWeapons() + if stage == loseStage then + return false + end return GetX(dense) > 2522 and StoppedGear(dense) end function DoNeedWeapons() + if stage == loseStage then + return + end grenadeCrate = SpawnAmmoCrate(2550, 800, amGrenade) shotgunCrate = SpawnAmmoCrate(2610, 850, amShotgun) AddCaption(loc("A little gift from the cyborgs")) end -function CheckTookWeapons() - return shotgunTaken and grenadeTaken +function CheckReadyForStronglings() + if stage == loseStage then + return false + end + return (shotgunTaken and grenadeTaken) or GetX(dense) > 2700 end -function DoTookWeapons() - 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"), 1, 8000) +function DoReadyForStronglings() + 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) AddAmmo(dense, amSkip, 100) AddAmmo(dense, amSwitch, 100) AddAmmo(leaks, amSkip, 100) @@ -733,7 +887,6 @@ stage = duoStage RemoveEventFunc(CheckNeedGirder) RemoveEventFunc(CheckNeedWeapons) - RemoveEventFunc(CheckRestartReturnAccepted) AddEvent(CheckStronglingsDead, {}, DoStronglingsDead, {}, 0) AddAmmo(cannibals[6], amGrenade, 2) AddAmmo(cannibals[6], amShotgun, 2) @@ -749,6 +902,12 @@ end function DoStronglingsDead() + if stage == loseStage then + return + end + if leaksDead or GetHealth(leaks) == 0 then + return + end SetGearMessage(CurrentHedgehog, 0) if denseDead == true then AddAnim(acceptedDiedFinalAnim) @@ -768,6 +927,9 @@ end function DoStronglingsDeadRefused() + if stage == loseStage then + return + end if denseDead == true then SaveCampaignVar("M2DenseDead", "1") else @@ -792,6 +954,9 @@ end function DoStronglingsDeadAttacked() + if stage == loseStage then + return + end SaveCampaignVar("M2DenseDead", "1") SaveCampaignVar("M2RamonDead", "0") SaveCampaignVar("M2SpikyDead", "0") @@ -820,9 +985,11 @@ end function DoDead() + if stage == loseStage then + return + end AddCaption(loc("...and so the cyborgs took over the world...")) stage = loseStage - TurnTimeLeft = 0 DismissTeam(loc("Natives")) end @@ -830,10 +997,6 @@ return denseDead and choice ~= choiceAttack end -function CheckRestartReturnAccepted() - return retryReturn -end - -----------------------------Main Functions---------------------------- function onGameInit() @@ -847,7 +1010,9 @@ Delay = 10 Map = "A_Classic_Fairytale_shadow" Theme = "Nature" - SuddenDeathTurns = 3000 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 AddHogs() PlaceHogs() @@ -926,17 +1091,15 @@ SetAmmo(amShotgun, 0, 0, 0, 3) SetAmmo(amSwitch, 0, 0, 0, 8) SetAmmo(amRope, 0, 0, 0, 6) + SetAmmo(amSkip, 9, 0, 0, 0) end function onNewTurn() if AnimInProgress() then TurnTimeLeft = -1 --- elseif stage == interSpyStage and GetHogTeamName(CurrentHedgehog) ~= loc("Natives") then --- TurnTimeLeft = 0 --- SetState(CurrentHedgehog, gstInvisible) elseif stage == cyborgStage then if CurrentHedgehog ~= dense then - TurnTimeLeft = 0 + EndTurn(true) else TurnTimeLeft = -1 end @@ -958,12 +1121,5 @@ SetAnimSkip(true) return end - if stage == acceptedReturnStage then - retryReturn = true --- else --- for i = 1, 9 do --- DeleteGear(cannibals[i]) --- end - end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/united.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/united.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Classic_Fairytale/united.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,27 @@ +--[[ +A Classic Fairytale: United we stand + += SUMMARY = +Simple Deathmatch against cannibals in two waves. + += GOAL = +Kill both Cannfantery (cannibal) teams. + += FLOW CHART = + +- Light Cannfantery and player hogs spawn +- Cut scene: startAnim +- TBS +- Light Cannfantery defeated +- Cut scene: wave2Anim +- Heavy Cannfantery spawns +- TBS +- Heavy Cannfantery defeated +- Cut scene: finalAnim +> Victory + +]] + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") @@ -80,7 +104,7 @@ end function AfterWave2Anim() - TurnTimeLeft = 0 + EndTurn(true) end function AfterFinalAnim() @@ -113,7 +137,7 @@ SaveCampaignVar("Progress", "4") end DismissTeam(loc("011101001")) - TurnTimeLeft = 0 + EndTurn(true) end -----------------------------Animations-------------------------------- function Wave2Reaction() @@ -193,7 +217,7 @@ table.insert(startAnim, {func = AnimOutOfNowhere, args = {cannibals[i], unpack(cannibalPos[i])}}) end table.insert(startAnim, {func = AnimWait, args = {chief, 1500}}) - table.insert(startAnim, {func = AnimSay, args = {leaks, loc("HOW DO THEY KNOW WHERE WE ARE???"), SAY_SHOUT, 5000}}) + table.insert(startAnim, {func = AnimSay, args = {leaks, loc("HOW DO THEY KNOW WHERE WE ARE?"), SAY_SHOUT, 5000}}) table.insert(startAnim, {func = AnimSay, args = {chief, loc("We have to protect the village!"), SAY_SAY, 5000}}) table.insert(startAnim, {func = AnimSwitchHog, args = {leaks}}) AddSkipFunction(startAnim, SkipStartAnim, {}) @@ -214,10 +238,10 @@ if nativesNum == 0 then return end - local hogDeadStrings = {loc("They killed ") .. gear ..loc("! You bastards!"), - gear .. loc("! Why?!"), + local hogDeadStrings = {string.format(loc("They killed %s! You bastards!"), gear), + string.format(loc("%s! Why?!"), gear), loc("That was just mean!"), - loc("Oh no, not ") .. gear .. "!"} + string.format(loc("Oh no, not %s!"), gear)} table.insert(hogDeadAnim, {func = AnimSay, args = {CurrentHedgehog, hogDeadStrings[nativesNum], SAY_SHOUT, 4000}}) end @@ -308,17 +332,17 @@ natives = {leaks, dense, water, buffalo, chief} nativesNum = 5 - AddTeam(loc("Light Cannfantry"), 14483456, "Skull", "Island", "Pirate", "cm_vampire") + AddTeam(loc("Light Cannfantry"), 14483456, "skull", "Island", "Pirate", "cm_vampire") for i = 1, 4 do cannibals[i] = AddHog(HogNames[i], 2, 40, "Zombi") end - AddTeam(loc("Heavy Cannfantry"), 14483456, "Skull", "Island", "Pirate", "cm_vampire") + AddTeam(loc("Heavy Cannfantry"), 14483456, "skull", "Island", "Pirate", "cm_vampire") for i = 5, 8 do cannibals[i] = AddHog(HogNames[i], 2, 55, "vampirichog") end - AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_star") + AddTeam(loc("011101001"), 14483456, "ring", "UFO", "Robot", "cm_binary") cyborg = AddHog(loc("Unit 334a$7%;.*"), 0, 200, "cyborg1") AnimSetGearPosition(leaks, unpack(leaksPos)) @@ -359,11 +383,11 @@ SpawnAmmoCrate(1981, 464, amGrenade) SpawnAmmoCrate(1957, 459, amShotgun) SpawnAmmoCrate(1902, 450, amDynamite) - SpawnUtilityCrate(1982, 405, amPickHammer) + SpawnAmmoCrate(1982, 405, amPickHammer) SpawnUtilityCrate(2028, 455, amRope) SpawnUtilityCrate(2025, 464, amTeleport) else - SpawnUtilityCrate(1982, 405, amBlowTorch) + SpawnAmmoCrate(1982, 405, amBlowTorch) SpawnAmmoCrate(2171, 428, amMolotov) SpawnAmmoCrate(2364, 346, amFlamethrower) SpawnAmmoCrate(2521, 303, amBazooka) @@ -411,7 +435,9 @@ Delay = 10 Map = "Hogville" Theme = "Nature" - SuddenDeathTurns = 3000 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 AddHogs() AnimInit() @@ -488,7 +514,7 @@ SetAmmo(amGirder, 4, 0, 0, 2) SetAmmo(amParachute, 4, 0, 0, 2) SetAmmo(amSwitch, 8, 0, 0, 2) - SetAmmo(amSkip, 8, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) SetAmmo(amRope, 5, 0, 0, 3) SetAmmo(amBlowTorch, 3, 0, 0, 3) SetAmmo(amPickHammer, 0, 0, 0, 3) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/campaign.ini --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/campaign.ini Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/campaign.ini Sun Dec 17 00:09:24 2017 +0100 @@ -1,4 +1,4 @@ -MissionNum=5 +MissionNum=14 ResetRetry=1 [Mission 1] diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua Sun Dec 17 00:09:24 2017 +0100 @@ -16,11 +16,10 @@ local timeForGuard1ToTurnLeft = timeForGuard1ToTurn local saucerAcquired = false local status +local getReadyForRumble = false -- guards wake up +local ropeDestroyed = false -- for detecting if player roped to the moon +local ropedToMoon = 0 local checkPointReached = 1 -- 1 is start of the game -local objectives = loc("Go to the moon by using the flying saucer and complete the main mission").."|".. -loc("Come back to this mission and visit the other planets to collect the crates").."|".. -loc("Visit the Death Planet after completing all the other planets' main missions").."|".. -loc("Come back to this mission after collecting all the device parts") -- dialogs local dialog01 = {} local dialog02 = {} @@ -30,16 +29,22 @@ local dialog06 = {} local dialog07 = {} local dialog08 = {} +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.").. + "|"..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}, [dialog03] = {missionName, loc("An unexpected event!"), loc("Use the saucer and fly away").."|"..loc("Beware, any damage taken will stay until you complete the moon's main mission"), 1, 7000}, - [dialog04] = {missionName, loc("Objectives"), objectives, 1, 7000}, - [dialog05] = {missionName, loc("Objectives"), objectives, 1, 7000}, - [dialog06] = {missionName, loc("Objectives"), objectives, 1, 7000}, [dialog07] = {missionName, loc("Searching the stars!"), loc("Use the saucer and fly away").."|"..loc("Visit the planets of Ice, Desert and Fruit before you proceed to the Death Planet"), 1, 6000}, - [dialog08] = {missionName, loc("Saving Hogera"), loc("Fly to the meteorite and detonate the explosives"), 1, 7000} + [dialog08] = {missionName, loc("Saving Hogera"), loc("Fly to the meteorite and detonate the explosives"), 1, 7000}, + ["open_side_missions"] = {missionName, loc("Conquering the galaxy"), + loc("Use the flying saucer to fly to the other planets.").."|".. + 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} } -- crates local saucerX = 3270 @@ -54,6 +59,10 @@ local teamA = {} local teamB = {} local teamC = {} +-- to check if flying saucer is active +local saucerGear = nil +-- if player abandoned any incomplete planet mission +local abandonedPlanetMission = false -- hedgehogs values hero.name = loc("Hog Solo") hero.x = 1450 @@ -72,22 +81,26 @@ guard2.name = loc("Sam") guard2.x = 3400 guard2.y = 1800 +-- Planetary Association of the Hedgehogs teamA.name = loc("PAotH") -teamA.color = tonumber("FF0000",16) -- red +teamA.color = 0x38D61C -- green teamB.name = loc("Guards") -teamB.color = tonumber("0033FF",16) -- blue +teamB.color = 0x0072FF -- blue teamC.name = loc("Hog Solo") -teamC.color = tonumber("38D61C",16) -- green +teamC.color = 0x38D61C -- green -------------- LuaAPI EVENT HANDLERS ------------------ function onGameInit() Seed = 35 - GameFlags = gfSolidLand + gfDisableWind - TurnTime = 40000 + GameFlags = gfSolidLand + gfDisableWind + gfTagTeam + TurnTime = 20000 CaseFreq = 0 MinesNum = 0 Explosives = 0 Delay = 5 + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 -- completed main missions status = getCompletedStatus() if status.death01 then @@ -98,17 +111,17 @@ Theme = "Nature" -- I had originally hero in PAotH team and changed it, may reconsider though -- PAotH - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamC.name, teamC.color, "Simple", "Island", "Default", "hedgewars") hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1") AnimSetGearPosition(hero.gear, hero.x, hero.y) HogTurnLeft(hero.gear, true) - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default", "cm_galaxy") 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, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "Statue", "Island", "Default", "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") @@ -117,18 +130,29 @@ if tonumber(GetCampaignVar("CosmosCheckPoint")) then checkPointReached = tonumber(GetCampaignVar("CosmosCheckPoint")) end + if checkPointReached == 4 then + -- Disable walking as long we're stuck on the moon + GameFlags = bor(GameFlags, gfArtillery) + end + -- Whether to start with an animation + local startSequence -- do checkpoint stuff needed before game starts if checkPointReached == 1 then -- Start of the game + startSequence = true elseif checkPointReached == 2 then -- Hero on the column, just took space ship unnoticed + startSequence = true AnimSetGearPosition(hero.gear, saucerX, saucerY) elseif checkPointReached == 3 then -- Hero near column, without space ship unnoticed + startSequence = true elseif checkPointReached == 4 then -- Hero visited moon for fuels + startSequence = true AnimSetGearPosition(hero.gear, 1110, 850) elseif checkPointReached == 5 then + startSequence = false -- Hero has visited a planet, he has plenty of fuels and can change planet if GetCampaignVar("Planet") == "moon" then AnimSetGearPosition(hero.gear, 1110, 850) @@ -144,8 +168,13 @@ AnimSetGearPosition(hero.gear, 3080, 850) end end + AnimInit(startSequence) - AnimInit() + -- Reset checkpoint of other missions when entering this mission. + -- The player has left the planet, so we count that “abandoning” any incomplete missions. + -- This also allows the player (indirectly) to reset the checkpointed missions. + abandonedPlanetMission = resetCheckpoint() + AnimationSetup() end @@ -154,19 +183,26 @@ AnimWait(hero.gear, 3000) FollowGear(hero.gear) - ShowMission(loc("Spacetrip"), loc("Getting ready"), loc("Help Hog Solo to find all the parts of the anti-gravity device.").. - "|"..loc("Travel to all the neighbor planets and collect all the pieces"), -amSkip, 0) + if GetCampaignVar("Won") == "true" then + if GetCampaignVar("Mission1Won") == "true" then + ShowMission(unpack(goals["free"])) + else + ShowMission(unpack(goals["open_side_missions"])) + end + else + ShowMission(unpack(goals["init"])) + end -- do checkpoint stuff needed after game starts if checkPointReached == 1 then AddAnim(dialog01) AddAmmo(hero.gear, amRope, 1) - AddAmmo(guard1.gear, amDEagle, 2) - AddAmmo(guard2.gear, amDEagle, 2) - SpawnAmmoCrate(saucerX, saucerY, amJetpack) + AddAmmo(guard1.gear, amDEagle, 100) + AddAmmo(guard2.gear, amDEagle, 100) + SpawnUtilityCrate(saucerX, saucerY, amJetpack) -- EVENT HANDLERS AddEvent(onHeroBeforeTreePosition, {hero.gear}, heroBeforeTreePosition, {hero.gear}, 0) - AddEvent(onHeroAtSaucerPosition, {hero.gear}, heroAtSaucerPosition, {hero.gear}, 0) + AddEvent(onHeroAcquiredSaucer, {hero.gear}, heroAcquiredSaucer, {hero.gear}, 1) AddEvent(onHeroOutOfGuardSight, {hero.gear}, heroOutOfGuardSight, {hero.gear}, 0) elseif checkPointReached == 2 then AddAmmo(hero.gear, amJetpack, 1) @@ -178,7 +214,7 @@ AddAnim(dialog05) elseif checkPointReached == 5 then -- Hero has visited a planet, he has plenty of fuels and can change planet - AddAmmo(hero.gear, amJetpack, 99) + AddAmmo(hero.gear, amJetpack, 100) end AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) @@ -240,14 +276,43 @@ SetAmmo(amJetpack, 0, 0, 0, 1) end +local abandonCheck = false + function onNewTurn() - if CurrentHedgehog == director.gear or CurrentHedgehog == doctor.gear then - TurnTimeLeft = 0 + if ropedToMoon == 1 then + AnimSetInputMask(0) + sendStatsOnRopedToMoon() + return + end + if saucerAcquired then + -- The only way for the player to have a saucer at turn start is by having used the rope + -- before; there's no other way to get it. We can therefore conclude the rope has been + -- used. + ropeDestroyed = true end - if guard1.keepTurning then - AnimSwitchHog(hero.gear) - TurnTimeLeft = -1 + if not abandonCheck and checkPointReached == 5 then + if abandonedPlanetMission then + HogSay(hero.gear, loc("I just forgot all checkpoints of incomplete missions."), SAY_THINK) + end + abandonCheck = true end + + if CurrentHedgehog == hero.gear then + -- Hero just got spotted by guards + if getReadyForRumble then + EndTurn(true) + getReadyForRumble = false + else + if guard1.keepTurning then + TurnTimeLeft = -1 + end + end + elseif CurrentHedgehog == director.gear or CurrentHedgehog == doctor.gear then + EndTurn(true) + elseif (CurrentHedgehog == guard1.gear or CurrentHedgehog == guard2.gear) and guard1.keepTurning then + EndTurn(true) + end + end -------------- EVENTS ------------------ @@ -259,14 +324,18 @@ return false end -function onHeroAtSaucerPosition(gear) - if GetHealth(hero.gear) and GetX(gear) >= saucerX-25 and GetX(gear) <= saucerX+32 and GetY(gear) >= saucerY-32 and GetY(gear) <= saucerY+32 then - saucerAcquired = true +function onGearAdd(gear) + if GetGearType(gear) == gtJetpack then + saucerGear = gear end - if saucerAcquired and GetHealth(hero.gear) and StoppedGear(gear) then - return true +end + +function onGearDelete(gear) + if GetGearType(gear) == gtCase and band(GetGearMessage(gear), gmDestroy) ~= 0 then + saucerAcquired = true + elseif GetGearType(gear) == gtJetpack then + saucerGear = nil end - return false end function onHeroOutOfGuardSight(gear) @@ -320,7 +389,7 @@ function onNoFuelAtLand(gear) if checkPointReached > 1 and GetHealth(hero.gear) and GetY(gear) > 1400 and - GetAmmoCount(gear, amJetpack) == 0 and StoppedGear(gear) then + GetAmmoCount(gear, amJetpack) == 0 and saucerGear == nil and StoppedGear(gear) then return true end return false @@ -336,44 +405,68 @@ -------------- ACTIONS ------------------ function heroBeforeTreePosition(gear) - AnimSay(gear,loc("Now I have to climb these trees"), SAY_SAY, 4000) - AnimCaption(hero.gear, loc("Use the rope to get to the crate"), 4000) + if band(GetState(gear), gstHHDriven) ~= 0 then + AnimSay(gear,loc("Now I have to climb these trees"), SAY_SAY, 4000) + AnimCaption(hero.gear, loc("Use the rope to get to the crate"), 4000) + end end -function heroAtSaucerPosition(gear) - TurnTimeLeft = 0 - -- save check point - SaveCampaignVar("CosmosCheckPoint", "2") - checkPointReached = 2 - AddAnim(dialog02) - -- check if he was spotted by the guard - if guard1.turn and GetX(hero.gear) > saucerX-150 then - guard1.keepTurning = false - AddAnim(dialog03) +function prepareDialog02(gear) + if StoppedGear(gear) and guard1.keepTurning and checkPointReached < 2 then + SetGearMessage(gear, band(GetGearMessage(gear), bnot(gmLeft+gmRight+gmUp+gmDown+gmPrecise))) + EndTurn(true) + -- save check point + SaveCampaignVar("CosmosCheckPoint", "2") + checkPointReached = 2 + AddAnim(dialog02) + + RemoveEventFunc(onHeroAcquiredSaucer) end end +function heroAcquiredSaucer(gear) + -- check if he was spotted by the guard + if guard1.turn and guard1.keepTurning and GetX(gear) > saucerX-150 then + guard1.keepTurning = false + SetGearMessage(gear, band(GetGearMessage(gear), bnot(gmLeft+gmRight+gmUp+gmDown+gmPrecise))) + local _, dy = GetGearVelocity(gear) + SetGearVelocity(gear, 0, dy) + AddAnim(dialog03) + end + + prepareDialog02(gear) +end + +function onHeroAcquiredSaucer(gear) + return saucerAcquired +end + function heroOutOfGuardSight(gear) + SetGearMessage(gear, 0) guard1.keepTurning = true AddAnim(dialog04) + + if onHeroAcquiredSaucer(gear) then + prepareDialog02(gear) + end end function moonLanding(gear) - if checkPointReached == 1 then - -- player climbed the moon with rope - FollowGear(doctor.gear) - AnimSay(doctor.gear, loc("One does not simply rope to the moon!"), SAY_SHOUT, 4000) - SendStat(siGameResult, loc("This is the wrong way!")) - SendStat(siCustomAchievement, loc("Collect the crate with the flying saucer!")) - SendStat(siCustomAchievement, loc("Fly to the moon.")) - SendStat(siPlayerKills,'0',teamC.name) - EndGame() + if checkPointReached == 1 and not ropeDestroyed then + -- Player climbed the moon with rope. + -- THIS IS A CRIMINAL OFFENSE AND WILL BE PUNISHED! + ropedToMoon = 1 + SetGearVelocity(gear, 0, 0) + SetGearMessage(gear, 0) + AnimSetInputMask(0) + AddAnim(dialog09) else if checkPointReached ~= 5 then SaveCampaignVar("CosmosCheckPoint", "4") SaveCampaignVar("HeroHealth",GetHealth(hero.gear)) end AnimCaption(hero.gear,loc("Welcome to the moon!")) + TurnTimeLeft = -1 SaveCampaignVar("HeroHealth", GetHealth(hero.gear)) SaveCampaignVar("Planet", "moon") SaveCampaignVar("UnlockedMissions", "3") @@ -384,16 +477,27 @@ end end +function punishHeroForRopingToMoon(gear) + -- Initiate the secret PAotH anti-rope defense system (5 bazookas dropped from sky) + AddGear(GetX(gear), 100, gtShell, 0, 0, 0, 0) + AddGear(GetX(gear), 0, gtShell, 0, 0, 0, 0) + AddGear(GetX(gear), -100, gtShell, 0, 0, 0, 0) + AddGear(GetX(gear), -200, gtShell, 0, 0, 0, 0) + AddGear(GetX(gear), -300, gtShell, 0, 0, 0, 0) + FollowGear(hero.gear) + AnimSetInputMask(0) +end + function fruitPlanetLanding(gear) if checkPointReached < 5 then AddAnim(dialog06) else AnimCaption(hero.gear,loc("Welcome to the Fruit Planet!")) SaveCampaignVar("Planet", "fruitPlanet") - if status.fruit02 then + if status.fruit01 then SaveCampaignVar("UnlockedMissions", "4") - SaveCampaignVar("Mission1", "3") - SaveCampaignVar("Mission2", "8") + SaveCampaignVar("Mission1", "8") + SaveCampaignVar("Mission2", "3") SaveCampaignVar("Mission3", "10") SaveCampaignVar("Mission4", "1") else @@ -472,34 +576,48 @@ end function heroDeath(gear) - sendStatsOnRetry() + if ropedToMoon == 1 then + sendStatsOnRopedToMoon() + elseif ropedToMoon == 0 then + sendStatsOnRetry() + end end function setFoundDeviceVisual() --WriteLnToConsole("status: "..status.fruit01.." - "..status.fruit02) if status.moon01 then vgear = AddVisualGear(1116, 848, vgtBeeTrace, 0, false) - + if status.moon02 then + vgear = AddVisualGear(1116, 828, vgtBeeTrace, 0, false) + end end if status.ice01 then vgear = AddVisualGear(1512, 120, vgtBeeTrace, 0, false) - + if status.ice02 then + vgear = AddVisualGear(1512, 100, vgtBeeTrace, 0, false) + end end if status.desert01 then vgear = AddVisualGear(4015, 316, vgtBeeTrace, 0, false) - + if status.desert02 and status.desert03 then + vgear = AddVisualGear(4015, 296, vgtBeeTrace, 0, false) + end end if status.fruit01 and status.fruit02 then vgear = AddVisualGear(2390, 384, vgtBeeTrace, 0, false) - + if status.fruit03 then + vgear = AddVisualGear(2390, 364, vgtBeeTrace, 0, false) + end end if status.death01 then vgear = AddVisualGear(444, 400, vgtBeeTrace, 0, false) - + if status.death02 then + vgear = AddVisualGear(444, 380, vgtBeeTrace, 0, false) + end end if status.final then vgear = AddVisualGear(3070, 810, vgtBeeTrace, 0, false) - + vgear = AddVisualGear(3070, 790, vgtBeeTrace, 0, false) end end @@ -508,13 +626,20 @@ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end - if CurrentHedgehog ~= hero.gear and anim ~= dialog03 then + end + if anim == dialog09 then + AnimSetInputMask(0) + -- Quick punishment for the impatient + AddGear(GetX(hero.gear)-1, GetY(hero.gear)+1, gtDynamite, 0, 0, 0, 1) + sendStatsOnRopedToMoon() + elseif anim == dialog05 then + sendStatsOnStuckOnMoon() + elseif anim == dialog06 then + sendStatsOnRetry() + elseif CurrentHedgehog ~= hero.gear and anim ~= dialog03 then AnimSwitchHog(hero.gear) elseif anim == dialog03 then startCombat() - elseif anim == dialog05 or anim == dialog06 then - sendStatsOnRetry() end end @@ -535,6 +660,7 @@ table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("It would be wiser to steal the space ship while the PAotH guards are taking a brake!"), SAY_SAY, 7000}}) table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Remember! Many will seek the anti-gravity device! Now go, hurry up!"), SAY_SAY, 4000}}) table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}}) + table.insert(dialog01, {func = ShowMission, args = goals[dialog01]}) -- DIALOG 02 - Hero got the saucer AddSkipFunction(dialog02, Skipanim, {dialog02}) table.insert(dialog02, {func = AnimWait, args = {hero.gear, 500}}) @@ -542,14 +668,15 @@ table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("Got the saucer!"), SAY_SHOUT, 2000}}) table.insert(dialog02, {func = AnimSay, args = {director.gear, loc("Nice!"), SAY_SHOUT, 1000}}) table.insert(dialog02, {func = AnimSay, args = {director.gear, loc("Now use it and go to the moon PAotH station to get more fuel!"), SAY_SHOUT, 5000}}) - table.insert(dialog02, {func = AnimGearWait, args = {hero.gear, 500}}) - -- DIALOG 03 - Hero got spotted by guard + table.insert(dialog02, {func = AnimGearWait, args = {hero.gear, 500}}) + table.insert(dialog02, {func = ShowMission, args = goals[dialog02]}) + -- DIALOG 03 - Hero got spotted by guard AddSkipFunction(dialog03, Skipanim, {dialog03}) - table.insert(dialog03, {func = AnimWait, args = {guard1.gear, 4000}}) - table.insert(dialog03, {func = AnimCaption, args = {guard1.gear, loc("Prepare to flee!"), 4000}}) table.insert(dialog03, {func = AnimSay, args = {guard1.gear, string.format(loc("Hey, %s! Look, someone is stealing the saucer!"), guard2.name), SAY_SHOUT, 4000}}) table.insert(dialog03, {func = AnimSay, args = {guard2.gear, loc("I'll get him!"), SAY_SAY, 4000}}) + table.insert(dialog03, {func = AnimCaption, args = {guard1.gear, loc("Prepare to flee!"), 1000}}) table.insert(dialog03, {func = startCombat, args = {guard1.gear}}) + table.insert(dialog03, {func = ShowMission, args = goals[dialog03]}) -- DIALOG 04 - Hero out of sight AddSkipFunction(dialog04, Skipanim, {dialog04}) table.insert(dialog04, {func = AnimCaption, args = {guard1.gear, loc("You are out of danger, time to go to the moon!"), 4000}}) @@ -559,12 +686,16 @@ -- DIALOG 05 - Hero returned from moon without fuels AddSkipFunction(dialog05, Skipanim, {dialog05}) table.insert(dialog05, {func = AnimSay, args = {hero.gear, loc("I guess I can't go far without fuel!"), SAY_THINK, 6000}}) + if abandonedPlanetMission then + -- Hog solo is mad he has to play the moon main mission from start. Very sarcastic tone. ;-) + table.insert(dialog05, {func = AnimSay, args = {hero.gear, loc("And I just forgot the checkpoint of my main mission. Great, just great!"), SAY_THINK, 7000}}) + end table.insert(dialog05, {func = AnimSay, args = {hero.gear, loc("Got to go back."), SAY_THINK, 2000}}) - table.insert(dialog05, {func = sendStatsOnRetry, args = {hero.gear}}) + table.insert(dialog05, {func = sendStatsOnStuckOnMoon, args = {hero.gear}}) -- DIALOG 06 - Landing on wrong planet or on earth if not enough fuels AddSkipFunction(dialog06, Skipanim, {dialog06}) - table.insert(dialog06, {func = AnimCaption, args = {hero.gear, loc("You have to try again!"), 5000}}) table.insert(dialog06, {func = AnimSay, args = {hero.gear, loc("Hm ... Now I ran out of fuel."), SAY_THINK, 3000}}) + table.insert(dialog06, {func = AnimCaption, args = {hero.gear, loc("You have to try again!"), 0}}) table.insert(dialog06, {func = sendStatsOnRetry, args = {hero.gear}}) -- DIALOG 07 - Hero lands on Death Planet but isn't allowed yet to play this map AddSkipFunction(dialog07, Skipanim, {dialog07}) @@ -580,14 +711,21 @@ table.insert(dialog08, {func = AnimSay, args = {doctor.gear, loc("We need you to go there and detonate them yourself! Good luck!"), SAY_SHOUT, 500}}) table.insert(dialog08, {func = AnimWait, args = {doctor.gear, 3000}}) table.insert(dialog08, {func = AnimSwitchHog, args = {hero.gear}}) + table.insert(dialog08, {func = ShowMission, args = goals[dialog08]}) + -- DIALOG 09 - Hero roped to the moon (how naughty!) + AddSkipFunction(dialog09, Skipanim, {dialog09}) + table.insert(dialog09, {func = AnimSay, args = {doctor.gear, loc("One does not simply rope to the moon!"), SAY_SHOUT, 4500}}) + table.insert(dialog09, {func = punishHeroForRopingToMoon, args = {hero.gear}}) + table.insert(dialog09, {func = AnimWait, args = {hero.gear, 5000}}) + table.insert(dialog09, {func = sendStatsOnRopedToMoon, args = {hero.gear}}) end ------------------- custom "animation" functions -------------------------- function startCombat() - -- use this so guard2 will gain control - AnimSwitchHog(hero.gear) - TurnTimeLeft = 0 + -- Use this so guard2 gains control + EndTurn(true) + getReadyForRumble = true end function sendStats(planetMsg) @@ -595,15 +733,36 @@ SendStat(siCustomAchievement, loc("Return to the mission menu by pressing the \"Go back\" button.")) SendStat(siCustomAchievement, loc("You can choose another planet by replaying this mission.")) SendStat(siCustomAchievement, loc("Planets with completed main missions will be marked with a flower.")) - SendStat(siPlayerKills,'1',teamC.name) + SendStat(siCustomAchievement, loc("Planets with all missions completed will be marked with two flowers.")) + 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.")) + 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.")) - SendStat(siCustomAchievement, loc("You have to be careful and must not die!")) - SendStat(siPlayerKills,'0',teamC.name) + sendSimpleTeamRankings({teamC.name}) EndGame() end + +function sendStatsOnRopedToMoon() + if ropedToMoon ~= 2 then + ropedToMoon = 2 + 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 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death01.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death01.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death01.lua Sun Dec 17 00:09:24 2017 +0100 @@ -16,7 +16,7 @@ local dialog01 = {} -- missions objectives local goals = { - [dialog01] = {missionName, loc("The final part"), loc("Defeat Professor Hogevil!"), 1, 4500}, + [dialog01] = {missionName, loc("The final part"), loc("Defeat Professor Hogevil!") .. "|" .. loc("Mines time: 1.5 seconds"), 1, 4500}, } -- crates local teleportCrate = {x = 1935, y = 1830} @@ -79,11 +79,12 @@ thug7.y = 1960 thug7.health = 80 teamA.name = loc("Hog Solo") -teamA.color = tonumber("38D61C",16) -- green +teamA.color = 0x38D61C -- green teamB.name = loc("PAotH") -teamB.color = tonumber("0033FF",16) -- blue because otherwise enemies attack them +-- FIXME: PAotH should share color with Hog Solo +teamB.color = 0x0072FF -- blue because otherwise enemies attack them teamC.name = loc("Professor") -teamC.color = tonumber("0033FF",16) -- blue +teamC.color = 0x0072FF -- blue -------------- LuaAPI EVENT HANDLERS ------------------ @@ -96,16 +97,18 @@ Explosives = 2 Delay = 3 HealthCaseAmount = 50 - SuddenDeathTurns = 100 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 Map = "death01_map" Theme = "Hell" -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + 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) -- PAotH - AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "Earth", "Island", "Default", "cm_galaxy") paoth1.gear = AddHog(paoth1.name, 0, 100, "hair_yellow") AnimSetGearPosition(paoth1.gear, paoth1.x, paoth1.y) HogTurnLeft(paoth1.gear, true) @@ -113,11 +116,11 @@ AnimSetGearPosition(paoth2.gear, paoth2.x, paoth2.y) HogTurnLeft(paoth2.gear, true) -- Professor and Thugs - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamC.name, teamC.color, "star", "Island", "Default", "cm_sine") professor.human = AddHog(professor.name, 0, 300, "tophats") AnimSetGearPosition(professor.human, hero.x + 70, hero.y) HogTurnLeft(professor.human, true) - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamC.name, teamC.color, "eyecross", "Island", "Default", "cm_sine") professor.bot = AddHog(professor.name, 1, 300, "tophats") AnimSetGearPosition(professor.bot, paoth1.x - 100, paoth1.y) HogTurnLeft(professor.bot, true) @@ -130,7 +133,7 @@ initCheckpoint("death01") - AnimInit() + AnimInit(true) AnimationSetup() end @@ -142,13 +145,13 @@ AddEvent(onEnemiesDeath, {hero.gear}, enemiesDeath, {hero.gear}, 0) -- add crates - SpawnAmmoCrate(teleportCrate.x, teleportCrate.y, amTeleport) - SpawnAmmoCrate(drillCrate.x, drillCrate.y, amTeleport) + SpawnUtilityCrate(teleportCrate.x, teleportCrate.y, amTeleport) + SpawnUtilityCrate(drillCrate.x, drillCrate.y, amTeleport) SpawnAmmoCrate(drillCrate.x, drillCrate.y, amDrill) SpawnAmmoCrate(batCrate.x, batCrate.y, amBaseballBat) SpawnAmmoCrate(blowtorchCrate.x, blowtorchCrate.y, amBlowTorch) SpawnAmmoCrate(cakeCrate.x, cakeCrate.y, amCake) - SpawnAmmoCrate(ropeCrate.x, ropeCrate.y, amRope) + SpawnUtilityCrate(ropeCrate.x, ropeCrate.y, amRope) SpawnAmmoCrate(pickHammerCrate.x, pickHammerCrate.y, amPickHammer) SpawnHealthCrate(cakeCrate.x + 40, cakeCrate.y) SpawnHealthCrate(blowtorchCrate.x + 40, blowtorchCrate.y) @@ -200,7 +203,7 @@ function onNewTurn() if CurrentHedgehog == paoth1.gear or CurrentHedgehog == paoth2.gear then AnimSwitchHog(hero.gear) - TurnTimeLeft = 0 + EndTurn(true) end end @@ -266,8 +269,7 @@ 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(siPlayerKills,'1',teamC.name) - SendStat(siPlayerKills,'0',teamA.name) + sendSimpleTeamRankings({teamC.name, teamA.name}) EndGame() end @@ -278,42 +280,48 @@ SendStat(siCustomAchievement, loc("You have rescued H and Dr. Cornelius.")) SendStat(siCustomAchievement, loc("You have acquired the last device part.")) SendStat(siCustomAchievement, loc("Now go and play the menu mission to complete the campaign.")) - SendStat(siPlayerKills,'1',teamA.name) - SendStat(siPlayerKills,'0',teamC.name) + sendSimpleTeamRankings({teamA.name, teamC.name}) EndGame() end -------------- ANIMATIONS ------------------ function Skipanim(anim) - if goals[anim] ~= nil then - ShowMission(unpack(goals[anim])) - end - startBattle() + startBattle() end function AnimationSetup() + local profDiedOnMoon = GetCampaignVar("ProfDiedOnMoon") == "1" -- DIALOG01, GAME START, INTRODUCTION 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, loc("As you can see I have survived our last encounter and I had time to plot my master plan!"), 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 + table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("As you can see I have survived our last encounter and I had time to plot my master plan!"), SAY_SAY, 4000}}) + end table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("I've thought that the best way to get the device is to let you collect most of the parts for me!"), SAY_SAY, 4000}}) table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("So, now I got the last part and I have your friends captured."), SAY_SAY, 4000}}) table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("Will you give me the other parts?"), SAY_SAY, 4000}}) table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}}) table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("I will never hand you the parts!"), SAY_SAY, 4000}}) table.insert(dialog01, {func = AnimWait, args = {professor.human, 3000}}) - table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("Then prepare for battle!"), SAY_SAY, 4000}}) + if profDiedOnMoon then + table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("Then prepare for battle!"), SAY_SHOUT, 4000}}) + else + table.insert(dialog01, {func = AnimSay, args = {professor.human, loc("Then prepare for battle!"), SAY_SAY, 4000}}) + end table.insert(dialog01, {func = startBattle, args = {}}) end -------------- OTHER FUNCTIONS ----------------- function startBattle() + ShowMission(unpack(goals[dialog01])) DeleteGear(professor.human) RestoreHog(professor.bot) AnimSwitchHog(professor.gear) - TurnTimeLeft = 0 + EndTurn(true) end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death02.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death02.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/death02.lua Sun Dec 17 00:09:24 2017 +0100 @@ -16,13 +16,11 @@ loc("A random hedgehog will inherit the weapons of his deceased team-mates.").."|".. loc("If you kill a hedgehog with the respective weapon your health points will be set to 100.").."|".. loc("If you injure a hedgehog you'll get 35% of the damage dealt.").."|".. - loc("Every time you kill an enemy hog your ammo will get reset.").."|".. + loc("Every time you kill an enemy hog your ammo will get reset next turn.").."|".. loc("The rope won't get reset.") --- dialogs -local dialog01 = {} -- mission objectives local goals = { - [dialog01] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 4500}, + ["init"] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 35000}, } -- hogs local hero = { @@ -36,11 +34,11 @@ grenadeAmmo = 4, } local enemies = { - { name = loc("Mortar"), x = 1890, y = 520, weapon = amMortar, additionalWeapons = {}}, - { name = loc("Desert Eagle"), x = 1390, y = 790, weapon = amDEagle, additionalWeapons = {}}, - { name = loc("Grenade"), x = 186, y = 48, weapon = amGrenade, additionalWeapons = {}}, - { name = loc("Shoryuken"), x = 330, y = 270, weapon = amFirePunch, additionalWeapons = {}}, - { name = loc("Bazooka"), x = 1950, y = 150, weapon = amBazooka, additionalWeapons = {}}, + { 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 = {}}, } -- teams local teamA = { @@ -51,6 +49,10 @@ name = loc("5 Deadly Hogs"), color = tonumber("FF0000",16) -- red } +-- After hero killed an enemy, his weapons will be reset in the next round +local heroWeaponResetPending = false +local battleStarted = false +local firstTurn = true -------------- LuaAPI EVENT HANDLERS ------------------ @@ -63,14 +65,17 @@ Explosives = 0 Map = "death02_map" Theme = "Hell" + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + 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) -- enemies shuffleHogs(enemies) - AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "skull", "Island", "Default", "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) @@ -79,13 +84,12 @@ initCheckpoint("death02") AnimInit() - AnimationSetup() end function onGameStart() AnimWait(hero.gear, 3000) FollowGear(hero.gear) - ShowMission(missionName, loc("Challenge Objectives"), challengeObjectives, -amSkip, 0) + ShowMission(unpack(goals["init"])) AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) AddEvent(onHeroWin, {hero.gear}, heroWin, {hero.gear}, 0) @@ -96,12 +100,19 @@ refreshHeroAmmo() SendHealthStatsOff() - AddAnim(dialog01) end function onNewTurn() + battleStarted = true + if firstTurn then + -- Generous ready time in first turn to more time to read the mission panel + ReadyTimeLeft = 35000 + firstTurn = false + end if CurrentHedgehog ~= hero.gear then enemyWeapons() + elseif heroWeaponResetPending then + refreshHeroAmmo() end end @@ -128,7 +139,7 @@ for i=1,table.getn(deadHog.additionalWeapons) do table.insert(enemies[randomHog].additionalWeapons, deadHog.additionalWeapons[i]) end - refreshHeroAmmo() + heroWeaponResetPending = true end end @@ -147,12 +158,18 @@ CheckEvents() end -function onPrecise() - if GameTime > 3000 then - SetAnimSkip(true) +-- Hide mission panel when player does anything +function hideMissionOnAction() + if battleStarted then + HideMission() end end +onHogAttack = hideMissionOnAction +onAttack = hideMissionOnAction +onSlot = hideMissionOnAction +onSetWeapon = hideMissionOnAction + -------------- EVENTS ------------------ function onHeroDeath(gear) @@ -179,8 +196,7 @@ SendStat(siGameResult, loc("Hog Solo lost, try again!")) SendStat(siCustomAchievement, loc("You have to eliminate all the enemies.")) SendStat(siCustomAchievement, loc("Read the challenge objectives from within the mission for more details.")) - SendStat(siPlayerKills,'1',teamB.name) - SendStat(siPlayerKills,'0',teamA.name) + sendSimpleTeamRankings({teamB.name, teamA.name}) EndGame() end @@ -188,44 +204,25 @@ saveBonus(3, 4) SendStat(siGameResult, loc("Congratulations, you won!")) SendStat(siCustomAchievement, string.format(loc("You completed the mission in %d rounds."), TotalRounds)) + local record = tonumber(GetCampaignVar("FastestSpecialistsKill")) + if record ~= nil and TotalRounds >= record then + SendStat(siCustomAchievement, string.format(loc("Your fastest victory so far: %d rounds"), record)) + end + if record == nil or TotalRounds < record then + SaveCampaignVar("FastestSpecialistsKill", tostring(TotalRounds)) + if record ~= nil then + SendStat(siCustomAchievement, loc("This is a new personal best, congratulations!")) + end + end SendStat(siCustomAchievement, loc("The next 4 times you play the \"The last encounter\" mission you'll get 20 more hit points and a laser sight.")) - SendStat(siPlayerKills,'1',teamA.name) + sendSimpleTeamRankings({teamA.name, teamB.name}) + SaveCampaignVar("Mission11Won", "true") + checkAllMissionsCompleted() EndGame() end --------------- ANIMATIONS ------------------ - -function Skipanim(anim) - if goals[anim] ~= nil then - ShowMission(unpack(goals[anim])) - end - startBattle() -end - -function AnimationSetup() - -- DIALOG 01 - Start, game instructions - 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 Planet of Death ..."), 3000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("... Hog Solo fights for his life"), 3000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Each time you play this missions enemy hogs will play in a random order"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("At the start of the game each enemy hog has only the weapon that he is named after"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("A random hedgehog will inherit the weapons of his deceased team-mates"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("If you kill a hedgehog with the respective weapon your health points will be set to 100"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("If you injure a hedgehog you'll get 35% of the damage dealt"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Every time you kill an enemy hog your ammo will get reset"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Rope won't get reset"), 2000}}) - table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}}) - table.insert(dialog01, {func = startBattle, args = {hero.gear}}) -end - ------------ Other Functions ------------------- -function startBattle() - AnimSwitchHog(hero.gear) - TurnTimeLeft = TurnTime -end - function shuffleHogs(hogs) local hogsNumber = table.getn(hogs) for i=1,hogsNumber do @@ -244,6 +241,7 @@ AddAmmo(hero.gear, amDEagle, hero.deagleAmmo + extraAmmo) AddAmmo(hero.gear, amBazooka, hero.bazookaAmmo + extraAmmo) AddAmmo(hero.gear, amGrenade, hero.grenadeAmmo + extraAmmo) + heroWeaponResetPending = false end function enemyWeapons() diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert01.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert01.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert01.lua Sun Dec 17 00:09:24 2017 +0100 @@ -20,13 +20,13 @@ local heroIsInBattle = false local ongoingBattle = 0 local cratesFound = 0 -local checkPointReached = 1 -- 1 is normal spawn +local ropeGear = nil -- dialogs local dialog01 = {} -- mission objectives local goals = { [dialog01] = {missionName, loc("Getting ready"), loc("The device part is hidden in one of the crates! Go and get it!").."|".. - loc("Most of the destructible terrain in marked with blue color"), 1, 4500}, + loc("Most of the destructible terrain in marked with blue color").."|"..loc("Mines time: 0 seconds"), 1, 6000}, } -- crates local btorch1Y = 60 @@ -46,8 +46,8 @@ local girderY = 1630 local girderX = 3350 -- win crates -local btorch2 = {} -local girder = {} +local btorch2 = { gear = nil, destroyed = false, deleted = false} +local girder = { gear = nil, destroyed = false, deleted = false} -- hogs local hero = {} local ally = {} @@ -76,11 +76,11 @@ smuggler3.x = 1940 smuggler3.y = 1625 teamA.name = loc("PAotH") -teamA.color = tonumber("FF0000",16) -- red +teamA.color = 0x38D61C -- green teamB.name = loc("Smugglers") -teamB.color = tonumber("0033FF",16) -- blues +teamB.color = 0xFE8B0E -- orange teamC.name = loc("Hog Solo") -teamC.color = tonumber("38D61C",16) -- green +teamC.color = 0x38D61C -- green -------------- LuaAPI EVENT HANDLERS ------------------ @@ -93,28 +93,26 @@ Explosives = 0 Delay = 3 HealthCaseAmount = 30 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 Map = "desert01_map" Theme = "Desert" - -- get the check point - checkPointReached = initCheckpoint("desert01") -- get hero health local heroHealth = 100 - if checkPointReached > 1 and tonumber(GetCampaignVar("HeroHealth")) then - heroHealth = tonumber(GetCampaignVar("HeroHealth")) - end -- Hog Solo - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamC.name, teamC.color, "Simple", "Island", "Default", "hedgewars") hero.gear = AddHog(hero.name, 0, heroHealth, "war_desertgrenadier1") AnimSetGearPosition(hero.gear, hero.x, hero.y) HogTurnLeft(hero.gear, true) -- PAotH undercover scientist and chief Sandologist - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default", "cm_galaxy") ally.gear = AddHog(ally.name, 0, 100, "Cowboy") AnimSetGearPosition(ally.gear, ally.x, ally.y) -- Smugglers - AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "chest", "Island", "Default", "cm_bloodyblade") smuggler1.gear = AddHog(smuggler1.name, 1, 100, "hair_orange") AnimSetGearPosition(smuggler1.gear, smuggler1.x, smuggler1.y) smuggler2.gear = AddHog(smuggler2.name, 1, 100, "lambda") @@ -122,33 +120,7 @@ smuggler3.gear = AddHog(smuggler3.name, 1, 100, "beefeater") AnimSetGearPosition(smuggler3.gear, smuggler3.x, smuggler3.y) - if checkPointReached == 1 then - -- Start of the game - elseif checkPointReached == 2 then - AnimSetGearPosition(hero.gear, 1050, 615) - HogTurnLeft(hero.gear, true) - elseif checkPointReached == 3 then - AnimSetGearPosition(hero.gear, 1680, 920) - HogTurnLeft(hero.gear, true) - elseif checkPointReached == 4 then - AnimSetGearPosition(hero.gear, 1160, 1180) - elseif checkPointReached == 5 then - local positions = GetCampaignVar("HogsPosition") - positions = split(positions,",") - local x - local y - if positions[1] then - x = positions[1] - y = positions[2] - else - -- this should *NEVER* happen, remove? - x = girderX+40 - y = girderY-30 - end - AnimSetGearPosition(hero.gear, x, y) - end - - AnimInit() + AnimInit(true) AnimationSetup() end @@ -158,7 +130,6 @@ AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) AddEvent(onHeroAtFirstBattle, {hero.gear}, heroAtFirstBattle, {hero.gear}, 1) - AddEvent(onHeroAtCheckpoint4, {hero.gear}, heroAtCheckpoint4, {hero.gear}, 0) AddEvent(onHeroAtThirdBattle, {hero.gear}, heroAtThirdBattle, {hero.gear}, 0) AddEvent(onCheckForWin1, {hero.gear}, checkForWin1, {hero.gear}, 0) AddEvent(onCheckForWin2, {hero.gear}, checkForWin2, {hero.gear}, 0) @@ -171,15 +142,16 @@ AddAmmo(smuggler3.gear, amRope, 2) -- spawn crates - SpawnAmmoCrate(btorch2X, btorch2Y, amBlowTorch) SpawnAmmoCrate(btorch3X, btorch3Y, amBlowTorch) - SpawnAmmoCrate(rope1X, rope1Y, amRope) - SpawnAmmoCrate(rope2X, rope2Y, amRope) - SpawnAmmoCrate(rope3X, rope3Y, amRope) - SpawnAmmoCrate(portalX, portalY, amPortalGun) - SpawnAmmoCrate(girderX, girderY, amGirder) + SpawnUtilityCrate(rope1X, rope1Y, amRope) + SpawnUtilityCrate(rope2X, rope2Y, amRope) + SpawnUtilityCrate(rope3X, rope3Y, amRope) + SpawnUtilityCrate(portalX, portalY, amPortalGun) + SpawnHealthCrate(3300, 970) - SpawnHealthCrate(3300, 970) + -- the win crates, collect both to win + btorch2.gear = SpawnAmmoCrate(btorch2X, btorch2Y, amBlowTorch) + girder.gear = SpawnUtilityCrate(girderX, girderY, amGirder) -- adding mines - BOOM! AddGear(1280, 460, gtMine, 0, 0, 0, 0) @@ -210,51 +182,52 @@ x = x + GetRandom(13)+8 end - if checkPointReached == 1 then - AddEvent(onHeroFleeFirstBattle, {hero.gear}, heroFleeFirstBattle, {hero.gear}, 1) - AddEvent(onHeroAtCheckpoint2, {hero.gear}, heroAtCheckpoint2, {hero.gear}, 0) - AddEvent(onHeroAtCheckpoint3, {hero.gear}, heroAtCheckpoint3, {hero.gear}, 0) - -- crates - SpawnAmmoCrate(btorch1X, btorch1Y, amBlowTorch) - SpawnHealthCrate(680, 460) - -- hero ammo - AddAmmo(hero.gear, amRope, 2) - AddAmmo(hero.gear, amBazooka, 3) - AddAmmo(hero.gear, amParachute, 1) - AddAmmo(hero.gear, amGrenade, 6) - AddAmmo(hero.gear, amDEagle, 4) - AddAmmo(hero.gear, amRCPlane, tonumber(getBonus(1))) + AddEvent(onHeroFleeFirstBattle, {hero.gear}, heroFleeFirstBattle, {hero.gear}, 1) + AddEvent(onHeroAtBattlePoint1, {hero.gear}, heroAtBattlePoint1, {hero.gear}, 0) + AddEvent(onHeroAtBattlePoint2, {hero.gear}, heroAtBattlePoint2, {hero.gear}, 0) + -- crates + SpawnAmmoCrate(btorch1X, btorch1Y, amBlowTorch) + SpawnHealthCrate(680, 460) + -- hero ammo + AddAmmo(hero.gear, amRope, 2) + AddAmmo(hero.gear, amBazooka, 3) + AddAmmo(hero.gear, amParachute, 1) + AddAmmo(hero.gear, amGrenade, 6) + AddAmmo(hero.gear, amDEagle, 4) + AddAmmo(hero.gear, amRCPlane, tonumber(getBonus(1))) + AddAmmo(hero.gear, amSkip, 0) - AddAnim(dialog01) - elseif checkPointReached == 2 or checkPointReached == 3 then - ShowMission(campaignName, missionName, loc("The device part is hidden in one of the crates! Go and get it!"), -amSkip, 0) - loadHeroAmmo() - - secondBattle() - elseif checkPointReached == 4 or checkPointReached == 5 then - ShowMission(campaignName, missionName, loc("The part device is hidden in one of the crates! Go and get it!"), -amSkip, 0) - loadHeroAmmo() - end + AddAnim(dialog01) SendHealthStatsOff() 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 - TurnTimeLeft = 0 + AnimSwitchHog(hero.gear) + getReady(hero.gear) + TurnTimeLeft = -1 elseif CurrentHedgehog == hero.gear and not heroIsInBattle then TurnTimeLeft = -1 elseif (CurrentHedgehog == smuggler2.gear or CurrentHedgehog == smuggler3.gear) and ongoingBattle == 1 then - AnimSwitchHog(hero.gear) - TurnTimeLeft = 0 + 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) - TurnTimeLeft = 0 - elseif (CurrentHedgehog == smuggler1.gear or CurrentHedgehog == smuggler2.gear) and ongoingBattle == 3 then - AnimSwitchHog(hero.gear) - TurnTimeLeft = 0 - elseif CurrentHedgehog == ally.gear then - TurnTimeLeft = 0 + getReady(hero.gear) end end @@ -272,40 +245,49 @@ SetAmmo(amRope, 0, 0, 0, 1) SetAmmo(amPortalGun, 0, 0, 0, 1) SetAmmo(amGirder, 0, 0, 0, 3) + SetAmmo(amSkip, 9, 0, 0, 1) end function onGearAdd(gear) - if GetGearType(gear) == gtCase then - if GetX(gear) == btorch2X and GetY(gear) == btorch2Y then - btorch2.gear = gear - btorch2.destroyed = false - btorch2.deleted = false - elseif GetX(gear) == girderX and GetY(gear) == girderY then - girder.gear = gear - girder.destroyed = false - girder.deleted = false - end - end -end - -function onGearDamage(gear, damage) - if gear == girder.gear then - girder.destroyed = true - elseif gear == btorch2.gear then - btorch2.destroyed = true + if GetGearType(gear) == gtRope then + ropeGear = gear end end function onGearDelete(gear) + if GetGearType(gear) == gtRope then + ropeGear = nil + end + local foundDeviceCrateCandidate = function(candidate_crate_table, other_crate_table) + candidate_crate_table.deleted = true + -- Evaluates to false if crate has been collected + if (band(GetGearMessage(candidate_crate_table.gear), gmDestroy) == 0) then + candidate_crate_table.destroyed = true + end + + if cratesFound == 0 then + -- First win crate collected: + -- Turn the other crate into a fake crate; this will “contain” the device. + SetGearPos(other_crate_table.gear, bor(GetGearPos(other_crate_table.gear), 0x8)) + elseif cratesFound == 1 then + -- Second win crate collected: + -- This crate contains the anti-gravity part! VICTORY! + PlaySound(sndShotgunReload) + -- It's displayed as if collecting a normal ammo/utility crate. :-) + AddCaption(loc("Anti-Gravity Device Part (+1)"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmoinfo) + end + end + if gear == girder.gear then - girder.deleted = true + foundDeviceCrateCandidate(girder, btorch2) elseif gear == btorch2.gear then - btorch2.deleted = true + foundDeviceCrateCandidate(btorch2, girder) 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 end end @@ -327,7 +309,9 @@ function onHeroAtFirstBattle(gear) if not hero.dead and not heroIsInBattle and GetHealth(smuggler1.gear) and GetX(hero.gear) <= 1450 and GetX(hero.gear) > 80 - and GetY(hero.gear) <= GetY(smuggler1.gear)+5 and GetY(hero.gear) >= GetY(smuggler1.gear)-40 and StoppedGear(hero.gear) then + 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 return true end return false @@ -343,25 +327,19 @@ end -- saves the location of the hero and prompts him for the second battle -function onHeroAtCheckpoint2(gear) +function onHeroAtBattlePoint1(gear) if not hero.dead and GetX(hero.gear) > 1000 and GetX(hero.gear) < 1100 - and GetY(hero.gear) > 590 and GetY(hero.gear) < 700 and StoppedGear(hero.gear) then + 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 end return false end -function onHeroAtCheckpoint3(gear) +function onHeroAtBattlePoint2(gear) if not hero.dead and GetX(hero.gear) > 1610 and GetX(hero.gear) < 1680 - and GetY(hero.gear) > 850 and GetY(hero.gear) < 1000 and StoppedGear(hero.gear) then - return true - end - return false -end - -function onHeroAtCheckpoint4(gear) - if not hero.dead and GetX(hero.gear) > 1110 and GetX(hero.gear) < 1300 - and GetY(hero.gear) > 1100 and GetY(hero.gear) < 1220 then + and GetY(hero.gear) > 850 and GetY(hero.gear) < 1000 + and (StoppedGear(hero.gear) or GetGearElasticity(hero.gear) ~= 0) then return true end return false @@ -404,44 +382,56 @@ function heroAtFirstBattle(gear) AnimCaption(hero.gear, loc("A smuggler! Prepare for battle"), 5000) - TurnTimeLeft = 0 + -- 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 + EndTurn(true) heroIsInBattle = true + AddAmmo(hero.gear, amSkip, 100) ongoingBattle = 1 AnimSwitchHog(smuggler1.gear) - TurnTimeLeft = 0 + EndTurn(true) + SetGearVelocity(hero.gear, dx, dy) end function heroFleeFirstBattle(gear) AnimSay(smuggler1.gear, loc("Run away, you coward!"), SAY_SHOUT, 4000) - TurnTimeLeft = 0 + EndTurn(true) heroIsInBattle = false + AddAmmo(hero.gear, amSkip, 0) ongoingBattle = 0 end -function heroAtCheckpoint2(gear) - if GetAmmoCount(hero.gear, amRope) > 0 or GetAmmoCount(hero.gear, amParachute) > 0 then - saveCheckPointLocal("2") - end +function heroAtBattlePoint1(gear) secondBattle() end -function heroAtCheckpoint3(gear) - if GetAmmoCount(hero.gear, amRope) > 0 then - saveCheckPointLocal("3") - end +function heroAtBattlePoint2(gear) secondBattle() end -function heroAtCheckpoint4(gear) - saveCheckPointLocal("4") -end - function heroAtThirdBattle(gear) heroIsInBattle = true + AddAmmo(hero.gear, amSkip, 100) 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) + end AnimSwitchHog(smuggler3.gear) - TurnTimeLeft = 0 + EndTurn(true) + SetGearVelocity(hero.gear, dx, dy) end function crateDestroyed(gear) @@ -454,12 +444,6 @@ end function checkForWin2(gear) - -- ok lets place one more checkpoint as next part seems challenging without rope - if cratesFound == 0 then - saveCheckPointLocal("5") - SaveCampaignVar("HogsPosition", GetX(hero.gear)..","..GetY(hero.gear)) - end - checkForWin() end @@ -468,8 +452,8 @@ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end - AnimSwitchHog(hero.gear) + end + AnimSwitchHog(hero.gear) if anim == dialog01 then startMission() end @@ -497,14 +481,22 @@ table.insert(dialog01, {func = AnimSay, args = {ally.gear, loc("The tunnel entrance is over there."), SAY_SAY, 3000}}) table.insert(dialog01, {func = AnimSay, args = {ally.gear, loc("Good luck!"), SAY_SAY, 3000}}) table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}}) + table.insert(dialog01, {func = ShowMission, args = goals[dialog01]}) table.insert(dialog01, {func = startMission, args = {hero.gear}}) end --------------- OTHER FUNCTIONS ------------------ +function isOnRope() + if ropeGear then + return true + end + return false +end + function startMission() AnimSwitchHog(ally.gear) - TurnTimeLeft = 0 + EndTurn(true) end function secondBattle() @@ -512,40 +504,21 @@ if heroIsInBattle and ongoingBattle == 1 then AnimSay(smuggler1.gear, loc("Get him, Spike!"), SAY_SHOUT, 4000) 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) + end heroIsInBattle = true + AddAmmo(hero.gear, amSkip, 100) ongoingBattle = 2 AnimSay(smuggler2.gear, loc("This is seems like a wealthy hedgehog, nice ..."), SAY_THINK, 5000) AnimSwitchHog(smuggler2.gear) - TurnTimeLeft = 0 -end - -function saveCheckPointLocal(cpoint) - -- save checkpoint - saveCheckpoint(cpoint) - SaveCampaignVar("HeroHealth", GetHealth(hero.gear)) - -- bazooka - grenade - rope - parachute - deagle - btorch - construct - portal - rcplane - SaveCampaignVar("HeroAmmo", GetAmmoCount(hero.gear, amBazooka)..GetAmmoCount(hero.gear, amGrenade).. - GetAmmoCount(hero.gear, amRope)..GetAmmoCount(hero.gear, amParachute)..GetAmmoCount(hero.gear, amDEagle).. - GetAmmoCount(hero.gear, amBlowTorch)..GetAmmoCount(hero.gear, amGirder).. - GetAmmoCount(hero.gear, amPortalGun)..GetAmmoCount(hero.gear, amRCPlane)) - AnimCaption(hero.gear, loc("Checkpoint reached!"), 5000) -end - -function loadHeroAmmo() - -- hero ammo - local ammo = GetCampaignVar("HeroAmmo") - AddAmmo(hero.gear, amRope, tonumber(ammo:sub(3,3))) - AddAmmo(hero.gear, amBazooka, tonumber(ammo:sub(1,1))) - AddAmmo(hero.gear, amParachute, tonumber(ammo:sub(4,4))) - AddAmmo(hero.gear, amGrenade, tonumber(ammo:sub(2,2))) - AddAmmo(hero.gear, amDEagle, tonumber(ammo:sub(5,5))) - AddAmmo(hero.gear, amBlowTorch, tonumber(ammo:sub(6,6))) - -- weird, if 0 bazooka isn't displayed in the weapons menu - if tonumber(ammo:sub(7,7)) > 0 then - AddAmmo(hero.gear, amGirder, tonumber(ammo:sub(7,7))) - end - AddAmmo(hero.gear, amPortalGun, tonumber(ammo:sub(8,8))) - AddAmmo(hero.gear, amRCPlane, tonumber(ammo:sub(9,9))) + EndTurn(true) + SetGearVelocity(hero.gear, dx, dy) end function checkForWin() @@ -556,11 +529,11 @@ elseif cratesFound == 1 then -- end game saveCompletedStatus(5) - AnimSay(hero.gear, loc("Hooray!"), SAY_SHOUT, 5000) + AnimSay(hero.gear, loc("I found it! Hooray!"), SAY_SHOUT, 5000) + PlaySound(sndVictory, hero.gear) SendStat(siGameResult, loc("Congratulations, you won!")) SendStat(siCustomAchievement, loc("To win the game you had to collect the 2 crates with no specific order.")) - SendStat(siPlayerKills,'1',teamC.name) - SendStat(siPlayerKills,'0',teamB.name) + sendSimpleTeamRankings({teamC.name, teamA.name, teamB.name}) EndGame() end end @@ -571,7 +544,6 @@ SendStat(siCustomAchievement, loc("You can avoid some battles.")) SendStat(siCustomAchievement, loc("Use your ammo wisely.")) SendStat(siCustomAchievement, loc("Don't destroy the device crate!")) - SendStat(siPlayerKills,'1',teamB.name) - SendStat(siPlayerKills,'0',teamC.name) + sendSimpleTeamRankings({teamB.name, teamC.name, teamA.name}) EndGame() end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert02.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert02.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert02.lua Sun Dec 17 00:09:24 2017 +0100 @@ -15,7 +15,7 @@ local dialog01 = {} -- mission objectives local goals = { - [dialog01] = {missionName, loc("Getting ready"), loc("Use the rope to quickly get to the surface!"), 1, 4500}, + [dialog01] = {missionName, loc("Getting ready"), loc("Use the rope to quickly get to the surface!") .. "|" .. loc("Mines time: 1 second"), 1, 4500}, } -- health crates healthX = 565 @@ -72,29 +72,35 @@ Theme = "Desert" -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + 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) HogTurnLeft(hero.gear, true) initCheckpoint("desert02") - AnimInit() + AnimInit(true) AnimationSetup() end +function onAmmoStoreInit() + SetAmmo(amRope, 9, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) +end + function onGameStart() AnimWait(hero.gear, 3000) FollowGear(hero.gear) + ShowMission(unpack(goals[dialog01])) + HideMission() + AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) AddEvent(onHeroSafe, {hero.gear}, heroSafe, {hero.gear}, 0) SpawnHealthCrate(healthX, health1Y) SpawnHealthCrate(healthX, health2Y) - AddAmmo(hero.gear, amRope, 99) - SendHealthStatsOff() AddAnim(dialog01) end @@ -112,6 +118,12 @@ CheckEvents() end +function onGearAdd(gear) + if GetGearType(gear) == gtRope then + HideMission() + end +end + function onGearDelete(gear) if gear == hero.gear then hero.dead = true @@ -147,7 +159,7 @@ 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.")) - SendStat(siPlayerKills,'0',teamA.name) + sendSimpleTeamRankings({teamA.name}) EndGame() end @@ -155,7 +167,19 @@ 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)) - SendStat(siPlayerKills,'1',teamA.name) + 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 + if record == nil or TotalRounds < record then + SaveCampaignVar("FastestMineEscape", tostring(TotalRounds)) + if record ~= nil then + SendStat(siCustomAchievement, loc("This is a new personal best, congratulations!")) + end + end + sendSimpleTeamRankings({teamA.name}) + SaveCampaignVar("Mission7Won", "true") + checkAllMissionsCompleted() EndGame() end @@ -164,7 +188,7 @@ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end + end challengeStart() end @@ -176,6 +200,7 @@ table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("The tunnel is about to get flooded!"), SAY_THINK, 4000}}) table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("I have to reach the surface as quickly as I can."), SAY_THINK, 4000}}) table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}}) + table.insert(dialog01, {func = ShowMission, args = goals[dialog01]}) table.insert(dialog01, {func = challengeStart, args = {hero.gear}}) end @@ -183,5 +208,5 @@ function challengeStart() startChallenge = true - TurnTimeLeft = 0 + EndTurn(true) end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert03.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert03.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert03.lua Sun Dec 17 00:09:24 2017 +0100 @@ -9,16 +9,16 @@ -- globals local missionName = loc("Precise flying") -local challengeObjectives = loc("Use the RC plane and destroy the all the targets").."|".. - loc("Each time you destroy all the targets on your current level you'll get teleported to the next level").."|".. - loc("You'll have only one RC plane at the start of the mission").."|".. - loc("During the game you can get new RC planes by collecting the weapon crates") +local challengeObjectives = loc("Use the RC plane and destroy the all the targets.").."|".. + loc("Each time you destroy all the targets on your current level you'll get teleported to the next level.").."|".. + loc("You'll have only one RC plane at the start of the mission.").."|".. + loc("During the game you can get new RC planes by collecting the weapon crates.") local currentTarget = 1 -- dialogs local dialog01 = {} -- mission objectives local goals = { - [dialog01] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 4500}, + ["init"] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 30000}, } -- hogs local hero = { @@ -53,6 +53,8 @@ { x = 1200, y = 1310}, { x = 1700, y = 1310}, } +local targetsDead = {} +local flameCounter = 0 -------------- LuaAPI EVENT HANDLERS ------------------ @@ -60,28 +62,30 @@ GameFlags = gfOneClanMode Seed = 1 TurnTime = -1 + Ready = 30000 CaseFreq = 0 MinesNum = 0 MinesTime = 1 Explosives = 0 Map = "desert03_map" Theme = "Desert" + -- Disable SuddenDeath + WaterRise = 0 + HealthDecrease = 0 -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars") hero.gear = AddHog(hero.name, 0, 1, "war_desertgrenadier1") AnimSetGearPosition(hero.gear, hero.x, hero.y) initCheckpoint("desert03") AnimInit() - AnimationSetup() end function onGameStart() - AnimWait(hero.gear, 3000) FollowGear(hero.gear) - ShowMission(missionName, loc("Challenge objectives"), challengeObjectives, -amSkip, 0) + ShowMission(unpack(goals["init"])) AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) AddEvent(onLose, {hero.gear}, lose, {hero.gear}, 0) @@ -121,6 +125,27 @@ end end +function onGearAdd(gear) + if GetGearType(gear) == gtFlame then + flameCounter = flameCounter + 1 + end + if GetGearType(gear) == gtRCPlane then + HideMission() + end +end + +function onGearDelete(gear) + if GetGearType(gear) == gtFlame then + flameCounter = flameCounter - 1 + end + for t=1, #targets do + if gear == targets[t].gear then + targetsDead[t] = true + break + end + end +end + -------------- EVENTS ------------------ function onHeroDeath(gear) @@ -131,7 +156,7 @@ end function onLose(gear) - if GetHealth(hero.gear) and currentTarget < 4 and GetAmmoCount(hero.gear, amRCPlane) == 0 then + if GetHealth(hero.gear) and currentTarget < 4 and GetAmmoCount(hero.gear, amRCPlane) == 0 and flameCounter <= 0 then return true end return false @@ -144,49 +169,39 @@ end function lose(gear) + AddCaption(loc("Out of ammo!"), 0xFFFFFFFF, capgrpMessage2) + PlaySound(sndStupid, hero.gear) gameOver() end --------------- ANIMATIONS ------------------ - -function Skipanim(anim) - if goals[anim] ~= nil then - ShowMission(unpack(goals[anim])) - end -end - -function AnimationSetup() - -- DIALOG 01 - Start, game instructions - AddSkipFunction(dialog01, Skipanim, {dialog01}) - table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("On the Desert Planet, Hog Solo found some time to play with his RC plane"), 3000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Each time you destroy all the targets on your current level you'll get teleported to the next level"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You'll have only one RC plane at the start of the mission"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("During the game you can get new RC planes by collecting the weapon crates"), 5000}}) - table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}}) -end - ----------------- Other Functions ----------------- function checkTargetsDestroyed() if currentTarget == 1 then - if not GetHealth(targets[1].gear) then + if targetsDead[1] then AddCaption(loc("Level 1 clear!")) SetGearPosition(hero.gear, 3590, 90) currentTarget = 2 setTargets(currentTarget) end elseif currentTarget == 2 then - if not (GetHealth(targets[2].gear) or GetHealth(targets[3].gear)) then + if targetsDead[2] and targetsDead[3] then AddCaption(loc("Level 2 clear!")) SetGearPosition(hero.gear, 1110, 580) currentTarget = 3 setTargets(currentTarget) end elseif currentTarget == 3 then - - else - win() + local allDead = true + for t=3, #targets do + if targetsDead[t] ~= true then + allDead = false + end + end + if allDead then + currentTarget = 4 + win() + end end end @@ -197,9 +212,8 @@ targets[i].gear = AddGear(targets[i].x, targets[i].y, gtTarget, 0, 0, 0, 0) end elseif ct == 3 then - SpawnAmmoCrate(rcCrates[3].x, rcCrates[3].y, amRCPlane) - SpawnAmmoCrate(rcCrates[3].x, rcCrates[3].y, amRCPlane) - SpawnAmmoCrate(rcCrates[4].x, rcCrates[4].y, amNothing) + SpawnUtilityCrate(rcCrates[4].x, rcCrates[4].y, amNothing) + SpawnAmmoCrate(rcCrates[3].x, rcCrates[3].y, amRCPlane, 2) for i=4,13 do targets[i].gear = AddGear(targets[i].x, targets[i].y, gtTarget, 0, 0, 0, 0) end @@ -207,12 +221,16 @@ end function win() + AddCaption(loc("Victory!")) + PlaySound(sndVictory, hero.gear) saveBonus(1, 1) SendStat(siGameResult, loc("Congratulations, you are the best!")) SendStat(siCustomAchievement, loc("You have destroyed all the targets.")) SendStat(siCustomAchievement, loc("You are indeed the best PAotH pilot.")) SendStat(siCustomAchievement, loc("Next time you play \"Searching in the dust\" you'll have an RC plane available.")) - SendStat(siPlayerKills,'1',teamA.name) + sendSimpleTeamRankings({teamA.name}) + SaveCampaignVar("Mission12Won", "true") + checkAllMissionsCompleted() EndGame() end @@ -221,6 +239,6 @@ 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.")) - SendStat(siPlayerKills,'0',teamA.name) + sendSimpleTeamRankings({teamA.name}) EndGame() end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua Sun Dec 17 00:09:24 2017 +0100 @@ -13,8 +13,11 @@ -- globals local missionName = loc("The big bang") local challengeObjectives = loc("Find a way to detonate all the explosives and stay alive!").."|".. - loc("Red areas are indestructible").."|".. - loc("Green areas are portal-proof") + loc("Red areas are indestructible.").."|".. + loc("Green areas are portal-proof.").."|".. + loc("Mines time: 0 seconds") + +local dialog01 = {} local explosives = {} local currentHealth = 1 local currentDamage = 0 @@ -43,9 +46,12 @@ HealthCaseAmount = 35 Map = "final_map" Theme = "EarthRise" + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars") hero.gear = AddHog(hero.name, 0, 1, "war_desertgrenadier1") AnimSetGearPosition(hero.gear, hero.x, hero.y) @@ -75,16 +81,17 @@ -- health crate SpawnHealthCrate(910, 5) -- ammo crates - SpawnAmmoCrate(930, 1000,amRCPlane) - SpawnAmmoCrate(1220, 672,amPickHammer) - SpawnAmmoCrate(1220, 672,amGirder) + SpawnAmmoCrate(930, 1000, amRCPlane) + SpawnUtilityCrate(1260, 652, amGirder) + SpawnAmmoCrate(1220, 652, amPickHammer) -- ammo AddAmmo(hero.gear, amPortalGun, 1) AddAmmo(hero.gear, amFirePunch, 1) AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) - AddEvent(onHeroWin, {hero.gear}, heroWin, {hero.gear}, 0) + AddEvent(onBoom, {hero.gear}, heroBoomReaction, {hero.gear}, 0) + AnimationSetup() SendHealthStatsOff() end @@ -107,6 +114,9 @@ function onNewTurn() currentDamage = 0 currentHealth = GetHealth(hero.gear) + if onBoom(hero.gear) then + heroWin(hero.gear) + end end function onGearDamage(gear, damage) @@ -124,7 +134,7 @@ return false end -function onHeroWin(gear) +function onBoom(gear) local win = true for i=1,table.getn(explosives) do if GetHealth(explosives[i]) then @@ -145,14 +155,66 @@ SendStat(siCustomAchievement, loc("You have to destroy all the explosives without dying!")) SendStat(siCustomAchievement, loc("Red areas are indestructible.")) SendStat(siCustomAchievement, loc("Green areas are portal-proof and repel portals.")) - SendStat(siPlayerKills,'0',teamA.name) + sendSimpleTeamRankings({teamA.name}) EndGame() end +function heroBoomReaction(gear) + if GetHealth(gear) and GetHealth(gear) > 0 then + HogSay(gear, loc("Kaboom! Hahahaha! Take this, stupid meteorite!"), SAY_SHOUT, 2) + end +end + function heroWin(gear) + AddAnim(dialog01) +end + +function win() + SetWeapon(amNothing) + AnimSetInputMask(0) saveCompletedStatus(7) + SaveCampaignVar("Won", "true") + checkAllMissionsCompleted() SendStat(siGameResult, loc("Congratulations, you have saved Hogera!")) SendStat(siCustomAchievement, loc("Hogera is safe!")) - SendStat(siPlayerKills,'1',teamA.name) + sendSimpleTeamRankings({teamA.name}) EndGame() end + +------------ ANIMATION STUFF ------------ + +function Skipanim(anim) + if anim == dialog01 then + win() + end +end + +function onPrecise() + if GameTime > 3000 then + SetAnimSkip(true) + end +end + +function AnimationSetup() + -- DIALOG 01 - Start, welcome to moon + AddSkipFunction(dialog01, Skipanim, {dialog01}) + table.insert(dialog01, {func = AnimWait, args = {hero.gear, 100}}) + table.insert(dialog01, {func = FollowGear, args = {hero.gear}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Hooray! I actually did it! Hogera is safe!"), SAY_SHOUT, 3000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("I'm so glad this is finally over!"), SAY_SAY, 3000}}) + table.insert(dialog01, {func = AnimWait, args = {hero.gear, 4000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Wait a moment …"), SAY_THINK, 2000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("If some good old explosives were enough to save Hogera …"), SAY_THINK, 5000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("… why did I risk my life to collect all the parts of the anti-gravity device?"), SAY_THINK, 6000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("It was completely useless!"), SAY_THINK, 3000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("We could just have blown up the meteorite from the the beginning!"), SAY_THINK, 5000}}) + -- Hogerian = Inhabitant of the planet Hogera + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Stupid, stupid Hogerians!"), SAY_SAY, 5000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Or maybe this was all part of an evil plan, so evil that even Prof. Hogevil can't think of it!"), SAY_THINK, 9000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Nah, probably everyone was just stupid."), SAY_THINK, 4000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Except me, of course! I just saved a whole planet!"), SAY_THINK, 5000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("But one thing's for sure:"), SAY_THINK, 4000}}) + table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Hogera is definitely the last planet I saved!"), SAY_THINK, 4000}}) + table.insert(dialog01, {func = win, args = {hero.gear}}) +end + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit01.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit01.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit01.lua Sun Dec 17 00:09:24 2017 +0100 @@ -23,6 +23,7 @@ -- globals local missionName = loc("Bad timing") local chooseToBattle = false +local awaitingInput = false local previousHog = 0 local heroPlayedFirstTurn = false local startBattleCalled = false @@ -30,11 +31,19 @@ local dialog01 = {} local dialog02 = {} local dialog03 = {} + -- mission objectives local goals = { - [dialog01] = {missionName, loc("Ready for Battle?"), loc("Walk left if you want to join Captain Lime or right if you want to decline his offer."), 1, 4000}, - [dialog02] = {missionName, loc("Battle Starts Now!"), loc("You have chosen to fight! Lead the Green Bananas to battle and eliminate all the enemies!"), 1, 4000}, - [dialog03] = {missionName, loc("Time to run!"), loc("You have chosen to flee ... Unfortunately, the only place where you can launch your saucer is the left-most place on the map."), 1, 4000}, + [dialog01] = {missionName, loc("Ready for Battle?"), + 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}, + [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}, + [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}, + ["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 local crateWMX = 2170 @@ -88,13 +97,13 @@ {name = loc("Naranja Jed"), x = 960 , y = 516, health = 40}, } teamA.name = loc("Hog Solo") -teamA.color = tonumber("38D61C",16) -- green +teamA.color = 0x38D61C -- green teamB.name = loc("Green Bananas") -teamB.color = tonumber("38D61C",16) -- green +teamB.color = 0x38D61C -- green teamC.name = loc("Yellow Watermelons") -teamC.color = tonumber("DDFF00",16) -- yellow +teamC.color = 0xFFFF01 -- yellow teamD.name = loc("Captain Lime") -teamD.color = tonumber("38D61C",16) -- green +teamD.color = 0x38D61C -- green function onGameInit() Seed = 1 @@ -104,25 +113,24 @@ MinesTime = 1 Explosives = 0 Delay = 3 - SuddenDeathTurns = 100 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 HealthCaseAmount = 50 Map = "fruit01_map" Theme = "Fruit" -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + 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) HogTurnLeft(hero.gear, true) -- Captain Lime - AddTeam(teamD.name, teamD.color, "Bone", "Island", "HillBilly", "cm_birdy") - green1.bot = AddHog(green1.name, 1, 200, "war_desertofficer") - AnimSetGearPosition(green1.bot, green1.x, green1.y) - green1.human = AddHog(green1.name, 0, 200, "war_desertofficer") - AnimSetGearPosition(green1.human, green1.x, green1.y) - green1.gear = green1.human + AddTeam(teamD.name, teamD.color, "Cherry", "Island", "Default", "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, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "Cherry", "Island", "Default", "congo-brazzaville") green2.gear = AddHog(green2.name, 0, 100, "war_britmedic") AnimSetGearPosition(green2.gear, green2.x, green2.y) HogTurnLeft(green2.gear, true) @@ -136,7 +144,7 @@ AnimSetGearPosition(green5.gear, green5.x, green5.y) HogTurnLeft(green5.gear, true) -- Yellow Watermelons - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamC.name, teamC.color, "Flower", "Island", "Default", "cm_mog") yellow1.gear = AddHog(yellow1.name, 1, 100, "war_desertgrenadier2") AnimSetGearPosition(yellow1.gear, yellow1.x, yellow1.y) -- the rest of the Yellow Watermelons @@ -148,16 +156,16 @@ initCheckpoint("fruit01") - AnimInit() + AnimInit(true) AnimationSetup() end function onGameStart() + AnimSetInputMask(0) AnimWait(hero.gear, 3000) FollowGear(hero.gear) AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) - AddEvent(onHeroSelect, {hero.gear}, heroSelect, {hero.gear}, 0) -- Green team weapons local greenArmy = { green1, green2 } @@ -186,7 +194,6 @@ for i=3,7 do HideHog(yellowArmy[i].gear) end - HideHog(green1.bot) -- crates SpawnHealthCrate(health1X, health1Y) @@ -198,17 +205,17 @@ function onNewTurn() if not heroPlayedFirstTurn and CurrentHedgehog ~= hero.gear and startBattleCalled then - TurnTimeLeft = 0 + EndTurn(true) elseif not heroPlayedFirstTurn and CurrentHedgehog == hero.gear and startBattleCalled then heroPlayedFirstTurn = true elseif not heroPlayedFirstTurn and CurrentHedgehog == green1.gear then - TurnTimeLeft = 0 + EndTurn(true) else if chooseToBattle then if CurrentHedgehog == green1.gear then TotalRounds = TotalRounds - 2 AnimSwitchHog(previousHog) - TurnTimeLeft = 0 + EndTurn(true) end previousHog = CurrentHedgehog end @@ -225,6 +232,18 @@ CheckEvents() end +local choiceDialogTimer = 0 +function onGameTick20() + -- Make sure the choice dialog never disappears while it is active + if awaitingInput then + choiceDialogTimer = choiceDialogTimer + 20 + if choiceDialogTimer > 9990000 then + ShowMission(unpack(goals[dialog01])) + choiceDialogTimer = 0 + end + end +end + function onGearDelete(gear) if gear == hero.gear then hero.dead = true @@ -296,28 +315,39 @@ return win end -function onEscapeWin(gear) - local escape = false +function isHeroOnLaunchPad() if not hero.dead and GetX(hero.gear) < 170 and GetY(hero.gear) > 1980 and StoppedGear(hero.gear) then - escape = true - local yellowTeam = { yellow1, unpack(yellowArmy) } - for i=1,8 do - if not yellowTeam[i].hidden and GetHealth(yellowTeam[i].gear) and GetX(yellowTeam[i].gear) < 170 then - escape = false - break - end - end - end - return escape -end - -function onHeroSelect(gear) - if GetX(hero.gear) ~= hero.x then return true end return false end +function isLaunchPadEmpty(gear) + local yellowTeam = { yellow1, unpack(yellowArmy) } + for i=1, #yellowArmy+1 do + if not yellowTeam[i].hidden and GetHealth(yellowTeam[i].gear) and GetX(yellowTeam[i].gear) < 170 then + return false + end + end + return true +end + +function onHeroOnLaunchPadWithEnemies() + return isHeroOnLaunchPad() and not isLaunchPadEmpty() +end + +function heroOnLaunchPadWithEnemies() + ShowMission(unpack(goals["flee_final"])) +end + +function onEscapeWin(gear) + local escape = false + if isHeroOnLaunchPad() then + escape = isLaunchPadEmpty() + end + return escape +end + -------------- ACTIONS ------------------ function heroDeath(gear) @@ -333,34 +363,33 @@ saveVariables() SendStat(siGameResult, loc("Green Bananas won!")) SendStat(siCustomAchievement, loc("You have eliminated all visible enemy hedgehogs!")) - SendStat(siPlayerKills,'1',teamA.name) - SendStat(siPlayerKills,'1',teamB.name) - SendStat(siPlayerKills,'0',teamC.name) + sendSimpleTeamRankings({teamA.name, teamD.name, teamB.name, teamC.name}) EndGame() end function escapeWin(gear) + RemoveEventFunc(heroOnLaunchPadWithEnemies) -- add stats saveVariables() SendStat(siGameResult, loc("Hog Solo escaped successfully!")) SendStat(siCustomAchievement, loc("You have reached the take-off area successfully!")) - SendStat(siPlayerKills,'1',teamA.name) - SendStat(siPlayerKills,'0',teamB.name) - SendStat(siPlayerKills,'0',teamC.name) + sendSimpleTeamRankings({teamA.name, teamD.name, teamB.name, teamC.name}) EndGame() end -function heroSelect(gear) - TurnTimeLeft = 0 +function heroSelect() + awaitingInput = false FollowGear(hero.gear) - if GetX(hero.gear) < hero.x then + if chooseToBattle == true then chooseToBattle = true + ShowMission(unpack(goals["fight"])) AddEvent(onGreen1Death, {green1.gear}, green1Death, {green1.gear}, 0) AddEvent(onBattleWin, {hero.gear}, battleWin, {hero.gear}, 0) AddAnim(dialog02) - elseif GetX(hero.gear) > hero.x then - HogTurnLeft(hero.gear, true) + else + ShowMission(unpack(goals["flee"])) AddAmmo(green1.gear, amSwitch, 100) + AddEvent(onHeroOnLaunchPadWithEnemies, {hero.gear}, heroOnLaunchPadWithEnemies, {hero.gear}, 0) AddEvent(onEscapeWin, {hero.gear}, escapeWin, {hero.gear}, 0) local greenTeam = { green2, green3, green4, green5 } for i=1,4 do @@ -372,21 +401,26 @@ -------------- ANIMATIONS ------------------ +function AfterDialog01() + AnimSwitchHog(hero.gear) + awaitingInput = true +end + function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end - if anim == dialog01 then - AnimSwitchHog(hero.gear) + end + if anim == dialog01 then + AfterDialog01() elseif anim == dialog02 or anim == dialog03 then startBattle() - end + end end function AnimationSetup() -- DIALOG 01 - Start, Captain Lime talks explains to Hog Solo AddSkipFunction(dialog01, Skipanim, {dialog01}) - table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}}) + 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}}) @@ -398,11 +432,10 @@ 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}}) - table.insert(dialog01, {func = ShowMission, args = {missionName, loc("Ready for Battle?"), loc("Walk left if you want to join Captain Lime or right if you want to decline his offer."), 1, 7000}}) - table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}}) + table.insert(dialog01, {func = ShowMission, args = goals[dialog01]}) + table.insert(dialog01, {func = AfterDialog01, args = {}}) -- DIALOG 02 - Hero selects to fight AddSkipFunction(dialog02, Skipanim, {dialog02}) - table.insert(dialog02, {func = AnimWait, args = {green1.gear, 3000}}) 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, 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}}) @@ -414,22 +447,24 @@ table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("Don't be foolish, son, there will be more."), SAY_SAY, 2000}}) table.insert(dialog02, {func = AnimSay, args = {green1.gear, loc("Try to be smart and eliminate them quickly. This way you might scare off the rest!"), SAY_SAY, 5000}}) table.insert(dialog02, {func = AnimWait, args = {hero.gear, 5000}}) + table.insert(dialog02, {func = ShowMission, args = goals[dialog02]}) table.insert(dialog02, {func = startBattle, args = {hero.gear}}) -- DIALOG 03 - Hero selects to flee AddSkipFunction(dialog03, Skipanim, {dialog03}) - table.insert(dialog03, {func = AnimWait, args = {green1.gear, 3000}}) table.insert(dialog03, {func = AnimSay, args = {green1.gear, loc("Too bad! Then you should really leave!"), SAY_SAY, 3000}}) table.insert(dialog03, {func = AnimSay, args = {green1.gear, loc("Things are going to get messy around here."), SAY_SAY, 3000}}) table.insert(dialog03, {func = AnimSay, args = {green1.gear, loc("Also, you should know that the only place where you can fly is the left-most part of this area."), SAY_SAY, 5000}}) table.insert(dialog03, {func = AnimSay, args = {green1.gear, loc("All the other places are protected by our flight-inhibiting weapons."), SAY_SAY, 4000}}) table.insert(dialog03, {func = AnimSay, args = {green1.gear, loc("Now go and don't waste more of my time, you coward!"), SAY_SAY, 4000}}) table.insert(dialog03, {func = AnimWait, args = {hero.gear, 5000}}) + table.insert(dialog03, {func = ShowMission, args = goals[dialog03]}) table.insert(dialog03, {func = startBattle, args = {hero.gear}}) end ------------- OTHER FUNCTIONS --------------- function startBattle() + AnimSetInputMask(0xFFFFFFFF) -- Hog Solo weapons AddAmmo(hero.gear, amRope, 2) AddAmmo(hero.gear, amBazooka, 3) @@ -437,11 +472,9 @@ AddAmmo(hero.gear, amGrenade, 6) AddAmmo(hero.gear, amDEagle, 4) AddAmmo(hero.gear, amSkip, 100) - RestoreHog(green1.bot) - DeleteGear(green1.human) - green1.gear = green1.bot + SetHogLevel(green1.gear, 1) startBattleCalled = true - TurnTimeLeft = 0 + EndTurn(true) end function gameLost() @@ -458,9 +491,7 @@ SendStat(siCustomAchievement, loc("You will play every 3 turns.")) SendStat(siCustomAchievement, loc("Green hogs won't intentionally hurt you.")) end - SendStat(siPlayerKills,'1',teamC.name) - SendStat(siPlayerKills,'0',teamA.name) - SendStat(siPlayerKills,'0',teamB.name) + sendSimpleTeamRankings({teamC.name, teamA.name, teamD.name, teamB.name}) EndGame() end @@ -490,8 +521,28 @@ function saveVariables() saveCompletedStatus(2) - SaveCampaignVar("UnlockedMissions", "3") - SaveCampaignVar("Mission1", "3") - SaveCampaignVar("Mission2", "8") - SaveCampaignVar("Mission3", "1") + SaveCampaignVar("UnlockedMissions", "4") + SaveCampaignVar("Mission1", "8") + SaveCampaignVar("Mission2", "3") + SaveCampaignVar("Mission3", "10") + SaveCampaignVar("Mission4", "1") end + + +function onLJump() + if awaitingInput then + PlaySound(sndPlaced) + PlaySound(sndCoward, green1.gear) + chooseToBattle = false + heroSelect() + end +end +onHJump = onLJump + +function onAttack() + if awaitingInput then + PlaySound(sndPlaced) + chooseToBattle = true + heroSelect() + end +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit02.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit02.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit02.lua Sun Dec 17 00:09:24 2017 +0100 @@ -13,25 +13,29 @@ local inBattle = false local tookPartInBattle = false local previousHog = -1 -local checkPointReached = 1 -- 1 is normal spawn local permitCaptainLimeDeath = false -- dialogs local dialog01 = {} local dialog02 = {} local dialog03 = {} local dialog04 = {} +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"), 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"), 1, 4000}, - [dialog03] = {missionName, loc("Return to the Surface"), loc("Go to the surface!").."|"..loc("Attack Captain Lime before he attacks back"), 1, 4000}, - [dialog04] = {missionName, loc("Return to the Surface"), loc("Go to the surface!").."|"..loc("Attack the assassins before they attack back"), 1, 4000}, + [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}, } -- crates +local girderCrate = {name = amGirder, x = 1680, y = 1160} + local eagleCrate = {name = amDEagle, x = 1680, y = 1650} -local girderCrate = {name = amGirder, x = 1680, y = 1160} + +local weaponCrate = { x = 1320, y = 1870} +local deviceCrate = { gear = nil, x = 1360, y = 1870} local ropeCrate = {name = amRope, x = 1400, y = 1870} -local weaponCrate = { x = 1360, y = 1870} -- hogs local hero = {} local green1 = {} @@ -62,12 +66,13 @@ { name = loc("Watermelon Heart") }, { name = loc("Deadly Grape") } } +-- Hog Solo and Green Bananas teamA.name = loc("Hog Solo and GB") -teamA.color = tonumber("38D61C",16) -- green +teamA.color = 0x38D61C -- green teamB.name = loc("Captain Lime") -teamB.color = tonumber("38D61D",16) -- greenish +teamB.color = 0x38D61D -- greenish teamC.name = loc("Fruit Assassins") -teamC.color = tonumber("FF0000",16) -- red +teamC.color = 0xFF0000 -- red function onGameInit() GameFlags = gfDisableWind @@ -78,20 +83,16 @@ MinesTime = 1 Explosives = 0 Delay = 3 - SuddenDeathTurns = 200 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 Map = "fruit02_map" Theme = "Fruit" - -- load checkpoints, problem getting the campaign variable local health = 100 - checkPointReached = initCheckpoint("fruit02") - if checkPointReached ~= 1 then - loadHogsPositions() - health = tonumber(GetCampaignVar("HeroHealth")) - end -- Hog Solo and Green Bananas - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + 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) HogTurnLeft(hero.gear, true) @@ -102,21 +103,18 @@ AnimSetGearPosition(green3.gear, green3.x, green3.y) HogTurnLeft(green3.gear, true) -- Captain Lime - AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") - green1.human = AddHog(green1.name, 0, 100, "war_desertofficer") - AnimSetGearPosition(green1.human, green1.x, green1.y) - green1.bot = AddHog(green1.name, 1, 100, "war_desertofficer") - AnimSetGearPosition(green1.bot, green1.x, green1.y) - green1.gear = green1.human + AddTeam(teamB.name, teamB.color, "Cherry", "Island", "Default", "congo-brazzaville") + green1.gear= AddHog(green1.name, 0, 100, "war_desertofficer") + AnimSetGearPosition(green1.gear, green1.x, green1.y) -- Fruit Assassins local assasinsHats = { "NinjaFull", "NinjaStraight", "NinjaTriangle" } - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamC.name, teamC.color, "bp2", "Island", "Default", "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) end - AnimInit() + AnimInit(true) AnimationSetup() end @@ -129,15 +127,10 @@ end AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) - AddEvent(onDeviceCrates, {hero.gear}, deviceCrates, {hero.gear}, 0) + AddEvent(onDeviceCrates, {hero.gear}, deviceCrateEvent, {hero.gear}, 0) -- Hog Solo and GB weapons AddAmmo(hero.gear, amSwitch, 100) - -- Captain Lime weapons - AddAmmo(green1.bot, amBazooka, 6) - AddAmmo(green1.bot, amGrenade, 6) - AddAmmo(green1.bot, amDEagle, 2) - HideHog(green1.bot) -- Assassins weapons AddAmmo(redHedgehogs[1].gear, amBazooka, 6) AddAmmo(redHedgehogs[1].gear, amGrenade, 6) @@ -179,48 +172,20 @@ AddGear(3085, 1680, gtMine, 0, 0, 0, 0) AddGear(3075, 1680, gtMine, 0, 0, 0, 0) - if checkPointReached == 1 then - AddAmmo(hero.gear, amFirePunch, 3) - AddEvent(onCheckPoint1, {hero.gear}, checkPoint1, {hero.gear}, 0) - AddEvent(onCheckPoint2, {hero.gear}, checkPoint2, {hero.gear}, 0) - AddEvent(onCheckPoint3, {hero.gear}, checkPoint3, {hero.gear}, 0) - AddEvent(onCheckPoint4, {hero.gear}, checkPoint4, {hero.gear}, 0) - if tookPartInBattle then - AddAnim(dialog01) - else - AddAnim(dialog02) - end - elseif checkPointReached == 2 then - AddEvent(onCheckPoint2, {hero.gear}, checkPoint2, {hero.gear}, 0) - AddEvent(onCheckPoint3, {hero.gear}, checkPoint3, {hero.gear}, 0) - AddEvent(onCheckPoint4, {hero.gear}, checkPoint4, {hero.gear}, 0) - elseif checkPointReached == 3 then - AddEvent(onCheckPoint1, {hero.gear}, checkPoint1, {hero.gear}, 0) - AddEvent(onCheckPoint3, {hero.gear}, checkPoint3, {hero.gear}, 0) - AddEvent(onCheckPoint4, {hero.gear}, checkPoint4, {hero.gear}, 0) - elseif checkPointReached == 4 then - AddEvent(onCheckPoint4, {hero.gear}, checkPoint4, {hero.gear}, 0) - elseif checkPointReached == 5 then - -- EMPTY - end - if checkPointReached ~= 1 then - loadWeapons() - end - - -- girders - if checkPointReached > 1 then - PlaceGirder(1580, 875, 4) - PlaceGirder(1800, 875, 4) + AddAmmo(hero.gear, amFirePunch, 3) + if tookPartInBattle then + AddAnim(dialog01) + else + AddAnim(dialog02) end -- place crates - if checkPointReached < 2 then - SpawnAmmoCrate(girderCrate.x, girderCrate.y, girderCrate.name) - end - if checkPointReached < 5 then - SpawnAmmoCrate(eagleCrate.x, eagleCrate.y, eagleCrate.name) - end - SpawnAmmoCrate(ropeCrate.x, ropeCrate.y, ropeCrate.name) + SpawnUtilityCrate(girderCrate.x, girderCrate.y, girderCrate.name) + SpawnAmmoCrate(eagleCrate.x, eagleCrate.y, eagleCrate.name) + deviceCrate.gear = SpawnFakeUtilityCrate(deviceCrate.x, deviceCrate.y, false, false) -- anti-gravity device + -- Rope crate is placed after device crate has been collected. + -- This is done so it is impossible the player can rope before getting + -- the device part. if tookPartInBattle then SpawnAmmoCrate(weaponCrate.x, weaponCrate.y, amWatermelon) @@ -233,17 +198,17 @@ function onNewTurn() if not inBattle and CurrentHedgehog == green1.gear then - TurnTimeLeft = 0 + EndTurn(true) elseif CurrentHedgehog == green2.gear or CurrentHedgehog == green3.gear then - TurnTimeLeft = 0 + EndTurn(true) elseif inBattle then if CurrentHedgehog == green1.gear and previousHog ~= hero.gear then - TurnTimeLeft = 0 + EndTurn(true) return end for i=1,table.getn(redHedgehogs) do if CurrentHedgehog == redHedgehogs[i].gear and previousHog ~= hero.gear then - TurnTimeLeft = 0 + EndTurn(true) return end end @@ -253,7 +218,7 @@ TurnTimeLeft = -1 wind() else - TurnTimeLeft = 0 + EndTurn(true) end previousHog = CurrentHedgehog end @@ -281,8 +246,17 @@ function onGearDelete(gear) if gear == hero.gear then hero.dead = true - elseif gear == green1.bot then + elseif gear == green1.gear then green1.dead = true + elseif gear == deviceCrate.gear then + if band(GetGearMessage(gear), gmDestroy) ~= 0 then + PlaySound(sndShotgunReload) + AddCaption(loc("Anti-Gravity Device Part (+1)"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmostate) + deviceCrate.collected = true + deviceCrate.collector = CurrentHedgehog + -- Spawn rope crate + SpawnUtilityCrate(ropeCrate.x, ropeCrate.y, ropeCrate.name) + end end end @@ -298,6 +272,7 @@ SetAmmo(amDEagle, 0, 0, 0, 6) SetAmmo(amGirder, 0, 0, 0, 2) SetAmmo(amRope, 0, 0, 0, 1) + SetAmmo(amSkip, 9, 0, 0, 1) if tonumber(getBonus(2)) == 1 then SetAmmo(amWatermelon, 0, 0, 0, 2) SetAmmo(amSniperRifle, 0, 0, 0, 2) @@ -323,7 +298,7 @@ end function onDeviceCrates(gear) - if not hero.dead and GetY(hero.gear)>1850 and GetX(hero.gear)>1340 and GetX(hero.gear)<1640 then + if not hero.dead and deviceCrate.collected and StoppedGear(hero.gear) then return true end return false @@ -354,44 +329,6 @@ return redDead end -function onCheckPoint1(gear) - -- before barrel jump - if not hero.dead and GetX(hero.gear) > 2850 and GetX(hero.gear) < 2945 - and GetY(hero.gear) > 808 and GetY(hero.gear) < 852 and not isHeroAtWrongPlace() then - return true - end - return false -end - -function onCheckPoint2(gear) - -- before barrel jump - if ((GetHealth(green2.gear) and GetX(green2.gear) > 2850 and GetX(green2.gear) < 2945 and GetY(green2.gear) > 808 and GetY(green2.gear) < 852) - or (GetHealth(green3.gear) and GetX(green3.gear) > 2850 and GetX(green3.gear) < 2945 and GetY(green3.gear) > 808 and GetY(green3.gear) < 852)) - and not isHeroAtWrongPlace() then - return true - end - return false -end - -function onCheckPoint3(gear) - -- after barrel jump - if ((GetHealth(green2.gear) and GetY(green2.gear) > 1550 and GetX(green2.gear) < 3000 and StoppedGear(green2.gear)) - or (GetHealth(green3.gear) and GetY(green3.gear) > 1550 and GetX(green3.gear) < 3000 and StoppedGear(green2.gear))) - and not isHeroAtWrongPlace() then - return true - end - return false -end - -function onCheckPoint4(gear) - -- hero at crates - if not hero.dead and GetX(hero.gear) > 1288 and GetX(hero.gear) < 1420 - and GetY(hero.gear) > 1840 and not isHeroAtWrongPlace() then - return true - end - return false -end - -------------- ACTIONS ------------------ ended = false @@ -402,52 +339,72 @@ SendStat(siCustomAchievement, loc("You can use the other 2 hogs to assist you.")) SendStat(siCustomAchievement, loc("Do not destroy the crates!")) if tookPartInBattle then - SendStat(siCustomAchievement, loc("You'll have to eliminate the Strawberry Assassins at the end.")) + if permitCaptainLimeDeath then + SendStat(siCustomAchievement, loc("You'll have to eliminate the Fruit Assassins at the end.")) + sendSimpleTeamRankings({teamC.name, teamA.name}) + else + sendSimpleTeamRankings({teamA.name}) + end else - SendStat(siCustomAchievement, loc("You'll have to eliminate Captain Lime at the end.")) - SendStat(siCustomAchievement, loc("Don't eliminate Captain Lime before collecting the last crate!")) + if permitCaptainLimeDeath then + SendStat(siCustomAchievement, loc("You'll have to eliminate Captain Lime at the end.")) + sendSimpleTeamRankings({teamB.name, teamA.name}) + else + SendStat(siCustomAchievement, loc("Don't eliminate Captain Lime before collecting the last crate!")) + sendSimpleTeamRankings({teamA.name}) + end end - SendStat(siPlayerKills,'0',teamA.name) EndGame() ended = true end end -function deviceCrates(gear) - TurnTimeLeft = 0 - if not tookPartInBattle then - AddAnim(dialog03) +-- Device crate got taken +function deviceCrateEvent(gear) + -- Stop hedgehog + SetGearMessage(deviceCrate.collector, 0) + if deviceCrate.collector == hero.gear then + -- Hog Solo collected the device crate + + if not tookPartInBattle then + -- Captain Lime turns evil + AddAnim(dialog03) + else + -- Fruit Assassins attack + for i=1,table.getn(redHedgehogs) do + RestoreHog(redHedgehogs[i].gear) + end + AddAnim(dialog04) + end + -- needs to be set to true for both plots + permitCaptainLimeDeath = true + AddAmmo(hero.gear, amSwitch, 0) + AddEvent(onSurface, {hero.gear}, surface, {hero.gear}, 0) else - for i=1,table.getn(redHedgehogs) do - RestoreHog(redHedgehogs[i].gear) - end - AddAnim(dialog04) + -- Player let the Green Bananas collect the crate. + -- How dumb! + -- Player will lose for this. + AnimationSetup05(deviceCrate.collector) + AddAnim(dialog05) end - -- needs to be set to true for both plots - permitCaptainLimeDeath = true - AddAmmo(hero.gear, amSwitch, 0) - AddEvent(onSurface, {hero.gear}, surface, {hero.gear}, 0) end function surface(gear) previousHog = -1 if tookPartInBattle then - if GetHealth(green1.gear) then - HideHog(green1.gear) - end + escapeHog(green1.gear) AddEvent(onRedTeamDeath, {green1.gear}, redTeamDeath, {green1.gear}, 0) else - DeleteGear(green1.human) - RestoreHog(green1.bot) - green1.gear = green1.bot + SetHogLevel(green1.gear, 1) + -- Equip Captain Lime with weapons + AddAmmo(green1.gear, amBazooka, 6) + AddAmmo(green1.gear, amGrenade, 6) + AddAmmo(green1.gear, amDEagle, 2) AddEvent(onGaptainLimeDeath, {green1.gear}, captainLimeDeath, {green1.gear}, 0) end - if GetHealth(green2.gear) then - HideHog(green2.gear) - end - if GetHealth(green3.gear) then - HideHog(green3.gear) - end + EndTurn(true) + escapeHog(green2.gear) + escapeHog(green3.gear) inBattle = true end @@ -457,8 +414,7 @@ SendStat(siGameResult, loc("Congratulations, you won!")) SendStat(siCustomAchievement, loc("You retrieved the lost part.")) SendStat(siCustomAchievement, loc("You defended yourself against Captain Lime.")) - SendStat(siPlayerKills,'1',teamA.name) - SendStat(siPlayerKills,'0',teamB.name) + sendSimpleTeamRankings({teamA.name, teamB.name}) EndGame() end @@ -467,35 +423,24 @@ saveCompletedStatus(3) SendStat(siGameResult, loc("Congratulations, you won!")) SendStat(siCustomAchievement, loc("You retrieved the lost part.")) - SendStat(siCustomAchievement, loc("You defended yourself against the Strawberry Assassins.")) - SendStat(siPlayerKills,'1',teamA.name) - SendStat(siPlayerKills,'0',teamC.name) + SendStat(siCustomAchievement, loc("You defended yourself against the Fruit Assassins.")) + sendSimpleTeamRankings({teamA.name, teamC.name}) EndGame() end -function checkPoint1(gear) - saveCheckPointLocal(2) -end - -function checkPoint2(gear) - saveCheckPointLocal(3) -end - -function checkPoint3(gear) - saveCheckPointLocal(4) -end - -function checkPoint4(gear) - saveCheckPointLocal(5) -end - -------------- ANIMATIONS ------------------ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end - TurnTimeLeft = 0 + end + if anim == dialog03 then + makeCptLimeEvil() + elseif anim == dialog05 then + heroIsAStupidFool() + else + EndTurn(true) + end end function AnimationSetup() @@ -509,6 +454,7 @@ table.insert(dialog01, {func = AnimSay, args = {green1.gear, loc("Good luck!"), SAY_SAY, 2000}}) 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 AddSkipFunction(dialog02, Skipanim, {dialog02}) table.insert(dialog02, {func = AnimWait, args = {hero.gear, 3000}}) @@ -524,98 +470,80 @@ table.insert(dialog02, {func = AnimWait, args = {hero.gear, 1800}}) table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("Okay then!"), SAY_SAY, 2000}}) table.insert(dialog02, {func = AnimSwitchHog, args = {hero.gear}}) + table.insert(dialog02, {func = ShowMission, args = goals[dialog02]}) -- DIALOG03 - At crates, hero learns that Captain Lime is bad AddSkipFunction(dialog03, Skipanim, {dialog03}) - table.insert(dialog03, {func = AnimWait, args = {hero.gear, 4000}}) + table.insert(dialog03, {func = AnimWait, args = {hero.gear, 2000}}) 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 = goToThesurface, args = {hero.gear}}) + table.insert(dialog03, {func = ShowMission, args = goals[dialog03]}) + table.insert(dialog03, {func = makeCptLimeEvil, args = {hero.gear}}) -- DIALOG04 - At crates, hero learns about the Assassins ambush AddSkipFunction(dialog04, Skipanim, {dialog04}) - table.insert(dialog04, {func = AnimWait, args = {hero.gear, 4000}}) + table.insert(dialog04, {func = AnimWait, args = {hero.gear, 2000}}) table.insert(dialog04, {func = FollowGear, args = {hero.gear}}) table.insert(dialog04, {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(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 = goToThesurface, args = {hero.gear}}) end +function AnimationSetup05(collector) + -- DIALOG05 - A member or the green bananas collected the target crate and steals it. Player loses + AddSkipFunction(dialog05, Skipanim, {dialog05}) + table.insert(dialog05, {func = AnimWait, args = {collector, 2000}}) + table.insert(dialog05, {func = FollowGear, args = {collector}}) + table.insert(dialog05, {func = AnimSay, args = {collector, loc("Oh yes! I got the device part! Now it belongs to me alone."), SAY_SAY, 4000}}) + table.insert(dialog05, {func = AnimWait, args = {collector, 3000}}) + table.insert(dialog05, {func = AnimSay, args = {hero.gear, loc("Hey! I was supposed to collect it!"), SAY_SHOUT, 3000}}) + table.insert(dialog05, {func = AnimWait, args = {hero.gear, 3000}}) + table.insert(dialog05, {func = AnimSay, args = {collector, loc("I don't care. It's worth a fortune! Good bye, you idiot!"), SAY_SAY, 5000}}) + table.insert(dialog05, {func = heroIsAStupidFool, args = {collector}}) + +end + ------------- OTHER FUNCTIONS --------------- +-- Hide hog and create a simple escaping effect, if hog exists. +-- No-op is hog does not exist +function escapeHog(gear) + if GetHealth(gear) then + AddVisualGear(GetX(gear), GetY(gear), vgtSmokeWhite, 0, false) + for i=1, 4 do + AddVisualGear(GetX(gear)-16+math.random(32), GetY(gear)-16+math.random(32), vgtSmokeWhite, 0, false) + end + HideHog(gear) + end +end + +function makeCptLimeEvil() + -- Turn Captain Lime evil + SetHogLevel(green1.gear, 1) + EndTurn(true) +end + function goToThesurface() - TurnTimeLeft = 0 + EndTurn(true) +end + +-- Player let wrong hog collect crate +function heroIsAStupidFool() + if not ended then + 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.")) + EndGame() + ended = true + end end function wind() SetWind(GetRandom(201)-100) end -function saveHogsPositions() - local positions; - positions = GetX(hero.gear)..","..GetY(hero.gear) - if GetHealth(green2.gear) then - positions = positions..","..GetX(green2.gear)..","..GetY(green2.gear) - else - positions = positions..",1,1" - end - if GetHealth(green3.gear) then - positions = positions..","..GetX(green3.gear)..","..GetY(green3.gear) - else - positions = positions..",1,1" - end - SaveCampaignVar("HogsPosition", positions) -end - -function loadHogsPositions() - local positions; - if GetCampaignVar("HogsPosition") then - positions = GetCampaignVar("HogsPosition") - else - return - end - positions = split(positions,",") - if positions[1] then - hero.x = positions[1] - hero.y = positions[2] - end - if positions[3] then - green2.x = tonumber(positions[3]) - green2.y = tonumber(positions[4]) - end - if positions[5] then - green3.x = tonumber(positions[5]) - green3.y = tonumber(positions[6]) - end -end - -function saveWeapons() - -- firepunch - gilder - deagle - watermelon - sniper - SaveCampaignVar("HeroAmmo", GetAmmoCount(hero.gear, amFirePunch)..GetAmmoCount(hero.gear, amGirder).. - GetAmmoCount(hero.gear, amDEagle)..GetAmmoCount(hero.gear, amWatermelon)..GetAmmoCount(hero.gear, amSniperRifle)) -end - -function loadWeapons() - local ammo = GetCampaignVar("HeroAmmo") - AddAmmo(hero.gear, amFirePunch, tonumber(ammo:sub(1,1))) - AddAmmo(hero.gear, amGirder, tonumber(ammo:sub(2,2))) - AddAmmo(hero.gear, amDEagle, tonumber(ammo:sub(3,3))) - AddAmmo(hero.gear, amWatermelon, tonumber(ammo:sub(4,4))) - AddAmmo(hero.gear, amSniperRifle, tonumber(ammo:sub(5,5))) -end - -function isHeroAtWrongPlace() - if GetX(hero.gear) > 1480 and GetX(hero.gear) < 1892 and GetY(hero.gear) > 1000 and GetY(hero.gear) < 1220 then - return true - end - return false -end - -function saveCheckPointLocal(cpoint) - AnimCaption(hero.gear, loc("Checkpoint reached!"), 3000) - saveCheckpoint(cpoint) - SaveCampaignVar("HeroHealth", GetHealth(hero.gear)) - saveHogsPositions() - saveWeapons() -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit03.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit03.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/fruit03.lua Sun Dec 17 00:09:24 2017 +0100 @@ -11,8 +11,10 @@ ----------------- VARIABLES -------------------- -- globals local missionName = loc("Precise shooting") -local timeLeft = 10000 -local lastWeaponUsed = amSniperRifle +local timeLeft = 0 +local lastWeaponUsed = amNothing +local firstTurn = true +local battleStarted = false local challengeObjectives = loc("Use your available weapons in order to eliminate the enemies.").."|".. loc("You can only use the sniper rifle or the watermelon bomb.").."|".. loc("You'll have only 2 watermelon bombs during the game.").."|".. @@ -25,7 +27,7 @@ local dialog01 = {} -- mission objectives local goals = { - [dialog01] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 4500}, + ["init"] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 35000}, } -- hogs local hero = { @@ -59,10 +61,12 @@ color = tonumber("38D61C",16) -- green } local teamB = { + -- Red Strawberries 1 name = loc("RS1"), color = tonumber("FF0000",16) -- red } local teamC = { + -- Red Strawberries 2 name = loc("RS2"), color = tonumber("FF0000",16) -- red } @@ -79,20 +83,23 @@ Explosives = 0 Map = "fruit03_map" Theme = "Fruit" + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + 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) -- enemies local hats = { "Bandit", "fr_apple", "fr_banana", "fr_lemon", "fr_orange", "fr_pumpkin", "Gasmask", "NinjaFull", "NinjaStraight", "NinjaTriangle" } - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamC.name, teamC.color, "bp2", "Island", "Default", "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, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "bp2", "Island", "Default", "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) @@ -101,13 +108,11 @@ initCheckpoint("fruit03") AnimInit() - AnimationSetup() end function onGameStart() - AnimWait(hero.gear, 3000) FollowGear(hero.gear) - ShowMission(missionName, loc("Challenge objectives"), challengeObjectives, -amSkip, 0) + ShowMission(unpack(goals["init"])) AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) AddEvent(onHeroWin, {hero.gear}, heroWin, {hero.gear}, 0) @@ -116,6 +121,10 @@ AddAmmo(hero.gear, amTeleport, 2) AddAmmo(hero.gear, amSniperRifle, 2) AddAmmo(hero.gear, amWatermelon, 2) + + AddAmmo(hero.gear, amSkip, 100) + timeLeft = 0 + --enemies ammo AddAmmo(enemiesOdd[1].gear, amDEagle, 100) AddAmmo(enemiesOdd[1].gear, amSniperRifle, 100) @@ -127,14 +136,20 @@ AddAmmo(enemiesEven[1].gear, amGrenade, 5) SendHealthStatsOff() - AddAnim(dialog01) end function onNewTurn() if CurrentHedgehog == hero.gear then - if GetAmmoCount(hero.gear, amSkip) == 0 then + if firstTurn then + -- Unique game rule in this mission: First turn has more time + TurnTimeLeft = 25000 + -- Generous ready time on first turn to give more time to read + ReadyTimeLeft = 35000 + battleStarted = true + firstTurn = false + end + if lastWeaponUsed == amSkip then TurnTimeLeft = TurnTime + timeLeft - AddAmmo(hero.gear, amSkip, 1) end timeLeft = 0 end @@ -169,9 +184,20 @@ end end -function onPrecise() - if GameTime > 3000 then - SetAnimSkip(true) +-- Hide mission panel when player does anything +function hideMissionOnAction() + if battleStarted then + HideMission() + end +end + +onSlot = hideMissionOnAction +onSetWeapon = hideMissionOnAction +onAttack = hideMissionOnAction +function onHogAttack(ammoType) + hideMissionOnAction() + if CurrentHedgehog == hero.gear then + lastWeaponUsed = ammoType end end @@ -205,8 +231,7 @@ SendStat(siGameResult, loc("Hog Solo lost, try again!")) SendStat(siCustomAchievement, loc("You have to eliminate all the enemies.")) SendStat(siCustomAchievement, loc("Read the challenge objectives from within the mission for more details.")) - SendStat(siPlayerKills,'1',teamB.name) - SendStat(siPlayerKills,'0',teamA.name) + sendSimpleTeamRankings({teamB.name, teamC.name, teamA.name}) EndGame() end @@ -214,38 +239,23 @@ saveBonus(2, 1) SendStat(siGameResult, loc("Congratulations, you won!")) SendStat(siCustomAchievement, string.format(loc("You completed the mission in %d rounds."), TotalRounds)) + local record = tonumber(GetCampaignVar("FastestPreciseShooting")) + if record ~= nil and TotalRounds >= record then + SendStat(siCustomAchievement, string.format(loc("Your fastest victory so far: %d rounds"), record)) + end + if record == nil or TotalRounds < record then + SaveCampaignVar("FastestPreciseShooting", tostring(TotalRounds)) + if record ~= nil then + SendStat(siCustomAchievement, loc("This is a new personal best, congratulations!")) + end + end SendStat(siCustomAchievement, loc("You will gain some extra ammo from the crates the next time you play the \"Getting to the device\" mission.")) - SendStat(siPlayerKills,'1',teamA.name) + sendSimpleTeamRankings({teamA.name, teamB.name, teamC.name}) + SaveCampaignVar("Mission10Won", "true") + checkAllMissionsCompleted() EndGame() end --------------- ANIMATIONS ------------------ - -function Skipanim(anim) - if goals[anim] ~= nil then - ShowMission(unpack(goals[anim])) - end - startBattle() -end - -function AnimationSetup() - -- DIALOG 01 - Start, game instructions - AddSkipFunction(dialog01, Skipanim, {dialog01}) - table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Somewhere in the Fruit Planet Hog Solo got lost ..."), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("... and got ambushed by the Red Strawberries"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Use your available weapons in order to eliminate the enemies"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You can only use the sniper rifle or the watermelon bomb"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You'll have only 2 watermelon bombs during the game"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("The first turn will last 25 sec and every other turn 15 sec"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("If you skip the game your time left will be added to your next turn"), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Some parts of the land are indestructible"), 5000}}) - table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}}) - table.insert(dialog01, {func = startBattle, args = {hero.gear}}) -end - ------------------ Other Functions ------------------- function turnHogs() @@ -271,14 +281,6 @@ end end -function startBattle() - AnimSwitchHog(enemiesOdd[table.getn(enemiesOdd)].gear) - TurnTimeLeft = 0 - -- these 2 are needed in order hero has 10 sec more in the first turn - timeLeft = 10000 - AddAmmo(hero.gear, amSkip, 0) -end - function isHog(gear) local hog = false for i=1,table.getn(enemiesOdd) do diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/global_functions.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/global_functions.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/global_functions.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,5 @@ +local missionsNum = 14 + function saveCompletedStatus(planetNum) -- 1 2 3 4 5 6 7 -- order: moon01, fruit01, fruit02, ice01, desert01, death01, final @@ -6,6 +8,21 @@ status = GetCampaignVar("MainMissionsStatus") end + local planetToLevelMapping = { + [1] = 2, + [2] = 3, + [3] = 8, + [4] = 5, + [5] = 4, + [6] = 9, + [7] = 14 + } + + local level = planetToLevelMapping[planetNum] + if level ~= nil then + SaveCampaignVar("Mission"..level.."Won", "true") + end + if planetNum == 1 then status = "1"..status:sub(2) elseif planetNum == status:len() then @@ -14,6 +31,21 @@ status = status:sub(1,planetNum-1).."1"..status:sub(planetNum+1) end SaveCampaignVar("MainMissionsStatus",status) + + checkAllMissionsCompleted() +end + +function checkAllMissionsCompleted() + local allMissions = true + for i=2, missionsNum do + if GetCampaignVar("Mission"..i.."Won") ~= "true" then + allMissions = false + break + end + end + if allMissions then + SaveCampaignVar("Mission1Won", "true") + end end function getCompletedStatus() @@ -23,11 +55,17 @@ end local status = { moon01 = false, + moon02 = false, fruit01 = false, fruit02 = false, + fruit03 = false, ice01 = false, + ice02 = false, desert01 = false, + desert02 = false, + desert03 = false, death01 = false, + death02 = false, final = false } if allStatus ~= "" then @@ -53,6 +91,25 @@ status.final = true end end + -- Bonus missions + if GetCampaignVar("Mission13Won") == "true" then + status.moon02 = true + end + if GetCampaignVar("Mission6Won") == "true" then + status.ice02 = true + end + if GetCampaignVar("Mission7Won") == "true" then + status.desert02 = true + end + if GetCampaignVar("Mission10Won") == "true" then + status.fruit03 = true + end + if GetCampaignVar("Mission11Won") == "true" then + status.death02 = true + end + if GetCampaignVar("Mission12Won") == "true" then + status.desert03 = true + end return status end @@ -61,13 +118,21 @@ if GetCampaignVar("CurrentMission") ~= mission then SaveCampaignVar("CurrentMission", mission) SaveCampaignVar("CurrentMissionCheckpoint", 1) - SaveCampaignVar("HogsPosition", "") else - checkPoint = tonumber(GetCampaignVar("currentMissionCheckpoint")) + checkPoint = tonumber(GetCampaignVar("CurrentMissionCheckpoint")) end return checkPoint end +-- Reset mission checkpoint to 1 +-- Returns true if the player reached a checkpoint before, false otherwise. +function resetCheckpoint(mission) + local cp = tonumber(GetCampaignVar("CurrentMissionCheckpoint")) + SaveCampaignVar("CurrentMissionCheckpoint", 1) + + return (type(cp) == "number" and cp > 1) +end + function saveCheckpoint(cp) SaveCampaignVar("CurrentMissionCheckpoint", cp) end @@ -118,3 +183,12 @@ end return res end + +-- Send team ranking stats. Teams is a list of teams in the desired order. +-- The default kills counter is used. +function sendSimpleTeamRankings(teams) + for t=1, #teams do + local teamname = teams[t] + SendStat(siPlayerKills, GetTeamStats(teamname).Kills, teamname) + end +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice01.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice01.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice01.lua Sun Dec 17 00:09:24 2017 +0100 @@ -22,9 +22,10 @@ local dialog01 = {} local dialog02 = {} -- mission objectives +local goToThantaString = loc("Go to Thanta and get the device part!") local goals = { - [dialog01] = {missionName, loc("Getting ready"), loc("Collect the icegun and get the device part from Thanta"), 1, 4500}, - [dialog02] = {missionName, loc("Win"), loc("Congratulations, you collected the device part!"), 1, 3500}, + [dialog01] = {missionName, loc("Getting ready"), loc("Collect the freezer and get the device part from Thanta.") .. "|" .. loc("Mines time: 0 seconds"), 1, 4500}, + ["checkpoint"] = {missionName, loc("Objectives"), goToThantaString .. "|" .. loc("Mines time: 0 seconds"), 1, 4500}, } -- crates local icegunY = 1950 @@ -72,11 +73,11 @@ bandit5.frozen = false bandit5.roundsToUnfreeze = 0 teamA.name = loc("Allies") -teamA.color = tonumber("FF0000",16) -- red +teamA.color = 0x38D61C -- green teamB.name = loc("Frozen Bandits") -teamB.color = tonumber("0033FF",16) -- blues +teamB.color = 0x0072FF -- blue teamC.name = loc("Hog Solo") -teamC.color = tonumber("38D61C",16) -- green +teamC.color = 0x38D61C -- green -------------- LuaAPI EVENT HANDLERS ------------------ @@ -90,6 +91,9 @@ Delay = 3 Map = "ice01_map" Theme = "Snow" + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 -- get the check point checkPointReached = initCheckpoint("ice01") @@ -108,16 +112,16 @@ end -- Hog Solo - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamC.name, teamC.color, "Simple", "Island", "Default", "hedgewars") hero.gear = AddHog(hero.name, 0, heroHealth, "war_desertgrenadier1") AnimSetGearPosition(hero.gear, hero.x, hero.y) HogTurnLeft(hero.gear, true) -- Ally - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamA.name, teamA.color, "heart", "Island", "Default", "cm_face") ally.gear = AddHog(ally.name, 0, 100, "war_airwarden02") AnimSetGearPosition(ally.gear, ally.x, ally.y) -- Frozen Bandits - AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "plant2", "Island", "Default", "cm_pirate") bandit1.gear = AddHog(bandit1.name, 1, 120, "Santa") AnimSetGearPosition(bandit1.gear, bandit1.x, bandit1.y) HogTurnLeft(bandit1.gear, true) @@ -144,7 +148,7 @@ AnimSetGearPosition(hero.gear, 1450, 910) end - AnimInit() + AnimInit(checkPointReached == 1) AnimationSetup() end @@ -206,8 +210,6 @@ AddAmmo(bandit4.gear, amBazooka, 5) AddAmmo(bandit5.gear, amBazooka, 5) - goToThantaString = loc("Go to Thanta and get the device part!") - if checkPointReached == 1 then AddAmmo(hero.gear, amBazooka, 1) SpawnAmmoCrate(icegunX, icegunY, amIceGun) @@ -215,11 +217,18 @@ AddEvent(onHeroAtIceGun, {hero.gear}, heroAtIceGun, {hero.gear}, 0) AddAnim(dialog01) elseif checkPointReached == 2 then + local baz = tonumber(GetCampaignVar("HeroAmmoIce01Bazooka")) or 1 + AddAmmo(hero.gear, amBazooka, baz) AddAmmo(hero.gear, amIceGun, 8) AnimCaption(hero.gear, goToThantaString, 5000) + ShowMission(unpack(goals["checkpoint"])) elseif checkPointReached == 3 then - AddAmmo(hero.gear, amIceGun, 6) + local baz = tonumber(GetCampaignVar("HeroAmmoIce01Bazooka")) or 0 + local ice = math.max(6, tonumber(GetCampaignVar("HeroAmmoIce01IceGun")) or 6) + AddAmmo(hero.gear, amBazooka, baz) + AddAmmo(hero.gear, amIceGun, ice) AnimCaption(hero.gear, goToThantaString, 5000) + ShowMission(unpack(goals["checkpoint"])) end SendHealthStatsOff() @@ -229,23 +238,25 @@ heroDamageAtCurrentTurn = 0 -- round has to start if hero goes near the column if not heroVisitedAntiFlyArea and CurrentHedgehog ~= hero.gear then - TurnTimeLeft = 0 + EndTurn(true) elseif not heroVisitedAntiFlyArea and CurrentHedgehog == hero.gear then TurnTimeLeft = -1 elseif not heroAtFinalStep and (CurrentHedgehog == bandit1.gear or CurrentHedgehog == bandit4.gear or CurrentHedgehog == bandit5.gear) then AnimSwitchHog(hero.gear) - TurnTimeLeft = 0 + 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 - TurnTimeLeft = 0 + EndTurn(true) else AnimSwitchHog(hero.gear) - TurnTimeLeft = 0 + EndTurn(true) end elseif CurrentHedgehog == ally.gear then - TurnTimeLeft = 0 + -- 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 @@ -406,13 +417,15 @@ function antiFlyArea(gear) heroAtAntiFlyArea = true if not heroVisitedAntiFlyArea then - TurnTimeLeft = 0 + EndTurn(true) FollowGear(hero.gear) AnimSwitchHog(bandit1.gear) FollowGear(hero.gear) - TurnTimeLeft = 0 + HogSay(hero.gear, loc("My flying saucer stopped working!"), SAY_THINK) + EndTurn(true) end AddAmmo(hero.gear, amJetpack, 0) + AddAmmo(hero.gear, amSkip, 100) heroVisitedAntiFlyArea = true end @@ -429,10 +442,9 @@ function heroDeath(gear) SendStat(siGameResult, loc("Hog Solo lost, try again!")) 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 icegun only.")) - SendStat(siCustomAchievement, loc("Use the bazooka and the flying saucer to get the icegun.")) - SendStat(siPlayerKills,'1',teamB.name) - SendStat(siPlayerKills,'0',teamC.name) + 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.")) + sendSimpleTeamRankings({teamB.name, teamC.name, teamA.name}) EndGame() end @@ -440,12 +452,17 @@ heroAtFinalStep = true saveCheckpoint("3") SaveCampaignVar("HeroHealth", GetHealth(hero.gear)) + SaveCampaignVar("HeroAmmoIce01IceGun", GetAmmoCount(hero.gear, amIceGun)) + SaveCampaignVar("HeroAmmoIce01Bazooka", GetAmmoCount(hero.gear, amBazooka)) + AddCaption(loc("Checkpoint reached!"), 0xFFFFFFFF, capgrpMessage2) end function columnCheckPoint(gear) saveCheckpoint("2") SaveCampaignVar("HeroHealth", GetHealth(hero.gear)) - AnimCaption(hero.gear, loc("Checkpoint reached!"), 5000) + AddCaption(loc("Checkpoint reached!"), 0xFFFFFFFF, capgrpMessage2) + SaveCampaignVar("HeroAmmoIce01IceGun", GetAmmoCount(hero.gear, amIceGun)) + SaveCampaignVar("HeroAmmoIce01Bazooka", GetAmmoCount(hero.gear, amBazooka)) end function heroAtIceGun(gear) @@ -456,15 +473,14 @@ SendStat(siGameResult, loc("Hog Solo lost, try again!")) 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 icegun only.")) - SendStat(siCustomAchievement, loc("Use the bazooka and the flying saucer to get the icegun.")) - SendStat(siPlayerKills,'1',teamB.name) - SendStat(siPlayerKills,'0',teamC.name) + 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.")) + sendSimpleTeamRankings({teamB.name, teamC.name, teamA.name}) EndGame() end function heroWin(gear) - TurnTimeLeft=0 + SetGearMessage(gear, 0) if GetX(hero.gear) < GetX(bandit1.gear) then HogTurnLeft(bandit1.gear, true) else @@ -478,8 +494,8 @@ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end - if anim == dialog02 then + end + if anim == dialog02 then actionsOnWin() else AnimSwitchHog(hero.gear) @@ -504,10 +520,10 @@ table.insert(dialog01, {func = AnimSay, args = {ally.gear, loc("There is one below us!"), SAY_SAY, 4000}}) table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}}) table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}}) - -- DIALOG 02 - Hero got to Thant2 + table.insert(dialog01, {func = ShowMission, args = goals[dialog01]}) + -- DIALOG 02 - Hero got to Thanta AddSkipFunction(dialog02, Skipanim, {dialog02}) table.insert(dialog02, {func = AnimWait, args = {hero.gear, 3000}}) - table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("Congratulations, now you can take Thanta's device part!"), 5000}}) table.insert(dialog02, {func = AnimSay, args = {bandit1.gear, loc("Oh! Please spare me. You can take all my treasures!"), SAY_SAY, 3000}}) table.insert(dialog02, {func = AnimWait, args = {hero.gear, 5000}}) table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("I just want the strange device you found!"), SAY_SAY, 3000}}) @@ -519,11 +535,16 @@ -------------- Other Functions ------------------- function actionsOnWin() + AddCaption(loc("Anti-Gravity Device Part (+1)"), GetClanColor(GetHogClan(hero.gear)), capgrpAmmoinfo) + PlaySound(sndShotgunReload) + + ShowMission(missionName, loc("Win"), loc("Congratulations, you collected the device part!"), 1, 3500) + saveCompletedStatus(4) SendStat(siGameResult, loc("Congratulations, you acquired the device part!")) SendStat(siCustomAchievement, string.format(loc("At the end of the game your health was %d."), GetHealth(hero.gear))) -- maybe add number of tries for each part? - SendStat(siPlayerKills,'1',teamC.name) - SendStat(siPlayerKills,'0',teamB.name) + sendSimpleTeamRankings({teamC.name, teamA.name, teamB.name}) + resetCheckpoint() -- reset this mission EndGame() end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice02.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice02.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice02.lua Sun Dec 17 00:09:24 2017 +0100 @@ -19,15 +19,15 @@ local gameEnded = false local RED = 0xff0000ff local GREEN = 0x38d61cff -local challengeObjectives = loc("To win the game you have to pass into the rings in time").. - "|"..loc("You'll get extra time in case you need it when you pass a ring").."|".. - loc("Every 2 rings, the ring color will be green and you'll get an extra flying saucer").."|".. - loc("Use the attack key twice to change the flying saucer while floating in mid-air") +local challengeObjectives = loc("To win the game you have to pass into the rings in time.").. + "|"..loc("You'll get extra time in case you need it when you pass a ring.").."|".. + loc("Every 2 rings, the ring color will be green and you'll get an extra flying saucer.").."|".. + loc("Use the attack key twice to change the flying saucer while floating in mid-air.") -- dialogs local dialog01 = {} -- mission objectives local goals = { - [dialog01] = {missionName, loc("Getting ready"), challengeObjectives, 1, 4500}, + ["init"] = {missionName, loc("Getting ready"), challengeObjectives, 1, 25000}, } -- hogs local hero = {} @@ -44,9 +44,9 @@ ally.x = 860 ally.y = 130 teamA.name = loc("Hog Solo") -teamA.color = tonumber("38D61C",16) -- green +teamA.color = 0x38D61C -- green teamB.name = loc("Allies") -teamB.color = tonumber("FF0000",16) -- red +teamB.color = 0x38D61C -- green -- way points local current waypoint = 1 local waypoints = { @@ -70,36 +70,41 @@ -------------- LuaAPI EVENT HANDLERS ------------------ function onGameInit() - GameFlags = gfInvulnerable + GameFlags = gfInvulnerable + gfOneClanMode Seed = 1 TurnTime = 15000 + Ready = 25000 CaseFreq = 0 MinesNum = 0 MinesTime = 1 Explosives = 0 Map = "ice02_map" Theme = "Snow" + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + 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) -- Ally - AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "heart", "Island", "Default", "cm_face") ally.gear = AddHog(ally.name, 0, 100, "war_airwarden02") AnimSetGearPosition(ally.gear, ally.x, ally.y) HogTurnLeft(ally.gear, true) initCheckpoint("ice02") - AnimInit() + AnimInit(true) AnimationSetup() end function onGameStart() AnimWait(hero.gear, 3000) FollowGear(hero.gear) - ShowMission(missionName, loc("Challenge objectives"), challengeObjectives, -amSkip, 0) + ShowMission(unpack(goals["init"])) + HideMission() AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) @@ -135,14 +140,32 @@ gameEnded = true -- GAME OVER, WIN! totalTime = totalTime - TurnTimeLeft - totalTime = totalTime / 1000 + local totalTimePrinted = totalTime / 1000 local saucersLeft = GetAmmoCount(hero.gear, amJetpack) local saucersUsed = totalSaucers - saucersLeft SendStat(siGameResult, loc("Hooray! You are a champion!")) - SendStat(siCustomAchievement, string.format(loc("You completed the mission in %.3f seconds.", totalTime))) - 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)) - SendStat(siPlayerKills,'1',teamA.name) + SendStat(siCustomAchievement, string.format(loc("You completed the mission in %.3f seconds."), totalTimePrinted)) + local record = tonumber(GetCampaignVar("IceStadiumBestTime")) + if record ~= nil and totalTime >= record then + SendStat(siCustomAchievement, string.format(loc("Your personal best time so far: %.3f seconds"), record/1000)) + end + if record == nil or totalTime < record then + SaveCampaignVar("IceStadiumBestTime", tostring(totalTime)) + if record ~= nil then + SendStat(siCustomAchievement, loc("This is a new personal best time, congratulations!")) + 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)) + + record = tonumber(GetCampaignVar("IceStadiumLeastSaucersUsed")) + if record == nil or saucersUsed < record then + SaveCampaignVar("IceStadiumLeastSaucersUsed", tostring(saucersUsed)) + end + + sendSimpleTeamRankings({teamA.name}) + SaveCampaignVar("Mission6Won", "true") + checkAllMissionsCompleted() EndGame() end end @@ -154,6 +177,12 @@ end end +function onGearAdd(gear) + if GetGearType(gear) == gtJetpack then + HideMission() + end +end + function onPrecise() if GameTime > 3000 then SetAnimSkip(true) @@ -178,10 +207,8 @@ -------------- ANIMATIONS ------------------ function Skipanim(anim) - if goals[anim] ~= nil then - ShowMission(unpack(goals[anim])) - end - startFlying() + ShowMission(unpack(goals["init"])) + startFlying() end function AnimationSetup() @@ -192,10 +219,9 @@ table.insert(dialog01, {func = AnimSay, args = {ally.gear, loc("This is the Olympic stadium of saucer flying."), SAY_SAY, 4000}}) table.insert(dialog01, {func = AnimSay, args = {ally.gear, loc("All the saucer pilots dream to come here one day in order to compete with the best!"), SAY_SAY, 5000}}) table.insert(dialog01, {func = AnimSay, args = {ally.gear, loc("Now you have the chance to try and claim the place that you deserve among the best."), SAY_SAY, 6000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Use the saucer and pass through the rings."), 5000}}) - table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Pause the game by pressing the pause key (default \"P\") for more details"), 5000}}) table.insert(dialog01, {func = AnimSay, args = {ally.gear, loc("Can you do it?"), SAY_SAY, 2000}}) table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}}) + table.insert(dialog01, {func = ShowMission, args = goals["init"]}) table.insert(dialog01, {func = startFlying, args = {hero.gear}}) end @@ -203,7 +229,7 @@ function startFlying() AnimSwitchHog(ally.gear) - TurnTimeLeft = 0 + EndTurn(true) challengeStarted = true end @@ -217,15 +243,22 @@ wp.gear = AddVisualGear(1,1,vgtCircle,1,true) -- add bonus time and "fuel" if currentWaypoint % 2 == 0 then - PlaySound(sndBump) -- what's the crate sound? + PlaySound(sndShotgunReload) SetVisualGearValues(wp.gear, wp.x,wp.y, 20, 200, 0, 0, 100, radius, 3, RED) AddAmmo(hero.gear, amJetpack, GetAmmoCount(hero.gear, amJetpack)+1) totalSaucers = totalSaucers + 1 - local message = loc("Got 1 more saucer") + local vgear = AddVisualGear(GetX(hero.gear), GetY(hero.gear), vgtAmmo, 0, true) + if vgear ~= nil then + SetVisualGearValues(vgear,nil,nil,nil,nil,nil,amJetpack) + end + local message if TurnTimeLeft <= 22000 then TurnTimeLeft = TurnTimeLeft + 8000 totalTime = totalTime + 8000 - message = message..loc(" and 8 more seconds added to the clock") + PlaySound(sndExtraTime) + message = loc("Got 1 more saucer and 8 more seconds added to the clock") + else + message = loc("Got 1 more saucer") end AnimCaption(hero.gear, message, 4000) else @@ -234,6 +267,7 @@ TurnTimeLeft = TurnTimeLeft + 6000 totalTime = totalTime + 6000 if currentWaypoint ~= 1 then + PlaySound(sndExtraTime) AnimCaption(hero.gear, loc("6 more seconds added to the clock"), 4000) end end @@ -243,6 +277,7 @@ return true else AnimCaption(hero.gear, loc("Congratulations, you won!"), 4000) + PlaySound(sndVictory, hero.gear) end return false end @@ -264,6 +299,6 @@ SendStat(siCustomAchievement, loc("You'll get extra time in case you need it when you pass a ring.")) SendStat(siCustomAchievement, loc("Every 2 rings you'll get extra flying saucers.")) SendStat(siCustomAchievement, loc("Use the attack key twice to change the flying saucer while being in air.")) - SendStat(siPlayerKills,'0',teamA.name) + sendSimpleTeamRankings({teamA.name}) EndGame() end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon01.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon01.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon01.lua Sun Dec 17 00:09:24 2017 +0100 @@ -19,11 +19,14 @@ local battleZoneReached = false local checkPointReached = 1 -- 1 is start of the game local afterDialog02 = false +local gameOver = false -- dialogs local dialog01 = {} local dialog02 = {} local dialog03 = {} local dialog04 = {} +local dialog05 = {} +local dialog06 = {} -- mission objectives local goals = { [dialog01] = {missionName, loc("Getting ready"), loc("Go to the upper platform and get the weapons in the crates!"), 1, 4500}, @@ -74,7 +77,7 @@ professor.x = 3800 professor.y = 1600 professor.dead = false -professor.health = 100 +professor.health = 120 minion1.name = loc("Minion") minion1.x = 2460 minion1.y = 1450 @@ -84,14 +87,15 @@ minion3.name = loc("Minion") minion3.x = 3500 minion3.y = 1750 + teamA.name = loc("PAotH") -teamA.color = tonumber("FF0000",16) -- red +teamA.color = 0x38D61C -- green teamB.name = loc("Minions") -teamB.color = tonumber("0033FF",16) -- blue +teamB.color = 0x0072FF -- blue teamC.name = loc("Professor") -teamC.color = tonumber("0033FF",16) -- blue +teamC.color = 0x0072FF -- blue teamD.name = loc("Hog Solo") -teamD.color = tonumber("38D61C",16) -- green +teamD.color = 0x38D61C -- green -------------- LuaAPI EVENT HANDLERS ------------------ @@ -103,11 +107,13 @@ MinesNum = 0 MinesTime = 3000 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, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamD.name, teamD.color, "Simple", "Island", "Default", "hedgewars") if tonumber(GetCampaignVar("HeroHealth")) then hero.gear = AddHog(hero.name, 0, tonumber(GetCampaignVar("HeroHealth")), "war_desertgrenadier1") else @@ -115,7 +121,7 @@ end AnimSetGearPosition(hero.gear, hero.x, hero.y) -- PAotH - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamA.name, teamA.color, "Earth", "Island", "Default", "cm_galaxy") paoth1.gear = AddHog(paoth1.name, 0, 100, "scif_2001O") AnimSetGearPosition(paoth1.gear, paoth1.x, paoth1.y) HogTurnLeft(paoth1.gear, true) @@ -129,12 +135,12 @@ AnimSetGearPosition(paoth4.gear, paoth4.x, paoth4.y) HogTurnLeft(paoth4.gear, true) -- Professor - AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy") - professor.gear = AddHog(professor.name, 0, 120, "tophats") + AddTeam(teamC.name, teamC.color, "star", "Island", "Default", "cm_sine") + 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, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "eyecross", "Island", "Default", "cm_sine") minion1.gear = AddHog(minion1.name, 1, 50, "Gasmask") AnimSetGearPosition(minion1.gear, minion1.x, minion1.y) HogTurnLeft(minion1.gear, true) @@ -158,7 +164,7 @@ end end - AnimInit() + AnimInit(true) AnimationSetup() end @@ -184,16 +190,18 @@ AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) AddEvent(onProfessorDeath, {professor.gear}, professorDeath, {professor.gear}, 0) AddEvent(onMinionsDeath, {professor.gear}, minionsDeath, {professor.gear}, 0) + AddEvent(onProfessorAndMinionsDeath, {professor.gear}, professorAndMinionsDeath, {professor.gear}, 0) AddEvent(onProfessorHit, {professor.gear}, professorHit, {professor.gear}, 1) if checkPointReached == 1 then AddAmmo(hero.gear, amRope, 2) + AddAmmo(hero.gear, amSkip, 0) SpawnAmmoCrate(bazookaX, weaponsY, amBazooka) - SpawnAmmoCrate(parachuteX, weaponsY, amParachute) + SpawnUtilityCrate(parachuteX, weaponsY, amParachute) SpawnAmmoCrate(grenadeX, weaponsY, amGrenade) SpawnAmmoCrate(deserteagleX, weaponsY, amDEagle) AddEvent(onWeaponsPlatform, {hero.gear}, weaponsPlatform, {hero.gear}, 0) - TurnTimeLeft = 0 + EndTurn(true) AddAnim(dialog01) elseif checkPointReached == 2 then AddAmmo(hero.gear, amBazooka, 3) @@ -204,7 +212,7 @@ GameFlags = bor(GameFlags,gfDisableWind) weaponsAcquired = true afterDialog02 = true - TurnTimeLeft = 0 + EndTurn(true) AddAnim(dialog02) end -- this event check goes here to be executed after the onWeaponsPlatform check @@ -218,6 +226,7 @@ SetAmmo(amParachute, 0, 0, 0, 1) SetAmmo(amGrenade, 0, 0, 0, 6) SetAmmo(amDEagle, 0, 0, 0, 4) + SetAmmo(amSkip, 9, 0, 0, 1) end function onGameTick() @@ -228,24 +237,31 @@ ExecuteAfterAnimations() CheckEvents() if CurrentHedgehog ~= hero.gear and not battleZone then - TurnTimeLeft = 0 + EndTurn(true) end end function onNewTurn() -- rounds start if hero got his weapons or got near the enemies - if not weaponsAcquired and not battleZoneReached and CurrentHedgehog ~= hero.gear then - TurnTimeLeft = 0 - elseif weaponsAcquired and not battleZoneReached and CurrentHedgehog ~= hero.gear and afterDialog02 then - battleZone(hero.gear) - elseif not weaponsAcquired and not battleZoneReached and CurrentHedgehog == hero.gear then - TurnTimeLeft = -1 + if CurrentHedgehog == hero.gear then + if not weaponsAcquired and not battleZoneReached then + TurnTimeLeft = -1 + end + elseif CurrentHedgehog == minion1.gear or CurrentHedgehog == minion2.gear or CurrentHedgehog == minion3.gear then + if not battleZoneReached then + EndTurn(true) + 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 - TurnTimeLeft = 0 + EndTurn(true) elseif CurrentHedgehog == professor.gear then - AnimSwitchHog(hero.gear) - TurnTimeLeft = 0 + if weaponsAcquired and not battleZoneReached and afterDialog02 then + battleZone(hero.gear) + else + EndTurn(true) + end end end @@ -281,7 +297,8 @@ end function onBattleZone(gear) - if not battleZoneReached and not hero.dead and GetX(gear) > 1900 and StoppedGear(gear) then + if not battleZoneReached and not hero.dead and StoppedGear(gear) and + (GetX(gear) > 1900 or (weaponsAcquired and GetY(gear) > 1200)) then return true end return false @@ -313,32 +330,48 @@ return false end +function onProfessorAndMinionsDeath(gear) + if professor.dead and (not (GetHealth(minion1.gear) or GetHealth(minion2.gear) or GetHealth(minion3.gear))) then + return true + end + return false +end + -------------- ACTIONS ------------------ function weaponsPlatform(gear) - saveCheckpoint("2") - SaveCampaignVar("HeroHealth",GetHealth(hero.gear)) - TurnTimeLeft = 0 - weaponsAcquired = true - SetWind(60) - GameFlags = bor(GameFlags,gfDisableWind) - AddAmmo(hero.gear, amRope, 0) - if GetX(hero.gear) < 1900 then - AddAnim(dialog02) + if not battleZoneReached then + -- Player entered weapons platform before entering battle zone. + -- Checkpoint and dialog! + saveCheckpoint("2") + SaveCampaignVar("HeroHealth",GetHealth(hero.gear)) + EndTurn(true) + weaponsAcquired = true + SetWind(60) + GameFlags = bor(GameFlags,gfDisableWind) + AddAmmo(hero.gear, amRope, 0) + AddAmmo(hero.gear, amSkip, 100) + if GetX(hero.gear) < 1900 then + AddAnim(dialog02) + end end + -- The player may screw up by going into the battle zone too early (dialog03). + -- In that case, the player is punished for this stupid move (no checkpoint), + -- but it is still theoretically possible to win by going for the weapons + -- very fast. end function heroDeath(gear) SendStat(siGameResult, loc("Hog Solo lost, try again!")) SendStat(siCustomAchievement, loc("You have to get the weapons and rescue the PAotH researchers.")) - SendStat(siPlayerKills,'1',teamC.name) - SendStat(siPlayerKills,'0',teamD.name) + sendSimpleTeamRankings({teamC.name, teamB.name, teamD.name, teamA.name}) EndGame() end function battleZone(gear) - TurnTimeLeft = 0 battleZoneReached = true + AddAmmo(hero.gear, amSkip, 100) + EndTurn(true) if weaponsAcquired then AddAnim(dialog04) else @@ -352,43 +385,64 @@ end end -function professorDeath(gear) - if GetHealth(minion1.gear) then - AnimSay(minion1.gear, loc("The boss has fallen! Retreat!"), SAY_SHOUT, 6000) - elseif GetHealth(minion2.gear) then - AnimSay(minion2.gear, loc("The boss has fallen! Retreat!"), SAY_SHOUT, 6000) - elseif GetHealth(minion3.gear) then - AnimSay(minion3.gear, loc("The boss has fallen! Retreat!"), SAY_SHOUT, 6000) - end - DismissTeam(teamB.name) - AnimCaption(hero.gear, loc("Congrats! You made them run away!"), 6000) - AnimWait(hero.gear,5000) - +function victory() + AnimCaption(hero.gear, loc("Congrats! You won!"), 6000) saveCompletedStatus(1) SendStat(siGameResult, loc("Hog Solo wins, congratulations!")) - SendStat(siCustomAchievement, loc("You have eliminated Professor Hogevil.")) - SendStat(siCustomAchievement, loc("You drove the minions away.")) - SendStat(siPlayerKills,'1',teamD.name) - SendStat(siPlayerKills,'0',teamC.name) + sendSimpleTeamRankings({teamD.name, teamA.name, teamC.name, teamB.name}) SaveCampaignVar("CosmosCheckPoint", "5") -- hero got fuels + resetCheckpoint() -- reset this mission + gameOver = true EndGame() end -function minionsDeath(gear) - -- do staffs here - AnimSay(professor.gear, loc("I may lost this battle, but I haven't lost the war yet!"), SAY_SHOUT, 6000) - DismissTeam(teamC.name) - AnimCaption(hero.gear, loc("Congrats! You won!"), 6000) - AnimWait(hero.gear,5000) +function professorAndMinionsDeath(gear) + if gameOver then return end + SendStat(siCustomAchievement, loc("You have eliminated the whole evil team. You're pretty tough!")) + + SaveCampaignVar("ProfDiedOnMoon", "1") + victory() +end + +function professorDeath(gear) + if gameOver then return end + local m1h = GetHealth(minion1.gear) + local m2h = GetHealth(minion2.gear) + local m3h = GetHealth(minion3.gear) + if m1h == 0 or m2h == 0 or m3h == 0 then return end - saveCompletedStatus(1) - SendStat(siGameResult, loc("Congratulations, you won!")) + if m1h and m1h > 0 and StoppedGear(minion1.gear) then + Dialog06Setup(minion1.gear) + elseif m2h and m2h > 0 and StoppedGear(minion2.gear) then + Dialog06ASetup(minion2.gear) + elseif m3h and m3h > 0 and StoppedGear(minion3.gear) then + Dialog06Setup(minion3.gear) + end + AddAnim(dialog06) +end + +function afterDialog06() + EndTurn(true) + SendStat(siCustomAchievement, loc("You have eliminated Professor Hogevil.")) + SendStat(siCustomAchievement, loc("You drove the minions away.")) + SaveCampaignVar("ProfDiedOnMoon", "1") + victory() +end + +function afterDialog05() + EndTurn(true) + HideHog(professor.gear) SendStat(siCustomAchievement, loc("You have eliminated the evil minions.")) SendStat(siCustomAchievement, loc("You drove Professor Hogevil away.")) - SendStat(siPlayerKills,'1',teamD.name) - SendStat(siPlayerKills,'0',teamC.name) - SaveCampaignVar("CosmosCheckPoint", "5") -- hero got fuels - EndGame() + + SaveCampaignVar("ProfDiedOnMoon", "0") + victory() +end + +function minionsDeath(gear) + if professor.dead or GetHealth(professor.gear) == nil or GetHealth(professor.gear) == 0 then return end + if gameOver then return end + AddAnim(dialog05) end -------------- ANIMATIONS ------------------ @@ -396,13 +450,22 @@ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end - if anim == dialog02 then + end + if anim == dialog01 then + AnimSwitchHog(hero.gear) + elseif anim == dialog02 then setAfterDialog02() - elseif anim == dialog03 then + AnimSwitchHog(hero.gear) + elseif anim == dialog03 or anim == dialog04 then startCombat() - else - AnimSwitchHog(hero.gear) + elseif anim == dialog05 then + runaway(professor.gear) + afterDialog05() + elseif anim == dialog06 then + runaway(minion1.gear) + runaway(minion2.gear) + runaway(minion3.gear) + afterDialog06() end end @@ -421,13 +484,16 @@ table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("Okay, then you have to go and take some of the weapons we have hidden in case of an emergency!"), SAY_SAY, 7000}}) table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("They are up there! Take this rope and hurry!"), SAY_SAY, 7000}}) table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Ehm, okay ..."), SAY_SAY, 2500}}) + table.insert(dialog01, {func = ShowMission, args = goals[dialog01]}) table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}}) -- DIALOG 02 - To the weapons platform AddSkipFunction(dialog02, Skipanim, {dialog02}) - table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("Checkpoint reached!"), 4000}}) + table.insert(dialog02, {func = AnimWait, args = {hero.gear, 100}}) + table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("Checkpoint reached!"), 4000}}) table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("I've made it! Yeah!"), SAY_SHOUT, 4000}}) table.insert(dialog02, {func = AnimSay, args = {paoth1.gear, loc("Nice! Now hurry and get down! You have to rescue my friends!"), SAY_SHOUT, 7000}}) table.insert(dialog02, {func = setAfterDialog02, args = {}}) + table.insert(dialog02, {func = ShowMission, args = goals[dialog02]}) table.insert(dialog02, {func = AnimSwitchHog, args = {hero.gear}}) -- DIALOG 03 - Hero spotted and has no weapons AddSkipFunction(dialog03, Skipanim, {dialog03}) @@ -435,6 +501,7 @@ table.insert(dialog03, {func = AnimSay, args = {minion1.gear, loc("Look, boss! There is the target!"), SAY_SHOUT, 4000}}) table.insert(dialog03, {func = AnimSay, args = {professor.gear, loc("Prepare for battle!"), SAY_SHOUT, 4000}}) table.insert(dialog03, {func = AnimSay, args = {hero.gear, loc("Oops, I've been spotted and I have no weapons! I am doomed!"), SAY_THINK, 4000}}) + table.insert(dialog03, {func = ShowMission, args = goals[dialog03]}) table.insert(dialog03, {func = startCombat, args = {hero.gear}}) -- DIALOG 04 - Hero spotted and *HAS* weapons AddSkipFunction(dialog04, Skipanim, {dialog04}) @@ -442,7 +509,35 @@ table.insert(dialog04, {func = AnimSay, args = {minion1.gear, loc("Look, boss! There is the target!"), SAY_SHOUT, 4000}}) table.insert(dialog04, {func = AnimSay, args = {professor.gear, loc("Prepare for battle!"), SAY_SHOUT, 4000}}) table.insert(dialog04, {func = AnimSay, args = {hero.gear, loc("Here we go!"), SAY_THINK, 4000}}) + table.insert(dialog04, {func = ShowMission, args = goals[dialog04]}) table.insert(dialog04, {func = startCombat, args = {hero.gear}}) + -- DIALOG 05 - All minions dead + AddSkipFunction(dialog05, Skipanim, {dialog05}) + table.insert(dialog05, {func = AnimWait, args = {professor.gear, 1500}}) + table.insert(dialog05, {func = AnimSay, args = {professor.gear, loc("I may lost this battle, but I haven't lost the war yet!"), SAY_SHOUT, 5000}}) + table.insert(dialog05, {func = runaway, args = {professor.gear}}) + table.insert(dialog05, {func = afterDialog05, args = {professor.gear}}) +end + +function Dialog06Setup(livingMinion) + -- DIALOG 06 - Professor dead + AddSkipFunction(dialog06, Skipanim, {dialog06}) + table.insert(dialog06, {func = AnimWait, args = {livingMinion, 1500}}) + table.insert(dialog06, {func = AnimSay, args = {livingMinion, loc("The boss has fallen! Retreat!"), SAY_SHOUT, 3000}}) + table.insert(dialog06, {func = runaway, args = {minion1.gear}}) + table.insert(dialog06, {func = runaway, args = {minion2.gear}}) + table.insert(dialog06, {func = runaway, args = {minion3.gear}}) + table.insert(dialog06, {func = afterDialog06, args = {livingMinion}}) +end + +function runaway(gear) + if GetHealth(gear) then + AddVisualGear(GetX(gear)-5, GetY(gear)-5, vgtSmoke, 0, false) + AddVisualGear(GetX(gear)+5, GetY(gear)+5, vgtSmoke, 0, false) + AddVisualGear(GetX(gear)-5, GetY(gear)+5, vgtSmoke, 0, false) + AddVisualGear(GetX(gear)+5, GetY(gear)-5, vgtSmoke, 0, false) + SetState(gear, bor(GetState(gear), gstInvisible)) + end end ------------------- custom "animation" functions -------------------------- @@ -450,7 +545,7 @@ function startCombat() -- use this so minion3 will gain control AnimSwitchHog(minion3.gear) - TurnTimeLeft = 0 + EndTurn(true) end function setAfterDialog02() diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon02.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon02.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon02.lua Sun Dec 17 00:09:24 2017 +0100 @@ -15,12 +15,13 @@ local currentPosition = 1 local previousTimeLeft = 0 local startChallenge = false +local winningTime = nil -- dialogs local dialog01 = {} local dialog02 = {} -- mission objectives local goals = { - [dialog01] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 4500}, + [dialog01] = {missionName, loc("Challenge objectives"), challengeObjectives, 1, 0}, } -- hogs local hero = { @@ -44,7 +45,7 @@ } local teamB = { name = loc("Crazy Runner"), - color = tonumber("FF0000",16) -- red + color = tonumber("0072FF",16) -- blue } -------------- LuaAPI EVENT HANDLERS ------------------ @@ -55,31 +56,32 @@ TurnTime = 25000 CaseFreq = 0 MinesNum = 0 - MinesTime = 1 Explosives = 0 Map = "moon02_map" Theme = "Cheese" + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 -- Hog Solo - AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamA.name, teamA.color, "Simple", "Island", "Default", "hedgewars") hero.gear = AddHog(hero.name, 0, 1, "war_desertgrenadier1") AnimSetGearPosition(hero.gear, hero.x, hero.y) -- Crazy Runner - AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy") + AddTeam(teamB.name, teamB.color, "ring", "Island", "Default", "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) initCheckpoint("moon02") - AnimInit() + AnimInit(true) AnimationSetup() end function onGameStart() AnimWait(hero.gear, 3000) FollowGear(hero.gear) - ShowMission(missionName, loc("Challenge objectives"), challengeObjectives, -amSkip, 0) AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0) @@ -90,10 +92,24 @@ AddAnim(dialog01) end +-- Hide mission panel when jumping or shooting rope +function onGearAdd(gear) + if GetGearType(gear) == gtRope then + HideMission() + end +end + +function onLJump() + if startChallenge then + HideMission() + end +end +onHJump = onLJump + function onNewTurn() if startChallenge and currentPosition < 5 then if CurrentHedgehog ~= hero.gear then - TurnTimeLeft = 0 + EndTurn(true) else if GetAmmoCount(hero.gear, amRope) == 0 then lose() @@ -146,12 +162,12 @@ function Skipanim(anim) if goals[anim] ~= nil then ShowMission(unpack(goals[anim])) - end - if anim == dialog01 then + end + if anim == dialog01 then moveRunner() elseif anim == dialog02 then win() - end + end end function AnimationSetup() @@ -163,6 +179,7 @@ table.insert(dialog01, {func = AnimSay, args = {runner.gear, loc("We'll play a game first."), SAY_SAY, 3000}}) table.insert(dialog01, {func = AnimSay, args = {runner.gear, loc("I'll let you know whatever I know about him if you manage to catch me 3 times."), SAY_SAY, 4000}}) 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 AddSkipFunction(dialog02, Skipanim, {dialog02}) @@ -199,7 +216,26 @@ HogTurnLeft(runner.gear, false) end AddAnim(dialog02) - TurnTimeLeft = 0 + + -- Update time record + local baseTime = 0 + for i=1, #runner.places do + baseTime = baseTime + runner.places[i].turnTime + end + winningTime = baseTime - TurnTimeLeft + 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 + if record == nil or winningTime < record then + SaveCampaignVar("FastestBlueHogCatch", tostring(winningTime)) + if record ~= nil then + SendStat(siCustomAchievement, loc("This is a new personal best time, congratulations!")) + end + end + + EndTurn(true) elseif currentPosition < 4 then if not startChallenge then startChallenge = true @@ -216,7 +252,7 @@ currentPosition = currentPosition + 1 AddVisualGear(GetX(runner.gear), GetY(runner.gear), vgtExplosion, 0, false) SetGearPosition(runner.gear, runner.places[currentPosition].x, runner.places[currentPosition].y) - TurnTimeLeft = 0 + EndTurn(true) end end @@ -226,13 +262,15 @@ 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.")) - SendStat(siPlayerKills,'0',teamA.name) + sendSimpleTeamRankings({teamB.name, teamA.name}) EndGame() end function win() SendStat(siGameResult, loc("Congratulations, you are the fastest!")) - SendStat(siCustomAchievement, loc("You have managed to catch the blue hedgehog in time.")) - SendStat(siPlayerKills,'1',teamA.name) + -- siCustomAchievements were added earlier + sendSimpleTeamRankings({teamA.name, teamB.name}) + SaveCampaignVar("Mission13Won", "true") + checkAllMissionsCompleted() EndGame() end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Basic_Training_-_Sniper_Rifle.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,424 @@ +-- Hedgewars SniperRifle Training +-- Scripting Example + +-- Lines such as this one are comments - they are ignored +-- by the game, no matter what kind of text is in there. +-- It's also possible to place a comment after some real +-- instruction as you see below. In short, everything +-- following "--" is ignored. + +--------------------------------------------------------------- +-- At first we implement the localization library using loadfile. +-- This allows us to localize strings without needing to think +-- about translations. +-- We can use the function loc(text) to localize a string. + +HedgewarsScriptLoad("/Scripts/Locale.lua") + +-- This variable will hold the number of destroyed targets. +local score = 0 +-- This variable will hold the number of shots from the sniper rifle +local shots = 0 +-- This variable represents the number of targets to destroy. +local score_goal = 27 +-- This variable controls how many milliseconds/ticks we'd +-- like to wait before we end the round once all targets +-- have been destroyed. +local end_timer = 1000 -- 1000 ms = 1 s +-- This variable is set to true if the game is lost (i.e. +-- time runs out). +local game_lost = false +-- This variable will point to the hog's gear +local player = nil +-- Current target gear +local target = nil +-- This variable will grab the time left at the end of the round +local time_goal = 0 + +-- Like score, but targets before a blow-up sequence count double. +-- Used to calculate final target score +local score_bonus = 0 + +local cinematic = false + +-- Timer of dynamite (shorter than usual) +local dynamiteTimer = 2000 +-- Number of dynamite gears currently in game +local dynamiteCounter = 0 +-- Table of dynamite gears, indexed by gear ID +local dynamiteGears = {} + +-- Position for delayed targets +local delayedTargetTargetX, delayedTargetY + +-- This is a custom function to make it easier to +-- spawn more targets with just one line of code +-- You may define as many custom functions as you +-- like. + +-- Spawns a target at (x, y) +function spawnTarget(x, y) + -- add a new target gear + target = AddGear(x, y, gtTarget, 0, 0, 0, 0) + -- have the camera move to the target so the player knows where it is + FollowGear(target) +end + +-- Remembers position to spawn a target at (x, y) after a dynamite explosion +function spawnTargetDelayed(x, y) + delayedTargetX = x + delayedTargetY = y +end + +-- Cut sequence to blow up land with dynamite +function blowUp(x, y, follow) + if cinematic == false then + cinematic = true + SetCinematicMode(true) + end + -- Spawn dynamite with short timer + local dyna = AddGear(x, y, gtDynamite, 0, 0, 0, dynamiteTimer) + -- Fix dynamite animation due to non-default timer + SetTag(dyna, div(5000-dynamiteTimer, 166)) + if follow then + FollowGear(dyna) + end +end + +function onNewTurn() + SetWeapon(amSniperRifle) +end + +-- This function is called before the game loads its +-- resources. +-- It's one of the predefined function names that will +-- be called by the game. They give you entry points +-- where you're able to call your own code using either +-- provided instructions or custom functions. +function onGameInit() + -- At first we have to overwrite/set some global variables + -- that define the map, the game has to load, as well as + -- other things such as the game rules to use, etc. + -- Things we don't modify here will use their default values. + + -- The base number for the random number generator + Seed = 0 + -- Game settings and rules + GameFlags = gfMultiWeapon + gfOneClanMode + gfArtillery + -- The time the player has to move each round (in ms) + TurnTime = 150000 + -- The frequency of crate drops + CaseFreq = 0 + -- The number of mines being placed + 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 + Theme = "Golf" + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 + + -- Create the player team + AddTeam(loc("Sniperz"), 14483456, "Simple", "Island", "Default", "cm_crosshair") + -- And add a hog to it + player = AddHog(loc("Hunter"), 0, 1, "Sniper") + SetGearPosition(player, 602, 1465) +end + +-- This function is called when the round starts +-- it spawns the first target that has to be destroyed. +-- In addition it shows the scenario goal(s). +function onGameStart() + -- Disable graph in stats screen + SendHealthStatsOff() + -- Spawn the first target. + spawnTarget(860,1020) + + -- 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) +end + +-- This function is called every game tick. +-- Note that there are 1000 ticks within one second. +-- You shouldn't try to calculate too complicated +-- code here as this might slow down your game. +function onGameTick20() + if game_lost then + return + end + -- If time's up, set the game to be lost. + -- We actually check the time to be "1 ms" as it + -- 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() + -- Just to be sure set the goal time to 1 ms + time_goal = 1 + end + -- If the goal is reached or we've lost ... + if score == score_goal or game_lost then + -- ... check to see if the time we'd like to + -- wait has passed and then ... + if end_timer == 0 then + -- ... end the game ... + generateStats() + EndGame() + else + -- ... or just lower the timer by 1. + -- Reset the time left to stop the timer + TurnTimeLeft = time_goal + end + end_timer = end_timer - 20 + end +end + +-- This function is called when the game is initialized +-- to request the available ammo and probabilities +function onAmmoStoreInit() + -- add an unlimited supply of shotgun ammo + SetAmmo(amSniperRifle, 9, 0, 0, 0) +end + +--[[ Re-center camera to target after using sniper rifle. +This makes it easier to find the target. If we don't +do this, the camera would contantly bounce back to +the hog which would be annoying. ]] +function onAttack() + if target and GetCurAmmoType() == amSniperRifle then + FollowGear(target) + end +end + +-- Insta-blow up dynamite with precise key +function onPrecise() + for gear, _ in pairs(dynamiteGears) do + SetTimer(gear, 0) + end +end + +-- This function is called when a new gear is added. +-- We use it to count the number of shots, which we +-- in turn use to calculate the final score and stats +function onGearAdd(gear) + if GetGearType(gear) == gtSniperRifleShot then + shots = shots + 1 + elseif GetGearType(gear) == gtDynamite then + dynamiteCounter = dynamiteCounter + 1 + dynamiteGears[gear] = true + end +end + +-- This function is called before a gear is destroyed. +-- We use it to count the number of targets destroyed. +function onGearDelete(gear) + local gt = GetGearType(gear) + + if gt == gtCase then + game_lost = true + return + end + + if (gt == gtDynamite) then + -- Dynamite blow-up, used to continue the game. + dynamiteCounter = dynamiteCounter - 1 + dynamiteGears[gear] = nil + + -- Wait for all dynamites to be destroyed before we continue. + -- Most cut scenes spawn multiple dynamites. + if dynamiteCounter == 0 then + if cinematic then + cinematic = false + SetCinematicMode(false) + end + -- Add bonus score for the previuos target + score_bonus = score_bonus + 1 + -- Now *actually* spawn the delayed target + spawnTarget(delayedTargetX, delayedTargetY) + end + return + end + + if gt == gtTarget then + target = nil + -- Add one point to our score/counter + score = score + 1 + score_bonus = score_bonus + 1 + -- If we haven't reached the goal ... + if score < score_goal then + -- ... spawn another target. + if score == 1 then + spawnTarget(1520,1350) + elseif score == 2 then + spawnTarget(1730,1040) + elseif score == 3 then + spawnTarget(2080,780) + elseif score == 4 then + -- Short cut scene, blows up up lots up land and prepares + -- next target position. + AddCaption(loc("Good so far!") .. " " .. loc("Keep it up!")); + blowUp(1730,1226) + blowUp(1440,1595) + blowUp(1527,1575) + blowUp(1614,1595) + blowUp(1420,1675, true) + blowUp(1527,1675) + blowUp(1634,1675) + blowUp(1440,1755) + blowUp(1527,1775) + blowUp(1614,1755) + -- Target appears *after* the cutscene. + spawnTargetDelayed(1527,1667) + elseif score == 5 then + spawnTarget(2175,1300) + elseif score == 6 then + spawnTarget(2250,940) + elseif score == 7 then + spawnTarget(2665,1540) + elseif score == 8 then + spawnTarget(3040,1160) + elseif score == 9 then + spawnTarget(2930,1500) + elseif score == 10 then + AddCaption(loc("This one's tricky.")); + spawnTarget(700,720) + elseif score == 11 then + AddCaption(loc("Well done.")); + blowUp(914,1222) + blowUp(1050,1222) + blowUp(1160,1008) + blowUp(1160,1093) + blowUp(1160,1188) + blowUp(375,911) + blowUp(510,911) + blowUp(640,911) + blowUp(780,911) + blowUp(920,911) + blowUp(1060,913) + blowUp(1198,913, true) + spawnTargetDelayed(1200,830) + elseif score == 12 then + spawnTarget(1430,450) + elseif score == 13 then + spawnTarget(796,240) + elseif score == 14 then + spawnTarget(300,10) + elseif score == 15 then + spawnTarget(2080,820) + elseif score == 16 then + AddCaption(loc("Demolition is fun!")); + blowUp(2110,920) + blowUp(2210,920) + blowUp(2200,305) + blowUp(2300,305) + blowUp(2300,400, true) + blowUp(2300,500) + blowUp(2300,600) + blowUp(2300,700) + blowUp(2300,800) + blowUp(2300,900) + blowUp(2401,305) + blowUp(2532,305) + blowUp(2663,305) + spawnTargetDelayed(2300,760) + elseif score == 17 then + spawnTarget(2738,190) + elseif score == 18 then + spawnTarget(2590,-100) + elseif score == 19 then + AddCaption(loc("Will this ever end?")); + blowUp(2790,305) + blowUp(2930,305) + blowUp(3060,305) + blowUp(3190,305) + blowUp(3310,305, true) + blowUp(3393,613) + blowUp(2805,370) + blowUp(2805,500) + blowUp(2805,630) + blowUp(2805,760) + blowUp(2805,890) + blowUp(3258,370) + blowUp(3258,475) + blowUp(3264,575) + spawnTargetDelayed(3230,290) + elseif score == 20 then + spawnTarget(3670,250) + elseif score == 21 then + spawnTarget(2620,-100) + elseif score == 22 then + spawnTarget(2870,300) + elseif score == 23 then + spawnTarget(3850,900) + elseif score == 24 then + spawnTarget(3780,300) + elseif score == 25 then + spawnTarget(3670,0) + elseif score == 26 then + AddCaption(loc("Last Target!")); + spawnTarget(3480,1200) + end + else + if not game_lost then + -- Victory! + AddCaption(loc("Victory!"), 0xFFFFFFFF, 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) + FollowGear(CurrentHedgehog) + + -- Disable hog controls + SetInputMask(0) + AddAmmo(CurrentHedgehog, amSniperRifle, 0) + + -- Save the time left so we may keep it. + time_goal = TurnTimeLeft + end + end + end +end + +-- 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 + if shots > 0 then + accuracy = (score/shots)*100 + end + local end_score_targets = (score_bonus * 200) + 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) + end_score_overall = end_score_time + end_score_targets + end_score_accuracy + + 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)) + SendStat(siCustomAchievement, string.format(loc("You had %.2fs remaining on the clock (+%d points)."), (time_goal/1000), end_score_time)) + else + SendStat(siGameResult, loc("You lose!")) + + 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(siPlayerKills, tostring(end_score_overall), loc("Sniperz")) +end + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,5 @@ +file(GLOB Scripts *.lua) + +install(FILES + ${Scripts} + DESTINATION ${SHAREPATH}Data/Missions/Challenge) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Hedgelove.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Hedgelove.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,38 @@ +HedgewarsScriptLoad("/Scripts/SpeedShoppa.lua") + +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 + +params.time = 45000 +params.map = "Hedgelove" +params.theme = "Nature" + +params.hog_x = 410 +params.hog_y = 934 +params.crates = { + { x = 183, y = 710 }, + { x = 202, y = 519 }, + { x = 336, y = 356 }, + { x = 658, y = 363 }, + { x = 1029, y = 39 }, + { x = 758, y = 879 }, + { x = 1324, y = 896 }, + { x = 1410, y = 390 }, + { x = 1746, y = 348 }, + { x = 1870, y = 538 }, + { x = 1884, y = 723 }, + { x = 1682, y = 970 }, +} +params.extra_onGameStart = function() + PlaceGirder(394, 1000, 0) + PlaceGirder(1696, 1000, 0) +end + +SpeedShoppaMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Ropes.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_Ropes.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,43 @@ +HedgewarsScriptLoad("/Scripts/SpeedShoppa.lua") + +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.time = 115000 +params.map = "Ropes" +params.theme = "City" + +params.hog_x = 3754 +params.hog_y = 1742 +params.crates = { + { x = 3533, y = 1404 }, + { x = 3884, y = 1048 }, + { x = 3366, y = 664 }, + { x = 3162, y = 630 }, + { x = 2872, y = 402 }, + { x = 3812, y = 322 }, + { x = 3685, y = 34 }, + { x = 3324, y = 540 }, + { x = 2666, y = 224 }, + { x = 2380, y = 1002 }, + { x = 2224, y = 1008 }, + { x = 2226, y = 854 }, + { x = 3274, y = 1754 }, + { x = 3016, y = 1278 }, + { x = 2756, y = 1716 }, + { x = 2334, y = 1756 }, + { x = 1716, y = 1752 }, + { x = 1526, y = 1464 }, + { x = 356, y = 1734 }, + { x = 598, y = 1444 }, + { x = 1084, y = 1150 }, + { x = 358, y = 834 }, + { x = 936, y = 200 }, + { x = 1540, y = 514 }, +} + +SpeedShoppaMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,54 @@ +HedgewarsScriptLoad("/Scripts/SpeedShoppa.lua") + +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" +params.theme = "Castle" + +params.hog_x = 543 +params.hog_y = 1167 +params.crates = { + { x = 170, y = 172 }, + { x = 216, y = 478 }, + { x = 616, y = 966 }, + { x = 291, y = 1898 }, + { x = 486, y = 1965 }, + { x = 852, y = 1289 }, + { x = 1224, y = 1625 }, + { x = 925, y = 584 }, + { x = 2013, y = 141 }, + { x = 2250, y = 351 }, + { x = 2250, y = 537 }, + { x = 2472, y = 513 }, + { x = 1974, y = 459 }, + { x = 1995, y = 1068 }, + { x = 2385, y = 1788 }, + { x = 1698, y = 1725 }, + { x = 2913, y = 1092 }, + { x = 3972, y = 1788 }, + { x = 3762, y = 1635 }, + { x = 2577, y = 1473 }, + { x = 3612, y = 1068 }, + { x = 3945, y = 687 }, + { x = 2883, y = 618 }, + { x = 3543, y = 471 }, + { x = 3636, y = 306 }, + { x = 3210, y = 321 }, + { x = 3426, y = 126 }, + { x = 3033, y = 1590 }, + { x = 3774, y = 1341 }, + { x = 1254, y = 297 }, + { x = 1300, y = 1022 }, + { x = 1410, y = 1292 }, + { x = 868, y = 1812 }, + { x = 3426, y = 954 }, +} + +SpeedShoppaMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/ClimbHome.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/ClimbHome.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,34 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") + +isSinglePlayer = true + +-- trying to allow random theme, but fixed theme objects... +-- Also skip some ugly themes, or ones where the sky is "meh" +--local themes = { "Art","Cake","City","EarthRise","Halloween","Olympics","Underwater","Bamboo","Castle","Compost","Eyes","Hell","Planes","Bath","Cave","CrazyMission","Freeway","Island","Sheep","Blox","Cheese","Deepspace","Fruit","Jungle","Snow","Brick","Christmas","Desert","Golf","Nature","Stage" } +local themes = {"Christmas","Hell","Bamboo","City","Island","Bath","Compost","Jungle","Desert","Nature","Olympics","Brick","EarthRise","Sheep","Cake","Freeway","Snow","Castle","Fruit","Stage","Cave","Golf","Cheese","Halloween"} +local totalHedgehogs = 0 +local HH = {} +local teams = {} +local dummyHog = nil + + +function onGameInit() + -- Ensure people get same map for same theme + Theme = themes[GetRandom(#themes)+1] + Seed = ClimbHome + TurnTime = 999999999 + EnableGameFlags(gfOneClanMode) + DisableGameFlags(gfBottomBorder+gfBorder) + CaseFreq = 0 + Explosives = 0 + MineDudPercent = 0 + Map = "ClimbHome" + AddTeam(loc("Lonely Hog"), 0xDD0000, "bubble", "Island", "Default") + player = AddHog(loc("Climber"), 0, 1, "NoHat") + if showWaterStats then + dummyHog = AddHog(" ", 0, 1, "NoHat") + HH[dummyHog] = nil + totalHedgehogs = totalHedgehogs - 1 + SendStat(siClanHealth, tostring(32640), " ") + end +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Bazooka_easy.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Bazooka_easy.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,35 @@ +HedgewarsScriptLoad("/Scripts/TargetPractice.lua") + +local params = { + ammoType = amBazooka, + gearType = gtShell, + missionTitle = loc("Target Practice: Bazooka (easy)"), + wind = 50, + solidLand = true, + map = "Lonely_Island", + theme = "Island", + hog_x = 1439, + hog_y = 482, + hogName = loc("Zook"), + hogHat = "war_americanww2helmet", + teamName = loc("Team Zook"), + targets = { + { x = 1310, y = 756 }, + { x = 1281, y = 893 }, + { x = 1376, y = 670 }, + { x = 1725, y = 907 }, + { x = 1971, y = 914 }, + { x = 1098, y = 955 }, + { x = 1009, y = 877 }, + { x = 930, y = 711 }, + { x = 771, y = 744 }, + { x = 385, y = 405 }, + { x = 442, y = 780 }, + { x = 620, y = 639 }, + { x = 311, y = 239 }, + }, + time = 80000, + shootText = loc("You have launched %d bazookas."), +} + +TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Bazooka_hard.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Bazooka_hard.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,40 @@ +HedgewarsScriptLoad("/Scripts/TargetPractice.lua") + +local params = { + ammoType = amBazooka, + gearType = gtShell, + missionTitle = loc("Target Practice: Bazooka (hard)"), + wind = 20, + solidLand = true, + artillery = true, + map = "SB_Grassy", + theme = "Castle", + hog_x = 2112, + hog_y = 913, + hogName = loc("Zook"), + hogHat = "war_americanww2helmet", + teamName = loc("Team Zook"), + targets = { + { x = 2660, y = 936 }, + { x = 2857, y = 629 }, + { x = 3044, y = 851 }, + { x = 3200, y = 441 }, + { x = 2931, y = 440 }, + { x = 3264, y = 370 }, + { x = 1880, y = 684 }, + { x = 1392, y = 672 }, + { x = 1587, y = 656 }, + { x = 1300, y = 840 }, + { x = 952, y = 814 }, + { x = 862, y = 634 }, + { x = 748, y = 794 }, + { x = 639, y = 548 }, + { x = 1730, y = 549 }, + { x = 1466, y = 566 }, + { x = 3716, y = 954 }, + }, + time = 180000, + shootText = loc("You have launched %d bazookas."), +} + +TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Cluster_Bomb.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Cluster_Bomb.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,33 @@ +HedgewarsScriptLoad("/Scripts/TargetPractice.lua") + +local params = { + ammoType = amClusterBomb, + gearType = gtClusterBomb, + missionTitle = loc("Cluster Bomb Training"), + solidLand = false, + map = "Trash", + theme = "Golf", + hog_x = 756, + hog_y = 370, + hogName = loc("Private Nolak"), + hogHat = "war_desertgrenadier1", + teamName = loc("The Hogies"), + targets = { + { x = 628, y = 0 }, + { x = 891, y = 0 }, + { x = 1309, y = 0 }, + { x = 1128, y = 0 }, + { x = 410, y = 0 }, + { x = 1564, y = 0 }, + { x = 1248, y = 476 }, + { x = 169, y = 0 }, + { x = 1720, y = 0 }, + { x = 1441, y = 0 }, + { x = 599, y = 0 }, + { x = 1638, y = 0 }, + }, + time = 180000, + shootText = loc("You have thrown %d cluster bombs."), +} + +TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Grenade_easy.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Grenade_easy.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,31 @@ +HedgewarsScriptLoad("/Scripts/TargetPractice.lua") + +local params = { + ammoType = amGrenade, + gearType = gtGrenade, + missionTitle = loc("Target Practice: Grenade (easy)"), + solidLand = true, + artillery = true, + map = "SB_Crystal", + theme = "Cave", + hog_x = 2039, + hog_y = 684, + hogName = loc("Grenadier"), + hogHat = "war_desertgrenadier2", + teamName = loc("Grenade Group"), + teamFlag = "cm_grenade", + targets = { + { x = 1834, y = 747 }, + { x = 2308, y = 729 }, + { x = 1659, y = 718 }, + { x = 1196, y = 704 }, + { x = 2650, y = 826 }, + { x = 1450, y = 705 }, + { x = 2774, y = 848 }, + { x = 2970, y = 704 }, + }, + time = 80000, + shootText = loc("You have thrown %d grenades."), +} + +TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Grenade_hard.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Grenade_hard.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,42 @@ +HedgewarsScriptLoad("/Scripts/TargetPractice.lua") + +local params = { + ammoType = amGrenade, + gearType = gtGrenade, + missionTitle = loc("Target Practice: Grenade (hard)"), + solidLand = true, + artillery = true, + map = "SB_Crystal", + theme = "Cave", + hog_x = 1456, + hog_y = 669, + hogName = loc("Grenadier"), + hogHat = "war_desertgrenadier2", + teamName = loc("Grenade Group"), + teamFlag = "cm_grenade", + targets = { + { x = 1190, y = 694 }, + { x = 962, y = 680 }, + { x = 1090, y = 489 }, + { x = 1664, y = 666 }, + { x = 1584, y = 580 }, + { x = 2160, y = 738 }, + { x = 1836, y = 726 }, + { x = 618, y = 753 }, + { x = 837, y = 668 }, + { x = 2424, y = 405 }, + { x = 2310, y = 742 }, + { x = 294, y = 897 }, + { x = 472, y = 855 }, + { x = 2949, y = 724}, + { x = 3356, y = 926 }, + { x = 3734, y = 918 }, + { x = 170, y = 874 }, + + + }, + time = 180000, + shootText = loc("You have thrown %d grenades."), +} + +TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Homing_Bee.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Homing_Bee.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,36 @@ +HedgewarsScriptLoad("/Scripts/TargetPractice.lua") + +local params = { + ammoType = amBee, + gearType = gtBee, + missionTitle = loc("Target Practice: Homing Bee"), + solidLand = true, + map = "Hedgewars", + theme = "Nature", + hog_x = 1990, + hog_y = 514, + hogHat = "NoHat", + teamGrave = "bp2", + teamFlag = "cm_flower", + targets = { + { x = 1949, y = 273 }, + { x = 1734, y = 322 }, + { x = 1574, y = 340 }, + { x = 1642, y = 474 }, + { x = 2006, y = 356 }, + { x = 1104, y = 285 }, + { x = 565, y = 440 }, + { x = 732, y = 350 }, + { x = 2022, y = 396 }, + { x = 366, y = 360 }, + { x = 556, y = 300 }, + { x = 902, y = 306 }, + { x = 924, y = 411 }, + { x = 227, y = 510 }, + { x = 150, y = 300 }, + }, + time = 120000, + shootText = loc("You have launched %d homing bees."), +} + +TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Shotgun.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/Target_Practice_-_Shotgun.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,39 @@ +HedgewarsScriptLoad("/Scripts/TargetPractice.lua") + +local params = { + ammoType = amShotgun, + gearType = gtShotgunShot, + missionTitle = loc("Target Practice: Shotgun"), + solidLand = false, + map = "SB_Haunty", + theme = "Halloween", + hog_x = 320, + hog_y = 324, + hogHat = "NoHat", + hogGrave = "Bones", + teamFlag = "cm_crosshair", + targets = { + { x = 495, y = 501 }, + { x = 227, y = 530 }, + { x = 835, y = 934 }, + { x = 1075, y = 889 }, + { x = 887, y = 915 }, + { x = 1148, y = 750 }, + { x = 916, y = 915 }, + { x = 1211, y = 700 }, + { x = 443, y = 505 }, + { x = 822, y = 964 }, + { x = 1092, y = 819 }, + { x = 1301, y = 683 }, + { x = 1480, y = 661 }, + { x = 1492, y = 786 }, + { x = 1605, y = 562 }, + { x = 1545, y = 466 }, + { x = 1654, y = 392 }, + { x = 1580, y = 334 }, + { x = 1730, y = 222 }, + }, + time = 90000, +} + +TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_RCPlane_Challenge.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,499 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local player = nil +local RCGear = nil +local planesUsed = 0 +local planeTimer = 0 +local planeUhOh = false +local cratesLeft = 0 +local crateStreak = 0 +local longestCrateStreak = 0 +local commentTimer = 0 +local missiles = 0 +local totalMissiles = 0 +local missileScanTimer = 0 +local nextComment = sndNone + +function onGameInit() + + Seed = 1 + GameFlags = gfInfAttack + gfInvulnerable + gfOneClanMode + gfSolidLand + + -- Basically unlimited turn time + TurnTime = 100000000 + + Map = "Ropes" + Theme = "Eyes" + + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 + + CaseFreq = 0 + MinesNum = 0 + Explosives = 0 + + AddTeam(loc("Wannabe Flyboys"), 14483456, "Simple", "Island", "Default", "cm_scout") + player = AddHog(loc("Ace"), 0, 80, "Gasmask") + SetGearPosition(player, 1380, 1500) + +end + + + +function onGameStart() + + SendHealthStatsOff() + + 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 + ) + + PlaceGirder(2192, 508, 6) + PlaceGirder(2192, 670, 6) + PlaceGirder(2193, 792, 2) + PlaceGirder(2100, 825, 4) + PlaceGirder(2009, 899, 6) + PlaceGirder(2084, 992, 4) + PlaceGirder(2145, 1087, 6) + PlaceGirder(2199, 1235, 5) + PlaceGirder(2308, 1296, 0) + PlaceGirder(2424, 1234, 7) + PlaceGirder(2473, 1129, 2) + PlaceGirder(2437, 1046, 1) + PlaceGirder(2409, 927, 6) + PlaceGirder(2408, 763, 6) + PlaceGirder(2404, 540, 6) + PlaceGirder(2426, 423, 3) + PlaceGirder(2550, 400, 4) + PlaceGirder(2668, 425, 1) + PlaceGirder(2707, 541, 6) + PlaceGirder(2706, 703, 6) + PlaceGirder(2705, 867, 6) + PlaceGirder(2779, 962, 4) + PlaceGirder(2894, 924, 3) + PlaceGirder(2908, 802, 6) + PlaceGirder(2907, 639, 6) + PlaceGirder(3052, 566, 4) + PlaceGirder(2971, 394, 4) + PlaceGirder(3103, 448, 7) + PlaceGirder(3047, 654, 0) + PlaceGirder(3043, 746, 6) + PlaceGirder(3265, 1583, 6) + PlaceGirder(3256, 1491, 4) + PlaceGirder(3187, 1401, 6) + PlaceGirder(3326, 1400, 6) + PlaceGirder(774, 530, 5) + PlaceGirder(922, 595, 4) + PlaceGirder(1079, 533, 7) + PlaceGirder(1139, 386, 6) + PlaceGirder(1074, 237, 5) + PlaceGirder(723, 381, 6) + PlaceGirder(781, 229, 7) + PlaceGirder(927, 746, 6) + PlaceGirder(874, 736, 0) + PlaceGirder(982, 737, 0) + PlaceGirder(2430, 1730, 4) + + PlaceGirder(1613, 1104, 7) + PlaceGirder(1564, 1256, 6) + PlaceGirder(1643, 1341, 5) + PlaceGirder(1780, 1372, 4) + PlaceGirder(1869, 1296, 7) + PlaceGirder(1858, 1163, 5) + PlaceGirder(1739, 1044, 5) + PlaceGirder(1621, 926, 5) + PlaceGirder(1597, 985, 5) + PlaceGirder(1449, 939, 4) + PlaceGirder(1473, 874, 4) + PlaceGirder(2092, 1352, 7) + PlaceGirder(2145, 1444, 7) + PlaceGirder(2004, 1443, 3) + PlaceGirder(1978, 1523, 2) + PlaceGirder(2021, 1596, 1) + PlaceGirder(2103, 1625, 0) + PlaceGirder(2208, 1551, 7) + PlaceGirder(2327, 1431, 7) + PlaceGirder(2395, 1478, 6) + PlaceGirder(2396, 1600, 2) + PlaceGirder(2495, 1285, 6) + PlaceGirder(2494, 1408, 2) + PlaceGirder(2547, 530, 0) + + PlaceGirder(2451, 1551, 0) + PlaceGirder(2551, 706, 6) + PlaceGirder(2551, 869, 6) + PlaceGirder(2623, 1016, 5) + PlaceGirder(2773, 1083, 4) + PlaceGirder(2924, 1019, 7) + PlaceGirder(2568, 1491, 7) + PlaceGirder(2618, 1346, 6) + PlaceGirder(2674, 1195, 7) + PlaceGirder(2822, 1142, 4) + PlaceGirder(2963, 1069, 7) + PlaceGirder(3067, 938, 5) + PlaceGirder(2803, 1373, 2) + PlaceGirder(2811, 1559, 2) + + tempG = SpawnHealthCrate(930, 557) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(979, 692) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(876, 703) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2309, 1260) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1733, 1127) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1738, 1320) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(3249, 1460) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(3051, 617) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2972, 353) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2548, 358) + + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2090, 1580) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1752, 1753) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1865, 1758) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1985, 1760) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2429, 1760) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2810, 1480) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2800, 1277) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2806, 1107) + SetHealth(tempG, 25) + + PlaceGirder(1897, 903, 6) + PlaceGirder(1916, 784, 3) + PlaceGirder(2010, 732, 4) + PlaceGirder(2082, 639, 6) + PlaceGirder(2081, 516, 2) + PlaceGirder(1985, 487, 4) + PlaceGirder(1862, 407, 5) + PlaceGirder(1855, 224, 7) + PlaceGirder(2006, 163, 4) + PlaceGirder(2128, 187, 1) + PlaceGirder(2251, 213, 4) + PlaceGirder(2413, 213, 4) + PlaceGirder(1952, 618, 0) + PlaceGirder(957, 1068, 4) + PlaceGirder(794, 1069, 4) + PlaceGirder(728, 1163, 6) + PlaceGirder(728, 1287, 2) + PlaceGirder(802, 1342, 4) + PlaceGirder(966, 1342, 4) + PlaceGirder(674, 1032, 1) + PlaceGirder(554, 1011, 4) + PlaceGirder(445, 1056, 3) + PlaceGirder(422, 1174, 6) + PlaceGirder(369, 1341, 5) + PlaceGirder(495, 1313, 5) + PlaceGirder(568, 1379, 3) + PlaceGirder(577, 1202, 2) + PlaceGirder(744, 1490, 5) + PlaceGirder(760, 1617, 7) + PlaceGirder(622, 1693, 4) + PlaceGirder(476, 1623, 5) + PlaceGirder(376, 1697, 1) + PlaceGirder(955, 1746, 2) + PlaceGirder(1025, 1746, 2) + PlaceGirder(1090, 1745, 2) + PlaceGirder(1156, 1746, 2) + PlaceGirder(3806, 1530, 2) + PlaceGirder(3880, 1464, 2) + PlaceGirder(3738, 1458, 2) + PlaceGirder(3806, 1390, 2) + PlaceGirder(3805, 1588, 0) + PlaceGirder(3676, 1609, 3) + PlaceGirder(3930, 1615, 1) + PlaceGirder(3719, 1295, 0) + PlaceGirder(3888, 1294, 0) + PlaceGirder(3661, 1385, 2) + PlaceGirder(3955, 1377, 2) + PlaceGirder(3982, 1518, 0) + PlaceGirder(3378, 440, 2) + PlaceGirder(3447, 492, 4) + PlaceGirder(3564, 529, 1) + PlaceGirder(3596, 647, 6) + PlaceGirder(3521, 740, 4) + PlaceGirder(3524, 838, 4) + PlaceGirder(3644, 819, 3) + PlaceGirder(3691, 708, 6) + PlaceGirder(3690, 545, 6) + PlaceGirder(3612, 433, 5) + PlaceGirder(3463, 383, 4) + PlaceGirder(2815, 122, 7) + PlaceGirder(2960, 72, 4) + PlaceGirder(3032, 123, 2) + PlaceGirder(3063, 174, 0) + PlaceGirder(3095, 124, 2) + PlaceGirder(3169, 71, 4) + PlaceGirder(3320, 124, 5) + PlaceGirder(3210, 179, 2) + PlaceGirder(2932, 181, 2) + + tempG = SpawnHealthCrate(3804, 1461) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(3269, 1742) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(3066, 121) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(3207, 104) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2928, 103) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1997, 202) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2253, 159) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2132, 774) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(2549, 490) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(3527, 694) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(3777, 78) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1124, 1746) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1056, 1740) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(993, 1742) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(799, 1298) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(577, 1126) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(596, 1463) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(3854, 1043) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(1944, 567) + SetHealth(tempG, 25) + tempG = SpawnHealthCrate(338, 1748) + SetHealth(tempG, 25) + + +end + +--function onGameTick() + + --if RCGear ~= nil then + -- AddCaption(GetTimer(RCGear)) + --end + +--end + +function onGameTick20() + if RCGear ~= nil then + if(GetTimer(RCGear) < 3000 and planeUhOh == false) then + PlaySound(sndUhOh, player) + planeUhOh = true + end + planeTimer = planeTimer + 20 + end + if commentTimer > 0 then + commentTimer = commentTimer - 20 + elseif(nextComment ~= sndNone) then + PlaySound(nextComment, player) + nextComment = sndNone + end + if missileScanTimer > 0 then + missileScanTimer = missileScanTimer - 20 + else + if crateStreak == 0 and missiles == 3 then + PlaySound(sndMissed, player) + missiles = 4 + end + end +end + +function onNewTurn() + TurnTimeLeft = -1 +end + +function onGearAdd(gear) + + if GetGearType(gear) == gtRCPlane then + RCGear = gear + planesUsed = planesUsed + 1 + planeTimer = 0 + missiles = 0 + end + + if GetGearType(gear) == gtCase then + cratesLeft = cratesLeft + 1 + end + + if GetGearType(gear) == gtAirBomb then + totalMissiles = totalMissiles + 1 + end +end + +function onGearDelete(gear) + + if GetGearType(gear) == gtRCPlane then + + RCGear = nil + planeUhOh = false + missiles = 0 + AddCaption(string.format(loc("Planes used: %d"), planesUsed)) + + if(planeTimer < 2000 and crateStreak == 0) then + nextComment = sndStupid + commentTimer = math.min(2000-planeTimer, 800) + elseif(planeTimer < 5000 and crateStreak == 0) then + PlaySound(sndOops, player) + elseif(planesUsed == 72) then + PlaySound(sndStupid, player) + elseif(planesUsed == 50) then + PlaySound(sndNutter, player) + elseif(planesUsed == 30) then + PlaySound(sndOops, player) + end + + crateStreak = 0 + + elseif GetGearType(gear) == gtAirBomb then + missiles = missiles + 1 + missileScanTimer = 500 + + elseif GetGearType(gear) == gtCase then + + cratesLeft = cratesLeft - 1 + crateStreak = crateStreak + 1 + if(crateStreak > longestCrateStreak) then + longestCrateStreak = crateStreak + end + + AddCaption(string.format(loc("Crates left: %d"), cratesLeft)) + + if cratesLeft == 0 then + + local rank = "unknown" + local color = 0xFFFFFFFF + local sound = sndVictory + if planesUsed >= 156 then + rank = loc("Destroyer of planes") + color = 0xD06700FF + sound = sndLaugh + elseif planesUsed >= 98 then + rank = loc("Hopeless case") + color = 0xFF0000FF + elseif planesUsed >= 72 then + rank = loc("Drunk greenhorn") + color = 0xFF0040FF + elseif planesUsed >= 50 then + rank = loc("Greenhorn") -- a.k.a. "absolute beginner" + color = 0xFF0080FF + elseif planesUsed >= 39 then + rank = loc("Beginner") + color = 0xFF00BFFF + elseif planesUsed >= 30 then + rank = loc("Experienced beginner") + color = 0xFF00CCFF + elseif planesUsed >= 21 then + rank = loc("Below-average pilot") + color = 0xFF00FFFF + elseif planesUsed >= 17 then + rank = loc("Average pilot") + color = 0xBF00FFFF + elseif planesUsed >= 13 then + rank = loc("Above-average pilot") + color = 0x8000FFFF + elseif planesUsed >= 8 then + rank = loc("Professional pilot") + color = 0x4000FFFF + elseif planesUsed >= 5 then + rank = loc("Professional stunt pilot") + color = 0x0000FFFF + elseif planesUsed >= 3 then + rank = loc("Elite pilot") + color = 0x0040FFFF + elseif planesUsed == 2 then + rank = loc("Upper-class elite pilot") + color = 0x0080FFFF + elseif planesUsed == 1 then + rank = loc("Top-class elite pilot") + color = 0x00FFFFFF + sound = sndFlawless + else + rank = loc("Cheater") + color = 0xFF0000FF + sound = sndCoward + end + AddCaption(string.format(loc("Rank: %s"), rank), color, capgrpMessage2) + SendStat(siCustomAchievement, string.format(loc("Your rank: %s"), rank)) + if planesUsed == 1 then + AddCaption(loc("Flawless victory!")) + SendStat(siGameResult, loc("You have perfectly beaten the challenge!")) + SendStat(siCustomAchievement, loc("You have used only 1 RC plane. Outstanding!")) + else + AddCaption(loc("Victory!")) + SendStat(siGameResult, loc("You have finished the challenge!")) + SendStat(siCustomAchievement, string.format(loc("You have used %d RC planes."), planesUsed)) + end + + if(totalMissiles > 1) then + SendStat(siCustomAchievement, string.format(loc("You have dropped %d missiles."), totalMissiles)) + end + + if(longestCrateStreak > 5) then + if(planesUsed == 1) then + SendStat(siCustomAchievement, string.format(loc("In your best (and only) flight you took out %d crates with one RC plane!"), longestCrateStreak)) + else + SendStat(siCustomAchievement, string.format(loc("In your best flight you took out %d crates with one RC plane."), longestCrateStreak)) + end + end + + if(planesUsed == 2) then + SendStat(siCustomAchievement, loc("This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?")) + end + if(planesUsed == 1) then + SendStat(siCustomAchievement, loc("Congratulations! You have truly mastered this challenge! Don't forget to save the demo.")) + SendStat(siCustomAchievement, string.format(loc("Achievement gotten: %s"), loc("Prestigious Pilot"))) + end + + ShowMission ( + loc("CHALLENGE COMPLETE"), + loc("Congratulations!"), + string.format(loc("Planes used: %d"), planesUsed) .. "|" .. + "", 0, 0 + ) + SetState(player, gstWinner) + PlaySound(sound, player) + + + DismissTeam(loc("Wannabe Flyboys")) + EndGame() + end + + if RCGear ~= nil then + SetTimer(RCGear, GetTimer(RCGear) + 10000) + end + end + +end + +function onAmmoStoreInit() + SetAmmo(amRCPlane, 9, 0, 0, 0) +end + +function onNewTurn() + SetWeapon(amRCPlane) +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_Rope_Knock_Challenge.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,294 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local hhs = {} +local missionWon = nil +local endTimer = 1000 +local hogsKilled = 0 +local finishTime +local ouchies = false + +local HogData = { + {"amn", "NinjaFull",false}, + {"alfadur", "NoHat",false}, + {"Anachron", "war_americanww2helmet",false}, + {"Bufon", "ShaggyYeti",false}, + {"burp", "lambda",false}, + {"Blue", "cap_blue",false}, + {"bender", "NoHat",false}, + {"Castell", "NoHat",false}, + {"cekoto", "NoHat",false}, + {"CheezeMonkey", "NoHat",false}, + {"claymore", "NoHat",false}, + {"CIA-144", "cyborg1",false}, + {"cri.the.grinch", "sf_blanka",false}, + {"eldiablo", "Evil",false}, + {"Displacer", "fr_lemon",false}, + {"doomy ", "NoHat",false}, + {"Falkenauge", "NoHat",false}, + {"FadeOne", "NoHat",false}, + {"hayaa", "NoHat",false}, + {"Hermes", "laurel",false}, + {"Henek", "WizardHat",false}, + {"HedgeKing", "NoHat",false}, + {"Izack1535", "NoHat",false}, + {"Kiofspa", "NoHat",false}, + {"KoBeWi", "NoHat",false}, + {"Komplex", "NoHat",false}, + {"koda", "poke_mudkip",false}, + {"Lalo", "NoHat",false}, + {"Logan", "NoHat",false}, + {"lollkiller", "NoHat",false}, + {"Luelle", "NoHat",false}, + {"mikade", "Skull",false}, + {"Mushi", "sm_daisy",false}, + {"Naboo", "NoHat",false}, + {"nemo", "bb_bub",false}, + {"practice", "NoHat",false}, + {"Prof. Panic", "NoHat",false}, + {"Randy", "zoo_Sheep",false}, + {"rhino", "NinjaTriangle",false}, + {"Radissthor", "NoHat",false}, + {"Sami", "sm_peach",false}, + {"soreau", "NoHat",false}, + {"Solar", "pinksunhat",false}, + {"sparkle", "NoHat",false}, + {"szczur", "mp3",false}, + {"sdw195", "NoHat",false}, + {"sphrix", "TeamTopHat",false}, + {"sheepluva", "zoo_Sheep",false}, + {"Smaxx", "NoHat",false}, + {"shadowzero", "NoHat",false}, + {"Star and Moon", "SparkleSuperFun",false}, + {"The 24", "NoHat",false}, + {"TLD", "NoHat",false}, + {"Tiyuri", "sf_ryu",false}, + {"unC0Rr", "cyborg1",false}, + {"Waldsau", "cyborg1",false}, + {"wolfmarc", "knight",false}, + {"Wuzzy", "fr_orange",false}, + {"Xeli", "android",false} + + } + +function GenericEnd() + EndGame() +end + +function GameOverMan() + missionWon = false + ShowMission(loc("Rope-knocking Challenge"), loc("Challenge over!"), loc("Oh no! Just try again!"), -amSkip, 0) + SendStat(siGameResult, loc("Challenge over!")) + local score = math.ceil((hogsKilled / 16)*6000) + SendStat(siCustomAchievement, string.format(loc("You have killed %d of 16 hedgehogs (+%d points)."), hogsKilled, score)) + SendStat(siPointType, loc("points")) + SendStat(siPlayerKills, tostring(score), loc("Wannabe Shoppsta")) + PlaySound(sndHellish) +end + +function GG() + missionWon = true + local completeTime = (TurnTime - finishTime) / 1000 + ShowMission(loc("Rope-knocking Challenge"), loc("Challenge completed!"), loc("Congratulations!") .. "|" .. string.format(loc("Completion time: %.2fs"), completeTime), 0, 0) + PlaySound(sndHomerun) + SendStat(siGameResult, loc("Challenge completed!")) + local hogScore = math.ceil((hogsKilled / 16)*6000) + local timeScore = math.ceil((finishTime/TurnTime)*6000) + local score = hogScore + timeScore + 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(siPlayerKills, tostring(score), loc("Wannabe Shoppsta")) +end + +function AssignCharacter(p) + + done = false + sanityCheck = 0 + + while(done == false) do + + i = 1+ GetRandom(#HogData) + if HogData[i][3] == false then + HogData[i][3] = true + done = true + SetHogName(hhs[p], HogData[i][1]) + SetHogHat(hhs[p], HogData[i][2]) + elseif HogData[i][3] == true then + sanityCheck = sanityCheck +1 + if sanityCheck == 100 then + done = true + SetHogName(hhs[p], "Newbie") + SetHogHat(hhs[p], "NoHat") + end + end + + end + +end + +function onGameInit() + + --Seed = 1 + GameFlags = gfBorder + gfSolidLand + + TurnTime = 180 * 1000 + Delay = 500 + Map = "Ropes" + Theme = "Eyes" + + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 + + CaseFreq = 0 + MinesNum = 0 + Explosives = 0 + + AddTeam(loc("Wannabe Shoppsta"), 0x11F12B, "money", "Island", "Default", "cm_shoppa") + hhs[0] = AddHog(loc("Ace"), 0, 1, "Gasmask") + SetGearPosition(player, 1380, 1500) + + AddTeam(loc("Unsuspecting Louts"), 0xDD0000, "Simple", "Island", "Default", "cm_face") + for i = 1, 8 do + hhs[i] = AddHog("generic", 0, 1, "NoHat") + end + + AddTeam(loc("Unlucky Sods"), 0xDD0000, "Simple", "Island", "Default", "cm_balrog") + for i = 9, 16 do + hhs[i] = AddHog("generic", 0, 1, "NoHat") + end + +end + + + +function onGameStart() + SendHealthStatsOff() + + 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."), + -amRope, 4000) + + PlaceGirder(46,1783, 0) + + SetGearPosition(hhs[0], 2419, 1769) + SetGearPosition(hhs[1], 3350, 570) + SetGearPosition(hhs[2], 3039, 1300) + SetGearPosition(hhs[3], 2909, 430) + SetGearPosition(hhs[4], 2150, 879) + SetGearPosition(hhs[5], 1735, 1136) + SetGearPosition(hhs[6], 1563, 553) + SetGearPosition(hhs[7], 679, 859) + SetGearPosition(hhs[8], 1034, 251) + SetGearPosition(hhs[9], 255, 67) + SetGearPosition(hhs[10], 2671, 7) + SetGearPosition(hhs[11], 2929, 244) + SetGearPosition(hhs[12], 1946, 221) + SetGearPosition(hhs[13], 3849, 1067) + SetGearPosition(hhs[14], 3360, 659) + SetGearPosition(hhs[15], 3885, 285) + SetGearPosition(hhs[16], 935, 1160) + + for i = 1, 16 do + AssignCharacter(i) + end + +end + +function onGameTick() + + if (TurnTimeLeft == 1) and (missionWon == nil) then + GameOverMan() + end + + if missionWon ~= nil then + + endTimer = endTimer - 1 + if endTimer == 1 then + GenericEnd() + end + + if missionWon == true then + AddCaption(loc("Victory!"), 0xFFFFFFFF,capgrpGameState) + else + AddCaption(loc("Challenge over!"), 0xFFFFFFFF,capgrpGameState) + end + + end + +end + +function onGearDamage(gear, damage) + + if gear == hhs[0] then + ouchies = true + end + + if gear ~= hhs[0] and GetGearType(gear) == gtHedgehog and missionWon == nil and ouchies == false then + + AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) + DeleteGear(gear) + PlaySound(sndExplosion) + AddCaption(string.format(knockTaunt(), GetHogName(gear)), 0xFFFFFFFF, capgrpMessage) + + hogsKilled = hogsKilled +1 + if hogsKilled == 15 then + PlaySound(sndRideOfTheValkyries) + elseif hogsKilled == 16 then + finishTime = TurnTimeLeft + GG() + end + + end + +end + +function knockTaunt() + local r = math.random(0,23) + local taunt + if r == 0 then taunt = loc("%s has been knocked out.") + elseif r == 1 then taunt = loc("%s hit the ground.") + elseif r == 2 then taunt = loc("%s splatted.") + elseif r == 3 then taunt = loc("%s was smashed.") + elseif r == 4 then taunt = loc("%s felt unstable.") + elseif r == 5 then taunt = loc("%s exploded.") + elseif r == 6 then taunt = loc("%s fell from a high cliff.") + elseif r == 7 then taunt = loc("%s goes the way of the lemming.") + elseif r == 8 then taunt = loc("%s was knocked away.") + elseif r == 9 then taunt = loc("%s was really unlucky.") + elseif r == 10 then taunt = loc("%s felt victim to rope-knocking.") + elseif r == 11 then taunt = loc("%s had no chance.") + elseif r == 12 then taunt = loc("%s was a good target.") + elseif r == 13 then taunt = loc("%s spawned at a really bad position.") + elseif r == 14 then taunt = loc("%s was doomed from the beginning.") + elseif r == 15 then taunt = loc("%s has fallen victim to gravity.") + elseif r == 16 then taunt = loc("%s hates Newton.") -- Isaac Newton + elseif r == 17 then taunt = loc("%s had it coming.") + elseif r == 18 then taunt = loc("%s is eliminated!") + elseif r == 19 then taunt = loc("%s fell too fast.") + elseif r == 20 then taunt = loc("%s flew like a rock.") + elseif r == 21 then taunt = loc("%s stumpled.") + elseif r == 22 then taunt = loc("%s was shoved away.") + elseif r == 23 then taunt = loc("%s didn't expect that.") + end + return taunt +end + +function onGearDelete(gear) + + if (gear == hhs[0]) and (missionWon == nil) then + GameOverMan() + end + +end + +function onAmmoStoreInit() + SetAmmo(amRope, 9, 0, 0, 0) +end + +function onNewTurn() + SetWeapon(amRope) +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Challenge/User_Mission_-_That_Sinking_Feeling.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,301 @@ + + +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local player +local hh = {} +local hhCount = 8 +local GameOver = false +local introStage = 0 +local genCounter = 0 +local waterCounter = 0 +local waterPix = 0 +local frig = 0 +local watGear = nil +local cinematic = false + +-- allow skipping of the intro via hitting precise key +function onPrecise() + if introStage < 100 then + introStage = 110 + 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) + SetInputMask(0xFFFFFFFF) + end +end + +function onGameInit() + + Seed = 0 + GameFlags = gfInfAttack + gfInvulnerable + gfOneClanMode + TurnTime = 90000 + CaseFreq = 0 + MinesNum = 0 + MinesTime = 3000 + Explosives = 0 + Delay = 10 + Map = "Islands" + Theme = "City" + SuddenDeathTurns = 1 + + AddTeam(loc("Hapless Hogs"), 14483456, "Simple", "Island", "Default") + 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") + hh[3] = AddHog(loc("Clumsy"), 1, 100, "dish_SauceBoatSilver") + hh[4] = AddHog(loc("Silly"), 1, 100, "dish_Ladle") + hh[5] = AddHog(loc("Careless"), 1, 100, "StrawHatEyes") + hh[6] = AddHog(loc("Sponge"), 1, 100, "sf_chunli") + hh[7] = AddHog(loc("Deadweight"), 1, 100, "dish_Teacup") + + AddTeam(loc("Nameless Heroes"), 14483456, "Simple", "Island", "Default", "cm_crossedswords") + player = AddHog(loc("The Nameless One"), 0, 1, "NoHat") + + SetGearPosition(player, 3992, 733) + SetGearPosition(hh[0], 938, 1369) + SetGearPosition(hh[1], 1301, 1439) + SetGearPosition(hh[2], 2093, 447) + SetGearPosition(hh[3], 2971, 926) + SetGearPosition(hh[4], 719, 545) + SetGearPosition(hh[5], 1630, 821) + SetGearPosition(hh[6], 2191, 810) + SetGearPosition(hh[7], 3799, 945) + + -- Disable all input except [Precise] for the intro + SetInputMask(gmPrecise) +end + + +function onGameStart() + cinematic = true + SetCinematicMode(true) + SendHealthStatsOff() + + ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hapless hogs as possible!"), 4, 1) + + HogTurnLeft(hh[0], false) + HogTurnLeft(hh[1], true) + + SpawnUtilityCrate(148,265,amLowGravity) + SpawnUtilityCrate(2124,1516,amJetpack) + +end + + +function onNewTurn() + TurnTimeLeft = -1 +end + +function onGameTick() + + -- intro sequence + if introStage < 100 then + + frig = frig + 1 + if frig == 50 then + frig = 0 + AddCaption(loc("Press [Precise] to skip intro")) + if watGear ~= nil then + FollowGear(watGear) + end + end + + + --AddCaption(loc("Press [Precise] to skip intro")) + genCounter = genCounter + 1 + + if introStage == 0 then + + + --FollowGear(hh[0]) + + if genCounter == 2000 then + watGear = hh[0] + HogSay(hh[0], loc("This rain is really something..."), SAY_SAY,2) + elseif genCounter == 5000 then + introStage = 1 + genCounter = 0 + end + + elseif introStage == 1 then + + --FollowGear(hh[1]) + + if genCounter == 2000 then + watGear = hh[1] + HogSay(hh[1], loc("Heh, it's not that bad."), SAY_SAY,2) + elseif genCounter == 5000 then + introStage = 2 + genCounter = 0 + end + + elseif introStage == 2 then + + --FollowGear(hh[0]) + + if genCounter == 2000 then + watGear = hh[0] + HogSay(hh[0], loc("You'd almost swear the water was rising!"), SAY_SHOUT,2) + elseif genCounter == 6000 then + introStage = 3 + genCounter = 0 + end + + elseif introStage == 3 then + + --FollowGear(hh[1]) + + if genCounter == 2000 then + watGear = hh[1] + HogSay(hh[1], loc("Haha, now THAT would be something!"), SAY_SAY,2) + elseif genCounter == 6000 then + introStage = 4 + genCounter = 0 + end + + elseif introStage == 4 then + + --FollowGear(hh[0]) + + if genCounter == 2000 then + watGear = hh[0] + HogSay(hh[0], loc("Hahahaha!"), SAY_SHOUT,2) + HogSay(hh[1], loc("Hahahaha!"), SAY_SHOUT,2) + elseif genCounter == 3000 then + introStage = 5 + genCounter = 0 + end + + elseif introStage == 5 then + + --FollowGear(hh[1]) + + if genCounter == 2000 then + watGear = hh[1] + HogSay(hh[0], loc("..."), SAY_THINK,2) + HogSay(hh[1], loc("..."), SAY_THINK,2) + elseif genCounter == 5000 then + introStage = 6 + genCounter = 0 + end + + elseif introStage == 6 then + + --FollowGear(hh[0]) + + if genCounter == 2000 then + watGear = hh[0] + HogSay(hh[0], loc("It's a good thing SUDDEN DEATH is 99 turns away..."), SAY_THINK,2) + elseif genCounter == 6000 then + introStage = 7 + genCounter = 0 + end + + + elseif introStage == 7 then + + 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) + SetInputMask(0xFFFFFFFF) + end + + end + + end + + -- start the water rising when the intro is finished + if introStage == 110 then + + if cinematic then + SetCinematicMode(false) + cinematic = false + end + + waterCounter = waterCounter + 1 + if (waterCounter == 100) and (waterPix < 1615) then + waterCounter = 0 + SetTag(AddGear(0, 0, gtWaterUp, 0, 0, 0, 0), 1) + waterPix = waterPix +1 + --AddCaption(waterPix) + + if (waterPix >= 1615) and (GameOver == false) then + 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")) + + -- Do not count drowning hedgehogs + local hhLeft = hhCount + for i=1,#hh do + local isDrowning = band(GetState(hh[i]),gstDrowning) ~= 0 + if isDrowning then + hhLeft = hhLeft - 1 + end + end + + SendStat(siCustomAchievement, string.format(loc("You saved %d of 8 Hapless Hogs."), hhLeft)) + + if hhLeft == 8 then + AddCaption(string.format(loc("Achievement gotten: %s"), loc("Lively Lifeguard")) ,0xffba00ff,capgrpMessage2) + SendStat(siCustomAchievement, loc("You have obtained an achievement: Lively Lifeguard")) + end + EndGame() + + end + + end + + end +end + + +function onAmmoStoreInit() + + SetAmmo(amBazooka, 9, 0, 0, 0) + + SetAmmo(amRope, 9, 0, 0, 0) + SetAmmo(amParachute, 9, 0, 0, 0) + SetAmmo(amJetpack, 2, 0, 0, 2) + + SetAmmo(amGirder, 9, 0, 0, 0) + SetAmmo(amBaseballBat, 9, 0, 0, 0) + + SetAmmo(amTeleport, 1, 0, 0, 1) + SetAmmo(amPortalGun, 3, 0, 0, 1) + + SetAmmo(amLowGravity, 0, 0, 0, 1) + +end + +function onGearDelete(gear) + + if GetGearType(gear) == gtHedgehog then + if GetHogTeamName(gear) == loc("Hapless Hogs") then + hhCount = hhCount - 1 + AddCaption(string.format(loc("%d Hapless Hogs left"), hhCount)) + end + end + + if ((gear == player) or (hhCount == 0)) and (GameOver == false) then + SetHealth(player, 0) + AddCaption(loc("Disqualified!")) + 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(siGameResult, loc("Disqualified!")) + GameOver = true + EndGame() + end + +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/Big_Armory.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/Big_Armory.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,310 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local playerHog +local playerTeamName = loc("Pro Killers") +local enemyTeamName = loc("Galaxy Guardians") +local enemyTeam1 = { + {name=loc("Rocket"), x=796, y=1184}, + {name=loc("Star"), x=733, y=1525}, + {name=loc("Asteroid"), x=738, y=1855}, + {name=loc("Comet"), x=937, y=1318}, + {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}, +} +local gameStarted = false +local turnNo = 0 +local toleranceTimer = nil +local enemyHogsLeft = #enemyTeam1 +local pendingDeaths = {} +local enemyHogs = {} +local gameEnded = false +local waitGears = 0 +local hasAttacked = false +local minePlaced = false +local delayGear = nil + +function onGameInit() + Seed = "{7e34a56b-ee7b-4fe1-8f30-352a998f3f6a}" + GameFlags = gfDisableWind + gfDisableLandObjects + TurnTime= 45000 + CaseFreq = 0 + MinesNum = 0 + Explosives = 0 + Theme = "EarthRise" + MapGen = mgRandom + MapFeatureSize = 12 + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 + + AddTeam(playerTeamName, 0xFF0000, "Bone", "Island", "Default", "cm_scout") + playerHog = AddHog(loc("Ultrasoldier"), 0, 100, "Terminator_Glasses") + SetGearPosition(playerHog, 543, 1167) + + AddTeam(enemyTeamName, 0xF5F808, "Earth", "Island", "Default", "cm_galaxy") + for i=1,8 do + local hogID = AddHog(enemyTeam1[i].name, 0, 100, "NoHat") + table.insert(enemyHogs, hogID) + SetGearPosition(hogID, enemyTeam1[i].x, enemyTeam1[i].y) + end +end + +function onAmmoStoreInit() + + SetAmmo(amGrenade, 9, 0, 0, 1) + SetAmmo(amClusterBomb, 9, 0, 0, 1) + SetAmmo(amBazooka, 9, 0, 0, 1) + SetAmmo(amBee, 9, 0, 0, 1) + SetAmmo(amShotgun, 9, 0, 0, 1) + SetAmmo(amPickHammer, 9, 0, 0, 1) + SetAmmo(amSkip, 9, 0, 0, 1) + SetAmmo(amRope, 9, 0, 0, 1) + SetAmmo(amMine, 9, 0, 0, 1) + SetAmmo(amDEagle, 9, 0, 0, 1) + SetAmmo(amDynamite, 9, 0, 0, 1) + SetAmmo(amFirePunch, 9, 0, 0, 1) + SetAmmo(amWhip, 9, 0, 0, 1) + SetAmmo(amBaseballBat, 9, 0, 0, 1) + SetAmmo(amParachute, 9, 0, 0, 1) + SetAmmo(amAirAttack, 9, 0, 0, 1) + SetAmmo(amMineStrike, 9, 0, 0, 1) + SetAmmo(amBlowTorch, 9, 0, 0, 1) + SetAmmo(amGirder, 9, 0, 0, 1) + SetAmmo(amTeleport, 9, 0, 0, 1) + SetAmmo(amSwitch, 9, 0, 0, 1) + SetAmmo(amMortar, 9, 0, 0, 1) + SetAmmo(amKamikaze, 9, 0, 0, 1) + SetAmmo(amCake, 9, 0, 0, 1) + SetAmmo(amSeduction, 9, 0, 0, 1) + SetAmmo(amWatermelon, 9, 0, 0, 1) + SetAmmo(amHellishBomb, 9, 0, 0, 1) + SetAmmo(amNapalm, 9, 0, 0, 1) + SetAmmo(amDrill, 9, 0, 0, 1) + SetAmmo(amBallgun, 9, 0, 0, 1) + SetAmmo(amRCPlane, 9, 0, 0, 1) + SetAmmo(amLowGravity, 9, 0, 0, 1) + SetAmmo(amExtraDamage, 9, 0, 0, 1) + SetAmmo(amInvulnerable, 9, 0, 0, 1) + SetAmmo(amLaserSight, 9, 0, 0, 1) + SetAmmo(amVampiric, 9, 0, 0, 1) + SetAmmo(amSniperRifle, 9, 0, 0, 1) + SetAmmo(amJetpack, 9, 0, 0, 1) + SetAmmo(amMolotov, 9, 0, 0, 1) + SetAmmo(amBirdy, 9, 0, 0, 1) + SetAmmo(amPortalGun, 9, 0, 0, 1) + SetAmmo(amPiano, 9, 0, 0, 1) + SetAmmo(amGasBomb, 9, 0, 0, 1) + SetAmmo(amSineGun, 9, 0, 0, 1) + SetAmmo(amFlamethrower, 9, 0, 0, 1) + SetAmmo(amSMine, 9, 0, 0, 1) + SetAmmo(amHammer, 9, 0, 0, 1) + SetAmmo(amResurrector, 9, 0, 0, 1) + SetAmmo(amDrillStrike, 9, 0, 0, 1) + SetAmmo(amSnowball, 9, 0, 0, 1) + SetAmmo(amTardis, 9, 0, 0, 1) + SetAmmo(amLandGun, 9, 0, 0, 1) + SetAmmo(amIceGun, 9, 0, 0, 1) + SetAmmo(amKnife, 9, 0, 0, 1) + SetAmmo(amRubber, 9, 0, 0, 1) + SetAmmo(amAirMine, 9, 0, 0, 1) + SetAmmo(amDuck, 9, 0, 0, 1) + + SetAmmo(amExtraTime, 2, 0, 0, 0) + +end + +function onGameStart() + SendHealthStatsOff() + ShowMission(loc("Big Armory"), loc("Scenario"), loc("Kill all enemy hedgehogs in a single turn."), -amBazooka, 0) + SetWind(15) +end + +function onGameTick20() + if not gameStarted and turnNo == 1 and TurnTimeLeft < TurnTime then + gameStarted = true + elseif gameStarted and not gameEnded then + if isPlayerAlive() then + if enemyHogsLeft - countPending() <= 0 then + TurnTimeLeft = 0 + if delayGear then + DeleteGear(delayGear) + end + return + elseif (enemyHogsLeft > 0) and TurnTimeLeft < 40 then + if not toleranceTimer and waitGears <= 0 then + SetInputMask(0) + SetGearMessage(playerHog, 0) + if not minePlaced then + TurnTimeLeft = 10000000 + end + if hasAttacked then + if minePlaced then + toleranceTimer = 12000 + else + toleranceTimer = 7500 + end + else + PlaySound(sndBoring, playerHog) + toleranceTimer = 5020 + end + return + end + end + if toleranceTimer ~= nil then + if toleranceTimer % 1000 == 0 and toleranceTimer > 0 and toleranceTimer <= 5000 then + AddCaption(string.format(loc("Mission failure in %d s"), div(toleranceTimer, 1000)), 0xFFFFFFFF, capgrpGameState) + end + if waitGears <= 0 then + if toleranceTimer <= 0 then + lose() + return + end + toleranceTimer = toleranceTimer - 20 + end + return + end + end + end +end + +function onGearAdd(gear) + local gt = GetGearType(gear) + if gt == gtIceGun or gt == gtPickHammer or gt == gtSineGunShot or gt == gtCake + or gt == gtTeleport or gt == gtFlamethrower or gt == gtBallGun or gt == gtSeduction + or gt == gtAirAttack or gt == gtMine or gt == gtSMine or gt == gtAirMine + or (isWaitGear(gear) and gt ~= gtFlame) then + --[[ This is a hack to prevent the turn from instantly ending + after using a weapon with a retreat time of 0. For some reason, there would be + are also problems with the hellish-hand grenade without this hack. + It spawns an invisible grenade with disabled gravity at (0,0) with a + high timer, which will delay the end of the turn. ]] + if delayGear == nil then + delayGear = AddGear(0, 0, gtGrenade, gstNoGravity + gstInvisible, 0, 0, 2147483647) + end + end + if gt == gtMine or gt == gtSMine or gt == gtAirMine then + minePlaced = true + end + if isWaitGear(gear) then + waitGears = waitGears + 1 + end + if gt == gtAirAttack then + hasAttacked = true + end +end + +function onGearDelete(gear) + if isWaitGear(gear) then + waitGears = waitGears - 1 + end + if GetGearType(gear) == gtHedgehog then + if GetHogTeamName(gear) == enemyTeamName then + enemyHogsLeft = enemyHogsLeft - 1 + pendingDeaths[gear] = nil + if enemyHogsLeft <= 0 then + win() + end + end + end +end + +function countPending() + local p = 0 + for h, v in pairs(pendingDeaths) do + if v then + p = p + 1 + end + end + return p +end + +function isPlayerAlive() + if GetGearType(playerHog) == gtHedgehog then + if GetHealth(playerHog) == 0 then + return false + else + local _, gearDamage + _, _, _, _, _, _, _, _, _, _, _, gearDamage = GetGearValues(playerHog) + return (GetHealth(playerHog) - gearDamage) > 0 + end + else + return false + end +end + +function onGearDamage(gear, damage) + if GetGearType(gear) == gtHedgehog then + if GetHogTeamName(gear) == enemyTeamName then + local _, gearDamage + _, _, _, _, _, _, _, _, _, _, _, gearDamage = GetGearValues(gear) + if (GetHealth(gear) - gearDamage) <= 0 then + pendingDeaths[gear] = true + end + end + end +end + +function isWaitGear(gear) + local gt = GetGearType(gear) + return gt == gtBall or gt == gtHellishBomb or gt == gtWatermelon or gt == gtMelonPiece + or (gt == gtFlame and band(GetState(gear), gsttmpFlag) == 0) + or gt == gtDrill or gt == gtAirAttack or gt == gtAirBomb or gt == gtCluster + or gt == gtEgg or gt == gtHammerHit or gt == gtNapalmBomb or gt == gtPoisonCloud + or gt == gtGasBomb +end + +function onNewTurn() + turnNo = turnNo + 1 + if turnNo > 1 then + PlaySound(sndBoring, playerHog) + lose() + end +end + +function onHogAttack(ammoType) + -- Set hasAttacked if hog attacked NOT with a non-turn ending weapon + if ammoType ~= amNothing and ammoType ~= amSkip and ammoType ~= amJetpack and ammoType ~= amGirder and ammoType ~= amRubber + and ammoType ~= amLandGun and ammoType ~= amParachute and ammoType ~= amResurrector and ammoType ~= amRope and ammoType ~= amSwitcher + and ammoType ~= amExtraDamage and ammoType ~= amExtraTime and ammoType ~= amLowGravity and ammoType ~= amInvulnerable + and ammoType ~= amLaserSight and ammoType ~= amVampiric and ammoType ~= amPortalGun and ammoType ~= amSnowball then + hasAttacked = true + end + if ammoType == amSkip and enemyHogsLeft > 0 then + PlaySound(sndCoward, playerHog) + lose() + return + end +end + +function lose() + if not gameEnded then + PlaySound(sndStupid, playerHog) + local mission, achievement + mission = loc("You failed to kill all enemies in this turn.") + achievement = loc("You failed to kill all enemies in a single turn.") + AddCaption(loc("Mission failed!"), 0xFFFFFFFF, capgrpGameState) + ShowMission(loc("Big Armory"), loc("Scenario"), mission, -amBazooka, 5000) + SendStat(siGameResult, loc("You lose!")) + SendStat(siCustomAchievement, achievement) + SendStat(siPlayerKills, tostring(0), enemyTeamName) + SendStat(siPlayerKills, tostring(8-enemyHogsLeft), playerTeamName) + gameEnded = true + EndGame() + end +end + +function win() + if not gameEnded then + AddCaption(loc("Victory!"), 0xFFFFFFFF, capgrpGameState) + ShowMission(loc("Big Armory"), loc("Scenario"), loc("Congratulations! You win."), 4, 5000) + PlaySound(sndVictory, playerHog) + SendStat(siGameResult, loc("You win!")) + SendStat(siCustomAchievement, loc("You have killed all enemies.")) + SendStat(siPlayerKills, tostring(8-enemyHogsLeft), playerTeamName) + SendStat(siPlayerKills, tostring(0), enemyTeamName) + gameEnded = true + EndGame() + end +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,5 @@ +file(GLOB Scripts *.lua) + +install(FILES + ${Scripts} + DESTINATION ${SHAREPATH}Data/Missions/Scenario) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Bamboo_Thicket.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Bamboo_Thicket.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,92 @@ + +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local player = nil +local enemy = nil +local firedShell = false +local turnNumber = 0 + +local hhs = {} +local numhhs = 0 + +function onGameInit() + + Seed = 0 + TurnTime = 20000 + CaseFreq = 0 + MinesNum = 0 + Explosives = 0 + Map = "Bamboo" + Theme = "Bamboo" + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 + + AddTeam(loc("Pathetic Resistance"), 14483456, "Plinko", "Island", "Default", "cm_yinyang") + player = AddHog(loc("Ikeda"), 0, 10, "StrawHat") + + AddTeam(loc("Cybernetic Empire"), 1175851, "ring", "Island", "Robot", "cm_cyborg") + enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg1") + + SetGearPosition(player,142,656) + SetGearPosition(enemy,1824,419) + +end + + +function onGameStart() + + ShowMission(loc("Bamboo Thicket"), loc("Scenario"), loc("Eliminate the enemy."), -amBazooka, 0) + + --WEAPON CRATE LIST. WCRATES: 2 + SpawnAmmoCrate(891,852,amBazooka) + SpawnAmmoCrate(962,117,amBlowTorch) + --UTILITY CRATE LIST. UCRATES: 1 + SpawnUtilityCrate(403,503,amParachute) + + AddAmmo(enemy, amGrenade, 100) + +end + +function onNewTurn() + SetWind(100) + turnNumber = turnNumber + 1 +end + +function onAmmoStoreInit() + SetAmmo(amSkip, 9, 0, 0, 0) + SetAmmo(amGirder, 4, 0, 0, 0) + SetAmmo(amBlowTorch, 0, 0, 0, 1) + SetAmmo(amParachute, 0, 0, 0, 2) + SetAmmo(amBazooka, 0, 0, 0, 2) +end + + +function onGearAdd(gear) + + if GetGearType(gear) == gtHedgehog then + hhs[numhhs] = gear + numhhs = numhhs + 1 + elseif GetGearType(gear) == gtShell then + firedShell = true + end + +end + +function onGearDelete(gear) + + if (gear == enemy) then + + ShowMission(loc("Bamboo Thicket"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) + + if (turnNumber < 6) and (firedShell == false) then + local achievementString = string.format(loc("Achievement gotten: %s"), loc("Energetic Engineer")) + AddCaption(achievementString, 0xffba00ff, capgrpMessage2) + SendStat(siCustomAchievement, achievementString) + end + + elseif gear == player then + ShowMission(loc("Bamboo Thicket"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) + end + +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Dangerous_Ducklings.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,151 @@ + +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local player = nil -- This variable will point to the hog's gear +local instructor = nil +local enemy = nil + +local speechStage = 0 + +local gameLost = false +local gameWon = false +local notListening = false + +local endTimer = 0 + +function onGameInit() + + -- Things we don't modify here will use their default values. + + Seed = 0 -- The base number for the random number generator + GameFlags = gfInfAttack -- Game settings and rules + TurnTime = 60000 -- The time the player has to move each round (in ms) + 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"), 14483456, "Rubberduck", "Island", "Default", "cm_duckhead") + player = AddHog(loc("Hunter"), 0, 1, "NoHat") + instructor = AddHog(loc("Instructor"), 0, 100, "sf_vega") + + AddTeam(loc("Blue Team"), 29439, "bubble", "Island", "Default", "somalia") + enemy = AddHog(loc("Filthy Blue"), 1, 100, "Skull") + + SetGearPosition(player,146,902) + SetGearPosition(instructor,317,902) + SetGearPosition(enemy,1918,837) + + HogSay(player, ".............................", SAY_THINK) + HogTurnLeft(instructor, true) + +end + + +function onGameStart() + + SpawnAmmoCrate(475,476,amRope) + SpawnAmmoCrate(1729,476,amFirePunch) + + FollowGear(player) + + ShowMission(loc("Dangerous Ducklings"), loc("Scenario"), loc("Eliminate the Blue Team before the time runs out."), -amRope, 5000); + +end + + +function onGameTick() + + + -- opening speech + if (notListening == false) and (gameLost == false) then + + if (TurnTimeLeft == 58000) and (speechStage == 0) then + HogSay(instructor, loc("Listen up, maggot!!"), SAY_SHOUT) + speechStage = 1 + elseif (TurnTimeLeft == 57000) and (speechStage == 1) then + HogSay(player,loc("!!!"),SAY_SHOUT) + elseif (TurnTimeLeft == 55000) and (speechStage == 1) then + HogSay(instructor, loc("The enemy is hiding out on yonder ducky!"), SAY_SAY) + speechStage = 2 + + elseif (TurnTimeLeft == 49000) and (speechStage == 2) then + FollowGear(enemy) + elseif (TurnTimeLeft == 46500) and (speechStage == 2) then + FollowGear(instructor) + HogSay(instructor, loc("Get on over there and take him out!"), SAY_SAY) + speechStage = 3 + elseif (TurnTimeLeft == 43500) and (speechStage == 3) then + HogSay(instructor, loc("GO! GO! GO!"), SAY_SHOUT) + speechStage = 4 + givenSpeech = true + end + + end + + -- if player falls in water or if player ignores speech + if (CurrentHedgehog ~= nil) and (CurrentHedgehog == player) then + if (GetY(player) > WaterLine) and (gameLost == false) then + HogSay(instructor, loc("DAMMIT, ROOKIE!"), SAY_SHOUT) + gameLost = true + end + + if (GetX(player) > 300) and (GetY(player) > 880) and (notListening == false) and (speechStage < 3) then + HogSay(instructor, loc("DAMMIT, ROOKIE! GET OFF MY HEAD!"), SAY_SHOUT) + notListening = true + end + + end + + --player out of time + if (TurnTimeLeft == 1) and (gameWon == false) then + SetHealth(player, 0) + end + + -- meh + if gameLost == true then + endTimer = endTimer + 1 + if (CurrentHedgehog ~= nil) and (CurrentHedgehog == instructor) then + if endTimer >= 3000 then + --SetHealth(instructor,0) + TurnTimeLeft = 1 + DismissTeam(loc("Bloody Rookies")) + end + ShowMission(loc("Dangerous Ducklings"), loc("MISSION FAILED"), loc("You've failed. Try again."), -amRope, 5000); + end + end + +end + + +function onAmmoStoreInit() + SetAmmo(amFirePunch, 0, 0, 0, 1) + SetAmmo(amParachute, 1, 0, 0, 0) + SetAmmo(amRope, 0, 0, 0, 1) +end + +function onGearDelete(gear) + if GetGearType(gear) == gtHedgehog then + if gear == player then + gameLost = true + elseif (gear == instructor) and (GetY(gear) > WaterLine) then + HogSay(player, loc("See ya!"), SAY_THINK) + TurnTimeLeft = 3000 + local achievementString = string.format(loc("Achievement gotten: %s"), loc("Naughty Ninja")) + AddCaption(achievementString, 0xffba00ff, capgrpMessage2) + SendStat(siCustomAchievement, achievementString) + DismissTeam(loc("Blue Team")) + gameWon = true + elseif gear == enemy then + HogSay(player, loc("Enjoy the swim..."), SAY_THINK) + gameWon = true + TurnTimeLeft = 3000 + end + + end +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Diver.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Diver.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,107 @@ + +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local player = nil -- This variable will point to the hog's gear +local enemy = nil + +local GameOver = false + +local jetpackFuel = 1000 + +function onGameInit() + + -- Things we don't modify here will use their default values. + + Seed = 0 -- The base number for the random number generator + GameFlags = gfInfAttack + gfDisableWind-- Game settings and rules + TurnTime = 90000 -- The time the player has to move each round (in ms) + CaseFreq = 0 -- The frequency of crate drops + 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 + + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 + + AddTeam(loc("Bloody Rookies"), 14483456, "deadhog", "Island", "Default", "cm_eyes") + player = AddHog(loc("Hunter"), 0, 1, "NoHat") + + AddTeam(loc("Toxic Team"), 1175851, "skull", "Island", "Default", "cm_magicskull") + enemy = AddHog(loc("Poison"), 1, 100, "Skull") + + SetGearPosition(player,430,516) + SetGearPosition(enemy,1464,936) + +end + + +function onGameStart() + + + SpawnUtilityCrate(426,886,amJetpack) + SpawnAmmoCrate(1544,690,amFirePunch) + SpawnAmmoCrate(950,851,amBlowTorch) + SpawnUtilityCrate(1032,853,amParachute) + + AddGear(579, 296, gtMine, 0, 0, 0, 0) + + ShowMission(loc("Diver"), loc("Scenario"), + loc("Eliminate the enemy before the time runs out.") .. "|" .. + loc("Unlimited Attacks: Attacks don't end your turn") .. "|" .. + loc("Mines time: 1 second"), -amFirePunch, 0); + --SetTag(AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1), -70) + + SetAmmoDescriptionAppendix(amJetpack, string.format(loc("In this mission you get %d%% fuel."), div(jetpackFuel, 20))) + + SetWind(-100) + +end + + +function onGameTick() + + + if (TotalRounds == 3) and (GameOver == false) then + SetHealth(player, 0) + GameOver = true + end + + if TurnTimeLeft == 1 then + SetHealth(player, 0) + GameOver = true + end + +end + + +function onAmmoStoreInit() + SetAmmo(amFirePunch, 1, 0, 0, 1) + SetAmmo(amBlowTorch, 0, 0, 0, 1) + SetAmmo(amGirder, 1, 0, 0, 0) + SetAmmo(amParachute, 0, 0, 0, 1) + SetAmmo(amJetpack, 0, 0, 0, 1) +end + + +function onGearAdd(gear) + + if GetGearType(gear) == gtJetpack then + SetHealth(gear, jetpackFuel) + end + +end + +function onGearDelete(gear) + + 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) + GameOver = true + end + +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Newton_and_the_Hammock.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,134 @@ + +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local player = nil +local enemy = nil +local failed = false + +local hhs = {} +local numhhs = 0 + +function onGameInit() + + Seed = 0 + TurnTime = 60000 + CaseFreq = 0 + MinesTime = 1000 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 + HealthCaseProb = 35 + Explosives = 0 + MinesNum = 0 + Map = "Hammock" + Theme = "Nature" + + AddTeam(loc("Pathetic Resistance"), 14483456, "Statue", "Island", "Default", "cm_duckhead") + player = AddHog(loc("Ikeda"), 0, 48, "StrawHat") + + AddTeam(loc("Cybernetic Empire"), 1175851, "ring", "Island", "Robot", "cm_cyborg") + enemy = AddHog(loc("Unit") .. " 811", 1, 100, "cyborg1") + + SetGearPosition(player,430,1540) + SetGearPosition(enemy,1464,1960) + +end + + +function onGameStart() + + AddAmmo(enemy, amShotgun, 100) + AddAmmo(enemy, amFirePunch, 100) + + --GIRDER LIST. + PlaceGirder(1073,2009,0) + PlaceGirder(524,1487,3) + PlaceGirder(638,1453,4) + PlaceGirder(761,1453,0) + PlaceGirder(840,1421,3) + PlaceGirder(302,1388,6) + PlaceGirder(327,1506,1) + PlaceGirder(1669,1832,3) + --MINE LIST. + AddGear(1056,1987,gtMine, 0, 0, 0, 0) + AddGear(1086,1988,gtMine, 0, 0, 0, 0) + --STICKY MINE LIST. + AddGear(1089,965,gtSMine, 0, 0, 0, 0) + AddGear(1133,945,gtSMine, 0, 0, 0, 0) + AddGear(1010,1081,gtSMine, 0, 0, 0, 0) + AddGear(1036,1049,gtSMine, 0, 0, 0, 0) + AddGear(1057,1004,gtSMine, 0, 0, 0, 0) + AddGear(784,1252,gtSMine, 0, 0, 0, 0) + AddGear(841,1257,gtSMine, 0, 0, 0, 0) + AddGear(902,1263,gtSMine, 0, 0, 0, 0) + AddGear(952,1281,gtSMine, 0, 0, 0, 0) + AddGear(517,1546,gtSMine, 0, 0, 0, 0) + AddGear(559,1597,gtSMine, 0, 0, 0, 0) + AddGear(613,1650,gtSMine, 0, 0, 0, 0) + AddGear(674,1705,gtSMine, 0, 0, 0, 0) + AddGear(746,1692,gtSMine, 0, 0, 0, 0) + AddGear(810,1692,gtSMine, 0, 0, 0, 0) + AddGear(872,1673,gtSMine, 0, 0, 0, 0) + AddGear(933,1666,gtSMine, 0, 0, 0, 0) + AddGear(981,1662,gtSMine, 0, 0, 0, 0) + AddGear(1016,1634,gtSMine, 0, 0, 0, 0) + AddGear(1063,1595,gtSMine, 0, 0, 0, 0) + AddGear(1100,1574,gtSMine, 0, 0, 0, 0) + AddGear(1002,1461,gtSMine, 0, 0, 0, 0) + AddGear(1052,1438,gtSMine, 0, 0, 0, 0) + AddGear(1102,1464,gtSMine, 0, 0, 0, 0) + --WEAPON CRATE LIST. + SpawnAmmoCrate(1565,642,amSineGun) + SpawnAmmoCrate(548,858,amBazooka) + --UTILITY CRATE LIST. + SpawnUtilityCrate(479,847,amJetpack) + SpawnAmmoCrate(1550,1715,amBlowTorch) + SpawnUtilityCrate(1227,1941,amJetpack) + SpawnUtilityCrate(1070,1964,amInvulnerable) + SpawnUtilityCrate(1070,1875,amTeleport) + --HOG POSITION LIST. + if hhs[0] ~= nil then + SetGearPosition(hhs[0],397,865) + end + if hhs[1] ~= nil then + SetGearPosition(hhs[1],561,1365) + end + + ShowMission(loc("Newton and the Hammock"), loc("Scenario"), loc("Eliminate the enemy.") .. "|" .. loc("Mines time: 1 second"), -amParachute, 0) + +end + +function onAmmoStoreInit() + SetAmmo(amSkip, 9, 0, 0, 1) + SetAmmo(amBazooka, 0, 0, 0, 1) + SetAmmo(amJetpack, 0, 0, 0, 1) + SetAmmo(amTeleport, 0, 0, 0, 1) + SetAmmo(amSineGun, 0, 0, 0, 1) + SetAmmo(amInvulnerable, 0, 0, 0, 1) + SetAmmo(amBlowTorch, 0, 0, 0, 1) +end + +function onGearDamage(gear, damage) + if (gear == player) and (damage >= 48) then + failed = true + end +end + +function onGearAdd(gear) + + if GetGearType(gear) == gtHedgehog then + hhs[numhhs] = gear + numhhs = numhhs + 1 + end + +end + +function onGearDelete(gear) + + if (gear == enemy) and (failed == false) then + ShowMission(loc("Newton and the Hammock"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) + elseif gear == player then + ShowMission(loc("Newton and the Hammock"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) + end + +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Nobody_Laugh.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Nobody_Laugh.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,134 @@ +-------------------------------------- +-- NOBODY LAUGH +-- a hilarious (not really) adventure +-------------------------------------- + +HedgewarsScriptLoad("/Scripts/Locale.lua") +HedgewarsScriptLoad("/Scripts/Tracker.lua") + +local hhs = {} + +function onGameInit() + + Seed = 0 + GameFlags = gfInfAttack + gfPerHogAmmo +gfDisableWind + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 + TurnTime = 180000 + CaseFreq = 0 + MinesNum = 0 + Explosives = 0 + Map = "Bath" + Theme = "Nature" + + AddTeam(loc("Nameless Heroes"), 14483456, "eyecross", "Wood", "HillBilly", "cm_crossedswords") + hhs[1] = AddHog(loc( "Hunter" ), 0, 1, "Skull") + SetGearPosition(hhs[1], 1267, 451) + hhs[2] = AddHog(loc("Drowner"), 0, 31, "mp3") + SetGearPosition(hhs[2], 1332, 451) + + AddTeam(loc("Clowns"), 1175851, "Duck2", "Tank", "Mobster", "cm_face") + hhs[3] = AddHog(loc("Poison"), 1, 100, "WhySoSerious") + SetGearPosition(hhs[3], 1133, 446) + hhs[4] = AddHog(loc("Bobo"), 1, 100, "clown") + SetGearPosition(hhs[4], 1215, 553) + hhs[5] = AddHog(loc("Copper"), 1, 10, "clown-copper") + SetGearPosition(hhs[5], 414, 376) + hhs[6] = AddHog(loc("Derp"), 1, 100, "clown-crossed") + SetGearPosition(hhs[6], 1590, 886) + hhs[7] = AddHog(loc("Eckles"), 1, 100, "clown-copper") + SetGearPosition(hhs[7], 772, 754) + hhs[8] = AddHog(loc("Frank"), 1, 50, "clown-copper") + SetGearPosition(hhs[8], 1688, 714) + hhs[9] = AddHog(loc("Harry"), 1, 50, "clown-copper") + SetGearPosition(hhs[9], 1932, 837) + hhs[10] = AddHog(loc("Igmund"), 1, 50, "WhySoSerious") + SetGearPosition(hhs[10], 1601, 733) + +end + +function onGameStart() + + AddAmmo(enemy, amAirAttack, 100) + + ShowMission( loc("Nobody Laugh"), + loc("Scenario"), + loc("Eliminate the enemy.") .. "|" .. + loc("Unlimited Attacks: Attacks don't end your turn") .. "|".. + loc("Per-hog Ammo: Weapons are not shared between hogs") + , 0, 0 + ) + + -- GIRDERS + PlaceGirder(1212, 710, 7) + PlaceGirder(1215, 570, 4) + PlaceGirder(1288, 520, 2) + PlaceGirder(1184, 468, 4) + PlaceGirder(1344, 468, 4) + PlaceGirder(1247, 346, 4) + + PlaceGirder(667, 438, 4) + PlaceGirder(507, 438, 4) + PlaceGirder(434, 487, 2) + PlaceGirder(505, 537, 4) + PlaceGirder(665, 537, 4) + PlaceGirder(737, 487, 2) + + PlaceGirder(416, 465, 6) + PlaceGirder(1415, 378, 6) + PlaceGirder(1300, 625, 3) + PlaceGirder(1359, 566, 3) + PlaceGirder(1436, 538, 0) + PlaceGirder(1505, 468, 4) + + ------ AMMO CRATE LIST ------ + tempG = SpawnAmmoCrate(1242, 315, amBaseballBat) + tempG = SpawnAmmoCrate(1309, 315, amAirAttack) + tempG = SpawnAmmoCrate(144, 895, amAirAttack) + tempG = SpawnAmmoCrate(664, 699, amIceGun) + tempG = SpawnAmmoCrate(1572, 444, amFirePunch) + tempG = SpawnAmmoCrate(1574, 382, amDynamite) + + ------ UTIL CRATE LIST ------ + tempG = SpawnUtilityCrate(654, 513, amParachute) + tempG = SpawnUtilityCrate(1569, 413, amParachute) + + -- HOG AMMO + AddAmmo(hhs[1],amParachute,1) + AddAmmo(hhs[1],amHammer,1) + AddAmmo(hhs[2],amWhip,1) + + for i = 3, 10 do + AddAmmo(hhs[i], amDEagle, 100) + AddAmmo(hhs[i], amShotgun, 100) + AddAmmo(hhs[i], amGrenade, 100) + AddAmmo(hhs[i], amBazooka, 100) + AddAmmo(hhs[i], amDrill, 100) + end + +end + +function onNewTurn() + SetWind(100) +end + +function onAmmoStoreInit() + + SetAmmo(amBaseballBat, 0, 0, 0, 1) + SetAmmo(amAirAttack, 0, 0, 0, 1) + SetAmmo(amFirePunch, 0, 0, 0, 1) + SetAmmo(amDynamite, 0, 0, 0, 1) + SetAmmo(amHammer, 0, 0, 0, 1) + SetAmmo(amIceGun, 0, 0, 0, 1) + + SetAmmo(amParachute, 0, 0, 0, 1) + + SetAmmo(amSwitch, 9, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) + +end + +------------------------------ +-- I'm in whitesppaaaaaaaaaacceeeee :D +------------------------------ diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Spooky_Tree.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Spooky_Tree.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,158 @@ + +HedgewarsScriptLoad("/Scripts/Locale.lua") + +--------------------------------------------------------------- + +local player = nil -- This variable will point to the hog's gear +local instructor = nil +local enemy = nil + +local GameOver = false +local birdSpeech = false +local birdSqualk = false + +local GirderCrate = nil + +function onGameInit() + + -- Things we don't modify here will use their default values. + Seed = 0 -- The base number for the random number generator + GameFlags = gfInfAttack +gfDisableWind-- Game settings and rules + TurnTime = 90000 -- The time the player has to move each round (in ms) + CaseFreq = 0 -- The frequency of crate drops + 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"), 14483456, "deadhog", "Island", "Default", "cm_eyes") + player = AddHog(loc("Hunter"), 0, 1, "NoHat") + --852718 + AddTeam(loc("Toxic Team"), 1175851, "skull", "Island", "Default", "cm_magicskull") + enemy = AddHog(loc("Poison"), 1, 10, "Skull") + + SetGearPosition(player,970,23) + SetGearPosition(enemy,498,806) + +end + + +function onGameStart() + + --right side mines + AddGear(1681,359,gtMine, 0, 0, 0, 0) + AddGear(1718,518,gtMine, 0, 0, 0, 0) + AddGear(1648,527,gtMine, 0, 0, 0, 0) + AddGear(1584,522,gtMine, 0, 0, 0, 0) + + --tunnel mines + AddGear(301,569,gtSMine, 0, 0, 0, 0) + AddGear(372,608,gtSMine, 0, 0, 0, 0) + AddGear(453,628,gtSMine, 0, 0, 0, 0) + AddGear(524,611,gtSMine, 0, 0, 0, 0) + AddGear(613,611,gtSMine, 0, 0, 0, 0) + + AddGear(308,486,gtSMine, 0, 0, 0, 0) + AddGear(372,478,gtSMine, 0, 0, 0, 0) + AddGear(453,466,gtSMine, 0, 0, 0, 0) + AddGear(524,471,gtSMine, 0, 0, 0, 0) + AddGear(613,466,gtSMine, 0, 0, 0, 0) + + --above the tunnel mines + AddGear(331,433,gtMine, 0, 0, 0, 0) + AddGear(404,420,gtMine, 0, 0, 0, 0) + AddGear(484,424,gtMine, 0, 0, 0, 0) + AddGear(562,417,gtMine, 0, 0, 0, 0) + AddGear(640,412,gtMine, 0, 0, 0, 0) + + -- crates crates and more crates + SpawnAmmoCrate(1208,576,amBlowTorch) + SpawnAmmoCrate(1467,376,amPickHammer) + SpawnUtilityCrate(373,165,amGirder) + SpawnUtilityCrate(704,623,amJetpack) + SpawnUtilityCrate(1646,749,amLaserSight) + + SpawnAmmoCrate(745,418,amShotgun) --shotgun1 + SpawnAmmoCrate(833,432,amFirePunch) --fire punch + GirderCrate = SpawnAmmoCrate(1789,514,amShotgun) -- final shotgun + SpawnAmmoCrate(1181,419,amBee) + + ShowMission(loc("Spooky Tree"), loc("Scenario"), + loc("Eliminate the enemy before the time runs out.") .. "|" .. + loc("Unlimited Attacks: Attacks don't end your turn") .. "|" .. + loc("Mines time: 0 seconds"), -amBee, 0) + + SetWind(-75) + +end + + +function onGameTick() + + + if CurrentHedgehog ~= nil then + + if (birdSqualk == false) and (GetX(CurrentHedgehog) == 1102) and (GetY(CurrentHedgehog) == 133) then + birdSqualk = true + PlaySound(sndBirdyLay) + end + + if (birdSpeech == false) and (GetX(CurrentHedgehog) == 1068) and (GetY(CurrentHedgehog) == 162) then + birdSpeech = true + HogSay(player,loc("Good birdy......"),SAY_THINK) + end + end + + if CurrentHedgehog ~= nil then + --AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog)) + end + + if (TotalRounds == 2) and (GameOver == false) then -- just in case + SetHealth(player, 0) + GameOver = true + end + + if TurnTimeLeft == 1 then + --ShowMission(loc(caption), loc(subcaption), loc(timeout), -amSkip, 0); + SetHealth(player, 0) + GameOver = true + end + +end + + +function onAmmoStoreInit() + SetAmmo(amShotgun, 0, 0, 0, 1) + SetAmmo(amFirePunch, 0, 0, 0, 1) + SetAmmo(amBee, 0, 0, 0, 1) + SetAmmo(amBlowTorch, 0, 0, 0, 1) + SetAmmo(amGirder, 0, 0, 0, 1) + SetAmmo(amParachute, 1, 0, 0, 1) + SetAmmo(amPickHammer, 0, 0, 0, 1) + SetAmmo(amJetpack, 0, 0, 0, 1) + SetAmmo(amLaserSight, 0, 0, 0, 1) +end + +function onGearDelete(gear) + + if gear == GirderCrate then + TurnTimeLeft = TurnTimeLeft + 30000 + end + + if GetGearType(gear) == gtCase then + TurnTimeLeft = 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) + GameOver = true + end + +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,117 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local player = nil -- This variable will point to the hog's gear +local p2 = nil +local enemy = nil +local bCrate = nil + +local GameOver = false + +function onGameInit() + + -- Things we don't modify here will use their default values. + Seed = 0 -- The base number for the random number generator + GameFlags = gfDisableWind-- Game settings and rules + TurnTime = 30000 -- The time the player has to move each round (in ms) + CaseFreq = 0 -- The frequency of crate drops + 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"), 14483456, "Statue", "Island", "Default", "cm_kiwi") + player = AddHog(loc("Greg"), 0, 50, "NoHat") + p2 = AddHog(loc("Mark"), 0, 20, "NoHat") + + AddTeam(loc("Cybernetic Empire"), 1175851, "ring", "Island", "Robot", "cm_cyborg") + enemy = AddHog(loc("Unit 3378"), 5, 30, "cyborg1") + + SetGearPosition(player,1403,235) + SetGearPosition(p2,1269,239) + SetGearPosition(enemy,492,495) + +end + + +function onGameStart() + + --mines + AddGear(276,76,gtMine, 0, 0, 0, 0) + AddGear(301,76,gtMine, 0, 0, 0, 0) + AddGear(326,76,gtMine, 0, 0, 0, 0) + AddGear(351,76,gtMine, 0, 0, 0, 0) + AddGear(376,76,gtMine, 0, 0, 0, 0) + AddGear(401,76,gtMine, 0, 0, 0, 0) + AddGear(426,76,gtMine, 0, 0, 0, 0) + AddGear(451,76,gtMine, 0, 0, 0, 0) + AddGear(476,76,gtMine, 0, 0, 0, 0) + + AddGear(886,356,gtMine, 0, 0, 0, 0) + AddGear(901,356,gtMine, 0, 0, 0, 0) + AddGear(926,356,gtMine, 0, 0, 0, 0) + AddGear(951,356,gtMine, 0, 0, 0, 0) + AddGear(976,356,gtMine, 0, 0, 0, 0) + AddGear(1001,356,gtMine, 0, 0, 0, 0) + + -- crates crates and more crates + bCrate = SpawnAmmoCrate(1688,476,amBaseballBat) + SpawnUtilityCrate(572,143,amGirder) + SpawnAmmoCrate(1704,954,amPickHammer) + SpawnAmmoCrate(704,623,amBlowTorch) + SpawnUtilityCrate(1543,744,amJetpack) + SpawnAmmoCrate(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) + +end + + +--function onGameTick() + + --if CurrentHedgehog ~= nil then + -- AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog)) + --end + +--end + + +function onAmmoStoreInit() + SetAmmo(amBlowTorch, 0, 0, 0, 1) + SetAmmo(amGirder, 0, 0, 0, 1) + SetAmmo(amPickHammer, 0, 0, 0, 2) + SetAmmo(amJetpack, 0, 0, 0, 1) + SetAmmo(amDrill, 0, 0, 0, 2) + SetAmmo(amBaseballBat, 0, 0, 0, 1) + SetAmmo(amSwitch, 9, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) +end + +function onGearDamage(gear, damage) + if (gear == player) and (damage == 30) then + HogSay(player,loc("T_T"),SAY_SHOUT) + end +end + +function onGearDelete(gear) + + if gear == bCrate then + HogSay(CurrentHedgehog, loc("Hmmm..."), SAY_THINK) + end + + if GetGearType(gear) == gtCase then + TurnTimeLeft = TurnTimeLeft + 5000 + 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 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork_2.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_Teamwork_2.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,109 @@ +-- Teamwork 2 +-- Original scenario by Arkhnen + +HedgewarsScriptLoad("Scripts/Locale.lua") + +local player = nil +local hlayer = nil +local enemy = nil +local Pack = nil +local help = false +local GameOver = false + +function onGameInit() + Seed = 0 + GameFlags = gfDisableWind + TurnTime = 600000000 + CaseFreq = 0 + MinesNum = 0 + MinesTime = 0 + -- Disable Sudden Death + HealthDecrease = 0 + WaterRise = 0 + + Explosives = 0 + Delay = 10 + Map = "CrazyMission" + Theme = "CrazyMission" + + AddTeam(loc("Feeble Resistance"), 14483456, "Statue", "Island", "Default", "cm_kiwi") + player = AddHog(loc("Greg"), 0, 30, "NoHat") + hlayer = AddHog(loc("Mark"), 0, 40, "NoHat") + + AddTeam(loc("Cybernetic Empire"), 1175851, "ring", "Island", "Robot", "cm_binary") + enemy = AddHog(loc("WatchBot 4000"), 5, 50, "cyborg1") + + SetGearPosition(player, 180, 555) + SetGearPosition(enemy, 1500, 914) + SetGearPosition(hlayer, 333, 555) +end + +function onGameStart() + Pack = SpawnAmmoCrate(40, 888, amPickHammer) + SpawnAmmoCrate(90, 888, amBaseballBat) + SpawnAmmoCrate(822, 750, amBlowTorch) + SpawnUtilityCrate(700, 580, amJetpack) + SpawnUtilityCrate(1400, 425, amParachute) + SpawnAmmoCrate(1900, 770, amDynamite) + SpawnAmmoCrate(1794, 970, amDynamite) + + ShowMission(loc("Teamwork 2"), loc("Scenario"), loc("Eliminate WatchBot 4000.") .. "|" .. loc("Both your hedgehogs must survive.") .. "|" .. loc("Land mines explode instantly."), -amBaseballBat, 0) + + AddGear(355, 822, gtSMine, 0, 0, 0, 0) + AddGear(515, 525, gtSMine, 0, 0, 0, 0) + AddGear(1080, 821, gtMine, 0, 0, 0, 0) + AddGear(1055, 821, gtMine, 0, 0, 0, 0) + AddGear(930, 587, gtMine, 0, 0, 0, 0) + AddGear(955, 556, gtMine, 0, 0, 0, 0) + AddGear(980, 556, gtMine, 0, 0, 0, 0) + AddGear(1005, 556, gtMine, 0, 0, 0, 0) + AddGear(710, 790, gtMine, 0, 0, 0, 0) + AddGear(685, 790, gtMine, 0, 0, 0, 0) + AddGear(660, 790, gtMine, 0, 0, 0, 0) + AddGear(1560, 540, gtMine, 0, 0, 0, 0) + AddGear(1610, 600, gtMine, 0, 0, 0, 0) + AddGear(1660, 655, gtMine, 0, 0, 0, 0) + AddGear(713, 707, gtMine, 0, 0, 0, 0) + AddGear(1668, 969, gtExplosives, 0, 0, 0, 0) + AddGear(1668, 906, gtExplosives, 0, 0, 0, 0) + AddGear(1668, 842, gtExplosives, 0, 0, 0, 0) + AddGear(1713, 969, gtExplosives, 0, 0, 0, 0) + SetWind(90) + + -- The enemy has no weapons and can only skip + for i=0, AmmoTypeMax do + if i ~= amNothing and i ~= amSkip then + AddAmmo(enemy, i, 0) + end + end +end + +function onGearAdd(gear) + if GetGearType(gear) == gtJetpack then + SetHealth(gear, 300) + end +end + +function onAmmoStoreInit() + SetAmmo(amParachute, 1, 0, 0, 2) + SetAmmo(amSwitch, 9, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) + SetAmmo(amPickHammer, 0, 0, 0, 1) + SetAmmo(amBaseballBat, 0, 0, 0, 1) + SetAmmo(amBlowTorch, 0, 0, 0, 2) + SetAmmo(amJetpack, 0, 0, 0, 1) + SetAmmo(amDynamite, 0, 0, 0, 1) +end + +function onGearDelete(gear) + if gear == Pack then + HogSay(CurrentHedgehog, loc("This will certianly come in handy."), SAY_THINK) + 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 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/User_Mission_-_The_Great_Escape.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/User_Mission_-_The_Great_Escape.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,122 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") + +local player = nil +local enemy = nil + +function onGameInit() + + Map = "Castle" + Theme = "Nature" + Seed = 0 + GameFlags = gfInfAttack + + TurnTime = 45 * 1000 + + CaseFreq = 0 + MinesNum = 0 + Explosives = 0 + + AddTeam(loc("Hero Team"), 14483456, "star", "Island", "Default", "cm_swordshield") + player = AddHog(loc("Good Dude"), 0, 80, "NoHat") --NoHat + + AddTeam(loc("Bad Team"), 1175851, "dragonball", "Island", "Default", "cm_dragonrb") + enemy = AddHog(loc("Bad Guy"), 1, 40, "NoHat") + +end + +function onGameStart() + +ShowMission(loc("The Great Escape"), loc("Scenario"), loc("Elimate your captor.") .. "|" .. loc("Mines time: 0 seconds"), -amGrenade, 0) + +------ GIRDER LIST ------ +PlaceGirder(1042,564,0) +PlaceGirder(1028,474,6) +PlaceGirder(1074,474,6) +PlaceGirder(1050,385,0) +PlaceGirder(1175,731,7) +PlaceGirder(1452,905,2) +PlaceGirder(1522,855,4) +PlaceGirder(1496,900,3) +PlaceGirder(1682,855,4) +PlaceGirder(1773,887,2) +PlaceGirder(1647,901,1) +PlaceGirder(1871,883,6) +PlaceGirder(1871,723,6) +PlaceGirder(1774,768,6) +PlaceGirder(1773,767,6) +PlaceGirder(1821,904,1) +PlaceGirder(1822,802,3) +PlaceGirder(1820,723,1) +PlaceGirder(1782,678,4) +PlaceGirder(1822,661,0) +PlaceGirder(1822,644,0) +PlaceGirder(1742,644,0) +PlaceGirder(1742,661,0) +PlaceGirder(1694,676,2) +PlaceGirder(1903,635,0) +------ HEALTH CRATE LIST ------ +SpawnHealthCrate(1476,169) +SpawnHealthCrate(1551,177) +SpawnHealthCrate(1586,200) +SpawnHealthCrate(1439,189) +SpawnHealthCrate(1401,211) +SpawnHealthCrate(1633,210) +------ MINE LIST ------ +tempG = AddGear(1010,680,gtMine, 0, 0, 0, 0) +SetTimer(tempG, 1) +tempG = AddGear(1031,720,gtMine, 0, 0, 0, 0) +SetTimer(tempG, 1) +tempG = AddGear(1039,748,gtMine, 0, 0, 0, 0) +SetTimer(tempG, 1) +tempG = AddGear(1051,777,gtMine, 0, 0, 0, 0) +SetTimer(tempG, 1) +tempG = AddGear(1065,796,gtMine, 0, 0, 0, 0) +SetTimer(tempG, 1) +tempG = AddGear(1094,800,gtMine, 0, 0, 0, 0) +SetTimer(tempG, 1) +------ REPOSITION LIST ------ +SetGearPosition(player,1050,534) +SetGearPosition(enemy,1512,158) +SetHealth(player, 1) +SetHealth(enemy, 1) +------ AMMO CRATE LIST ------ +SpawnAmmoCrate(1632,943,amShotgun) +SpawnAmmoCrate(1723,888,amFirePunch) +SpawnAmmoCrate(1915,599,amGrenade) +SpawnAmmoCrate(1416,913,amBlowTorch) +SpawnAmmoCrate(1227,640,amPickHammer) +------ UTILITY CRATE LIST ------ +SpawnUtilityCrate(1519,945,amParachute) +------ END LOADING DATA ------ + +end + +function onGameTick() + + if TurnTimeLeft == TurnTime-1 then + SetWind(100) + end + +end + +function onGearDelete(gear) + if (GetGearType(gear) == gtCase) and (CurrentHedgehog == player) then + if GetHealth(gear) > 0 then + AddGear(GetX(gear), GetY(gear), gtGrenade, 0, 0, 0, 1) + end + elseif gear == player then + ShowMission(loc("The Great Escape"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) + elseif gear == enemy then + ShowMission(loc("The Great Escape"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) + end +end + +function onAmmoStoreInit() + SetAmmo(amGrenade, 1, 0, 0, 1) + SetAmmo(amParachute, 1, 0, 0, 1) + SetAmmo(amFirePunch, 0, 0, 0, 3) + SetAmmo(amPickHammer, 0, 0, 0, 1) + SetAmmo(amBlowTorch, 0, 0, 0, 1) + SetAmmo(amShotgun, 0, 0, 0, 1) + SetAmmo(amSkip, 9, 0, 0, 0) +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Scenario/portal.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Missions/Scenario/portal.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,206 @@ +HedgewarsScriptLoad("/Scripts/Locale.lua") +HedgewarsScriptLoad("/Scripts/Utils.lua") + +local MineArray = {} +local player +local adviceGiven = false +local adviceGiven2 = false + +function onGameInit() + Seed = 0 -- The base number for the random number generator + GameFlags = gfInfAttack +gfBorder +gfDisableWind +gfSolidLand + TurnTime = 1500000 -- The time the player has to move each round (in ms) + 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"), 0xFFFF01, "Simple", "Island", "Default", "cm_test") + player = AddHog(loc("Subject 1"), 0, 10, "Terminator_Glasses") + + AddTeam(loc("Hell Army"), 0xFF0402, "skull", "Island", "Default", "cm_hellish") + enemy1 = AddHog(loc("Lucifer"), 1, 200, "InfernalHorns") + enemy2 = AddHog(loc("Voldemort"), 1, 150, "WizardHat") + enemy3 = AddHog(loc("Zombi"), 1, 100, "Zombi") + enemy4 = AddHog(loc("Predator"), 1, 14, "anzac") + enemy5 = AddHog(loc("Oneye"), 1, 50, "cyclops") + enemy6 = AddHog(loc("Razac"), 1, 50, "Evil") + enemy7 = AddHog(loc("C-2"), 1, 50, "cyborg1") + enemy8 = AddHog(loc("Rider"), 1, 50, "scif_SparkssHelmet") + + AddTeam(loc("Badmad"), 0xFF0402, "skull", "Island", "Default", "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) + +end + +function onAmmoStoreInit() + + SetAmmo(amFirePunch, 0,0,0,1) + SetAmmo(amParachute, 0, 0, 0, 2) + SetAmmo(amGirder, 0, 0, 0, 3) + SetAmmo(amTeleport, 0, 0, 0, 1) + SetAmmo(amLaserSight,0,0,0,1) + SetAmmo(amHellishBomb,0,0,0,1) + SetAmmo(amGrenade,0,0,0,1) + SetAmmo(amRope,0,0,0,1) + SetAmmo(amDEagle,0,0,0,1) + SetAmmo(amExtraTime,0,0,0,2) + SetAmmo(amSkip,9,0,0,0) + SetAmmo(amBlowTorch, 0, 0, 0, 1) + SetAmmo(amPickHammer, 0, 0, 0, 1) + SetAmmo(amSnowball, 0, 0, 0, 1) + +end + +function onGameStart() + + SetWind(100) + + MineArray[0] = AddGear(840, 1847, gtMine, 0, 0, 0, 0) + MineArray[1] = AddGear(900, 1847, gtMine, 0, 0, 0, 0) + MineArray[2] = AddGear(1000, 1847, gtMine, 0, 0, 0, 0) + MineArray[3] = AddGear(1100, 1847, gtMine, 0, 0, 0, 0) + MineArray[4] = AddGear(1140, 1847, gtMine, 0, 0, 0, 0) + MineArray[5] = AddGear(1170, 1847, gtMine, 0, 0, 0, 0) + MineArray[6] = AddGear(1200, 1847, gtMine, 0, 0, 0, 0) + MineArray[7] = AddGear(1200, 1847, gtMine, 0, 0, 0, 0) + MineArray[8] = AddGear(1230, 1847, gtMine, 0, 0, 0, 0) + MineArray[9] = AddGear(1280, 1847, gtMine, 0, 0, 0, 0) + MineArray[10] = AddGear(1302, 1847, gtMine, 0, 0, 0, 0) + MineArray[11] = AddGear(1350, 1847, gtMine, 0, 0, 0, 0) + MineArray[12] = AddGear(1383, 1847, gtMine, 0, 0, 0, 0) + MineArray[13] = AddGear(1400, 1847, gtMine, 0, 0, 0, 0) + MineArray[14] = AddGear(1423, 1847, gtMine, 0, 0, 0, 0) + MineArray[15] = AddGear(1470, 1847, gtMine, 0, 0, 0, 0) + MineArray[16] = AddGear(1480, 1847, gtMine, 0, 0, 0, 0) + MineArray[17] = AddGear(1311, 1847, gtMine, 0, 0, 0, 0) + + MineArray[18] = AddGear(840, 1785, gtMine, 0, 0, 0, 0) + MineArray[19] = AddGear(900, 1785, gtMine, 0, 0, 0, 0) + MineArray[20] = AddGear(1000, 1785, gtMine, 0, 0, 0, 0) + MineArray[21] = AddGear(1100, 1785, gtMine, 0, 0, 0, 0) + MineArray[22] = AddGear(1140, 1785, gtMine, 0, 0, 0, 0) + MineArray[23] = AddGear(1170, 1785, gtMine, 0, 0, 0, 0) + MineArray[24] = AddGear(1200, 1785, gtMine, 0, 0, 0, 0) + MineArray[25] = AddGear(1230, 1785, gtMine, 0, 0, 0, 0) + MineArray[26] = AddGear(1280, 1785, gtMine, 0, 0, 0, 0) + MineArray[27] = AddGear(1302, 1785, gtMine, 0, 0, 0, 0) + MineArray[28] = AddGear(1350, 1785, gtMine, 0, 0, 0, 0) + MineArray[29] = AddGear(1383, 1785, gtMine, 0, 0, 0, 0) + MineArray[30] = AddGear(1400, 1785, gtMine, 0, 0, 0, 0) + MineArray[31] = AddGear(1423, 1785, gtMine, 0, 0, 0, 0) + MineArray[32] = AddGear(1470, 1785, gtMine, 0, 0, 0, 0) + MineArray[33] = AddGear(1480, 1785, gtMine, 0, 0, 0, 0) + MineArray[34] = AddGear(1311, 1785, gtMine, 0, 0, 0, 0) + + MineArray[35] = AddGear(4029, 89, gtMine, 0, 0, 0, 120) + + for i = 0,#MineArray do + SetTimer(MineArray[i],050) + SetState(MineArray[i],544) + end + --needed this MineArray cause timer didn't work, its was always 3sec, i wanna instant mines + + --UTILITY CRATE-- + parachute = SpawnUtilityCrate(1670, 1165, amParachute) + girder = SpawnUtilityCrate(2101, 1297, amGirder) + SpawnUtilityCrate(1375, 900, amTeleport) + SpawnUtilityCrate(1660,1820, amLaserSight) + SpawnUtilityCrate(4070,1840, amLaserSight) + portalgun = SpawnUtilityCrate(505, 1943, amPortalGun, 1000) + extratime = SpawnUtilityCrate(4020, 785, amExtraTime, 2) + + --AMMO CRATE-- + SpawnAmmoCrate(425, 613, amSnowball) + SpawnAmmoCrate(861, 633, amHellishBomb) + SpawnAmmoCrate(2510, 623, amSnowball) + SpawnAmmoCrate(2900, 1600, amGrenade) + SpawnAmmoCrate(2680, 320, amGrenade) + SpawnAmmoCrate(2650, 80, amDEagle) + SpawnAmmoCrate(3000, 100, amDEagle) + SpawnAmmoCrate(2900, 1400, amRope) + SpawnAmmoCrate(4025, 1117, amFirePunch) + SpawnAmmoCrate(3965, 625, amBlowTorch) + SpawnAmmoCrate(2249, 93, amBlowTorch) + SpawnAmmoCrate(2181, 829, amBlowTorch) + SpawnAmmoCrate(1820, 567, amBlowTorch) + SpawnAmmoCrate(130, 600, amPickHammer) + + --HEALTH CRATE-- + SpawnHealthCrate(2000, 780) + + --GIRDER-- + PlaceGirder(3363, 1323, 4) + + ShowMission (loc("Portal Mind Challenge"), loc("Scenario"), + loc("Defeat all enemies!") .. "|" .. + 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 onGameTick() + + if (player ~= nil) then + if (gearIsInBox(player, 1650, 1907, 200, 60) and (adviceGiven == false)) then + adviceGiven = 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 + HogSay(player, loc("The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."), SAY_THINK) + end + end + +end + +function onGearDelete(gear) + -- Check gear collection + if CurrentHedgehog == player and (band(GetGearMessage(gear), gmDestroy) ~= 0) then + if gear == portalgun then + HogSay(player, loc("Great! Let’s kill all these enemies, using portals."), SAY_THINK) + end + + if gear == girder then + HogSay(player, loc("This will be useful when I need a new platform or if I want to rise."), SAY_THINK) + end + + if gear == parachute then + HogSay(player, loc("You can’t open a portal on the blue surface."), SAY_THINK) + end + + if gear == extratime then + HogSay(player, loc("What?! For all this struggle I just win some ... time? Oh dear!"), SAY_SHOUT) + end + end + + if gear == player then + player = nil + end +end + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Bazooka.lua Sun Dec 17 00:09:24 2017 +0100 @@ -66,7 +66,7 @@ -- The base number for the random number generator Seed = 1 -- Game settings and rules - EnableGameFlags(gfMultiWeapon, gfOneClanMode, gfSolidLand) + EnableGameFlags(gfMultiWeapon, gfOneClanMode, gfSolidLand, gfDisableWind) -- Uncommenting this wouldn't do anything --EnableGameFlags(gfMultiWeapon, gfOneClanMode, gfSolidLand) -- Neither this @@ -89,9 +89,12 @@ Map = "Bamboo" -- The theme to be used Theme = "Bamboo" + -- Setting these 2 values to 0 is the official way to disable Sudden Death cleanly + HealthDecrease = 0 -- Sudden Death damage + WaterRise = 0 -- Water rise in Sudden Death -- Create the player team - AddTeam(loc("'Zooka Team"), 14483456, "Simple", "Island", "Default") + AddTeam(loc("'Zooka Team"), 14483456, "Simple", "Island", "Default", "cm_crosshair") -- And add a hog to it player = AddHog(loc("Hunter"), 0, 1, "NoHat") SetGearPosition(player, 936, 136) @@ -105,6 +108,7 @@ SendHealthStatsOff() -- Spawn the first target. spawnTarget() + SetWind(-20) -- Show some nice mission goals. -- Parameters are: caption, sub caption, description, @@ -223,7 +227,7 @@ if GetGearType(gear) == gtHedgehog then if not game_lost then game_lost = true - AddCaption(loc("You lose!", 0xFFFFFFFF, capgrpGameState)) + AddCaption(loc("You lose!"), 0xFFFFFFFF, capgrpGameState) ShowMission(loc("Bazooka Training") , loc("Aiming Practice"), loc("Oh no! You failed! Just try again."), -amSkip, 0) time_goal = 1 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Basic_Training_-_Flying_Saucer.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Flying_Saucer.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Flying_Saucer.lua Sun Dec 17 00:09:24 2017 +0100 @@ -98,8 +98,8 @@ 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.")), + 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}, } -- The Boom Target @@ -114,8 +114,8 @@ loc("Step 2: Select your grenade.") .. "|" .. loc("Step 3: Start flying and get yourself right above the target.") .. "|" .. loc("Step 4: Drop your grenade by pressing the [Long jump] key.") .. "|" .. - loc("Step 5: Get away quickly and land safely anywhere." .. "| |" .. - loc("Note: We only give you grenades if you stay in your flying saucer.")), nil, 20000) + loc("Step 5: Get away quickly and land safely anywhere.") .. "| |" .. + loc("Note: We only give you grenades if you stay in your flying saucer."), nil, 20000) SpawnBoomTarget() diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua Sun Dec 17 00:09:24 2017 +0100 @@ -82,9 +82,12 @@ Map = "Battlefield" -- The theme to be used Theme = "Castle" + -- Setting these 2 values to 0 is the official way to disable Sudden Death cleanly + HealthDecrease = 0 -- Sudden Death damage + WaterRise = 0 -- Water rise in Sudden Death -- Create the player team - AddTeam(loc("Grenadiers"), 14483456, "Simple", "Island", "Default") + AddTeam(loc("Grenadiers"), 14483456, "Simple", "Island", "Default", "cm_grenade") -- And add a hog to it player = AddHog(loc("Nade Boy"), 0, 1, "war_grenadier1") SetGearPosition(player, 506, 76) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Basic_Training_-_Rope.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Rope.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Rope.lua Sun Dec 17 00:09:24 2017 +0100 @@ -14,8 +14,10 @@ local Target = nil -- Pointer to target hog local GameLost = false -- You lost the game local Objective = false -- Get to the target +local RopeMaster = false -- Achievement +local StatsSent = false -- Remember whether the stats have been sent already -local WaitTime = 10000 -- Wait 10sec before quit +local WaitTime = 1000 -- Wait 1sec before quit local FollowTime = 1500 -- For use with FollowGear local FollowingGear = false local BaseballIntro = false -- Fail safe for ticker @@ -26,20 +28,20 @@ local GetTime = 0 TargetPos[ 1 ] = { X = 1100, Y = 1100, Message = loc("Now find the next target! |Tip: Normally you lose health by falling down, so be careful!") } -TargetPos[ 2 ] = { X = 1500, Y = 1490, Message = loc("You're getting pretty good! |Tip: When you shorten you rope you move faster! |and when you lengthen it you move slower") } +TargetPos[ 2 ] = { X = 1500, Y = 1490, Message = loc("You're getting pretty good! |Tip: When you shorten you rope, you move faster!|And when you lengthen it, you move slower.") } TargetPos[ 3 ] = { X = 2200, Y = 800, Message = loc("The next one is pretty hard! |Tip: You have to do multiple swings!") } -TargetPos[ 4 ] = { X = 2870, Y = 400, Message = loc("I don't know how you did that.. But good work! |The next one should be easy as cake for you!") } +TargetPos[ 4 ] = { X = 2870, Y = 400, Message = loc("I don't know how you did that. But good work!|The next one should be easy as cake for you!") } TargetPos[ 5 ] = { X = 4000, Y = 1750, Message = "" } TargetPos[ 6 ] = { Modifier = true, Func = function() -- Last target is ALWAYS the "winning" target! - Info( loc("Congratulations"), loc("Congratulations! You've completed the Rope tutorial! |- Tutorial ends in 10 seconds!"), 0 ) -- Congrats - HogSay( Player, loc("Victory!"), SAY_SHOUT) -- You win! - PlaySound( sndVictory ) + Info( loc("Congratulations"), loc("Congratulations! You've completed the Basic Rope Training!"), 0 ) -- Congrats + PlaySound( sndVictory, Player ) + AddCaption( loc( "Victory!" ), 0xFFFFFFFF, capgrpGameState) if TurnTimeLeft >= 250000 then -- If you very fast, unlock the ahievement "Rope Master!" - AddCaption( loc( "Achievement Unlocked" ) .. ": " .. loc( "Rope Master!" ),0xffba00ff,capgrpAmmoinfo ) + RopeMaster = true + AddCaption( string.format(loc("Achievement gotten: %s"), loc("Rope Master") ), 0xffba00ff, capgrpMessage2) PlaySound( sndHomerun ) end - Objective = true end } @@ -67,7 +69,7 @@ end if TargetNumber > 1 then - Info(loc("Aiming Practice"), TargetPos[ TargetNumber - 1 ].Message, -amRope ) + Info(loc("Training"), TargetPos[ TargetNumber - 1 ].Message, -amRope ) end SpawnTarget( TargetPos[ TargetNumber ].X, TargetPos[ TargetNumber ].Y ) -- Spawn target on the next position @@ -83,7 +85,7 @@ if (not BaseballIntro and not Objective) and (CurrentHedgehog ~= nil) then --Fail safe check if InRange( Hog, 1100, 1100, Distance ) then -- Check if the player is within predefined position of the first target BaseballIntro = true - Info(loc("Aiming Practice"), loc("Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"), -amRope ) -- Guide them + Info(loc("Training"), loc("Great work! Now hit it with your Baseball Bat! |Tip: You can change weapon with 'Right Click'!"), -amRope ) -- Guide them Timer( 10000, loc("Remember: The rope only bend around objects, |if it doesn't hit anything it's always stright!")) end end @@ -107,8 +109,12 @@ Delay = 1 -- We don't wont to wait between each round ( as the only is one ) Map = "Ropes" -- Map name Theme = "Nature" -- Map theme + -- Disable Sudden Death + SuddenDeathTurns = 50 + WaterRise = 0 + HealthDecrease = 0 - AddTeam( loc( "Rope Team" ), 14483456, "Simple", "Island", "Default" ) -- Lets make the team + AddTeam( loc( "Rope Team" ), 14483456, "Simple", "Island", "Default", "cm_shoppa" ) -- Lets make the team Player = AddHog( loc( "Hunter" ), 0, 1, "StrawHat" ) -- Add a hog for it, and name it "Hunter" SetGearPosition( Player, 420, 1750 ) -- Set player position @@ -116,12 +122,16 @@ end function onGameStart() -- Called when the game starts + SendHealthStatsOff() AutoSpawn() -- Spawn our 1st target using the wrapper function SetHealth( Player, 100 ) -- Give the player 100 Health points - Info(loc("Aiming Practice"), loc("Get to the target using your rope! |Controls: Left & Right to swing the rope - Up & Down to Contract and Expand!"), -amRope ) -- Short intro to tell the player what to do - Timer( 10000, loc("Tip: The rope physics are different than in the real world, |use it to your advantage!") ) -- After 15 sec, give them more help + PlaceGirder(46,1783, 0) -- Place a girder to prevent the player falling into the water + + local message = loc("Get to the target using your rope!") .. "|" .. loc("Controls: Hold the Attack key (space by default) to|fire the rope, then, once attached use:|Left and Right to swing the rope;|Up and Down to contract and expand.") + Info(loc("Training"), message, -amRope ) -- Short intro to tell the player what to do + Timer( 10000, message .. "|" .. loc("Tip: The rope physics are different than in the real world, |use it to your advantage!") ) -- After 15 sec, give them more help end function onNewTurn() @@ -131,7 +141,12 @@ function onGameTick20() if TurnTimeLeft < 40 and TurnTimeLeft > 0 then -- Round starts at 0, so we check if the round is finished by using 1 GameLost = true -- You lost the game - Info(loc("Aiming Practice"), loc("You did not make it in time, try again!"), -amSkip ) + Info(loc("Training"), loc("You did not make it in time, try again!"), -amSkip ) + if not StatsSent then + SendStat(siGameResult, loc("You failed!")) + SendStat(siCustomAchievement, loc("You did not make it in time, try again!")) + StatsSent = true + end SetHealth( Player, 0 ) -- Kill the player so he can't keep moving! SetEffect( Player, heResurrectable, 0 ) @@ -142,14 +157,15 @@ -- If round is finished and your not at the target you lose -- in either case, end the game if (Objective == true) or (GameLost == true) then - if (WaitTime == 0) then - DismissTeam(loc( "Rope Team" )) - - --SetHealth( Player, 0 ) -- Kill the player so he can't keep moving! - --SetEffect( Player, heResurrectable, 0 ) - TurnTimeLeft = 1 - - WaitTime = -1 + if (WaitTime == 0 and not StatsSent) then + SendStat(siGameResult, loc("You have finished the Basic Rope Training!")) + SendStat(siCustomAchievement, loc("Good job!")) + SendStat(siPlayerKills, "0", loc("Rope Team")) + if RopeMaster then + SendStat(siCustomAchievement, loc("You earned the \"Rope Master\" achievement for finishing in under 50 seconds.")) + end + StatsSent = true + EndGame() else WaitTime = WaitTime - 20 end @@ -167,7 +183,7 @@ for k, v in pairs( Timers ) do if v.End <= GetTime then - Info(loc("Aiming Practice"), v.Message, -amRope ) + Info(loc("Training"), v.Message, -amRope ) Timers[ k ] = nil end end @@ -182,16 +198,6 @@ SetAmmo( amBaseballBat, 9, 2, 0, 0 ) --Baseball bat end -function onGearResurrect( Gear ) - if TargetNumber > 1 then - SetGearPosition( Player, TargetPos[ TargetNumber - 1 ].X, TargetPos[ TargetNumber - 1 ].Y ) -- If the player dies spawn him where he last killed a target - Info(loc("Aiming Practice"), loc("You have been respawned, at your last checkpoint!"), -amRope ) - else - SetGearPosition( Player, 420, 1750 ) -- If the player dies and didn't kill a target just spawn him at the default spawn - Info(loc("Aiming Practice"), loc("You have been respawned, be more carefull next time!"), -amRope ) - end -end - function onGearDelete( Gear ) if GetGearType( Gear ) == gtTarget then AutoSpawn() -- When a target is deleted / destroyed, spawn a new one! diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Basic_Training_-_Sniper_Rifle.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Sniper_Rifle.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,363 +0,0 @@ --- Hedgewars SniperRifle Training --- Scripting Example - --- Lines such as this one are comments - they are ignored --- by the game, no matter what kind of text is in there. --- It's also possible to place a comment after some real --- instruction as you see below. In short, everything --- following "--" is ignored. - ---------------------------------------------------------------- --- At first we implement the localization library using loadfile. --- This allows us to localize strings without needing to think --- about translations. --- We can use the function loc(text) to localize a string. - -HedgewarsScriptLoad("/Scripts/Locale.lua") - --- This variable will hold the number of destroyed targets. -local score = 0 --- This variable will hold the number of shots from the sniper rifle -local shots = 0 --- This variable represents the number of targets to destroy. -local score_goal = 31 --- This variable controls how many milliseconds/ticks we'd --- like to wait before we end the round once all targets --- have been destroyed. -local end_timer = 1000 -- 1000 ms = 1 s --- This variable is set to true if the game is lost (i.e. --- time runs out). -local game_lost = false --- This variable will point to the hog's gear -local player = nil --- This variable will grab the time left at the end of the round -local time_goal = 0 - -local target = nil - -local last_hit_time = 0 - -local cinematic = false - --- This is a custom function to make it easier to --- spawn more targets with just one line of code --- You may define as many custom functions as you --- like. -function spawnTarget(x, y) - -- add a new target gear - target = AddGear(x, y, gtTarget, 0, 0, 0, 0) - -- have the camera move to the target so the player knows where it is - FollowGear(target) -end - -function blowUp(x, y) - if cinematic == false then - cinematic = true - SetCinematicMode(true) - end - -- adds some TNT - gear = AddGear(x, y, gtDynamite, 0, 0, 0, 0) -end - -function onNewTurn() - SetWeapon(amSniperRifle) -end - --- This function is called before the game loads its --- resources. --- It's one of the predefined function names that will --- be called by the game. They give you entry points --- where you're able to call your own code using either --- provided instructions or custom functions. -function onGameInit() - -- At first we have to overwrite/set some global variables - -- that define the map, the game has to load, as well as - -- other things such as the game rules to use, etc. - -- Things we don't modify here will use their default values. - - -- The base number for the random number generator - Seed = 0 - -- Game settings and rules - GameFlags = gfMultiWeapon + gfOneClanMode + gfArtillery - -- The time the player has to move each round (in ms) - TurnTime = 150000 - -- The frequency of crate drops - CaseFreq = 0 - -- The number of mines being placed - 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 - Theme = "Golf" - - -- Create the player team - AddTeam(loc("Sniperz"), 14483456, "Simple", "Island", "Default") - -- And add a hog to it - player = AddHog(loc("Hunter"), 0, 1, "Sniper") - SetGearPosition(player, 602, 1465) -end - --- This function is called when the round starts --- it spawns the first target that has to be destroyed. --- In addition it shows the scenario goal(s). -function onGameStart() - -- Disable graph in stats screen - SendHealthStatsOff() - -- Spawn the first target. - spawnTarget(860,1020) - - -- 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) -end - --- This function is called every game tick. --- Note that there are 1000 ticks within one second. --- You shouldn't try to calculate too complicated --- code here as this might slow down your game. -function onGameTick20() - if game_lost then - return - end - -- after a target is destroyed, show hog, then target - if (target ~= nil) and (TurnTimeLeft + 1300 < last_hit_time) then - -- move camera to the target - FollowGear(target) - elseif TurnTimeLeft + 300 < last_hit_time then - -- move camera to the hog - FollowGear(player) - end - -- If time's up, set the game to be lost. - -- We actually check the time to be "1 ms" as it - -- 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() - -- Just to be sure set the goal time to 1 ms - time_goal = 1 - end - -- If the goal is reached or we've lost ... - if score == score_goal or game_lost then - -- ... check to see if the time we'd like to - -- wait has passed and then ... - if end_timer == 0 then - -- ... end the game ... - generateStats() - EndGame() - else - -- ... or just lower the timer by 1. - -- Reset the time left to stop the timer - TurnTimeLeft = time_goal - end - end_timer = end_timer - 20 - end -end - --- This function is called when the game is initialized --- to request the available ammo and probabilities -function onAmmoStoreInit() - -- add an unlimited supply of shotgun ammo - SetAmmo(amSniperRifle, 9, 0, 0, 0) -end - --- This function is called when a new gear is added. --- We use it to count the number of shots, which we --- in turn use to calculate the final score and stats -function onGearAdd(gear) - if GetGearType(gear) == gtSniperRifleShot then - shots = shots + 1 - end -end - --- This function is called before a gear is destroyed. --- We use it to count the number of targets destroyed. -function onGearDelete(gear) - local gt = GetGearType(gear) - - if gt == gtCase then - game_lost = true - return - end - - if (gt == gtDynamite) and cinematic then - cinematic = false - SetCinematicMode(false) - return - end - - if gt == gtTarget then - -- remember when the target was hit for adjusting the camera - last_hit_time = TurnTimeLeft - -- Add one point to our score/counter - score = score + 1 - -- If we haven't reached the goal ... - if score < score_goal then - -- ... spawn another target. - if score == 1 then - spawnTarget(1520,1350) - elseif score == 2 then - spawnTarget(1730,1040) - elseif score == 3 then - spawnTarget(2080,780) - elseif score == 4 then - AddCaption(loc("Good so far!") .. " " .. loc("Keep it up!")); - blowUp(1730,1226) - blowUp(1440,1595) - blowUp(1527,1575) - blowUp(1614,1595) - blowUp(1420,1675) - blowUp(1527,1675) - blowUp(1634,1675) - blowUp(1440,1755) - blowUp(1527,1775) - blowUp(1614,1755) - spawnTarget(1527,1667) - elseif score == 5 then - spawnTarget(1527,1667) - elseif score == 6 then - spawnTarget(2175,1300) - elseif score == 7 then - spawnTarget(2250,940) - elseif score == 8 then - spawnTarget(2665,1540) - elseif score == 9 then - spawnTarget(3040,1160) - elseif score == 10 then - spawnTarget(2930,1500) - elseif score == 11 then - AddCaption(loc("This one's tricky.")); - spawnTarget(700,720) - elseif score == 12 then - AddCaption(loc("Well done.")); - blowUp(914,1222) - blowUp(1050,1222) - blowUp(1160,1008) - blowUp(1160,1093) - blowUp(1160,1188) - blowUp(375,911) - blowUp(510,911) - blowUp(640,911) - blowUp(780,911) - blowUp(920,911) - blowUp(1060,913) - blowUp(1198,913) - spawnTarget(1200,730) - elseif score == 13 then - spawnTarget(1200,830) - elseif score == 14 then - spawnTarget(1430,450) - elseif score == 15 then - spawnTarget(796,240) - elseif score == 16 then - spawnTarget(300,10) - elseif score == 17 then - spawnTarget(2080,820) - elseif score == 18 then - AddCaption(loc("Demolition is fun!")); - blowUp(2110,920) - blowUp(2210,920) - blowUp(2200,305) - blowUp(2300,305) - blowUp(2300,400) - blowUp(2300,500) - blowUp(2300,600) - blowUp(2300,700) - blowUp(2300,800) - blowUp(2300,900) - blowUp(2401,305) - blowUp(2532,305) - blowUp(2663,305) - spawnTarget(2300,760) - elseif score == 19 then - spawnTarget(2300,760) - elseif score == 20 then - spawnTarget(2738,190) - elseif score == 21 then - spawnTarget(2590,-100) - elseif score == 22 then - AddCaption(loc("Will this ever end?")); - blowUp(2790,305) - blowUp(2930,305) - blowUp(3060,305) - blowUp(3190,305) - blowUp(3310,305) - blowUp(3393,613) - blowUp(2805,370) - blowUp(2805,500) - blowUp(2805,630) - blowUp(2805,760) - blowUp(2805,890) - blowUp(3258,370) - blowUp(3258,475) - blowUp(3264,575) - spawnTarget(3230,240) - elseif score == 23 then - spawnTarget(3230,290) - elseif score == 24 then - spawnTarget(3670,250) - elseif score == 25 then - spawnTarget(2620,-100) - elseif score == 26 then - spawnTarget(2870,300) - elseif score == 27 then - spawnTarget(3850,900) - elseif score == 28 then - spawnTarget(3780,300) - elseif score == 29 then - spawnTarget(3670,0) - elseif score == 30 then - AddCaption(loc("Last Target!")); - spawnTarget(3480,1200) - end - else - if not game_lost then - -- Otherwise show that the goal was accomplished - 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) - -- Save the time left so we may keep it. - time_goal = TurnTimeLeft - end - end - end -end - --- This function calculates the final score of the player and provides some texts and --- data for the final stats screen -function generateStats() - local accuracy = (score/shots)*100 - local end_score_targets = (score * 200) - 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) - end_score_overall = end_score_time + end_score_targets + end_score_accuracy - - 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)) - SendStat(siCustomAchievement, string.format(loc("You had %.2fs remaining on the clock (+%d points)."), (time_goal/1000), end_score_time)) - else - SendStat(siGameResult, loc("You lose!")) - - 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(siPlayerKills, tostring(end_score_overall), loc("Sniperz")) - SendStat(siPointType, loc("points")) -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_Hedgelove.lua --- a/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_Hedgelove.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -HedgewarsScriptLoad("/Scripts/SpeedShoppa.lua") - -local params = {} -params.missionTitle = loc("Shoppa Love") -params.teamName = loc("Team of Hearts") -params.hogName = loc("Heartful") -params.teamFlag = "cm_iluvu" -params.teamGrave = "heart" -params.hogHat = "pinksunhat" -params.crateType = "health" -params.faceLeft = true - -params.time = 45000 -params.map = "Hedgelove" -params.theme = "Nature" - -params.hog_x = 410 -params.hog_y = 934 -params.crates = { - { x = 183, y = 710 }, - { x = 202, y = 519 }, - { x = 336, y = 356 }, - { x = 658, y = 363 }, - { x = 1029, y = 39 }, - { x = 758, y = 879 }, - { x = 1324, y = 896 }, - { x = 1410, y = 390 }, - { x = 1746, y = 348 }, - { x = 1870, y = 538 }, - { x = 1884, y = 723 }, - { x = 1682, y = 970 }, -} -params.extra_onGameStart = function() - PlaceGirder(394, 1000, 0) - PlaceGirder(1696, 1000, 0) -end - -SpeedShoppaMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_Ropes.lua --- a/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_Ropes.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -HedgewarsScriptLoad("/Scripts/SpeedShoppa.lua") - -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.time = 115000 -params.map = "Ropes" -params.theme = "City" - -params.hog_x = 3754 -params.hog_y = 1742 -params.crates = { - { x = 3533, y = 1404 }, - { x = 3884, y = 1048 }, - { x = 3366, y = 664 }, - { x = 3162, y = 630 }, - { x = 2872, y = 402 }, - { x = 3812, y = 322 }, - { x = 3685, y = 34 }, - { x = 3324, y = 540 }, - { x = 2666, y = 224 }, - { x = 2380, y = 1002 }, - { x = 2224, y = 1008 }, - { x = 2226, y = 854 }, - { x = 3274, y = 1754 }, - { x = 3016, y = 1278 }, - { x = 2756, y = 1716 }, - { x = 2334, y = 1756 }, - { x = 1716, y = 1752 }, - { x = 1526, y = 1464 }, - { x = 356, y = 1734 }, - { x = 598, y = 1444 }, - { x = 1084, y = 1150 }, - { x = 358, y = 834 }, - { x = 936, y = 200 }, - { x = 1540, y = 514 }, -} - -SpeedShoppaMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua --- a/share/hedgewars/Data/Missions/Training/Challenge_-_Speed_Shoppa_-_ShoppaKing.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -HedgewarsScriptLoad("/Scripts/SpeedShoppa.lua") - -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" -params.theme = "Castle" - -params.hog_x = 543 -params.hog_y = 1167 -params.crates = { - { x = 170, y = 172 }, - { x = 216, y = 478 }, - { x = 616, y = 966 }, - { x = 291, y = 1898 }, - { x = 486, y = 1965 }, - { x = 852, y = 1289 }, - { x = 1224, y = 1625 }, - { x = 925, y = 584 }, - { x = 2013, y = 141 }, - { x = 2250, y = 351 }, - { x = 2250, y = 537 }, - { x = 2472, y = 513 }, - { x = 1974, y = 459 }, - { x = 1995, y = 1068 }, - { x = 2385, y = 1788 }, - { x = 1698, y = 1725 }, - { x = 2913, y = 1092 }, - { x = 3972, y = 1788 }, - { x = 3762, y = 1635 }, - { x = 2577, y = 1473 }, - { x = 3612, y = 1068 }, - { x = 3945, y = 687 }, - { x = 2883, y = 618 }, - { x = 3543, y = 471 }, - { x = 3636, y = 306 }, - { x = 3210, y = 321 }, - { x = 3426, y = 126 }, - { x = 3033, y = 1590 }, - { x = 3774, y = 1341 }, - { x = 1254, y = 297 }, - { x = 1300, y = 1022 }, - { x = 1410, y = 1292 }, - { x = 868, y = 1812 }, - { x = 3426, y = 954 }, -} - -SpeedShoppaMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/ClimbHome.lua --- a/share/hedgewars/Data/Missions/Training/ClimbHome.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local isSinglePlayer = true - --- trying to allow random theme, but fixed theme objects... --- Also skip some ugly themes, or ones where the sky is "meh" ---local themes = { "Art","Cake","City","EarthRise","Halloween","Olympics","Underwater","Bamboo","Castle","Compost","Eyes","Hell","Planes","Bath","Cave","CrazyMission","Freeway","Island","Sheep","Blox","Cheese","Deepspace","Fruit","Jungle","Snow","Brick","Christmas","Desert","Golf","Nature","Stage" } -local themes = {"Christmas","Hell","Bamboo","City","Island","Bath","Compost","Jungle","Desert","Nature","Olympics","Brick","EarthRise","Sheep","Cake","Freeway","Snow","Castle","Fruit","Stage","Cave","Golf","Cheese","Halloween"} -local showWaterStats = true -- uses the AI team to draw water height. -local scaleGraph = true -local totalHedgehogs = 0 -local HH = {} -local teams = {} -local dummyHog = nil - - -function onGameInit() - -- Ensure people get same map for same theme - Theme = themes[GetRandom(#themes)+1] - Seed = ClimbHome - TurnTime = 999999999 - EnableGameFlags(gfOneClanMode) - DisableGameFlags(gfBottomBorder+gfBorder) - CaseFreq = 0 - Explosives = 0 - MineDudPercent = 0 - Map = "ClimbHome" - AddTeam(loc("Lonely Hog"), 0xDD0000, "Simple", "Island", "Default") - player = AddHog(loc("Climber"), 0, 1, "NoHat") - if showWaterStats then - AddTeam(" ", 0x545C9D, "Simple", "Island", "Default") - elseif scaleGraph then - AddTeam(" ", 0x050505, "Simple", "Island", "Default") - end - if showWaterStats or scaleGraph then - dummyHog = AddHog(" ", 0, 1, "NoHat") - HH[dummyHog] = nil - totalHedgehogs = totalHedgehogs - 1 - SendStat(siClanHealth, tostring(32640), " ") - end -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_easy.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -HedgewarsScriptLoad("/Scripts/TargetPractice.lua") - -local params = { - ammoType = amBazooka, - gearType = gtShell, - missionTitle = loc("Target Practice: Bazooka (easy)"), - wind = 50, - solidLand = true, - map = "Lonely_Island", - theme = "Island", - hog_x = 1439, - hog_y = 482, - hogName = loc("Zook"), - hogHat = "war_americanww2helmet", - teamName = loc("Team Zook"), - targets = { - { x = 1310, y = 756 }, - { x = 1281, y = 893 }, - { x = 1376, y = 670 }, - { x = 1725, y = 907 }, - { x = 1971, y = 914 }, - { x = 1098, y = 955 }, - { x = 1009, y = 877 }, - { x = 930, y = 711 }, - { x = 771, y = 744 }, - { x = 385, y = 405 }, - { x = 442, y = 780 }, - { x = 620, y = 639 }, - { x = 311, y = 239 }, - }, - time = 80000, - shootText = loc("You have launched %d bazookas."), -} - -TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Bazooka_hard.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -HedgewarsScriptLoad("/Scripts/TargetPractice.lua") - -local params = { - ammoType = amBazooka, - gearType = gtShell, - missionTitle = loc("Target Practice: Bazooka (hard)"), - wind = 20, - solidLand = true, - artillery = true, - map = "SB_Grassy", - theme = "Castle", - hog_x = 2112, - hog_y = 913, - hogName = loc("Zook"), - hogHat = "war_americanww2helmet", - teamName = loc("Team Zook"), - targets = { - { x = 2660, y = 936 }, - { x = 2857, y = 629 }, - { x = 3044, y = 851 }, - { x = 3200, y = 441 }, - { x = 2931, y = 440 }, - { x = 3264, y = 370 }, - { x = 1880, y = 684 }, - { x = 1392, y = 672 }, - { x = 1587, y = 656 }, - { x = 1300, y = 840 }, - { x = 952, y = 814 }, - { x = 862, y = 634 }, - { x = 748, y = 794 }, - { x = 639, y = 548 }, - { x = 1730, y = 549 }, - { x = 1466, y = 566 }, - { x = 3716, y = 954 }, - }, - time = 180000, - shootText = loc("You have launched %d bazookas."), -} - -TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Cluster_Bomb.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -HedgewarsScriptLoad("/Scripts/TargetPractice.lua") - -local params = { - ammoType = amClusterBomb, - gearType = gtClusterBomb, - missionTitle = loc("Cluster Bomb Training"), - solidLand = false, - map = "Trash", - theme = "Golf", - hog_x = 756, - hog_y = 370, - hogName = loc("Private Nolak"), - hogHat = "war_desertgrenadier1", - teamName = loc("The Hogies"), - targets = { - { x = 628, y = 0 }, - { x = 891, y = 0 }, - { x = 1309, y = 0 }, - { x = 1128, y = 0 }, - { x = 410, y = 0 }, - { x = 1564, y = 0 }, - { x = 1248, y = 476 }, - { x = 169, y = 0 }, - { x = 1720, y = 0 }, - { x = 1441, y = 0 }, - { x = 599, y = 0 }, - { x = 1638, y = 0 }, - }, - time = 180000, - shootText = loc("You have thrown %d cluster bombs."), -} - -TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_easy.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -HedgewarsScriptLoad("/Scripts/TargetPractice.lua") - -local params = { - ammoType = amGrenade, - gearType = gtGrenade, - missionTitle = loc("Target Practice: Grenade (easy)"), - solidLand = true, - artillery = true, - map = "SB_Crystal", - theme = "Cave", - hog_x = 2039, - hog_y = 684, - hogName = loc("Grenadier"), - hogHat = "war_desertgrenadier2", - teamName = loc("Grenade Group"), - targets = { - { x = 1834, y = 747 }, - { x = 2308, y = 729 }, - { x = 1659, y = 718 }, - { x = 1196, y = 704 }, - { x = 2650, y = 826 }, - { x = 1450, y = 705 }, - { x = 2774, y = 848 }, - { x = 2970, y = 704 }, - }, - time = 80000, - shootText = loc("You have thrown %d grenades."), -} - -TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Grenade_hard.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -HedgewarsScriptLoad("/Scripts/TargetPractice.lua") - -local params = { - ammoType = amGrenade, - gearType = gtGrenade, - missionTitle = loc("Target Practice: Grenade (hard)"), - solidLand = true, - artillery = true, - map = "SB_Crystal", - theme = "Cave", - hog_x = 1456, - hog_y = 669, - hogName = loc("Grenadier"), - hogHat = "war_desertgrenadier2", - teamName = loc("Grenade Group"), - targets = { - { x = 1190, y = 694 }, - { x = 962, y = 680 }, - { x = 1090, y = 489 }, - { x = 1664, y = 666 }, - { x = 1584, y = 580 }, - { x = 2160, y = 738 }, - { x = 1836, y = 726 }, - { x = 618, y = 753 }, - { x = 837, y = 668 }, - { x = 2424, y = 405 }, - { x = 2310, y = 742 }, - { x = 294, y = 897 }, - { x = 472, y = 855 }, - { x = 2949, y = 724}, - { x = 3356, y = 926 }, - { x = 3734, y = 918 }, - { x = 170, y = 874 }, - - - }, - time = 180000, - shootText = loc("You have thrown %d grenades."), -} - -TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Homing_Bee.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -HedgewarsScriptLoad("/Scripts/TargetPractice.lua") - -local params = { - ammoType = amBee, - gearType = gtBee, - missionTitle = loc("Target Practice: Homing Bee"), - solidLand = true, - map = "Hedgewars", - theme = "Nature", - hog_x = 1990, - hog_y = 514, - hogHat = "NoHat", - teamGrave = "bp2", - targets = { - { x = 1949, y = 273 }, - { x = 1734, y = 322 }, - { x = 1574, y = 340 }, - { x = 1642, y = 474 }, - { x = 2006, y = 356 }, - { x = 1104, y = 285 }, - { x = 565, y = 440 }, - { x = 732, y = 350 }, - { x = 2022, y = 396 }, - { x = 366, y = 360 }, - { x = 556, y = 300 }, - { x = 902, y = 306 }, - { x = 924, y = 411 }, - { x = 227, y = 510 }, - { x = 150, y = 300 }, - }, - time = 120000, - shootText = loc("You have launched %d homing bees."), -} - -TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua --- a/share/hedgewars/Data/Missions/Training/Target_Practice_-_Shotgun.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -HedgewarsScriptLoad("/Scripts/TargetPractice.lua") - -local params = { - ammoType = amShotgun, - gearType = gtShotgunShot, - missionTitle = loc("Target Practice: Shotgun"), - solidLand = false, - map = "SB_Haunty", - theme = "Halloween", - hog_x = 320, - hog_y = 324, - hogHat = "NoHat", - hogGrave = "Bones", - targets = { - { x = 495, y = 501 }, - { x = 227, y = 530 }, - { x = 835, y = 934 }, - { x = 1075, y = 889 }, - { x = 887, y = 915 }, - { x = 1148, y = 750 }, - { x = 916, y = 915 }, - { x = 1211, y = 700 }, - { x = 443, y = 505 }, - { x = 822, y = 964 }, - { x = 1092, y = 819 }, - { x = 1301, y = 683 }, - { x = 1480, y = 661 }, - { x = 1492, y = 786 }, - { x = 1605, y = 562 }, - { x = 1545, y = 466 }, - { x = 1654, y = 392 }, - { x = 1580, y = 334 }, - { x = 1730, y = 222 }, - }, - time = 90000, -} - -TargetPracticeMission(params) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Bamboo_Thicket.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ - -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local player = nil -local enemy = nil -local firedShell = false -local turnNumber = 0 - -local hhs = {} -local numhhs = 0 - -function onGameInit() - - Seed = 0 - TurnTime = 20000 - CaseFreq = 0 - MinesNum = 0 - Explosives = 0 - Map = "Bamboo" - Theme = "Bamboo" - SuddenDeathTurns = 99999 - - AddTeam(loc("Pathetic Resistance"), 14483456, "Simple", "Island", "Default") - player = AddHog(loc("Ikeda"), 0, 10, "StrawHat") - - AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Default") - enemy = AddHog(loc("Unit 835"), 1, 10, "cyborg1") - - SetGearPosition(player,142,656) - SetGearPosition(enemy,1824,419) - -end - - -function onGameStart() - - ShowMission(loc("Bamboo Thicket"), loc("User Challenge"), loc("Eliminate the enemy before the time runs out"), -amBazooka, 0) - - --WEAPON CRATE LIST. WCRATES: 1 - SpawnAmmoCrate(891,852,amBazooka) - --UTILITY CRATE LIST. UCRATES: 2 - SpawnUtilityCrate(962,117,amBlowTorch) - SpawnUtilityCrate(403,503,amParachute) - - AddAmmo(enemy, amGrenade, 100) - -end - -function onNewTurn() - SetWind(100) - turnNumber = turnNumber + 1 -end - -function onAmmoStoreInit() - SetAmmo(amSkip, 9, 0, 0, 0) - SetAmmo(amGirder, 4, 0, 0, 0) - SetAmmo(amBlowTorch, 0, 0, 0, 1) - SetAmmo(amParachute, 0, 0, 0, 2) - SetAmmo(amBazooka, 0, 0, 0, 2) -end - - -function onGearAdd(gear) - - if GetGearType(gear) == gtHedgehog then - hhs[numhhs] = gear - numhhs = numhhs + 1 - elseif GetGearType(gear) == gtShell then - firedShell = true - end - -end - -function onGearDelete(gear) - - if (gear == enemy) then - - ShowMission(loc("Bamboo Thicket"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) - - if (turnNumber < 6) and (firedShell == false) then - AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Energetic Engineer"),0xffba00ff,capgrpMessage2) - end - - elseif gear == player then - ShowMission(loc("Bamboo Thicket"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) - end - -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_Dangerous_Ducklings.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Dangerous_Ducklings.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ - -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local player = nil -- This variable will point to the hog's gear -local instructor = nil -local enemy = nil - -local speechStage = 0 - -local gameLost = false -local gameWon = false -local notListening = false - -local endTimer = 0 - -function onGameInit() - - -- Things we don't modify here will use their default values. - - Seed = 0 -- The base number for the random number generator - GameFlags = gfInfAttack -- Game settings and rules - TurnTime = 60000 -- The time the player has to move each round (in ms) - 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 - SuddenDeathTurns = 99999 - - - AddTeam(loc("Bloody Rookies"), 14483456, "Simple", "Island", "Default") - player = AddHog(loc("Hunter"), 0, 1, "NoHat") - instructor = AddHog(loc("Instructor"), 0, 100, "sf_vega") - - AddTeam(loc("Blue Team"), 29439, "Simple", "Island", "Default") - enemy = AddHog(loc("Filthy Blue"), 1, 100, "Skull") - - SetGearPosition(player,146,902) - SetGearPosition(instructor,317,902) - SetGearPosition(enemy,1918,837) - - HogSay(player, ".............................", SAY_THINK) - HogTurnLeft(instructor, true) - -end - - -function onGameStart() - - SpawnAmmoCrate(475,476,amRope) - SpawnAmmoCrate(1729,476,amFirePunch) - - FollowGear(player) - - ShowMission(loc("Dangerous Ducklings"), "", loc("Eliminate the Blue Team"), -amRope, 5000); - -end - - -function onGameTick() - - - -- opening speech - if (notListening == false) and (gameLost == false) then - - if (TurnTimeLeft == 58000) and (speechStage == 0) then - HogSay(instructor, loc("Listen up, maggot!!"), SAY_SHOUT) - speechStage = 1 - elseif (TurnTimeLeft == 57000) and (speechStage == 1) then - HogSay(player,loc("!!!"),SAY_SHOUT) - elseif (TurnTimeLeft == 55000) and (speechStage == 1) then - HogSay(instructor, loc("The enemy is hiding out on yonder ducky!"), SAY_SAY) - speechStage = 2 - - elseif (TurnTimeLeft == 49000) and (speechStage == 2) then - FollowGear(enemy) - elseif (TurnTimeLeft == 46500) and (speechStage == 2) then - FollowGear(instructor) - HogSay(instructor, loc("Get on over there and take him out!"), SAY_SAY) - speechStage = 3 - elseif (TurnTimeLeft == 43500) and (speechStage == 3) then - HogSay(instructor, loc("GO! GO! GO!"), SAY_SHOUT) - speechStage = 4 - givenSpeech = true - end - - end - - -- if player falls in water or if player ignores speech - if (CurrentHedgehog ~= nil) and (CurrentHedgehog == player) then - if (GetY(player) > WaterLine) and (gameLost == false) then - HogSay(instructor, loc("DAMMIT, ROOKIE!"), SAY_SHOUT) - gameLost = true - end - - if (GetX(player) > 300) and (GetY(player) > 880) and (notListening == false) and (speechStage < 3) then - HogSay(instructor, loc("DAMMIT, ROOKIE! GET OFF MY HEAD!"), SAY_SHOUT) - notListening = true - end - - end - - --player out of time - if (TurnTimeLeft == 1) and (gameWon == false) then - SetHealth(player, 0) - end - - -- meh - if gameLost == true then - endTimer = endTimer + 1 - if (CurrentHedgehog ~= nil) and (CurrentHedgehog == instructor) then - if endTimer >= 3000 then - --SetHealth(instructor,0) - TurnTimeLeft = 1 - DismissTeam(loc("Bloody Rookies")) - end - ShowMission(loc("MISSION FAILED"), loc(":("), loc("You've failed. Try again."), -amRope, 5000); - end - end - -end - - -function onAmmoStoreInit() - SetAmmo(amFirePunch, 0, 0, 0, 1) - SetAmmo(amParachute, 1, 0, 0, 0) - SetAmmo(amRope, 0, 0, 0, 1) -end - -function onGearDelete(gear) - if GetGearType(gear) == gtHedgehog then - if gear == player then - gameLost = true - elseif (gear == instructor) and (GetY(gear) > WaterLine) then - HogSay(player, loc("See ya!"), SAY_THINK) - TurnTimeLeft = 3000 - AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Naughty Ninja"),0xffba00ff,capgrpMessage2) - DismissTeam(loc("Blue Team")) - gameWon = true - elseif gear == enemy then - HogSay(player, loc("Enjoy the swim..."), SAY_THINK) - gameWon = true - TurnTimeLeft = 3000 - end - - end -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_Diver.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Diver.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ - -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local player = nil -- This variable will point to the hog's gear -local enemy = nil - -local GameOver = false - -function onGameInit() - - -- Things we don't modify here will use their default values. - - Seed = 0 -- The base number for the random number generator - GameFlags = gfInfAttack + gfDisableWind-- Game settings and rules - TurnTime = 90000 -- The time the player has to move each round (in ms) - CaseFreq = 0 -- The frequency of crate drops - 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 - SuddenDeathTurns = 99999 - - AddTeam(loc("Bloody Rookies"), 14483456, "Simple", "Island", "Default") - player = AddHog(loc("Hunter"), 0, 1, "NoHat") - - AddTeam(loc("Toxic Team"), 1175851, "Simple", "Island", "Default") - enemy = AddHog(loc("Poison"), 1, 100, "Skull") - - SetGearPosition(player,430,516) - SetGearPosition(enemy,1464,936) - -end - - -function onGameStart() - - - SpawnAmmoCrate(426,886,amJetpack) - SpawnAmmoCrate(1544,690,amFirePunch) - SpawnAmmoCrate(950,851,amBlowTorch) - SpawnAmmoCrate(1032,853,amParachute) - - AddGear(579, 296, gtMine, 0, 0, 0, 0) - - ShowMission(loc("Operation Diver"), "", loc("Eliminate Poison before the time runs out") .. loc("|- Mines Time:") .. " " .. 1 .. " " .. loc("sec"), -amFirePunch, 0); - --SetTag(AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1), -70) - - SetWind(-100) - -end - - -function onGameTick() - - - if (TotalRounds == 3) and (GameOver == false) then - SetHealth(player, 0) - GameOver = true - end - - if TurnTimeLeft == 1 then - SetHealth(player, 0) - GameOver = true - end - -end - - -function onAmmoStoreInit() - SetAmmo(amFirePunch, 1, 0, 0, 1) - SetAmmo(amBlowTorch, 0, 0, 0, 1) - SetAmmo(amGirder, 1, 0, 0, 0) - SetAmmo(amParachute, 0, 0, 0, 1) - SetAmmo(amJetpack, 0, 0, 0, 1) -end - - -function onGearAdd(gear) - - if GetGearType(gear) == gtJetpack then - SetHealth(gear,1000) - end - -end - -function onGearDelete(gear) - - if (gear == enemy) and (GameOver == false) then - ShowMission(loc("Operation Diver"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) - elseif gear == player then - ShowMission(loc("Operation Diver"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) - GameOver = true - end - -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Newton_and_the_Hammock.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ - -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local player = nil -local enemy = nil -local failed = false - -local hhs = {} -local numhhs = 0 - -function onGameInit() - - Seed = 0 - TurnTime = 60000 - CaseFreq = 0 - MinesTime = 1000 - SuddenDeathTurns = 999999 - HealthCaseProb = 35 - Explosives = 0 - MinesNum = 0 - Map = "Hammock" - Theme = "Nature" - - AddTeam(loc("Pathetic Resistance"), 14483456, "Simple", "Island", "Default") - player = AddHog(loc("Ikeda"), 0, 48, "StrawHat") - - AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Default") - enemy = AddHog(loc("Unit") .. " 811", 1, 100, "cyborg1") - - SetGearPosition(player,430,1540) - SetGearPosition(enemy,1464,1960) - -end - - -function onGameStart() - - AddAmmo(enemy, amShotgun, 100) - AddAmmo(enemy, amFirePunch, 100) - - --GIRDER LIST. - PlaceGirder(1073,2009,0) - PlaceGirder(524,1487,3) - PlaceGirder(638,1453,4) - PlaceGirder(761,1453,0) - PlaceGirder(840,1421,3) - PlaceGirder(302,1388,6) - PlaceGirder(327,1506,1) - PlaceGirder(1669,1832,3) - --MINE LIST. - AddGear(1056,1987,gtMine, 0, 0, 0, 0) - AddGear(1086,1988,gtMine, 0, 0, 0, 0) - --STICKY MINE LIST. - AddGear(1089,965,gtSMine, 0, 0, 0, 0) - AddGear(1133,945,gtSMine, 0, 0, 0, 0) - AddGear(1010,1081,gtSMine, 0, 0, 0, 0) - AddGear(1036,1049,gtSMine, 0, 0, 0, 0) - AddGear(1057,1004,gtSMine, 0, 0, 0, 0) - AddGear(784,1252,gtSMine, 0, 0, 0, 0) - AddGear(841,1257,gtSMine, 0, 0, 0, 0) - AddGear(902,1263,gtSMine, 0, 0, 0, 0) - AddGear(952,1281,gtSMine, 0, 0, 0, 0) - AddGear(517,1546,gtSMine, 0, 0, 0, 0) - AddGear(559,1597,gtSMine, 0, 0, 0, 0) - AddGear(613,1650,gtSMine, 0, 0, 0, 0) - AddGear(674,1705,gtSMine, 0, 0, 0, 0) - AddGear(746,1692,gtSMine, 0, 0, 0, 0) - AddGear(810,1692,gtSMine, 0, 0, 0, 0) - AddGear(872,1673,gtSMine, 0, 0, 0, 0) - AddGear(933,1666,gtSMine, 0, 0, 0, 0) - AddGear(981,1662,gtSMine, 0, 0, 0, 0) - AddGear(1016,1634,gtSMine, 0, 0, 0, 0) - AddGear(1063,1595,gtSMine, 0, 0, 0, 0) - AddGear(1100,1574,gtSMine, 0, 0, 0, 0) - AddGear(1002,1461,gtSMine, 0, 0, 0, 0) - AddGear(1052,1438,gtSMine, 0, 0, 0, 0) - AddGear(1102,1464,gtSMine, 0, 0, 0, 0) - --WEAPON CRATE LIST. - SpawnAmmoCrate(1565,642,amSineGun) - SpawnAmmoCrate(548,858,amBazooka) - --UTILITY CRATE LIST. - SpawnUtilityCrate(479,847,amJetpack) - SpawnUtilityCrate(1550,1715,amBlowTorch) - SpawnUtilityCrate(1227,1941,amJetpack) - SpawnUtilityCrate(1070,1964,amInvulnerable) - SpawnUtilityCrate(1070,1875,amTeleport) - --HOG POSITION LIST. - if hhs[0] ~= nil then - SetGearPosition(hhs[0],397,865) - end - if hhs[1] ~= nil then - SetGearPosition(hhs[1],561,1365) - end - - ShowMission(loc("Newton's Hammock"), loc("User Challenge"), loc("Eliminate the enemy before the time runs out"), -amParachute, 0) - -end - -function onAmmoStoreInit() - SetAmmo(amSkip, 9, 0, 0, 1) - SetAmmo(amBazooka, 0, 0, 0, 1) - SetAmmo(amJetpack, 0, 0, 0, 1) - SetAmmo(amTeleport, 0, 0, 0, 1) - SetAmmo(amSineGun, 0, 0, 0, 1) - SetAmmo(amInvulnerable, 0, 0, 0, 1) - SetAmmo(amBlowTorch, 0, 0, 0, 1) -end - -function onGearDamage(gear, damage) - if (gear == player) and (damage >= 48) then - failed = true - end -end - -function onGearAdd(gear) - - if GetGearType(gear) == gtHedgehog then - hhs[numhhs] = gear - numhhs = numhhs + 1 - end - -end - -function onGearDelete(gear) - - if (gear == enemy) and (failed == false) then - ShowMission(loc("Newton's Hammock"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) - elseif gear == player then - ShowMission(loc("Newton's Hammock"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) - end - -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Nobody_Laugh.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ --------------------------------------- --- NOBODY LAUGH --- a hilarious (not really) adventure --------------------------------------- - -HedgewarsScriptLoad("/Scripts/Locale.lua") -HedgewarsScriptLoad("/Scripts/Tracker.lua") - -local hhs = {} - -function onGameInit() - - Seed = 0 - GameFlags = gfInfAttack + gfPerHogAmmo +gfDisableWind - SuddenDeathTurns = 9999 - TurnTime = 180000 - CaseFreq = 0 - MinesNum = 0 - Explosives = 0 - Map = "Bath" - Theme = "Nature" - - AddTeam(loc("Nameless Heroes"), 14483456, "eyecross", "Wood", "HillBilly", "cm_birdy") - hhs[1] = AddHog(loc( "Hunter" ), 0, 1, "Skull") - SetGearPosition(hhs[1], 1267, 451) - hhs[2] = AddHog(loc("Drowner"), 0, 31, "mp3") - SetGearPosition(hhs[2], 1332, 451) - - AddTeam(loc("Clowns"), 1175851, "Duck2", "Tank", "Mobster", "cm_spider") - hhs[3] = AddHog(loc("Poison"), 5, 100, "WhySoSerious") - SetGearPosition(hhs[3], 1133, 446) - hhs[4] = AddHog(loc("Bobo"), 5, 100, "clown") - SetGearPosition(hhs[4], 1215, 553) - hhs[5] = AddHog(loc("Copper"), 5, 10, "clown-copper") - SetGearPosition(hhs[5], 414, 376) - hhs[6] = AddHog(loc("Derp"), 5, 100, "clown-crossed") - SetGearPosition(hhs[6], 1590, 886) - hhs[7] = AddHog(loc("Eckles"), 5, 100, "clown-copper") - SetGearPosition(hhs[7], 772, 754) - hhs[8] = AddHog(loc("Frank"), 5, 50, "clown-copper") - SetGearPosition(hhs[8], 1688, 714) - hhs[9] = AddHog(loc("Harry"), 5, 50, "clown-copper") - SetGearPosition(hhs[9], 1932, 837) - hhs[10] = AddHog(loc("Igmund"), 5, 50, "WhySoSerious") - SetGearPosition(hhs[10], 1601, 733) - -end - -function onGameStart() - - AddAmmo(enemy, amAirAttack, 100) - - ShowMission( loc("Nobody Laugh"), - loc("User Challenge"), - loc("Eliminate the enemy before the time runs out") - , 0, 0 - ) - - -- GIRDERS - PlaceGirder(1212, 710, 7) - PlaceGirder(1215, 570, 4) - PlaceGirder(1288, 520, 2) - PlaceGirder(1184, 468, 4) - PlaceGirder(1344, 468, 4) - PlaceGirder(1247, 346, 4) - - PlaceGirder(667, 438, 4) - PlaceGirder(507, 438, 4) - PlaceGirder(434, 487, 2) - PlaceGirder(505, 537, 4) - PlaceGirder(665, 537, 4) - PlaceGirder(737, 487, 2) - - PlaceGirder(416, 465, 6) - PlaceGirder(1415, 378, 6) - PlaceGirder(1300, 625, 3) - PlaceGirder(1359, 566, 3) - PlaceGirder(1436, 538, 0) - PlaceGirder(1505, 468, 4) - - ------ AMMO CRATE LIST ------ - tempG = SpawnAmmoCrate(1242, 315, amBaseballBat) - tempG = SpawnAmmoCrate(1309, 315, amAirAttack) - tempG = SpawnAmmoCrate(144, 895, amAirAttack) - tempG = SpawnAmmoCrate(664, 699, amIceGun) - tempG = SpawnAmmoCrate(1572, 444, amFirePunch) - tempG = SpawnAmmoCrate(1574, 382, amDynamite) - - ------ UTIL CRATE LIST ------ - tempG = SpawnUtilityCrate(654, 513, amParachute) - tempG = SpawnUtilityCrate(1569, 413, amParachute) - - -- HOG AMMO - AddAmmo(hhs[1],amParachute,1) - AddAmmo(hhs[1],amHammer,1) - AddAmmo(hhs[2],amWhip,1) - - for i = 3, 10 do - AddAmmo(hhs[i], amDEagle, 100) - AddAmmo(hhs[i], amShotgun, 100) - AddAmmo(hhs[i], amGrenade, 100) - AddAmmo(hhs[i], amBazooka, 100) - AddAmmo(hhs[i], amDrill, 100) - end - -end - -function onNewTurn() - SetWind(100) -end - -function onAmmoStoreInit() - - SetAmmo(amBaseballBat, 0, 0, 0, 1) - SetAmmo(amAirAttack, 0, 0, 0, 1) - SetAmmo(amFirePunch, 0, 0, 0, 1) - SetAmmo(amDynamite, 0, 0, 0, 1) - SetAmmo(amHammer, 0, 0, 0, 1) - SetAmmo(amIceGun, 0, 0, 0, 1) - - SetAmmo(amParachute, 0, 0, 0, 1) - - SetAmmo(amSwitch, 9, 0, 0, 0) - SetAmmo(amSkip, 9, 0, 0, 0) - -end - ------------------------------- --- I'm in whitesppaaaaaaaaaacceeeee :D ------------------------------- diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_RCPlane_Challenge.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_RCPlane_Challenge.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,494 +0,0 @@ -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local player = nil -local RCGear = nil -local planesUsed = 0 -local planeTimer = 0 -local planeUhOh = false -local cratesLeft = 0 -local crateStreak = 0 -local longestCrateStreak = 0 -local commentTimer = 0 -local missiles = 0 -local totalMissiles = 0 -local missileScanTimer = 0 -local nextComment = sndNone - -function onGameInit() - - Seed = 1 - GameFlags = gfInfAttack + gfInvulnerable + gfOneClanMode + gfSolidLand - - TurnTime = 90 * 1000 - - Map = "Ropes" - Theme = "Eyes" - - CaseFreq = 0 - MinesNum = 0 - Explosives = 0 - - AddTeam(loc("Wannabe Flyboys"), 14483456, "Simple", "Island", "Default", "Hedgewars") - player = AddHog(loc("Ace"), 0, 80, "Gasmask") - SetGearPosition(player, 1380, 1500) - -end - - - -function onGameStart() - - SendHealthStatsOff() - - ShowMission ( - loc("RC PLANE TRAINING"), - loc("a Hedgewars challenge"), - - loc("Collect or destroy all the health crates.") .. "|" .. - loc("Compete to use as few planes as possible!") .. "|" .. - "", -amRCPlane, 4000 - ) - - PlaceGirder(2192, 508, 6) - PlaceGirder(2192, 670, 6) - PlaceGirder(2193, 792, 2) - PlaceGirder(2100, 825, 4) - PlaceGirder(2009, 899, 6) - PlaceGirder(2084, 992, 4) - PlaceGirder(2145, 1087, 6) - PlaceGirder(2199, 1235, 5) - PlaceGirder(2308, 1296, 0) - PlaceGirder(2424, 1234, 7) - PlaceGirder(2473, 1129, 2) - PlaceGirder(2437, 1046, 1) - PlaceGirder(2409, 927, 6) - PlaceGirder(2408, 763, 6) - PlaceGirder(2404, 540, 6) - PlaceGirder(2426, 423, 3) - PlaceGirder(2550, 400, 4) - PlaceGirder(2668, 425, 1) - PlaceGirder(2707, 541, 6) - PlaceGirder(2706, 703, 6) - PlaceGirder(2705, 867, 6) - PlaceGirder(2779, 962, 4) - PlaceGirder(2894, 924, 3) - PlaceGirder(2908, 802, 6) - PlaceGirder(2907, 639, 6) - PlaceGirder(3052, 566, 4) - PlaceGirder(2971, 394, 4) - PlaceGirder(3103, 448, 7) - PlaceGirder(3047, 654, 0) - PlaceGirder(3043, 746, 6) - PlaceGirder(3265, 1583, 6) - PlaceGirder(3256, 1491, 4) - PlaceGirder(3187, 1401, 6) - PlaceGirder(3326, 1400, 6) - PlaceGirder(774, 530, 5) - PlaceGirder(922, 595, 4) - PlaceGirder(1079, 533, 7) - PlaceGirder(1139, 386, 6) - PlaceGirder(1074, 237, 5) - PlaceGirder(723, 381, 6) - PlaceGirder(781, 229, 7) - PlaceGirder(927, 746, 6) - PlaceGirder(874, 736, 0) - PlaceGirder(982, 737, 0) - PlaceGirder(2430, 1730, 4) - - PlaceGirder(1613, 1104, 7) - PlaceGirder(1564, 1256, 6) - PlaceGirder(1643, 1341, 5) - PlaceGirder(1780, 1372, 4) - PlaceGirder(1869, 1296, 7) - PlaceGirder(1858, 1163, 5) - PlaceGirder(1739, 1044, 5) - PlaceGirder(1621, 926, 5) - PlaceGirder(1597, 985, 5) - PlaceGirder(1449, 939, 4) - PlaceGirder(1473, 874, 4) - PlaceGirder(2092, 1352, 7) - PlaceGirder(2145, 1444, 7) - PlaceGirder(2004, 1443, 3) - PlaceGirder(1978, 1523, 2) - PlaceGirder(2021, 1596, 1) - PlaceGirder(2103, 1625, 0) - PlaceGirder(2208, 1551, 7) - PlaceGirder(2327, 1431, 7) - PlaceGirder(2395, 1478, 6) - PlaceGirder(2396, 1600, 2) - PlaceGirder(2495, 1285, 6) - PlaceGirder(2494, 1408, 2) - PlaceGirder(2547, 530, 0) - - PlaceGirder(2451, 1551, 0) - PlaceGirder(2551, 706, 6) - PlaceGirder(2551, 869, 6) - PlaceGirder(2623, 1016, 5) - PlaceGirder(2773, 1083, 4) - PlaceGirder(2924, 1019, 7) - PlaceGirder(2568, 1491, 7) - PlaceGirder(2618, 1346, 6) - PlaceGirder(2674, 1195, 7) - PlaceGirder(2822, 1142, 4) - PlaceGirder(2963, 1069, 7) - PlaceGirder(3067, 938, 5) - PlaceGirder(2803, 1373, 2) - PlaceGirder(2811, 1559, 2) - - tempG = SpawnHealthCrate(930, 557) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(979, 692) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(876, 703) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2309, 1260) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1733, 1127) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1738, 1320) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(3249, 1460) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(3051, 617) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2972, 353) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2548, 358) - - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2090, 1580) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1752, 1753) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1865, 1758) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1985, 1760) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2429, 1760) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2810, 1480) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2800, 1277) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2806, 1107) - SetHealth(tempG, 25) - - PlaceGirder(1897, 903, 6) - PlaceGirder(1916, 784, 3) - PlaceGirder(2010, 732, 4) - PlaceGirder(2082, 639, 6) - PlaceGirder(2081, 516, 2) - PlaceGirder(1985, 487, 4) - PlaceGirder(1862, 407, 5) - PlaceGirder(1855, 224, 7) - PlaceGirder(2006, 163, 4) - PlaceGirder(2128, 187, 1) - PlaceGirder(2251, 213, 4) - PlaceGirder(2413, 213, 4) - PlaceGirder(1952, 618, 0) - PlaceGirder(957, 1068, 4) - PlaceGirder(794, 1069, 4) - PlaceGirder(728, 1163, 6) - PlaceGirder(728, 1287, 2) - PlaceGirder(802, 1342, 4) - PlaceGirder(966, 1342, 4) - PlaceGirder(674, 1032, 1) - PlaceGirder(554, 1011, 4) - PlaceGirder(445, 1056, 3) - PlaceGirder(422, 1174, 6) - PlaceGirder(369, 1341, 5) - PlaceGirder(495, 1313, 5) - PlaceGirder(568, 1379, 3) - PlaceGirder(577, 1202, 2) - PlaceGirder(744, 1490, 5) - PlaceGirder(760, 1617, 7) - PlaceGirder(622, 1693, 4) - PlaceGirder(476, 1623, 5) - PlaceGirder(376, 1697, 1) - PlaceGirder(955, 1746, 2) - PlaceGirder(1025, 1746, 2) - PlaceGirder(1090, 1745, 2) - PlaceGirder(1156, 1746, 2) - PlaceGirder(3806, 1530, 2) - PlaceGirder(3880, 1464, 2) - PlaceGirder(3738, 1458, 2) - PlaceGirder(3806, 1390, 2) - PlaceGirder(3805, 1588, 0) - PlaceGirder(3676, 1609, 3) - PlaceGirder(3930, 1615, 1) - PlaceGirder(3719, 1295, 0) - PlaceGirder(3888, 1294, 0) - PlaceGirder(3661, 1385, 2) - PlaceGirder(3955, 1377, 2) - PlaceGirder(3982, 1518, 0) - PlaceGirder(3378, 440, 2) - PlaceGirder(3447, 492, 4) - PlaceGirder(3564, 529, 1) - PlaceGirder(3596, 647, 6) - PlaceGirder(3521, 740, 4) - PlaceGirder(3524, 838, 4) - PlaceGirder(3644, 819, 3) - PlaceGirder(3691, 708, 6) - PlaceGirder(3690, 545, 6) - PlaceGirder(3612, 433, 5) - PlaceGirder(3463, 383, 4) - PlaceGirder(2815, 122, 7) - PlaceGirder(2960, 72, 4) - PlaceGirder(3032, 123, 2) - PlaceGirder(3063, 174, 0) - PlaceGirder(3095, 124, 2) - PlaceGirder(3169, 71, 4) - PlaceGirder(3320, 124, 5) - PlaceGirder(3210, 179, 2) - PlaceGirder(2932, 181, 2) - - tempG = SpawnHealthCrate(3804, 1461) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(3269, 1742) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(3066, 121) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(3207, 104) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2928, 103) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1997, 202) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2253, 159) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2132, 774) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(2549, 490) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(3527, 694) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(3777, 78) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1124, 1746) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1056, 1740) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(993, 1742) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(799, 1298) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(577, 1126) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(596, 1463) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(3854, 1043) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(1944, 567) - SetHealth(tempG, 25) - tempG = SpawnHealthCrate(338, 1748) - SetHealth(tempG, 25) - - -end - ---function onGameTick() - - --if RCGear ~= nil then - -- AddCaption(GetTimer(RCGear)) - --end - ---end - -function onGameTick20() - if RCGear ~= nil then - if(GetTimer(RCGear) < 3000 and planeUhOh == false) then - PlaySound(sndUhOh, player) - planeUhOh = true - end - planeTimer = planeTimer + 20 - end - if commentTimer > 0 then - commentTimer = commentTimer - 20 - elseif(nextComment ~= sndNone) then - PlaySound(nextComment, player) - nextComment = sndNone - end - if missileScanTimer > 0 then - missileScanTimer = missileScanTimer - 20 - else - if crateStreak == 0 and missiles == 3 then - PlaySound(sndMissed, player) - missiles = 4 - end - end -end - -function onNewTurn() - TurnTimeLeft = -1 -end - -function onGearAdd(gear) - - if GetGearType(gear) == gtRCPlane then - RCGear = gear - planesUsed = planesUsed + 1 - planeTimer = 0 - missiles = 0 - end - - if GetGearType(gear) == gtCase then - cratesLeft = cratesLeft + 1 - end - - if GetGearType(gear) == gtAirBomb then - totalMissiles = totalMissiles + 1 - end -end - -function onGearDelete(gear) - - if GetGearType(gear) == gtRCPlane then - - RCGear = nil - planeUhOh = false - missiles = 0 - AddCaption(string.format(loc("Planes used: %d"), planesUsed)) - - if(planeTimer < 2000 and crateStreak == 0) then - nextComment = sndStupid - commentTimer = math.min(2000-planeTimer, 800) - elseif(planeTimer < 5000 and crateStreak == 0) then - PlaySound(sndOops, player) - elseif(planesUsed == 72) then - PlaySound(sndStupid, player) - elseif(planesUsed == 50) then - PlaySound(sndNutter, player) - elseif(planesUsed == 30) then - PlaySound(sndOops, player) - end - - crateStreak = 0 - - elseif GetGearType(gear) == gtAirBomb then - missiles = missiles + 1 - missileScanTimer = 500 - - elseif GetGearType(gear) == gtCase then - - cratesLeft = cratesLeft - 1 - crateStreak = crateStreak + 1 - if(crateStreak > longestCrateStreak) then - longestCrateStreak = crateStreak - end - - AddCaption(string.format(loc("Crates left: %d"), cratesLeft)) - - if cratesLeft == 0 then - - local rank = "unknown" - local color = 0xFFFFFFFF - local sound = sndVictory - if planesUsed >= 156 then - rank = loc("Destroyer of planes") - color = 0xD06700FF - sound = sndLaugh - elseif planesUsed >= 98 then - rank = loc("Hopeless case") - color = 0xFF0000FF - elseif planesUsed >= 72 then - rank = loc("Drunk greenhorn") - color = 0xFF0040FF - elseif planesUsed >= 50 then - rank = loc("Greenhorn") -- a.k.a. "absolute beginner" - color = 0xFF0080FF - elseif planesUsed >= 39 then - rank = loc("Beginner") - color = 0xFF00BFFF - elseif planesUsed >= 30 then - rank = loc("Experienced beginner") - color = 0xFF00CCFF - elseif planesUsed >= 21 then - rank = loc("Below-average pilot") - color = 0xFF00FFFF - elseif planesUsed >= 17 then - rank = loc("Average pilot") - color = 0xBF00FFFF - elseif planesUsed >= 13 then - rank = loc("Above-average pilot") - color = 0x8000FFFF - elseif planesUsed >= 8 then - rank = loc("Professional pilot") - color = 0x4000FFFF - elseif planesUsed >= 5 then - rank = loc("Professional stunt pilot") - color = 0x0000FFFF - elseif planesUsed >= 3 then - rank = loc("Elite pilot") - color = 0x0040FFFF - elseif planesUsed == 2 then - rank = loc("Upper-class elite pilot") - color = 0x0080FFFF - elseif planesUsed == 1 then - rank = loc("Top-class elite pilot") - color = 0x00FFFFFF - sound = sndFlawless - else - rank = loc("Cheater") - color = 0xFF0000FF - sound = sndCoward - end - AddCaption(string.format(loc("Rank: %s"), rank), color, capgrpMessage2) - SendStat(siCustomAchievement, string.format(loc("Your rank: %s"), rank)) - if planesUsed == 1 then - AddCaption(loc("Flawless victory!")) - SendStat(siGameResult, loc("You have perfectly beaten the challenge!")) - SendStat(siCustomAchievement, loc("You have used only 1 RC plane. Outstanding!")) - else - AddCaption(loc("Victory!")) - SendStat(siGameResult, loc("You have finished the challenge!")) - SendStat(siCustomAchievement, string.format(loc("You have used %d RC planes."), planesUsed)) - end - - if(totalMissiles > 1) then - SendStat(siCustomAchievement, string.format(loc("You have dropped %d missiles."), totalMissiles)) - end - - if(longestCrateStreak > 5) then - if(planesUsed == 1) then - SendStat(siCustomAchievement, string.format(loc("In your best (and only) flight you took out %d crates with one RC plane!"), longestCrateStreak)) - else - SendStat(siCustomAchievement, string.format(loc("In your best flight you took out %d crates with one RC plane."), longestCrateStreak)) - end - end - - if(planesUsed == 2) then - SendStat(siCustomAchievement, loc("This was an awesome performance! But this challenge can be finished with even just one RC plane. Can you figure out how?")) - end - if(planesUsed == 1) then - SendStat(siCustomAchievement, loc("Congratulations! You have truly mastered this challenge! Don't forget to save the demo.")) - SendStat(siCustomAchievement, string.format(loc("You have gained an achievement: %s"), loc("Prestigious Pilot"))) - end - - ShowMission ( - loc("CHALLENGE COMPLETE"), - loc("Congratulations!"), - string.format(loc("Planes used: %d"), planesUsed) .. "|" .. - "", 0, 0 - ) - SetState(player, gstWinner) - PlaySound(sound, player) - - - DismissTeam(loc("Wannabe Flyboys")) - EndGame() - end - - if RCGear ~= nil then - SetTimer(RCGear, GetTimer(RCGear) + 10000) - end - end - -end - -function onAmmoStoreInit() - SetAmmo(amRCPlane, 9, 0, 0, 0) -end - -function onNewTurn() - SetWeapon(amRCPlane) -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_Rope_Knock_Challenge.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Rope_Knock_Challenge.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,273 +0,0 @@ -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local hhs = {} -local missionWon = nil -local endTimer = 1000 -local hogsKilled = 0 -local finishTime - -local HogData = { - {"Bufon", "ShaggyYeti",false}, - {"burp", "lambda",false}, - {"Blue", "cap_blue",false}, - {"bender", "NoHat",false}, - {"Castell", "NoHat",false}, - {"cekoto", "NoHat",false}, - {"CheezeMonkey", "NoHat",false}, - {"claymore", "NoHat",false}, - {"CIA-144", "cyborg1",false}, - {"doomy ", "NoHat",false}, - {"Falkenauge", "NoHat",false}, - {"FadeOne", "NoHat",false}, - {"hayaa", "NoHat",false}, - {"Hermes", "laurel",false}, - {"HedgeKing", "NoHat",false}, - {"Izack1535", "NoHat",false}, - {"Kiofspa", "NoHat",false}, - {"Komplex", "NoHat",false}, - {"koda", "poke_mudkip",false}, - {"Lalo", "NoHat",false}, - {"Logan", "NoHat",false}, - {"lollkiller", "NoHat",false}, - {"Luelle", "NoHat",false}, - {"mikade", "Skull",false}, - {"Mushi", "sm_daisy",false}, - {"Naboo", "NoHat",false}, - {"nemo", "bb_bub",false}, - {"practice", "NoHat",false}, - {"Prof. Panic", "NoHat",false}, - {"Randy", "zoo_Sheep",false}, - {"rhino", "NinjaTriangle",false}, - {"Radissthor", "NoHat",false}, - {"Sami", "sm_peach",false}, - {"soreau", "NoHat",false}, - {"sdw195", "NoHat",false}, - {"sphrix", "TeamTopHat",false}, - {"sheepluva", "zoo_Sheep",false}, - {"Smaxx", "NoHat",false}, - {"shadowzero", "NoHat",false}, - {"Star and Moon", "SparkleSuperFun",false}, - {"The 24", "NoHat",false}, - {"TLD", "NoHat",false}, - {"Tiyuri", "sf_ryu",false}, - {"unC0Rr", "cyborg1",false}, - {"Waldsau", "cyborg1",false}, - {"wolfmarc", "knight",false}, - {"Xeli", "android",false} - - } - -function GenericEnd() - EndGame() -end - -function GameOverMan() - missionWon = false - ShowMission(loc("Rope-knocking Challenge"), loc("Challenge over!"), loc("Oh no! Just try again!"), -amSkip, 0) - SendStat(siGameResult, loc("Challenge over!")) - local score = math.ceil((hogsKilled / 16)*6000) - SendStat(siCustomAchievement, string.format(loc("You have killed %d of 16 hedgehogs (+%d points)."), hogsKilled, score)) - SendStat(siPointType, "points") - SendStat(siPlayerKills, tostring(score), loc("Wannabe Shoppsta")) - PlaySound(sndHellish) -end - -function GG() - missionWon = true - local completeTime = (TurnTime - finishTime) / 1000 - ShowMission(loc("Rope-knocking Challenge"), loc("Challenge completed!"), loc("Congratulations!") .. "|" .. string.format(loc("Completion time: %.2fs"), completeTime), 0, 0) - PlaySound(sndHomerun) - SendStat(siGameResult, loc("Challenge completed!")) - local hogScore = math.ceil((hogsKilled / 16)*6000) - local timeScore = math.ceil((finishTime/TurnTime)*6000) - local score = hogScore + timeScore - 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, "points") - SendStat(siPlayerKills, tostring(score), loc("Wannabe Shoppsta")) -end - -function AssignCharacter(p) - - done = false - sanityCheck = 0 - - while(done == false) do - - i = 1+ GetRandom(#HogData) - if HogData[i][3] == false then - HogData[i][3] = true - done = true - SetHogName(hhs[p], HogData[i][1]) - SetHogHat(hhs[p], HogData[i][2]) - elseif HogData[i][3] == true then - sanityCheck = sanityCheck +1 - if sanityCheck == 100 then - done = true - SetHogName(hhs[p], "Newbie") - SetHogHat(hhs[p], "NoHat") - end - end - - end - -end - -function onGameInit() - - --Seed = 1 - GameFlags = gfBorder + gfSolidLand - - TurnTime = 180 * 1000 - Delay = 500 - Map = "Ropes" - Theme = "Eyes" - - CaseFreq = 0 - MinesNum = 0 - Explosives = 0 - - AddTeam(loc("Wannabe Shoppsta"), 0x11F12B, "Simple", "Island", "Default", "cm_shoppa") - hhs[0] = AddHog(loc("Ace"), 0, 1, "Gasmask") - SetGearPosition(player, 1380, 1500) - - AddTeam(loc("Unsuspecting Louts"), 0xDD0000, "Simple", "Island", "Default", "cm_face") - for i = 1, 8 do - hhs[i] = AddHog("generic", 0, 1, "NoHat") - end - - AddTeam(loc("Unlucky Sods"), 0xDD0000, "Simple", "Island", "Default", "cm_balrog") - for i = 9, 16 do - hhs[i] = AddHog("generic", 0, 1, "NoHat") - end - -end - - - -function onGameStart() - SendHealthStatsOff() - - 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."), - -amRope, 4000) - - PlaceGirder(46,1783, 0) - - SetGearPosition(hhs[0], 2419, 1769) - SetGearPosition(hhs[1], 3350, 570) - SetGearPosition(hhs[2], 3039, 1300) - SetGearPosition(hhs[3], 2909, 430) - SetGearPosition(hhs[4], 2150, 879) - SetGearPosition(hhs[5], 1735, 1136) - SetGearPosition(hhs[6], 1563, 553) - SetGearPosition(hhs[7], 679, 859) - SetGearPosition(hhs[8], 1034, 251) - SetGearPosition(hhs[9], 255, 67) - SetGearPosition(hhs[10], 2671, 7) - SetGearPosition(hhs[11], 2929, 244) - SetGearPosition(hhs[12], 1946, 221) - SetGearPosition(hhs[13], 3849, 1067) - SetGearPosition(hhs[14], 3360, 659) - SetGearPosition(hhs[15], 3885, 285) - SetGearPosition(hhs[16], 935, 1160) - - for i = 1, 16 do - AssignCharacter(i) - end - -end - -function onGameTick() - - if (TurnTimeLeft == 1) and (missionWon == nil) then - GameOverMan() - end - - if missionWon ~= nil then - - endTimer = endTimer - 1 - if endTimer == 1 then - GenericEnd() - end - - if missionWon == true then - AddCaption(loc("Victory!"), 0xFFFFFFFF,capgrpGameState) - else - AddCaption(loc("Challenge over!"), 0xFFFFFFFF,capgrpGameState) - end - - end - -end - -function onGearDamage(gear, damage) - - if gear ~= hhs[0] and GetGearType(gear) == gtHedgehog then - - AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) - DeleteGear(gear) - PlaySound(sndExplosion) - AddCaption(string.format(knockTaunt(), GetHogName(gear)), 0xFFFFFFFF, capgrpMessage) - - hogsKilled = hogsKilled +1 - if hogsKilled == 15 then - PlaySound(sndRideOfTheValkyries) - elseif hogsKilled == 16 then - finishTime = TurnTimeLeft - GG() - end - - end - -end - -function knockTaunt() - local r = math.random(0,23) - local taunt - if r == 0 then taunt = loc("%s has been knocked out.") - elseif r == 1 then taunt = loc("%s hit the ground.") - elseif r == 2 then taunt = loc("%s splatted.") - elseif r == 3 then taunt = loc("%s was smashed.") - elseif r == 4 then taunt = loc("%s felt unstable.") - elseif r == 5 then taunt = loc("%s exploded.") - elseif r == 6 then taunt = loc("%s fell from a high cliff.") - elseif r == 7 then taunt = loc("%s goes the way of the lemming.") - elseif r == 8 then taunt = loc("%s was knocked away.") - elseif r == 9 then taunt = loc("%s was really unlucky.") - elseif r == 10 then taunt = loc("%s felt victim to rope-knocking.") - elseif r == 11 then taunt = loc("%s had no chance.") - elseif r == 12 then taunt = loc("%s was a good target.") - elseif r == 13 then taunt = loc("%s spawned at a really bad position.") - elseif r == 14 then taunt = loc("%s was doomed from the beginning.") - elseif r == 15 then taunt = loc("%s has fallen victim to gravity.") - elseif r == 16 then taunt = loc("%s hates Newton.") -- Isaac Newton - elseif r == 17 then taunt = loc("%s had it coming.") - elseif r == 18 then taunt = loc("%s is eliminated!") - elseif r == 19 then taunt = loc("%s fell too fast.") - elseif r == 20 then taunt = loc("%s flew like a rock.") - elseif r == 21 then taunt = loc("%s stumpled.") - elseif r == 22 then taunt = loc("%s was shoved away.") - elseif r == 23 then taunt = loc("%s didn't expect that.") - end - return taunt -end - -function onGearDelete(gear) - - if (gear == hhs[0]) and (missionWon == nil) then - GameOverMan() - end - -end - -function onAmmoStoreInit() - SetAmmo(amRope, 9, 0, 0, 0) -end - -function onNewTurn() - SetWeapon(amRope) -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_Spooky_Tree.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Spooky_Tree.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ - -HedgewarsScriptLoad("/Scripts/Locale.lua") - ---------------------------------------------------------------- - -local player = nil -- This variable will point to the hog's gear -local instructor = nil -local enemy = nil - -local GameOver = false -local birdSpeech = false -local birdSqualk = false - -local GirderCrate = nil - -function onGameInit() - - -- Things we don't modify here will use their default values. - Seed = 0 -- The base number for the random number generator - GameFlags = gfInfAttack +gfDisableWind-- Game settings and rules - TurnTime = 90000 -- The time the player has to move each round (in ms) - CaseFreq = 0 -- The frequency of crate drops - 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 - SuddenDeathTurns = 99999 - - AddTeam(loc("Bloody Rookies"), 14483456, "Simple", "Island", "Default") - player = AddHog(loc("Hunter"), 0, 1, "NoHat") - --852718 - AddTeam(loc("Toxic Team"), 1175851, "Simple", "Island", "Default") - enemy = AddHog(loc("Poison"), 1, 10, "Skull") - - SetGearPosition(player,970,23) - SetGearPosition(enemy,498,806) - -end - - -function onGameStart() - - --right side mines - AddGear(1681,359,gtMine, 0, 0, 0, 0) - AddGear(1718,518,gtMine, 0, 0, 0, 0) - AddGear(1648,527,gtMine, 0, 0, 0, 0) - AddGear(1584,522,gtMine, 0, 0, 0, 0) - - --tunnel mines - AddGear(301,569,gtSMine, 0, 0, 0, 0) - AddGear(372,608,gtSMine, 0, 0, 0, 0) - AddGear(453,628,gtSMine, 0, 0, 0, 0) - AddGear(524,611,gtSMine, 0, 0, 0, 0) - AddGear(613,611,gtSMine, 0, 0, 0, 0) - - AddGear(308,486,gtSMine, 0, 0, 0, 0) - AddGear(372,478,gtSMine, 0, 0, 0, 0) - AddGear(453,466,gtSMine, 0, 0, 0, 0) - AddGear(524,471,gtSMine, 0, 0, 0, 0) - AddGear(613,466,gtSMine, 0, 0, 0, 0) - - --above the tunnel mines - AddGear(331,433,gtMine, 0, 0, 0, 0) - AddGear(404,420,gtMine, 0, 0, 0, 0) - AddGear(484,424,gtMine, 0, 0, 0, 0) - AddGear(562,417,gtMine, 0, 0, 0, 0) - AddGear(640,412,gtMine, 0, 0, 0, 0) - - -- crates crates and more crates - SpawnAmmoCrate(1208,576,amBlowTorch) - SpawnAmmoCrate(1467,376,amPickHammer) - SpawnUtilityCrate(373,165,amGirder) - SpawnUtilityCrate(704,623,amJetpack) - SpawnUtilityCrate(1646,749,amLaserSight) - - SpawnAmmoCrate(745,418,amShotgun) --shotgun1 - SpawnAmmoCrate(833,432,amFirePunch) --fire punch - GirderCrate = SpawnAmmoCrate(1789,514,amShotgun) -- final shotgun - SpawnAmmoCrate(1181,419,amBee) - - ShowMission(loc("Spooky Tree"), "", loc("Eliminate all enemies") .. loc("|- Mines Time:") .. " " .. 0 .. " " .. loc("sec"), -amBee, 0) - - SetWind(-75) - -end - - -function onGameTick() - - - if CurrentHedgehog ~= nil then - - if (birdSqualk == false) and (GetX(CurrentHedgehog) == 1102) and (GetY(CurrentHedgehog) == 133) then - birdSqualk = true - PlaySound(sndBirdyLay) - end - - if (birdSpeech == false) and (GetX(CurrentHedgehog) == 1068) and (GetY(CurrentHedgehog) == 162) then - birdSpeech = true - HogSay(player,loc("Good birdy......"),SAY_THINK) - end - end - - if CurrentHedgehog ~= nil then - --AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog)) - end - - if (TotalRounds == 2) and (GameOver == false) then -- just in case - SetHealth(player, 0) - GameOver = true - end - - if TurnTimeLeft == 1 then - --ShowMission(loc(caption), loc(subcaption), loc(timeout), -amSkip, 0); - SetHealth(player, 0) - GameOver = true - end - -end - - -function onAmmoStoreInit() - SetAmmo(amShotgun, 0, 0, 0, 1) - SetAmmo(amFirePunch, 0, 0, 0, 1) - SetAmmo(amBee, 0, 0, 0, 1) - SetAmmo(amBlowTorch, 0, 0, 0, 1) - SetAmmo(amGirder, 0, 0, 0, 1) - SetAmmo(amParachute, 1, 0, 0, 1) - SetAmmo(amPickHammer, 0, 0, 0, 1) - SetAmmo(amJetpack, 0, 0, 0, 1) - SetAmmo(amLaserSight, 0, 0, 0, 1) -end - -function onGearDelete(gear) - - if gear == GirderCrate then - TurnTimeLeft = TurnTimeLeft + 30000 - end - - if GetGearType(gear) == gtCase then - TurnTimeLeft = 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) - GameOver = true - end - -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_Teamwork.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_Teamwork.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local player = nil -- This variable will point to the hog's gear -local p2 = nil -local enemy = nil -local bCrate = nil - -local GameOver = false - -function onGameInit() - - -- Things we don't modify here will use their default values. - Seed = 0 -- The base number for the random number generator - GameFlags = gfDisableWind-- Game settings and rules - TurnTime = 30000 -- The time the player has to move each round (in ms) - CaseFreq = 0 -- The frequency of crate drops - 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 - SuddenDeathTurns = 99999 - - AddTeam(loc("Feeble Resistance"), 14483456, "Simple", "Island", "Default") - player = AddHog(string.format(loc("Pathetic Hog #%d"), 1), 0, 50, "NoHat") - p2 = AddHog(string.format(loc("Pathetic Hog #%d"), 2), 0, 20, "NoHat") - - --AddTeam("Toxic Team", 1175851, "Simple", "Island", "Robot","cm_binary") - AddTeam(loc("Cybernetic Empire"), 1175851, "Simple", "Island", "Robot", "cm_binary") - enemy = AddHog(loc("Unit 3378"), 5, 30, "cyborg1") - - SetGearPosition(player,1403,235) - SetGearPosition(p2,1269,239) - SetGearPosition(enemy,492,495) - -end - - -function onGameStart() - - --mines - AddGear(276,76,gtMine, 0, 0, 0, 0) - AddGear(301,76,gtMine, 0, 0, 0, 0) - AddGear(326,76,gtMine, 0, 0, 0, 0) - AddGear(351,76,gtMine, 0, 0, 0, 0) - AddGear(376,76,gtMine, 0, 0, 0, 0) - AddGear(401,76,gtMine, 0, 0, 0, 0) - AddGear(426,76,gtMine, 0, 0, 0, 0) - AddGear(451,76,gtMine, 0, 0, 0, 0) - AddGear(476,76,gtMine, 0, 0, 0, 0) - - AddGear(886,356,gtMine, 0, 0, 0, 0) - AddGear(901,356,gtMine, 0, 0, 0, 0) - AddGear(926,356,gtMine, 0, 0, 0, 0) - AddGear(951,356,gtMine, 0, 0, 0, 0) - AddGear(976,356,gtMine, 0, 0, 0, 0) - AddGear(1001,356,gtMine, 0, 0, 0, 0) - - -- crates crates and more crates - bCrate = SpawnAmmoCrate(1688,476,amBaseballBat) - SpawnUtilityCrate(572,143,amGirder) - SpawnAmmoCrate(1704,954,amPickHammer) - SpawnAmmoCrate(704,623,amBlowTorch) - SpawnUtilityCrate(1543,744,amJetpack) - SpawnAmmoCrate(227,442,amDrill) - - ShowMission(loc("Codename: Teamwork"), "", loc("- Eliminate Unit 3378 |- Feeble Resistance must survive") .. loc("|- Mines Time:") .. " " .. 0 .. " " .. loc("sec"), 0, 0) - -end - - ---function onGameTick() - - --if CurrentHedgehog ~= nil then - -- AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog)) - --end - ---end - - -function onAmmoStoreInit() - SetAmmo(amBlowTorch, 0, 0, 0, 1) - SetAmmo(amGirder, 0, 0, 0, 1) - SetAmmo(amPickHammer, 0, 0, 0, 2) - SetAmmo(amJetpack, 0, 0, 0, 1) - SetAmmo(amDrill, 0, 0, 0, 2) - SetAmmo(amBaseballBat, 0, 0, 0, 1) - SetAmmo(amSwitch, 9, 0, 0, 0) - SetAmmo(amSkip, 9, 0, 0, 0) -end - -function onGearDamage(gear, damage) - if (gear == player) and (damage == 30) then - HogSay(player,loc("T_T"),SAY_SHOUT) - end -end - -function onGearDelete(gear) - - if gear == bCrate then - HogSay(CurrentHedgehog, loc("Hmmm..."), SAY_THINK) - end - - if GetGearType(gear) == gtCase then - TurnTimeLeft = TurnTimeLeft + 5000 - end - - if (gear == enemy) and (GameOver == false) then - ShowMission(loc("Codename: Teamwork"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) - GameOver = true - elseif ( ((gear == player) or (gear == p2)) and (GameOver == false)) then - ShowMission(loc("Codename: Teamwork"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) - GameOver = true - SetHealth(p2,0) - SetHealth(player,0) - end - -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_That_Sinking_Feeling.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,301 +0,0 @@ - - -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local player -local hh = {} -local hhCount = 8 -local GameOver = false -local introStage = 0 -local genCounter = 0 -local waterCounter = 0 -local waterPix = 0 -local frig = 0 -local watGear = nil -local cinematic = false - --- allow skipping of the intro via hitting precise key -function onPrecise() - if introStage < 100 then - introStage = 110 - 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) - SetInputMask(0xFFFFFFFF) - end -end - -function onGameInit() - - Seed = 0 - GameFlags = gfInfAttack + gfInvulnerable + gfOneClanMode - TurnTime = 90000 - CaseFreq = 0 - MinesNum = 0 - MinesTime = 3000 - Explosives = 0 - Delay = 10 - Map = "Islands" - Theme = "City" - SuddenDeathTurns = 1 - - AddTeam(loc("Hapless Hogs"), 14483456, "Simple", "Island", "Default") - 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") - hh[3] = AddHog(loc("Clumsy"), 1, 100, "dish_SauceBoatSilver") - hh[4] = AddHog(loc("Silly"), 1, 100, "dish_Ladle") - hh[5] = AddHog(loc("Careless"), 1, 100, "StrawHatEyes") - hh[6] = AddHog(loc("Sponge"), 1, 100, "sf_chunli") - hh[7] = AddHog(loc("Deadweight"), 1, 100, "dish_Teacup") - - AddTeam(loc("Nameless Heroes"), 14483456, "Simple", "Island", "Default", "cm_crossedswords") - player = AddHog(loc("The Nameless One"), 0, 1, "NoHat") - - SetGearPosition(player, 3992, 733) - SetGearPosition(hh[0], 938, 1369) - SetGearPosition(hh[1], 1301, 1439) - SetGearPosition(hh[2], 2093, 447) - SetGearPosition(hh[3], 2971, 926) - SetGearPosition(hh[4], 719, 545) - SetGearPosition(hh[5], 1630, 821) - SetGearPosition(hh[6], 2191, 810) - SetGearPosition(hh[7], 3799, 945) - - -- Disable all input except [Precise] for the intro - SetInputMask(gmPrecise) -end - - -function onGameStart() - cinematic = true - SetCinematicMode(true) - SendHealthStatsOff() - - ShowMission(loc("That Sinking Feeling"), loc("Challenge"), loc("Save as many hapless hogs as possible!"), 4, 1) - - HogTurnLeft(hh[0], false) - HogTurnLeft(hh[1], true) - - SpawnUtilityCrate(148,265,amLowGravity) - SpawnUtilityCrate(2124,1516,amJetpack) - -end - - -function onNewTurn() - TurnTimeLeft = -1 -end - -function onGameTick() - - -- intro sequence - if introStage < 100 then - - frig = frig + 1 - if frig == 50 then - frig = 0 - AddCaption(loc("Press [Precise] to skip intro")) - if watGear ~= nil then - FollowGear(watGear) - end - end - - - --AddCaption(loc("Press [Precise] to skip intro")) - genCounter = genCounter + 1 - - if introStage == 0 then - - - --FollowGear(hh[0]) - - if genCounter == 2000 then - watGear = hh[0] - HogSay(hh[0], loc("This rain is really something..."), SAY_SAY,2) - elseif genCounter == 5000 then - introStage = 1 - genCounter = 0 - end - - elseif introStage == 1 then - - --FollowGear(hh[1]) - - if genCounter == 2000 then - watGear = hh[1] - HogSay(hh[1], loc("Heh, it's not that bad."), SAY_SAY,2) - elseif genCounter == 5000 then - introStage = 2 - genCounter = 0 - end - - elseif introStage == 2 then - - --FollowGear(hh[0]) - - if genCounter == 2000 then - watGear = hh[0] - HogSay(hh[0], loc("You'd almost swear the water was rising!"), SAY_SHOUT,2) - elseif genCounter == 6000 then - introStage = 3 - genCounter = 0 - end - - elseif introStage == 3 then - - --FollowGear(hh[1]) - - if genCounter == 2000 then - watGear = hh[1] - HogSay(hh[1], loc("Haha, now THAT would be something!"), SAY_SAY,2) - elseif genCounter == 6000 then - introStage = 4 - genCounter = 0 - end - - elseif introStage == 4 then - - --FollowGear(hh[0]) - - if genCounter == 2000 then - watGear = hh[0] - HogSay(hh[0], loc("Hahahaha!"), SAY_SHOUT,2) - HogSay(hh[1], loc("Hahahaha!"), SAY_SHOUT,2) - elseif genCounter == 3000 then - introStage = 5 - genCounter = 0 - end - - elseif introStage == 5 then - - --FollowGear(hh[1]) - - if genCounter == 2000 then - watGear = hh[1] - HogSay(hh[0], loc("..."), SAY_THINK,2) - HogSay(hh[1], loc("..."), SAY_THINK,2) - elseif genCounter == 5000 then - introStage = 6 - genCounter = 0 - end - - elseif introStage == 6 then - - --FollowGear(hh[0]) - - if genCounter == 2000 then - watGear = hh[0] - HogSay(hh[0], loc("It's a good thing SUDDEN DEATH is 99 turns away..."), SAY_THINK,2) - elseif genCounter == 6000 then - introStage = 7 - genCounter = 0 - end - - - elseif introStage == 7 then - - 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) - SetInputMask(0xFFFFFFFF) - end - - end - - end - - -- start the water rising when the intro is finished - if introStage == 110 then - - if cinematic then - SetCinematicMode(false) - cinematic = false - end - - waterCounter = waterCounter + 1 - if (waterCounter == 100) and (waterPix < 1615) then - waterCounter = 0 - SetTag(AddGear(0, 0, gtWaterUp, 0, 0, 0, 0), 1) - waterPix = waterPix +1 - --AddCaption(waterPix) - - if (waterPix >= 1615) and (GameOver == false) then - GameOver = true - AddCaption(loc("The flood has stopped! Challenge over.")) - SendStat(siGameResult, loc("Challenge completed!")) - SendStat(siPlayerKills, tostring(hhCount), loc("Nameless Heroes")) - SendStat(siPointType, loc("rescues")) - - -- Do not count drowning hedgehogs - local hhLeft = hhCount - for i=1,#hh do - local isDrowning = band(GetState(hh[i]),gstDrowning) ~= 0 - if isDrowning then - hhLeft = hhLeft - 1 - end - end - - SendStat(siCustomAchievement, string.format(loc("You saved %d of 8 Hapless Hogs."), hhLeft)) - - if hhLeft == 8 then - AddCaption(loc("Achievement obtained: Lively Lifeguard"),0xffba00ff,capgrpMessage2) - SendStat(siCustomAchievement, loc("You have obtained an achievement: Lively Lifeguard")) - end - EndGame() - - end - - end - - end -end - - -function onAmmoStoreInit() - - SetAmmo(amBazooka, 9, 0, 0, 0) - - SetAmmo(amRope, 9, 0, 0, 0) - SetAmmo(amParachute, 9, 0, 0, 0) - SetAmmo(amJetpack, 2, 0, 0, 2) - - SetAmmo(amGirder, 9, 0, 0, 0) - SetAmmo(amBaseballBat, 9, 0, 0, 0) - - SetAmmo(amTeleport, 1, 0, 0, 1) - SetAmmo(amPortalGun, 3, 0, 0, 1) - - SetAmmo(amLowGravity, 0, 0, 0, 1) - -end - -function onGearDelete(gear) - - if GetGearType(gear) == gtHedgehog then - if GetHogTeamName(gear) == loc("Hapless Hogs") then - hhCount = hhCount - 1 - AddCaption(string.format(loc("%d Hapless Hogs left"), hhCount)) - end - end - - if ((gear == player) or (hhCount == 0)) and (GameOver == false) then - SetHealth(player, 0) - AddCaption(loc("Disqualified!")) - 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(siPlayerKills, "0", loc("Nameless Heroes")) - SendStat(siPointType, loc("points")) - - SendStat(siGameResult, loc("Disqualified!")) - GameOver = true - EndGame() - end - -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua --- a/share/hedgewars/Data/Missions/Training/User_Mission_-_The_Great_Escape.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -HedgewarsScriptLoad("/Scripts/Locale.lua") - -local player = nil -local enemy = nil - -function onGameInit() - - Map = "Castle" - Theme = "Nature" - Seed = 0 - GameFlags = gfInfAttack - - TurnTime = 45 * 1000 - - CaseFreq = 0 - MinesNum = 0 - Explosives = 0 - - AddTeam(loc("Hero Team"), 14483456, "Simple", "Island", "Default", "Hedgewars") - player = AddHog(loc("Good Dude"), 0, 80, "NoHat") --NoHat - - AddTeam(loc("Bad Team"), 1175851, "Simple", "Island", "Default", "Hedgewars") - enemy = AddHog(loc("Bad Guy"), 1, 40, "NoHat") - -end - -function onGameStart() - -ShowMission(loc("The Great Escape"), loc("Get out of there!"), loc("Elimate your captor."), -amGrenade, 0) - ------- GIRDER LIST ------ -PlaceGirder(1042,564,0) -PlaceGirder(1028,474,6) -PlaceGirder(1074,474,6) -PlaceGirder(1050,385,0) -PlaceGirder(1175,731,7) -PlaceGirder(1452,905,2) -PlaceGirder(1522,855,4) -PlaceGirder(1496,900,3) -PlaceGirder(1682,855,4) -PlaceGirder(1773,887,2) -PlaceGirder(1647,901,1) -PlaceGirder(1871,883,6) -PlaceGirder(1871,723,6) -PlaceGirder(1774,768,6) -PlaceGirder(1773,767,6) -PlaceGirder(1821,904,1) -PlaceGirder(1822,802,3) -PlaceGirder(1820,723,1) -PlaceGirder(1782,678,4) -PlaceGirder(1822,661,0) -PlaceGirder(1822,644,0) -PlaceGirder(1742,644,0) -PlaceGirder(1742,661,0) -PlaceGirder(1694,676,2) -PlaceGirder(1903,635,0) ------- HEALTH CRATE LIST ------ -SpawnHealthCrate(1476,169) -SpawnHealthCrate(1551,177) -SpawnHealthCrate(1586,200) -SpawnHealthCrate(1439,189) -SpawnHealthCrate(1401,211) -SpawnHealthCrate(1633,210) ------- MINE LIST ------ -tempG = AddGear(1010,680,gtMine, 0, 0, 0, 0) -SetTimer(tempG, 1) -tempG = AddGear(1031,720,gtMine, 0, 0, 0, 0) -SetTimer(tempG, 1) -tempG = AddGear(1039,748,gtMine, 0, 0, 0, 0) -SetTimer(tempG, 1) -tempG = AddGear(1051,777,gtMine, 0, 0, 0, 0) -SetTimer(tempG, 1) -tempG = AddGear(1065,796,gtMine, 0, 0, 0, 0) -SetTimer(tempG, 1) -tempG = AddGear(1094,800,gtMine, 0, 0, 0, 0) -SetTimer(tempG, 1) ------- REPOSITION LIST ------ -SetGearPosition(player,1050,534) -SetGearPosition(enemy,1512,158) -SetHealth(player, 1) -SetHealth(enemy, 1) ------- AMMO CRATE LIST ------ -SpawnAmmoCrate(1632,943,5) -SpawnAmmoCrate(1723,888,12) -SpawnAmmoCrate(1915,599,1) ------- UTILITY CRATE LIST ------ -SpawnUtilityCrate(1519,945,15) -SpawnUtilityCrate(1227,640,6) -SpawnUtilityCrate(1416,913,18) ------- END LOADING DATA ------ - -end - -function onGameTick() - - if TurnTimeLeft == TurnTime-1 then - SetWind(100) - end - -end - -function onGearDelete(gear) - if (GetGearType(gear) == gtCase) and (CurrentHedgehog == player) then - if GetHealth(gear) > 0 then - AddGear(GetX(gear), GetY(gear), gtGrenade, 0, 0, 0, 1) - end - elseif gear == player then - ShowMission(loc("The Great Escape"), loc("MISSION FAILED"), loc("Oh no! Just try again!"), -amSkip, 0) - elseif gear == enemy then - ShowMission(loc("The Great Escape"), loc("MISSION SUCCESSFUL"), loc("Congratulations!"), 0, 0) - end -end - -function onAmmoStoreInit() - SetAmmo(amGrenade, 1, 0, 0, 1) - SetAmmo(amParachute, 1, 0, 0, 1) - SetAmmo(amFirePunch, 0, 0, 0, 3) - SetAmmo(amPickHammer, 0, 0, 0, 1) - SetAmmo(amBlowTorch, 0, 0, 0, 1) - SetAmmo(amShotgun, 0, 0, 0, 1) - SetAmmo(amSkip, 9, 0, 0, 0) -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Missions/Training/portal.lua --- a/share/hedgewars/Data/Missions/Training/portal.lua Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,205 +0,0 @@ -HedgewarsScriptLoad("/Scripts/Locale.lua") -HedgewarsScriptLoad("/Scripts/Utils.lua") - -local MineArray = {} -local player -local adviceGiven = false -local adviceGiven2 = false - -function onGameInit() - Seed = 0 -- The base number for the random number generator - GameFlags = gfInfAttack +gfBorder +gfDisableWind +gfSolidLand - TurnTime = 1500000 -- The time the player has to move each round (in ms) - 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"), 0xFFFF01, "Simple", "Island", "Default", "cm_test") - player = AddHog(loc("Subject 1"), 0, 10, "Terminator_Glasses") - - AddTeam(loc("Hell Army"), 0xFF0402, "skull", "Island", "Default", "cm_hellish") - enemy1 = AddHog(loc("Lucifer"), 1, 200, "InfernalHorns") - enemy2 = AddHog(loc("Voldemort"), 1, 150, "WizardHat") - enemy3 = AddHog(loc("Zombi"), 1, 100, "Zombi") - enemy4 = AddHog(loc("Predator"), 1, 14, "anzac") - enemy5 = AddHog(loc("Oneye"), 1, 50, "cyclops") - enemy6 = AddHog(loc("Razac"), 1, 50, "Evil") - enemy7 = AddHog(loc("C-2"), 1, 50, "cyborg1") - enemy8 = AddHog(loc("Rider"), 1, 50, "scif_SparkssHelmet") - - AddTeam(loc("Badmad"), 0xFF0402, "skull", "Island", "Default", "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) - -end - -function onAmmoStoreInit() - - SetAmmo(amFirePunch, 0,0,0,1) - SetAmmo(amParachute, 0, 0, 0, 2) - SetAmmo(amGirder, 0, 0, 0, 3) - SetAmmo(amTeleport, 0, 0, 0, 1) - SetAmmo(amLaserSight,0,0,0,1) - SetAmmo(amHellishBomb,0,0,0,1) - SetAmmo(amGrenade,0,0,0,1) - SetAmmo(amRope,0,0,0,1) - SetAmmo(amDEagle,0,0,0,1) - SetAmmo(amExtraTime,0,0,0,2) - SetAmmo(amSkip,9,0,0,0) - SetAmmo(amBlowTorch, 0, 0, 0, 1) - SetAmmo(amPickHammer, 0, 0, 0, 1) - SetAmmo(amSnowball, 0, 0, 0, 1) - -end - -function onGameStart() - - SetWind(100) - - MineArray[0] = AddGear(840, 1847, gtMine, 0, 0, 0, 0) - MineArray[1] = AddGear(900, 1847, gtMine, 0, 0, 0, 0) - MineArray[2] = AddGear(1000, 1847, gtMine, 0, 0, 0, 0) - MineArray[3] = AddGear(1100, 1847, gtMine, 0, 0, 0, 0) - MineArray[4] = AddGear(1140, 1847, gtMine, 0, 0, 0, 0) - MineArray[5] = AddGear(1170, 1847, gtMine, 0, 0, 0, 0) - MineArray[6] = AddGear(1200, 1847, gtMine, 0, 0, 0, 0) - MineArray[7] = AddGear(1200, 1847, gtMine, 0, 0, 0, 0) - MineArray[8] = AddGear(1230, 1847, gtMine, 0, 0, 0, 0) - MineArray[9] = AddGear(1280, 1847, gtMine, 0, 0, 0, 0) - MineArray[10] = AddGear(1302, 1847, gtMine, 0, 0, 0, 0) - MineArray[11] = AddGear(1350, 1847, gtMine, 0, 0, 0, 0) - MineArray[12] = AddGear(1383, 1847, gtMine, 0, 0, 0, 0) - MineArray[13] = AddGear(1400, 1847, gtMine, 0, 0, 0, 0) - MineArray[14] = AddGear(1423, 1847, gtMine, 0, 0, 0, 0) - MineArray[15] = AddGear(1470, 1847, gtMine, 0, 0, 0, 0) - MineArray[16] = AddGear(1480, 1847, gtMine, 0, 0, 0, 0) - MineArray[17] = AddGear(1311, 1847, gtMine, 0, 0, 0, 0) - - MineArray[18] = AddGear(840, 1785, gtMine, 0, 0, 0, 0) - MineArray[19] = AddGear(900, 1785, gtMine, 0, 0, 0, 0) - MineArray[20] = AddGear(1000, 1785, gtMine, 0, 0, 0, 0) - MineArray[21] = AddGear(1100, 1785, gtMine, 0, 0, 0, 0) - MineArray[22] = AddGear(1140, 1785, gtMine, 0, 0, 0, 0) - MineArray[23] = AddGear(1170, 1785, gtMine, 0, 0, 0, 0) - MineArray[24] = AddGear(1200, 1785, gtMine, 0, 0, 0, 0) - MineArray[25] = AddGear(1230, 1785, gtMine, 0, 0, 0, 0) - MineArray[26] = AddGear(1280, 1785, gtMine, 0, 0, 0, 0) - MineArray[27] = AddGear(1302, 1785, gtMine, 0, 0, 0, 0) - MineArray[28] = AddGear(1350, 1785, gtMine, 0, 0, 0, 0) - MineArray[29] = AddGear(1383, 1785, gtMine, 0, 0, 0, 0) - MineArray[30] = AddGear(1400, 1785, gtMine, 0, 0, 0, 0) - MineArray[31] = AddGear(1423, 1785, gtMine, 0, 0, 0, 0) - MineArray[32] = AddGear(1470, 1785, gtMine, 0, 0, 0, 0) - MineArray[33] = AddGear(1480, 1785, gtMine, 0, 0, 0, 0) - MineArray[34] = AddGear(1311, 1785, gtMine, 0, 0, 0, 0) - - MineArray[35] = AddGear(4029, 89, gtMine, 0, 0, 0, 120) - - for i = 0,#MineArray do - SetTimer(MineArray[i],050) - SetState(MineArray[i],544) - end - --needed this MineArray cause timer didn't work, its was always 3sec, i wanna instant mines - - --UTILITY CRATE-- - parachute = SpawnUtilityCrate(1670, 1165, amParachute) - girder = SpawnUtilityCrate(2101, 1297, amGirder) - SpawnUtilityCrate(3965, 625, amBlowTorch) - SpawnUtilityCrate(2249, 93, amBlowTorch) - SpawnUtilityCrate(2181, 829, amBlowTorch) - SpawnUtilityCrate(1820, 567, amBlowTorch) - SpawnUtilityCrate(1375, 900, amTeleport) - SpawnUtilityCrate(130, 600, amPickHammer) - SpawnUtilityCrate(1660,1820, amLaserSight) - SpawnUtilityCrate(4070,1840, amLaserSight) - - - --AMMO CRATE-- - portalgun = SpawnAmmoCrate(505, 1943, amPortalGun, 1000) - extratime = SpawnAmmoCrate(4020, 785, amExtraTime, 2) - SpawnAmmoCrate(425, 613, amSnowball) - SpawnAmmoCrate(861, 633, amHellishBomb) - SpawnAmmoCrate(2510, 623, amSnowball) - SpawnAmmoCrate(2900, 1600, amGrenade) - SpawnAmmoCrate(2680, 320, amGrenade) - SpawnAmmoCrate(2650, 80, amDEagle) - SpawnAmmoCrate(3000, 100, amDEagle) - SpawnAmmoCrate(2900, 1400, amRope) - SpawnAmmoCrate(4025, 1117, amFirePunch) - - --HEALTH CRATE-- - SpawnHealthCrate(2000, 780) - - --GIRDER-- - PlaceGirder(3363, 1323, 4) - - ShowMission (loc("Portal Mind Challenge"), loc("Mission"), - loc("Defeat all enemies!") .. "|" .. loc("In this mission you have infinite time."), - -amPortalGun, 5000) - HogSay(player, loc("I should get myself a portal device, maybe this crate has one."), SAY_THINK) - -end - -function onGameTick() - - if (player ~= nil) then - if (gearIsInBox(player, 1650, 1907, 200, 60) and (adviceGiven == false)) then - adviceGiven = 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 - HogSay(player, loc("The anti-portal surface is all over the floor, and I have nothing to kill him. Dropping something could hurt him enough to kill him."), SAY_THINK) - end - end - -end - -function onGearDelete(gear) - -- Check gear collection - if CurrentHedgehog == player and (band(GetGearMessage(gear), gmDestroy) ~= 0) then - if gear == portalgun then - HogSay(player, loc("Great! Let’s kill all these enemies, using portals."), SAY_THINK) - end - - if gear == girder then - HogSay(player, loc("This will be useful when I need a new platform or if I want to rise."), SAY_THINK) - end - - if gear == parachute then - HogSay(player, loc("You can’t open a portal on the blue surface."), SAY_THINK) - end - - if gear == extratime then - HogSay(player, loc("What?! For all this struggle I just win some ... time? Oh dear!"), SAY_SHOUT) - end - end - - if gear == player then - player = nil - end -end - diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Music/Beach.ogg Binary file share/hedgewars/Data/Music/Beach.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Music/Fruit.ogg Binary file share/hedgewars/Data/Music/Fruit.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Music/Jungle.ogg Binary file share/hedgewars/Data/Music/Jungle.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Music/credits.txt --- a/share/hedgewars/Data/Music/credits.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Music/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,7 +1,12 @@ 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 ) oriental.ogg=Jonatan Nilsson -Rock.ogg=HSR ( http://elhombresinremedio.com ) sdmusic.ogg=Kevin MacLeod - "Hitman" [sheepluva edit] snow.ogg=Jonatan Nilsson diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Bandit.cfg --- a/share/hedgewars/Data/Names/Bandit.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/Bandit.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,2 @@ bandit +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Cowboy.cfg --- a/share/hedgewars/Data/Names/Cowboy.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -cowboy diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Evil.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/Evil.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +morbid diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Glasses.cfg --- a/share/hedgewars/Data/Names/Glasses.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Hat.cfg --- a/share/hedgewars/Data/Names/Hat.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/IndianChief.cfg --- a/share/hedgewars/Data/Names/IndianChief.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/IndianChief.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,1 @@ -indian +native_american diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/InfernalHorns.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/InfernalHorns.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +morbid diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Joker.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/Joker.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +clown diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/MegaHogX.cfg --- a/share/hedgewars/Data/Names/MegaHogX.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/NoHat.cfg --- a/share/hedgewars/Data/Names/NoHat.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/README.md Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,56 @@ +# Hedgewars random name lists +The directory Data/Names contains random hog and team names and +hat sets for themed teams. + +In this file I'll explain the format of each of the files: + +## `.cfg` +Hat configuration file. +This file lists the random name list (without file name suffix), e.g.: + + generic + nordic + +and so on. Each list name must exist in this directory. When choosing +a random name for this hat, it will first randomly choose one of the +name lists, then choose a random name within that list. + +`` must be the name of a hat (without file name suffix) for which +to apply the random names, e.g. “Santa”. + +If a hat does not have a config file, it will use the generic name list. + +## `.txt` = +This is a list of random hedgehog names, one name per line. +`` is an identifier of your choice (except “types”). + +## `generic.txt` == +Works exactly like `.txt`, but this file is also used as default for all +hats without a .cfg file. + +This file must be present at all costs! + +## `types.txt` = +This contains themed team names and hat sets. +It works like this: + +For each team: + +* First comes a list of possible team names for a team type. +* Then comes a separator line with 5 equals signs (“=====”). +* Then comes a list of hat names with out file name suffix. +* 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. + +At the end of the final team, this line must be written (without the spaces): + + *END* + +Everything after that will be ignored. + +The first team entry is special: The team names of this entry are considered +to be generic and fit (more or less) and don't have any particular theme. + +This file must be present at all costs! diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/RobinHood.cfg --- a/share/hedgewars/Data/Names/RobinHood.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Samurai.cfg --- a/share/hedgewars/Data/Names/Samurai.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/Samurai.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,1 @@ -generic +ninja diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Santa.cfg --- a/share/hedgewars/Data/Names/Santa.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Sunglasses.cfg --- a/share/hedgewars/Data/Names/Sunglasses.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/TeamSoldier.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/TeamSoldier.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +generic +generic +war diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/Viking.cfg --- a/share/hedgewars/Data/Names/Viking.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/Viking.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,3 @@ +nordic +nordic generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/WhySoSerious.cfg --- a/share/hedgewars/Data/Names/WhySoSerious.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/WhySoSerious.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,2 @@ whysoserious +clown diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/WizardHat.cfg --- a/share/hedgewars/Data/Names/WizardHat.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/WizardHat.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,8 @@ wizard +generic +generic +generic +generic +generic +generic +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/angel.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/angel.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +angel +biblical +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/angel.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/angel.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,159 @@ +Aarin +Abasdarhon +Abdiel +Adellum +Adnachiel +Adoel +Ahiah +Ambriel +Amitiel +Anahita +Anak +Anaphiel +Ansiel +Aphaeleon +Appolyon +Araqiel +Araquiel +Arariel +Araton +Ariuk +Asmodel +Asteraoth +Azazel +Azrael +Balthioul +Barattiel +Boamiel +Cadriel +Cassiel +Cathetel +Cerviel +Charoum +Cherubim +Dabriel +Daniel +Dardariel +Dazielle +Domiel +Douma +Dubbiel +Elyon +Empyrean +Forfax +Gadiel +Gadreel +Gadriel +Gagiel +Galgaliel +Gazardiel +Germael +Hadariel +Hadramiel +Hadraniel +Hamael +Hamon +Haniel +Hayliel +Hayyel +Herchel +Iahhel +Iaoel +Inian +Iofiel +Ithuriel +Jabril +Jamaerah +Joshua +Kabshiel +Kafziel +Kakabel +Kezef +Lahabiel +Madan +Mahanaim +Malik +Mariuk +Maroth +Mattia +Micah +Michael +Mihr +Mikhal +Morael +Munkar +Nathanael +Nelchael +Nisroc +Omael +Omniel +Onafiel +Ongkanon +Ophiel +Orphamiel +Pamyel +Paschar +Peliel +Phaleg +Prentum +Qaddisin +Qaspiel +Quabriel +Rabdos +Radueriel +Rampel +Rasiel +Rogziel +Rufeal +Sabathiel +Salathiel +Samandriel +Samkiel +Sandalphon +Saniel +Sareash +Semalion +Semsapiel +Semyaza +Seraph +Seraphiel +Shamsiel +Shepherd +Sizouze +Sorath +Tabris +Taharial +Tamiel +Tearney +Telantes +Theliel +Tubiel +Ubaviel +Usiu +Valoel +Verchiel +Xathanael +Yabbashael +Yahoel +Yerachmiel +Zaapiel +Zaazenach +Zabkiel +Zakzakiel +Zaphiel +Zarall +Zazriel +Zehanpuryu +Zephon +Zophiel +Zuriel +Holy +Blessed +Saint +Godly +Spirit +Shine +Light +Lumine +Lumina +Mirage diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/apple.txt --- a/share/hedgewars/Data/Names/apple.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/apple.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,44 @@ Apple +Applehead +Applehat +No Worm +Shiny Red +Rotten +Hogapple +Foul +Ruit +Applove +Malus +Pomplus +Red Delicious +Golden Delicious +Autumn Glory +Worm’s Delight +Golden Orange +Deathly Delight +Delicous Death +Grenade Apple +Doom Apple +Fail Apple +Pink Pearl +Nice Bite +Wormhome +Cultivar +Mad Apple +Bad Apple +Hog Apple +Hollow Inside +Seedless +Seeder +Appler +Fool’s Tomato +Toxic Fruit +Poisoned Apple +Apple of Doom +Danger Fruit +Gone Bad +Killer Apple +Stem +Golden +Delight +Red Rage diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/banana.txt --- a/share/hedgewars/Data/Names/banana.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/banana.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,42 @@ Banana +Bananahead +Bananahead +Yellow Thing +Glitchy +Slippery +Silly +Fruity +Delicious +Yellow Tasty +Yellow Delight +Jungle Fruit +Monkey Wrench +Monkey Magnet +Slippery Slope +Floor Trap +Jungle Trouble +Jungle Jimbo +Musa +Shrub +Stern +Banana King +Yellow Hat +Yellow Fruit +Yellow Trouble +Other Green +Floor +Skidder +Slipping Hazard +Slip and Fall +Wastehead +Skin +Peel +Inside In +Forb +Monkey Food +Careeb +Bad Banana +Mad Banana +Killer Banana +Whoops +Accident diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/bandit.txt --- a/share/hedgewars/Data/Names/bandit.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/bandit.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,50 @@ Gangster Bandit -Burglar +Burgler +Taker +Stealer +Illegal +Criminal +Master Thief +Possessor +Mastermind +Anonymous +Violent +Danger +Bruiser +Thug +Mad Fellow +Sad Lad +Angry Joe +Legbreaker +Armcrunsher +Headcrusher +Buck +Bugger +Goofer +Chap +Bloke +Angry Hog +Crimethink +Headhunter +Petty Crook +Crook +Small-Time +Hood +Shorty +Moneytaker +Coingrabber +Wallet Walter +Highwayhog +Street Hog +Bridge Blocker +Blocker +Stopper +Annoyer +Underhog +Convicted +Escaped +Can’t Catch Me +Freerunner +Harry Killer +Convict diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/beefeater.cfg --- a/share/hedgewars/Data/Names/beefeater.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/biblical.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/biblical.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,325 @@ +Aaron +Abdiel +Abel +Abiah +Abiathar +Abiel +Abilene +Abiram +Abner +Abraham +Abram +Absalom +Adam +Adama +Adiel +Adin +Adlai +Adonijah +Adriel +Ahio +Ajah +Alexander +Alian +Allon +Alpha +Amad +Amariah +Amaziah +Amittai +Amon +Amos +Anaiah +Anayah +Andrew +Andronicus +Aquila +Arad +Areli +Ariel +Arioch +Armoni +Artemas +Asa +Asher +Azaliah +Azariah +Barabbas +Barak +Barnabas +Bartholmew +Baruch +Benjamin +Berachiah +Berechiah +Boaz +Cain +Calamus +Caleb +Canaan +Cedron +Chenaniah +Christian +Clement +Coniah +Corban +Cornelius +Cyprus +Cyrus +Dan +Daniel +Darius +Dathan +David +Demas +Dimnah +Dodavah +Ebenezer +Edrei +El`azar +Elah +Elasah +Elealeh +Eleazar +Elhanan +Eli +Elias +Eliezer +Elijah +Elisha +Elisheba +Elkanah +Elnaam +Elnathan +Emmanuel +Enan +Enoch +Ephraim +Erastus +Esau +Eshton +Ethan +Euphrates +Ezekiel +Ezra +Felix +Festus +Gabriel +Gamaliel +Gideon +Gilboa +Gilead +Hamath +Hanan +Haran +Hazael +Hazaiah +Hebron +Hezekiah +Hiram +Hosea +Immanuel +Isaac +Isaiah +Ishmael +Ishtob +Ismachiah +Ismaiah +Israel +Ithiel +Jaazaniah +Jabal +Jachin +Jacob +Jadon +Jahaziah +Jahaziel +Jahmai +Jairus +Jakin +Jalon +James +Jamin +Janna +Janoah +Japheth +Jared +Jaresiah +Jarmuth +Jasher +Jason +Javan +Jedidah +Jedidiah +Jehoiakim +Jehoram +Jehoshua +Jeremiah +Jeremy +Jeriah +Jericho +Jeshaiah +Jeshiah +Jeshua +Jeshuah +Jesse +Jesus +Jethro +Jezreel +Joab +Joachim +Joaquin +Joash +Job +Joel +Johanan +Johannan +John +Jonah +Jonathan +Jordan +Joseph +Joshua +Josiah +Jotham +Jubal +Judah +Jude +Julian +Julius +Justus +Kadesh +Kadmiel +Kedar +Kemuel +Kenan +Kenaniah +Kir +Kohath +Korah +Kristian +Laban +Lazarus +Lemuel +Levi +Linus +Lucas +Lucius +Luke +Lysanias +Malachi +Malchiah +Malchiel +Malchus +Manasseh +Manoah +Marcus +Mark +Mattathias +Matthew +Matthias +Mattithiah +Menahem +Meshach +Methuselah +Micah +Micaiah +Micha +Michael +Mordecai +Mose +Moses +Moshe +Naaman +Nadab +Nahaliel +Naham +Nathan +Nathanael +Nathanel +Nathaniel +Nedabiah +Nehemiah +Neriah +Nicholas +Nicodemas +Nicolas +Noah +Obadiah +Obed +Omar +Oren +Othniel +Pagiel +Parmenus +Patrobus +Paul +Pediah +Peres +Perez +Peter +Philemon +Philetus +Philip +Phillip +Rama +Ramah +Ramiah +Raphael +Rei +Reuben +Reuel +Rueben +Rufus +Salathiel +Salem +Samson +Samuel +Saul +Sergius +Seth +Shalem +Shalom +Shaphan +Shecaniah +Shem +Shemaiah +Shiloh +Silas +Simeon +Simon +Sirion +Solomon +Stephen +Steven +Tartan +Tekoa +Tekoah +Thaddaeus +Thaddeus +Theophilus +Thomas +Timon +Timotheus +Timothy +Titus +Tobiah +Tobias +Trophimus +Uriah +Urias +Uzziah +Vaniah +Yakim +Zachariah +Zachary +Zadok +Zebadiah +Zebedee +Zebulun +Zechariah +Zedekiah +Zelotes +Zephaniah +Zimri +Zion diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/brainslug.txt --- a/share/hedgewars/Data/Names/brainslug.txt Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -Hermes -Fry -Zoidberg -Wong -Nibbler -Conrad -Amy -Billy -West -Katey -Sagal -Dimaggio diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/cap_blue.cfg --- a/share/hedgewars/Data/Names/cap_blue.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/cap_green.cfg --- a/share/hedgewars/Data/Names/cap_green.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/cap_red.cfg --- a/share/hedgewars/Data/Names/cap_red.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/cap_yellow.cfg --- a/share/hedgewars/Data/Names/cap_yellow.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/clown-copper.cfg --- a/share/hedgewars/Data/Names/clown-copper.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/clown-copper.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,2 @@ clown +whysoserious diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/clown-crossed.cfg --- a/share/hedgewars/Data/Names/clown-crossed.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/clown-crossed.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,2 @@ clown +whysoserious diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/clown.cfg --- a/share/hedgewars/Data/Names/clown.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/clown.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,2 @@ clown +whysoserious diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/clown.txt --- a/share/hedgewars/Data/Names/clown.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/clown.txt Sun Dec 17 00:09:24 2017 +0100 @@ -4,6 +4,7 @@ Buttons Chocko Chuckles +Clown Dinky Doodles Dusty @@ -18,7 +19,7 @@ Jojo Jumbo Kinko -KnicKnac +Knicknac Koko Krusty Loopy diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/cowboy.txt --- a/share/hedgewars/Data/Names/cowboy.txt Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -Jim -Ramirez -Roy -Joe -Rob -Dan -Tom -Ernesto -Douglas -Mario -Jose -Francisco -Brian -Cooper -Salvador -Javier -Ara -Cinzia -Rafael -Claudio -Franzo -Juan diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/crown.txt --- a/share/hedgewars/Data/Names/crown.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/crown.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,3 +1,96 @@ -Majesty +Actual King +Admin +Arthur IV +Authority +Bamboo King +Bath King +Benevolent Dictator +Big One +Boss +Brick King +Cake King +Captain +Castle King +Cave King +Cheese King +Chief +Chieftain +Chosen One +City King +Compost King +Crownbearer +Desert King +Dictator +Ducky King +Eddie I +Ed XI +Emperor +Forest King +Freeway King +Fruit King +Gold +Golf King +Grass King +Great Leader +Greg IX +Gregory XXIII +Greg VIII +Head +Hedgehog III +Hedge King +Hog King +Hog with Crown +Ice King +Ignucius II +Imperator +Island King +Joe VII +Joseph I +Jungle King King -Emperor +Kingliest King +King of Arts +King of Clubs +King of Diamonds +King of Halloween +King of Hearts +King of Hell +King of Hoggywood +King of Kings +King of Spades +Leader +Lord Harry I +Lord Hog +Luxury +Majesty +Malevolent Dictator +Master +Mayor +Mini King +Mr Crown +Nature King +Number One +Ocean King +Operator +Overking +Overlord +Owner +Precious +Righteous Ruler +Ruler +Skull King +Snow King +Space King +Special +Stage King +Stephanus V +Superb +The Real Leader +Tim X +Top Hog +Tremendous +Tyrant +Victor VII +Walter VI +Warlord +Water King diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/cyborg1.cfg --- a/share/hedgewars/Data/Names/cyborg1.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/female.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/female.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,199 @@ +Adaline +Alanna +Alberta +Alease +Aleta +Alysa +Amiee +Anastasia +Andera +Angelena +Angle +Anglea +Anissa +Annalee +Audrey +Aurore +Autumn +Bao +Bev +Beverlee +Breanna +Brittani +Brittny +Brunilda +Buffy +Caren +Carlotta +Chanell +Chantell +Chara +Cheree +Chu +Ciara +Clarissa +Concetta +Consuelo +Coral +Cordia +Corinna +Dannette +Daphine +Deb +Debora +Delfina +Delilah +Delorse +Desire +Dominque +Donita +Doretha +Dotty +Dwana +Easter +Ebony +Effie +Ellan +Eloisa +Emilee +Emilie +Emma +Erica +Etha +Eufemia +Eusebia +Floretta +Frederica +Genevive +Georgie +Geri +Glynda +Gwenda +Ha +Heike +Hollie +Ilona +In +Inocencia +Irmgard +Janay +Janice +Jannie +Jeane +Jeanna +Jeffie +Jerlene +Joane +Joanna +Joellen +Joleen +Jolene +Jolynn +Juana +Juliet +Jutta +Kacy +Karleen +Kathie +Katrina +Kelsey +Kenyetta +Kerri +Kimberlie +Kimi +Kirstin +Kittie +Kristin +Kristle +Kyla +Lacey +Laraine +Larissa +Latesha +Leatha +Leeanne +Liana +Librada +Lisa +Lisha +Loria +Lourdes +Luba +Lucie +Lucrecia +Lyn +Madelaine +Magdalena +Maggie +Maile +Malia +Maris +Marita +Marvel +Maryln +Maybelle +Meagan +Melaine +Melinda +Meri +Meta +Michelle +Mollie +Nadene +Nadine +Nakita +Natividad +Nellie +Nena +Nidia +Noreen +Ola +Olympia +Onita +Pandora +Peggy +Penni +Pia +Piper +Racquel +Ranae +Regena +Regina +Renea +Ria +Robbin +Romelia +Rosamond +Rosanna +Ryann +Shae +Sharen +Sharolyn +Shavon +Shella +Shellie +Sheri +Sigrid +Song +Sook +Stacie +Suzann +Tamica +Teisha +Tessie +Thalia +Thomasena +Tomeka +Tomoko +Tosha +Toya +Tracee +Tu +Veronica +Vida +Wendy +Willia +Yesenia +Yuki +Zena +Zula \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/fr_apple.cfg --- a/share/hedgewars/Data/Names/fr_apple.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/fr_apple.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,3 @@ apple fruit +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/fr_banana.cfg --- a/share/hedgewars/Data/Names/fr_banana.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/fr_banana.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,3 @@ banana fruit +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/fr_lemon.cfg --- a/share/hedgewars/Data/Names/fr_lemon.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/fr_lemon.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,3 @@ lemon fruit +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/fr_orange.cfg --- a/share/hedgewars/Data/Names/fr_orange.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/fr_orange.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,3 @@ orange fruit +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/fruit.txt --- a/share/hedgewars/Data/Names/fruit.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/fruit.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,18 +1,33 @@ -Mellow Mellow Tasty Healthy Fresh -Fresh Sweety Covered Delicious -Delicious Fruit Snack Food Vitamine Vital -Aggresive Taste Yummy +Fruity +Bitten +Yummy +Eat my Hat +Myhat +Plant +Fun Fruit +Fruut +Bad Hat +Mad Hat +Special +Growth +Terra +Earth +Strangehead +Friend +Munch +Bud +Gnarf diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/generic.txt --- a/share/hedgewars/Data/Names/generic.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/generic.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,9 +1,665 @@ -Diego -Boggy -Arnold -Cal +Aaron +Acorn +Adam +Adan +Adolph Adrian -Johnny +Agustin +Ahmed +Aimer +Airhead +Albert +Albi +Aldo +Alex +Alexis +Alfonso +Alfonzo +Alfred +Alfredo +Alonso +Alton +Alva +Alvaro +Alvin +Amado +Amos +Andrew +Andy +Angelo +Ani +Anibal +Animal +Anthea +Anthony +Antony +Antwan +Ariel +Armand +Arnold +Art +Ash +Ashes +Aubrey +August +Austin +Autumn +Baby +Bad +Bako +Bart +Bathog +Bear +Benedict +Benjamin +Benny +Bernard +Bernie +Berry +Bert +Big Boy +Bignose +Bijou +Billy +Bing +Blackie +Bluebell +Bobby +Bobo +Boggy +Bonkers +Boogie +Borris +Brad +Brady +Brain +Brendan +Brent +Bruce +Brutus +Bryan +Buff +Bullet +Bully +Burl +Buster +Butterbean +Butters +Byron +Cal +Cali +Carmine +Carter +Cecil +Ceres +Chadwick +Chauncey +Cheeko +Cheeks +Cheeky +Cheesecake +Chester +Chewi +Chewy +Chica +Choc +Choco +Chops +Chor +Chriss +Chub-Chub +Chuckie +Chunky +Cinnabunn +Clarence +Clay +Clement +Clifford +Clover +Cocco +Coco +Cocoa +Cody +Collin +Conrad +Cookie +Cooper +Cornflake +Courtney +Creampuff +Cristobal +Crosby +Crumpet +Cupcake +Curt +Dallas +Dalton +Damage +Damian +Dandy +Darin +Darrin +Dasha +Dave +Davey +Demin +Demo +Denis +Denise +Deon +Derrick +Destroyer +Devon +Dewitt +Dexter +Diego +Dig +Dinney +Dino +Dodo +Dolly +Domenic +Domi +Dominic +Dominick +Domino +Donn +Donna +Donny +Donut +Dood +Doodle +Dopey +Doug +Drako +Dusty +Dwarfy +Dwayne +Dwight +Earle +Earnest +Ears +Earth +Edgar +Edmund +Edna +Efren +Egg +Einstein +Elden +Eleanor +Elliot +Elmer +Elmo +Elton +Elvin +Em +Emmanuel +Emmie +Enrique +Epic +Eric +Erin +Erinace +Eris +Ernace +Ernie +Ervin +Erwin +Esteban +Eugenio +Exploder +Fabian +Fermin +Fernando +Fido +Filiberto +Flap-Jack +Flip Flop +Florian +Florra +Footer +Forest +Frances +Frankie +Freda +Freddie +Freddy +Fredric +Fritz +Frosty +Fry +Funbun +Funker +Furball +Furry +Garry +Gavin +Genaro +George +Geraldo +Gerry +Gibbel +Gilbert +Gilberto +Gismo +Gizmo +Glan +Glenn +Gordo +Grant +Gravis +Gregg +Gregory +Gru +Grumpy +Guillermo +Gus-Gus +Gut +Haga +Hai +Ham +Hamlet +Hammer +Hammy +Hank +Hannibal +Hans +Happy +Harlan +Harold +Harris +Harry +Harvest +Haywood +Heads +Health +Hector +Hedge +Herb +Hercules +Hermes +Hiber +Hibernate +Himber +Hippy +Hog +Hope +Houston +Howard +Hoyt +Hubert +Hugo +Humphrey +Hungry +Hunter +Hurt +Icecream +Ichigo +Isaac +Isaias +Ismael +Ivan Jackson -Crosby -Frankie +Jacob +Jae +Jame +Jamel +Jan +Jarred +Jason +Jasper +Jeff +Jefferson +Jelly Bean +Jem +Jeppy +Jerald +Jere +Jerome +Jerry +Jezzy +Jill +Jim +Jimmie +Joanne +Jody +Joe +John +Johnnie +Johnny +Jonathan +Jordan +Jude +Jules +Jumper +Junior +Jupiter +Justin +Kasey +Keeko +Keenan +Ken +Keneth +Kenneth +Kerby +Kermit +Kiara +Killer +Kin +Kit +Kiwi +Knuck-knuck +Kooky +Kraig +Kramer +Kronk +Lacy +La-La +Larry +Lee +Lena +Leo +Leonel +Lester +Lethe +Lewis +Lightning +Lime +Lino +Linus +Lisie +Little +Lloyd +Louis +Louise +Lucas +Luciano +Luis +Luke +Luther +Lux +Lycan +Mac +Mack +Mad +Magnum +Mahdi +Major +Mal +Malcom +Malita +Mamma +Mammal +Man +Mango +Marcelino +Marcus +Margarito +Mars +Martin +Marvin +Mary +Max +Maynard +Meatball +Mechano +Memphis +Mervin +Michael +Michaela +Michal +Mickey +Midnight +Mikel +Mikey +Mikhaii +Milan +Miley +Milky Way +Millie +Milo +Mimi Belle +Mini +Mini me +Mitch +Mo +Mocha +Mohammad +Momo +Mondo +Monte +Monty +Moonlight +Morty +Moustache +Muffin +Muncher +Murray +Mystic +Napoleon +Nathan +Ned +Neptune +Newton +Nibble +Nibbles +Nice +Nicholas +Nick +Nicodemus +Nightmare +Nimbus +Nin +Nips-A-Lot +Noe +Nolan +Norman +Nose +Nugget +Numbers +Nutmeg +Oliver +Omer +Orris +Orville +Oscar +Osvaldo +Oswald +Otis +Ozzie +Pablo +Paige +Pasquale +Patrick +Paul +Peanut +Pebbles +Peels +Peggy +Penelope +Pepper +Perry +Phobos +Pickle +Pinkie +Pipsqeak +Pixel +Plop +Pluto +Pollie +Polo +Pop +Preston +Pueblo +Pumpkin +Putt-Putt +Quentin +Quintin +Quinton +Raleigh +Ralph +Ramen +Ramiro +Ramon +Randy +Raoul +Rascal +Ray +Raymon +Raymond +Raymundo +Redtan +Rex +Ricardo +Richard +Richie +Rick +Rigby +Rigoberto +Riley +Rip +Rob +Robbie +Robby +Rocket +Rocky +Rodalyn +Roderick +Rolando +Rolland +Rollie +Romeo +Ron +Ronny +Roscoe +Rosendo +Ruckus +Rudolf +Rudolph +Runner +Russell +Rusty +Ryan +Sada +Sagal +Saint +Salem +Salvador +Sammy +Samuel +Sandy +Santo +Santos +Sarge +Scooter +Scot +Scrappy +Shad +Shadow +Sharpie +Shelby +Sheldon +Shine +Shooter +Sico +Sid +Silas +Silver +Skipper +Sleep +Sleepy +Slowhog +Smart +Snoopy +Snowball +Snow White +Snuggles +Sob +Soldier +Solomon +Sonic +Sooty +Speedster +Speedy +Spencer +Spike +Spines +Splash +Spot +Spring +Sprinkles +Spudnick +Squirrel +Steal +Stefan +Steven +Stomper +Strawberry +Stretch +Stubby +Stud +Sugar +Summer +Sweet Pea +Sydney +Tails +Taizha +Ted +Teddy +Templeton +Thad +Thaddeus +Theo +Thor +Tiffany +Tigger +Tile +Timon +Tiny +Toast +Toby +Tomas +Tory +Travis +Treacle +Treakle +Trinket +Truman +Tyco +Valentin +Valentine +Van +Velvey +Venus +Vicente +Victor +Vince +Vincenzo +Virgil +Wade +Walter +Ward +Warhead +Warlock +Warrior +Water +Wesley +Wiley +Wilmer +Wilson +Wormeater +Wormstomp +Wyatt +Xander +Xavier +Xaviera +Yang +Yankydoodle +Yin +Yogurt +Zach +Zack +Zap +Zebra +Ziggy diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/hair_blue.cfg --- a/share/hedgewars/Data/Names/hair_blue.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/hair_green.cfg --- a/share/hedgewars/Data/Names/hair_green.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/hair_grey.cfg --- a/share/hedgewars/Data/Names/hair_grey.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/hair_orange.cfg --- a/share/hedgewars/Data/Names/hair_orange.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/hair_pink.cfg --- a/share/hedgewars/Data/Names/hair_pink.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/hair_purple.cfg --- a/share/hedgewars/Data/Names/hair_purple.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/hair_red.cfg --- a/share/hedgewars/Data/Names/hair_red.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/hair_yellow.cfg --- a/share/hedgewars/Data/Names/hair_yellow.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/indian.txt --- a/share/hedgewars/Data/Names/indian.txt Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,424 +0,0 @@ -Alsoomse -Chayton -Sahkyo -Aiyanna -Shideezhi -Naira -Bilagaana -Witashnah -Nadie -Hesutu -Tahkeome -Abukcheech -Honon -Hehewuti -Rowtag -Tisseewoonatis -Koko -Liwanu -Kimi -Mahkah -Kotori -Ominotago -Hurit -Mapiya -Askuwheteau -Moki -Wakanda -Wohehiv -Liluye -Ohitekah -Howahkan -Hania -Pahana -Honaw -Demonthin -Tayanita -Kiwidinok -Alaqua -Talutah -Isi -Hassun -Angwusnasomtaqa -Adahy -Nahcomence -Aiyana -Una -Wicapi wakan -Melkedoodum -Pachua -Molimo -Heskovizenako -Tahmelapachme -Ptaysanwee -Ogaleesha -Ahanu -Pavati -Kuruk -Shizhe'e -Etchemin -Magaskawee -Ohanzee -Kosumi -Mahpee -Masichuvio -Ehawee -Wicasa -Hotah -Ayawamat -Zitkala -Sani -Shuman -Winona -Chua -Sewati -Sihu -Totsi -Salali -Taigi -Megedagik -Hokolesqua -Powaqa -Qaletaqa -Wanageeska -Moema -Meturato -Maka -Sunukkuhkau -Uzumati -Matwau -Chansomps -Howi -Sowi'ngwa -Yamka -Gad -Suletu -Mansi -Doli -Odakota -Wuyi -Nahimana -Hakidonmuya -Shiriki -Pauwau -Tokala -Kesegowaase -Tihkoosue -Cha'risa -Kaneonuskatew -Lomahongva -Ayasha -Nukpana -Chuchip -Otoahnacto -Wokaihwokomas -Taini -Kasa -Enapay -Anpaytoo -Amadahy -Etlelooaat -Kimimela -Zihna -Keegsquaw -Kisecawchuck -Sokanon -Odahingum -Shadi -Tuwa -Hinto -Urika -Huyana -Nina -Awinita -Matchitisiw -Misu -Ashkii -Tenskwatawa -Kimama -Onatah -Kachina -Talulla -Lokni -Lansa -Nittawosew -Niyol -Napayshni -Nayeli -Makkapitew -Pamuya -Catahecassa -Mona -Eluwilussit -Orenda -Abedabun -Lapu -Yanisin -Kuwanlelenta -Tiponi -Amitola -Aponi -Tiva -Tatanka-ptecila -Pannoowau -Wikvaya -Chaschunka -Adsila -Yas -Quanah -Takoda -Makawee -Tse -Wematin -Pajackok -Kohana -Chochuschuvio -Namid -Wauna -Kolichiyaw -Awentia -Kuckunniwi -Peta -Taipa -Sikyahonaw -Huritt -Otaktay -Kwatoko -Pivane -Donoma -Pakwa -Nosh -Enkoodabooaoo -Wenona -Makkitotosimew -Ayelen -Kohkahycumest -Ayashe -Sicheii -Mantotohpa -Tupi -Tsiishchili -Polikwaptiwa -Tangakwunu -Wahchintonka -Mundoo -Achak -Heammawihio -Tolinka -Tasunke -Chankoowashtay -Telutci -Goyathlay -Posala -Macawi -Ahote -Nukpana -Rayen -Hastiin -Nahiossi -Togquos -Calfuray -Chumani -Shilah -Mochni -Kawacatoose -Weayaya -Len -Cheveyo -Gahege -Wachiwi -Waquini -Honani -Noshi -Shiye -Pakuna -Hototo -Naalnish -Shikoba -Muscowequan -Oota dabun -Chunta -Nuttah -Papina -Kai -Matoskah -Aucaman -Nawkaw -Kachada -Vokivocummast -Powwaw -Mimiteh -Vohkinne -Ciqala -Wuti -Gudahi -Skah -Chu'si -Choovio -Shimasani -Cha'tima -Kateri -Sinopa -Avonaco -Chumana -Kwahu -Ocumwhowurst -Tallulah -Wambli-waste -Nootau -Aponivi -Kestejoo -Methoataske -Honiahaka -Sooleawa -Nastas -Hahkethomemah -Istaqa -Chogan -Hevataneo -Waki -Wenonah -Chowilawu -Ocunnowhurst -Wahchinksapa -Kaliska -Ahiga -Hiamovi -T'iis -Wihakayda -Keme -Honovi -Tadewi -Kanti -Bidziil -Ohcumgache -Alameda -Sitala -Sayen -Sike -Wapasha -Makya -Voisttitoevetz -Tooantuh -Ailen -Meoquanee -Chochmingwu -Mukki -Migina -Enkoodabaoo -Isi -Niichaad -Sheshebens -Antinanco -Wanahton -Wahkan -Malila -Sikyatavo -Pocahontas -Omusa -Editon -Tohopka -Omawnakw -Numees -Poloma -Lenmana -Chochmo -Nizhoni -Yoki -Shima -Kuwanyamtiwa -Nidawi -Keezheekoni -Wanikiya -Muna -Aylen -Chepi -Muata -Misae -Takala -Chochokpi -Kele -Quidel -Paytah -Yiska -Maiara -Gaagii -Kokyangwuti -Wickaninnish -Jaci -Nahuel -Migisi -Taregan -Sanuye -Tamaya -Nascha -Chusi -Awanata -Otoahhastis -Voistitoevitz -Matchitehew -Njlon -Abequa -Ata'halne -Yahto -Ooljee -Chosovi -Machakw -Soyala -Nova -Kangee -Minninnewah -Abooksigun -Lootah -Vaiveahtoish -Nixkamich -Wayra -Helushka -Yazhi -Hantaywee -Qochata -Choviohoya -Tocho -Leyati -Cha'akmongwi -Mongwau -Lise -Sik'is -Tallula -Matunaaga -Takhi -Litonya -Askook -Lalawethika -Viho -Wahanassatta -Takchawee -Ahtahkakoop -Teetonka -Segenam -Kaya -Tecumseh -Saqui -Wikimak -Maza blaska -Sucki -Machk -Galilahi -Nita -Sitsi -Wambleeska -Kuwanyauma -Weeko -Abeque -Chosposi -Cowessess -Niabi -Talullah -Hawiovi -Pules -Vipponah -Antiman -Shikoba -Kitchi -Hok'ee -Tablita diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/jester.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/jester.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,2 @@ +whysoserious +clown diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/kiss.txt --- a/share/hedgewars/Data/Names/kiss.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/kiss.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,13 +1,325 @@ -Starchild +Anger +Angerroot +Angerslice +Ankh +Aquaclay +Aquarig +Aquasoil +Automaton +Banebolt +Bashcoin +Basher +Bashthunder +Battleblink +Beam +Beast +Beastspring +Beastthunder +Belch +Belchcrash +Bentflame +Bentneed +Blackcoin +Blast +Blastgreed +Blink +Bloodstorm +Blow +Bolt +Bone +Boneclub +Braincut +Brainrun +Brood +Burnlure +Carnal +Carver +Catman +Chain +Chainmane +Chainzap +Chargelust +Chargemurk +Charm +Charmpulley +Charnelshock +Chill +Chillbolt +Cinderclay +Cindergreed +Clawcinder +Coffinooze +Coffinsneak +Cog +Cogblast +Cogfang +Coldblink +Coldwave +Crank +Crash +Crashlover +Criss +Curse +Curseshroud +Cutember +Damned +Darkwire +Dartblast +Dartspring +Dashblow +Dashclay +Deadgut +Deadzap +Deathblow +Deathcoil +Deathmiser +Deaththunder Demon +Demonbrood +Demondamn +Demonfight +Demonmace +Demonrot +Demonspawn +Destroyer +Device +Dirthunger +Dream +Dreamtear +Drummer +Duskcoin +Duskfight +Duskmystic +Duskstrike +Earthbone +Emberrot +Emberstrike +Evilbrood +Evildamn +Evildemon +Evilfight +Evilspawn +Fallen +Fang +Fangcrash +Fangstorm +Fastblow +Fire +Firevault +Flamebolt +Flameslime +Flickergloom +Foulbelch +Foulcog +Fox +Freeze +Freezeghost +Freezelock +Freezer +Freshley +Frock +Fury +Ghoulbeam +Ghouldamn +Ghouldouse +Gloom +Gloomspeed +Gold +Goldbeam +Goldboss +Goldfang +Goldthunder +Goredash +Goreshroud +Gorespring +Gravehaunt +Gut +Hauntlurk +Hauntwave +Hellbound +Hellbrain +Helldamn +Horndouse +Hornshiver +Horror +Hunger +Hungerfury +Hungergut +Huntchill +Huntrage +Insane +Interred +Killbolt +Killfire +Killtool +Lakewire +Leaf +Lovespring +Lust +Lustful +Lustooze +Lustskull +Lustspring +Mastergreed +Mastershroud +Mechapus +Metal +Metalpiston +Minddusk +Misor +Moneyspike +Moulder +Muckpulley +Murktool +Mystic +Nail +Nailfire +Necrohorror +Netthunder +Nighthunger +Nightskull +Nightsoul +Oozetree +Plantghast +Plug +Psycho +Pukesmash +Putrid +Quickblaze +Quicksludge +Quickthorn +Rage +Ragebolt +Ragethought +Rapid +Rapidcharm +Rapidmurk +Rapidneed +Rapidwheel +Reign +Revenge +Ripdart +Riverlover +Rivertear +Rockwave +Rootrot +Rot +Rotsoil +Rotten +Rulecaster +Scum +Scumbeast +Scumbrood +Scummouth +Seamace +Seekcrash +Seeker +Shadow +Shadowcharge +Shadowhorn +Sharphate +Sharpspring +Shiver +Shivergut +Shiverlock +Shiverslime +Shiverstench +Shock +Shocknail +Shocksneak +Simmons +Skull +Skulldream +Skullreign +Slashcrank +Slashrivet +Slashsoil +Slashwave +Slayfreeze +Slicer +Slime +Slimetrap +Sludgedeath +Sludgestench +Slymane +Slystrike +Slyzap +Smash +Smashcurse +Smasher +Smashskull +Snare +Snowleaf +Snowpiston +Soil +Soilvenom +Soul +Soulshock Spaceman -Catman -Fox -Ankh +Spark +Sparkgloom +Spectral +Speedhorror +Spellbolt +Spiritmaw +Spiritthought +Stanley +Starchild +Stealth +Steelclay +Steelmouth +Stench +Stone +Storm +Stormfight +Stormtooth +Strength +Strike +Tear +Thiefrock +Thorn +Thornblink +Thornboss +Thundercrash +Thundershiver +Tomb +Tombblow +Tombspark +Toothbeam +Toothhunt +Trackerember +Trackerstone +Trackerstorm +Treestealth +Twistbeast +Twistchain +Twistcrash +Twistreign +Unborn +Unplugged +Vault +Vaultblaze +Vaultclub +Vaultshock +Vaultstrike +Venom +Venomfreeze +Vileshiver Warrior -Drummer -Destroyer -Revenge -Psycho -Unplugged -Metal +Warspell +Wave +Wavestroke +Wealthember +Wealthshade +Wealthsnare +Wealthsneak +Wetcoil +Wethorn +Wheelcoin +Wireanger +Witch +Witchcraze +Witchvenom +Zap +Zapdrool +Zapwheel \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/knight.cfg --- a/share/hedgewars/Data/Names/knight.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/knight.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,2 @@ +knight generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/knight.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/knight.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,102 @@ +Army +Battle Cleaver +Bearhead +Bearhelm +Black Knight +Boar +Bone Bane +Bone Rage +Bull +Champion +Colossal +Colossus +Conqueror +Coyote +Cruel +Deathmane +Dire +Dire One +Dog +Doomhammer +Dragonslayer +Dread +Eternal Hunger +Exalted +Fearless +Feisty +Feral +Firepelt +Firestarter +Ford +Freak +Giantfist +Gianthallow +Giant Mane +Goldmane +Grandfury +Grandhide +Greatchaser +Great Grimace +Honorless +Hurricane +Insane +Knight +Knightingale +Light Sword +Lionheart +Lone Wolf +Mammoth +Mammoth Brow +Mammothfang +Mammoth Might +Molten pelt +Moltenshield +Monster +Mutant +Ni +Night Eye +Nighthelm +Owl +Ox +Paragon +Phantom +Phoenix +Pyro +Rage Strike +Redcut +Redmantle +Redthorn +Rock Helm +Rumbleroar +Sadist +Scarred One +Serpent +Shadowblood +Shadowhide +Shadowmight +Sharpbane +Shiny Armor +Silentpelt +Silverbrow +Singlecut +Skullmantle +Slayer +Spider +Steel Blow +Stormcut +Stout Fist +Surgeon +Swiftgrip +Swift song +Swine +Thief +Vermin +Voidblood +Voidhammer +Voidhide +Vulture +White Knight +Wildling +Wolfbreaker +Wolfhammer +Wolfhide diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/lemon.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/lemon.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,39 @@ +Lemon +Lemonhead +Lemonhat +Yellow +Sour +Acid +Yellow Fun +Crazy Hat +Limon +Lemonade +Sour +Zitron +Citrus +Citric +Juice +Squash +Squeeze +Lemon Aid +Yellow Fruit +Sour Fruit +Pulp Fact +Pulp +Rind +Zest +Ferment +Aroma +Lemongrass +Balm +Garden Fool +Fool's Banana +Juicemaker +Danger Lemon +Mad Lemon +Yellow Mad +Sour and Mad +Sour Fun +Bad Lemon +Combustible Lemon +Killer Lemon diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/morbid.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/morbid.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,241 @@ +Agororor +Angurimm +Aran +Atuncha +Bathazgla +Bauin +Baurgodu +Bavaia +Beldriro +Belogiro +Beroror +Bethath +Black +Blood +Body Counter +Brasest +Browast +Brutal +Cagulini +Calathugorc +Canging +Cathmal +Caurtham +Cauru +Cazgoth +Chair +Chakod +Chaugori +Cherodu +Chingotu +Chuazg +Cragas +Cratost +Cutter +Damage +Danger +Dark +Darkness +Death +Degurgo +Doom +Doublekill +Drasest +Durcar +Drowest +Drurgi +Drurin +Dugura +Egondetuntu +Egunturingo +Egwethar +Elangond +Encaurt +Engul +Enguldel +Ergog +Eriror +Erku +Erme +Eroror +Ertula +Erzil +Ethmau +Ethulat +Evil +Fabangilau +Falirca +Fang +Fauarcalu +Faungba +Favalal +Fazgbango +Geman +Giri +Glongin +Godugl +Gore +Grazan +Grenen +Grrrr +Guina +Guluglathma +Gurdr +Gwetulan +Habarotu +Haglindr +Hagoth +Hair +Hakalila +Hathulam +Haulalkod +Headhunter +Headshot +Healthtaker +Heavy +Hegotur +Hela +Heturtha +Hiand +Hmmendurai +Horns +Hunter +Hurirava +Hurt +Iangi +Iath +Ilalir +Imalorodu +Imego +Immergoro +Incan +Inside Out +Irngrorncau +Ituli +Iturgi +Kadol +Kamast +Kaulinan +Kaurotug +Kava +Kenern +Kesest +Kewal +Kill +Killer +Kolam +Koturg +Krogast +Kronast +Laimab +Laurar +Life Sucker +Lilat +Limilori +Lkaelau +Lrchan +Lrnal +Mabang +Marth +Mass +Melazgo +Merirgl +Metalhead +Milanim +Milrdrchal +Mirimon +Mogori +Mogulab +Moliri +Mongirod +Muncher +Murderer +Nandulko +Nathang +Nauloril +Nglkor +Ngort +Ngrg +Ngurg +Obengw +Odri +Oglk +Ogurchma +Ogurng +Oliau +Olroturor +Oraroru +Ordugldu +Orgind +Orglavaul +Orimmor +Orogoro +Orthalugiror +Orthm +Otugorur +Oturcalo +Pain +Paingiver +Ratast +Rates +Razgl +Rcaturcavan +Rcha +Rduruau +Red Spikes +Rglurgo +Riabatui +Riakorulira +Rinaelroru +Rngb +Rogar +Rolar +Rorcall +Rorong +Rotha +Rtulir +Rurorg +Sades +Samorturmma +Sarth +Satar +Shaungor +Shitu +Shmorc +Shulatun +Slasher +Slaughterer +Slonrurr +Snatcher +Spikes of Doom +Srezen +Stogen +Tadol +Taker +Than +Thmo +Todost +Tulingug +Turircau +Uingothalana +Uirithegld +Ulugli +Ungllath +Urinagor +Urirauli +Uturuglu +Vaetu +Vaianarg +Vamarm +Vamornt +Vandethm +Varu +Veins +Vogerm +Vrater +Weglindetu +Wegorn +Welamo +Wencalaulr +Wethavaugrca +Wetua diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/mv_Venom.cfg --- a/share/hedgewars/Data/Names/mv_Venom.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/native_american.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/native_american.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,419 @@ +Abedabun +Abequa +Abeque +Abooksigun +Abukcheech +Achak +Adahy +Adsila +Ahanu +Ahiga +Ahote +Ahtahkakoop +Ailen +Aiyana +Aiyanna +Alameda +Alaqua +Alsoomse +Amadahy +Amitola +Anpaytoo +Antiman +Antinanco +Aponi +Aponivi +Ashkii +Askook +Askuwheteau +Ata'halne +Aucaman +Avonaco +Awanata +Awentia +Awinita +Ayasha +Ayashe +Ayawamat +Ayelen +Aylen +Bidziil +Bilagaana +Calfuray +Catahecassa +Cha'akmongwi +Chankoowashtay +Chansomps +Cha'risa +Chaschunka +Cha'tima +Chayton +Chepi +Cheveyo +Chochmingwu +Chochmo +Chochokpi +Chochuschuvio +Chogan +Choovio +Chosovi +Chosposi +Choviohoya +Chowilawu +Chua +Chuchip +Chumana +Chumani +Chunta +Chusi +Chu'si +Ciqala +Cowessess +Demonthin +Doli +Donoma +Editon +Ehawee +Eluwilussit +Enapay +Enkoodabaoo +Enkoodabooaoo +Etchemin +Etlelooaat +Gaagii +Gad +Gahege +Galilahi +Goyathlay +Gudahi +Hahkethomemah +Hakidonmuya +Hania +Hantaywee +Hassun +Hastiin +Hawiovi +Heammawihio +Hehewuti +Helushka +Heskovizenako +Hesutu +Hevataneo +Hiamovi +Hinto +Hokee +Hokolesqua +Honani +Honaw +Honiahaka +Honon +Honovi +Hotah +Hototo +Howahkan +Howi +Hurit +Huritt +Huyana +Isi +Istaqa +Jaci +Kachada +Kachina +Kai +Kaliska +Kaneonuskatew +Kangee +Kanti +Kasa +Kateri +Kawacatoose +Kaya +Keegsquaw +Keezheekoni +Kele +Keme +Kesegowaase +Kestejoo +Kimama +Kimi +Kimimela +Kisecawchuck +Kitchi +Kiwidinok +Kohana +Kohkahycumest +Koko +Kokyangwuti +Kolichiyaw +Kosumi +Kotori +Kuckunniwi +Kuruk +Kuwanlelenta +Kuwanyamtiwa +Kuwanyauma +Kwahu +Kwatoko +Lalawethika +Lansa +Lapu +Len +Lenmana +Leyati +Liluye +Lise +Litonya +Liwanu +Lokni +Lomahongva +Lootah +Macawi +Machakw +Machk +Magaskawee +Mahkah +Mahpee +Maiara +Maka +Makawee +Makkapitew +Makkitotosimew +Makya +Malila +Mansi +Mantotohpa +Mapiya +Masichuvio +Matchitehew +Matchitisiw +Matoskah +Matunaaga +Matwau +Maza blaska +Megedagik +Melkedoodum +Meoquanee +Methoataske +Meturato +Migina +Migisi +Mimiteh +Minninnewah +Misae +Misu +Mochni +Moema +Moki +Molimo +Mona +Mongwau +Muata +Mukki +Muna +Mundoo +Muscowequan +Naalnish +Nadie +Nahcomence +Nahimana +Nahiossi +Nahuel +Naira +Namid +Napayshni +Nascha +Nastas +Nawkaw +Nayeli +Niabi +Nidawi +Niichaad +Nina +Nita +Nittawosew +Nixkamich +Niyol +Nizhoni +Njlon +Nootau +Nosh +Noshi +Nova +Nukpana +Numees +Nuttah +Ocumwhowurst +Ocunnowhurst +Odahingum +Odakota +Ogaleesha +Ohanzee +Ohcumgache +Ohitekah +Omawnakw +Ominotago +Omusa +Onatah +Ooljee +Oota dabun +Orenda +Otaktay +Otoahhastis +Otoahnacto +Pachua +Pahana +Pajackok +Pakuna +Pakwa +Pamuya +Pannoowau +Papina +Pauwau +Pavati +Paytah +Peta +Pivane +Pocahontas +Polikwaptiwa +Poloma +Posala +Powaqa +Powwaw +Ptaysanwee +Pules +Qaletaqa +Qochata +Quanah +Quidel +Rayen +Rowtag +Sahkyo +Salali +Sani +Sanuye +Saqui +Sayen +Segenam +Sewati +Shadi +Sheshebens +Shideezhi +Shikoba +Shilah +Shima +Shimasani +Shiriki +Shiye +Shizhee +Shuman +Sicheii +Sihu +Sike +Sikis +Sikyahonaw +Sikyatavo +Sinopa +Sitala +Sitsi +Skah +Sokanon +Sooleawa +Sowi'angwa +Soyala +Sucki +Suletu +Sunukkuhkau +Tablita +Tadewi +Tahkeome +Tahmelapachme +Taigi +Taini +Taipa +Takala +Takchawee +Takhi +Takoda +Tallula +Tallulah +Talulla +Talullah +Talutah +Tamaya +Tangakwunu +Taregan +Tasunke +Tatanka-ptecila +Tayanita +Tecumseh +Teetonka +Telutci +Tenskwatawa +Tihis +Tihkoosue +Tiponi +Tiva +Tocho +Togquos +Tohopka +Tokala +Tolinka +Tooantuh +Totsi +Tse +Tsiishchili +Tupi +Tuwa +Una +Urika +Uzumati +Vaiveahtoish +Viho +Vipponah +Vohkinne +Voistitoevitz +Voisttitoevetz +Vokivocummast +Wachiwi +Wahanassatta +Wahchinksapa +Wahchintonka +Wahkan +Wakanda +Waki +Wambleeska +Wambli-waste +Wanageeska +Wanahton +Wanikiya +Wapasha +Waquini +Wauna +Wayra +Weayaya +Weeko +Wematin +Wenona +Wenonah +Wicapi wakan +Wicasa +Wickaninnish +Wihakayda +Wikimak +Wikvaya +Winona +Witashnah +Wohehiv +Wokaihwokomas +Wuti +Wuyi +Yahto +Yamka +Yanisin +Yas +Yazhi +Yiska +Yoki +Zihna +Zitkala diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/ninja.txt --- a/share/hedgewars/Data/Names/ninja.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/ninja.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,9 +1,122 @@ -Ukemi +Akako +Aogin +Arashi +Asasen +Bashioka +Bushi +Dachi +Daharu +Dasawa +Fujiwa +Fujiyoshi +Fukuhoshi +Fukusaki +Fukusawa +Furue +Furufuku +Furuken +Furumori +Furuoka +Furushima +Furuyoshi +Gawa +Gawabashi +Gawakei +Gawamatsu +Gawazawa +Gingawa +Ginmarui +Gintaka Godai +Hanasen +Haraki +Harataka +Haruhara +Haruko +Hirafuru +Hirasaki +Honkami +Hoshitake +Ichihana +Ichikawa +Ikei +Imiya +Itami +Iwafuji +Iwaharu +Iwawa +Iwazaki +Kamio +Kawamarui +Kawanaka +Keisa +Kenhira +Kenhon +Kenki +Kensaka +Kenshi +Kenta +Kenyama +Ki +Kikuro +Kinfuku +Kisaki +Kitasaka +Ko +Koao +Koken +Kooka +Koyama +Kurofuru +Matsutaka +Miyazawa +Motoda +Motoken +Murakuchi +Nabenishi +Nabeue +Nakahara +Nakamori Ninpo +Nishiao +Nishihana +Nishinishi +Nishino +Nishisawa +Nishitoku +Nishitoyo +Nogawa +Nosaka +Notake +Nozawa +Oka +Oosa +Ooshima +Sakakuchi +Sakiki +Sakishima +Senmoto +Senta +Shimahara Shinobi +Shitafuru +Shitata +Suzutaka +Takeka Tatsujin -Arashi -Bushi -Itami -Kenshi +Tokutaka +Ueao +Ueshiro +Ukemi +Wara +Warakin +Waramiya +Warao +Wata +Yoshihana +Yoshino +Yuki +Yukiwa +Zakita +Zawashima +Zenbashi diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/nordic.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/nordic.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,247 @@ +Absalon +Adam +Adar +Ador +Adrian +Aegir +Alban +Albert +Aldor +Alf +Algot +Allen +Alois +Alrek +Alvin +Ambjorn +Andor +Andras +Andre +Annul +Anthonius +Arctander +Arnfred +Aske +Aslak +Asmus +Asulf +Baard +Basse +Belest +Ben +Bent +Berginius +Bernhard +Bertel +Berthel +Bertin +Besse +Bjornard +Bo +Boje +Borge +Borje +Botvid +Bronnil +Brynte +Carl +Christen +Clifford +Corey +Cyrill +Dagbart +Dagbjart +Dagfred +Dagnar +Dani +Dann +Dennis +Dick +Dieter +Dominic +Dovre +Edbjorn +Edin +Edolf +Edvin +Eghart +Eimar +Eivind +Elgar +Elis +Endre +Ervin +Ewen +Falkvor +Fanjel +Faste +Flavius +Flemming +Franck +Fridar +Froy +Germann +Gerry +Giermund +Gjuke +Godmann +Gregorius +Grunde +Guddor +Gudleiv +Gulf +Gullmund +Gunnar +Gunnfrod +Gunnulf +Hagerup +Halfdan +Harkjell +Hasse +Heike +Heini +Herbjorn +Hilovard +Hjuke +Holger +Holmkjell +Inge +Ingemann +Ingmund +Ingvard +Irjan +Jackie +Jahn +Jannik +Jehans +Jenvald +Jim +Jimmi +Johan +Johnny +Jol +Jomar +Jonn +Jose +Josef +Julius +Kaius +Karsten +Kjerrand +Krister +Kristian +Kyrre +Larsinius +Laurits +Laust +Lave +Leif +Leikvin +Lenny +Leon +Lorentz +Lotar +Luciano +Lucien +Ludvik +Ludwik +Lunde +Magnus +Malvin +Marc +Marcus +Martin +Matheo +Matthias +Mauritz +Max +Melian +Michel +Mikael +Mike +Mogens +Moises +Moris +Morten +Nick +Nicky +Nils +Nis +Normund +Norolf +Norstein +Oddkjell +Odmar +Olaf +Olav +Oliver +Olle +Olver +Ornulv +Oscar +Osov +Osvald +Otten +Otter +Owe +Oyel +Oyuv +Paulhard +Racin +Randinus +Rasmen +Rasmin +Reiar +Reidar +Reiner +René +Ricard +Rol +Roy +Run +Sandi +Sebastian +Severin +Sigfinn +Sigfus +Sigurd +Singvald +Sirus +Snaere +Snerre +Stanislav +Sten +Steve +Svavar +Sven +Syver +Taale +Tarik +Teis +Teo +Terkjel +Thom +Thomas +Thommy +Thor +Timo +Tjaerand +Tobias +Toivo +Tom +Tommy +Torarin +Torres +Torsten +Torvid +Torvild +Tue +Ulrik +Vagn +Vellum +Vendel +Vidkunn +Viking +Ville +Wilfred +Wincent \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/ntd_Kirby.cfg --- a/share/hedgewars/Data/Names/ntd_Kirby.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/nurse.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/nurse.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/nursehat.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/nursehat.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,2 @@ +generic +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/orange.txt --- a/share/hedgewars/Data/Names/orange.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/orange.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,41 @@ Orange -Mandarine +Oranger +Orangest +Orange Utan +Orangey +Citrus +Sinesis +Sweet +Yum-Yum +Manda +Oran +Colorfruit +Sweethog +Sweetie +Juice +Juicy +Peel +Pulp +Fool’s Tangerine +Mad Orange +Orange Orange +Colorfruit +Fruithat +Orange Hat +Outside Out +Rough +Sweetie +Blood Orange +Doom Orange +Bad Orange +Mad Orange +Rotten Orange +Rotten Fruit +Grove +Super Orange +Killer Orange +Dark Orange +Evil Orange +Lord Orange +Roundy +Pulphead diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/pirate.txt --- a/share/hedgewars/Data/Names/pirate.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/pirate.txt Sun Dec 17 00:09:24 2017 +0100 @@ -14,7 +14,7 @@ Hawkin Haunter Cruise Seymour Rusted Diego -First +First Mate Rusted Haunter Peter Buckett Yumee Gunpowder diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/pirate_bandana.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/pirate_bandana.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pirate diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/pirate_eyepatch.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/pirate_eyepatch.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +pirate +pirate +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/pirate_hat.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/pirate_hat.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pirate diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_charmander.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_charmander.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_chikorita.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_chikorita.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_diglett.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_diglett.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_jigglypuff.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_jigglypuff.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_lugia.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_lugia.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_mudkip.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_mudkip.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_pikachu.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_pikachu.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_slowpoke.cfg --- a/share/hedgewars/Data/Names/poke_slowpoke.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/poke_slowpoke.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,1 @@ -generic +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_squirtle.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_squirtle.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/poke_voltorb.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_voltorb.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +pokehogs diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/pokehogs.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/pokehogs.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,637 @@ +Adamon +Adozard +Adumon +Aduzard +Ageychu +Airachu +Airemon +Airizard +Airomon +Airychu +Airyrtle +Albalix +Aldochu +Aleertle +Alligath +Alligatric +Alligeler +Allily +Alphatross +Anezard +Angezard +Angochu +Anichu +Anklezard +Ankleumon +Anomon +Apricode +Aquaking +Aquaster +Aquatena +Ardamon +Ardimon +Ardomon +Arizard +Armaduno +Asemon +Ashirtle +Ashmeleon +Ashtile +Asychu +Atamon +Athazard +Athertle +Athochu +Atozard +Atyrtle +Aughamon +Aughozard +Aughumon +Awechu +Badgath +Badgerbil +Ballachu +Balley +Ballimon +Ballirtle +Bambinosaur +Barracola +Barracyle +Beamish +Beatone +Beefartle +Beefechu +Beefemon +Belertle +Belimon +Bellilla +Binub +Bipod +Blastora +Bonander +Boneachu +Boneamon +Boneezard +Boneichu +Boneizard +Boneomon +Boneuchu +Boneychu +Boneyzard +Buffasire +Bumamon +Bumbleechu +Bumbleemon +Bumbleimon +Bumbleochu +Bumemon +Bumezard +Bumimon +Bumirtle +Bumizard +Bumozard +Bumportle +Bumpuzard +Bumpymon +Bumpyrtle +Bumymon +Buruzard +Camosquito +Caterpia +Celestiger +Cerortle +Chaimon +Chairtle +Chamelite +Chamenyte +Chamesion +Chamezel +Chaortle +Chartle +Chazard +Chee +Cheechu +Cheemon +Cheeseirtle +Cheeseomon +Cheortle +Chimonite +Chimpadrill +Chimpanzung +Chimpapix +Chimpola +Chimybara +Clodartle +Clodozard +Clotechu +Clotortle +Clotyrtle +Clownimon +Clownychu +Cobraring +Cornamon +Cornazard +Cornechu +Cornurtle +Cornymon +Crocodair +Crocord +Crocosion +Crocoth +Danachu +Danartle +Danechu +Danichu +Danirtle +Daremon +Darertle +Daryrtle +Delozard +Demonkey +Denomon +Derp +Derpizard +Dewoda +Dinopip +Dinoscythe +Dinosotto +Dipamon +Dipezard +Dipichu +Dolphuna +Doltemon +Doltezard +Doltichu +Doltochu +Doltuzard +Doltyrtle +Doofachu +Doofazard +Doofortle +Doofurtle +Doomzelle +Dorkazard +Dorkirtle +Dorkochu +Dorkomon +Dorkuzard +Drachu +Dragolix +Dranub +Dratuff +Drayzard +Drummingbird +Dumbazard +Dumbemon +Dumbochu +Dumbumon +Dynartle +Dynurtle +Eaglide +Earthatee +Echazard +Eldirtle +Elechawk +Elecmeleon +Elecowary +Electrican +Electripion +Electrisel +Electriwing +Electroth +Elmichu +Emamon +Emimon +Emomon +Emozard +Emurtle +Endortle +Enertle +Engimon +Enochu +Enthazard +Enthomon +Enthyzard +Enuchu +Enuzard +Enyzard +Erechu +Eromon +Essertle +Estizard +Estymon +Estyzard +Etozard +Etumon +Faceachu +Faceamon +Faceechu +Faceemon +Faceimon +Faceirtle +Faceochu +Faceomon +Faceozard +Faceurtle +Falcopip +Fastpoke +Fiephant +Fierbil +Fierrilla +Fingerochu +Fingeruzard +Flamemingo +Flamimic +Flaminyte +Flamoss +Fluffabura +Fluray +Footertle +Fumbleartle +Fumbleemon +Fumbleochu +Fumbleortle +Fumbleumon +Fumbleychu +Fumbleyzard +Garortle +Garymon +Garyrtle +Gazebyss +Gazena +Gazenium +Gazung +Ghaochu +Ghartle +Ghophin +Ghowing +Gigglo +Giraffle +Girarak +Glacimite +Glaciroach +Gladuar +Gnuke +Goldela +Goldodo +Golemite +Golepion +Goofazard +Goofizard +Goofomon +Goofyzard +Gorinite +Grumbleartle +Grumbleechu +Grumbleuzard +Grumbleyzard +Hatichu +Hatizard +Hatomon +Hatuzard +Headechu +Headichu +Hedgehawk +Hedgemon +Herbarak +Herbaros +Herbican +Hiberton +Hiddo +Hippony +Hippopoth +Hogizard +Hogmon +Hograzard +Honimon +Horroboon +Horrophin +Huntadillo +Huntapi +Hunterpillar +Hyely +Hyepet +Hypewing +Hypossum +Ightachu +Ightichu +Ildachu +Ildartle +Ildyzard +Imachu +Imichu +Imizard +Inamon +Inaurtle +Ineirtle +Ingotter +Ingozard +Irirtle +Irychu +Isimon +Issazard +Itamon +Itartle +Itochu +Kalartle +Kalirtle +Kalumon +Kalyzard +Kangafree +Kelartle +Kelertle +Kimozard +Kinetadillo +Kinimon +Kinochu +Knightingale +Knockamon +Knockertle +Knockeruchu +Knockerymon +Knockeryrtle +Knockeryzard +Knockichu +Knockomon +Knuckleertle +Knuckleizard +Knuckleyrtle +Koalena +Koaron +Komodaza +Komoditar +Laserpent +Lemithe +Leopithe +Leopyss +Lerezard +Loafazard +Loafichu +Loafirtle +Loafochu +Loafomon +Loafortle +Loafozard +Loafumon +Lorezard +Lorimon +Lorizard +Lorozard +Lumpirtle +Lumpomon +Lumpuchu +Lumpychu +Lumpymon +Lunkamon +Lunkechu +Lunkezard +Lunkirtle +Lunkochu +Lunkortle +Lyeartle +Lyeirtle +Magiboon +Maginea +Magizelle +Magpine +Manaloon +Manaron +Marshypus +Mascotton +Meatechu +Meatirtle +Meatomon +Meatortle +Meatozard +Meatyzard +Megacuda +Mermantis +Mockroach +Moltish +Morechu +Moremon +Morymon +Mosamon +Mosqama +Muckamon +Muckirtle +Muckomon +Muckozard +Munchechu +Munchemon +Munchizard +Munchuzard +Munchyrtle +Niturtle +Numbartle +Numbemon +Numbichu +Numbochu +Numbortle +Numburtle +Numbyrtle +Numbyzard +Nyizard +Nyochu +Nysartle +Nysozard +Octopuds +Octoros +Oddelope +Oldemon +Omartle +Omumon +Onemon +Onochu +Orcabbage +Orirtle +Orumon +Osochu +Ostroth +Oughichu +Oystaring +Pandops +Panthug +Pelicuzz +Pelinite +Pengith +Penguna +Peruzard +Pinazard +Pinechu +Pinemon +Pinezard +Pinortle +Pinuchu +Pinychu +Poluchu +Psychound +Puffezard +Puffozard +Puffychu +Quachu +Quaileaf +Quaymon +Queachu +Queochu +Queortle +Quickeen +Quickpie +Quiling +Raccoconut +Rakazard +Rakuchu +Ramaby +Rammingo +Rampecker +Rayichu +Rhinena +Rhinocou +Rhinoplume +Rhinotar +Rilychu +Riotter +Risemon +Risizard +Rockosaur +Rodezard +Rodomon +Rothyzard +Rynizard +Salamaniac +Salaphy +Sandutor +Sardeeno +Sayirtle +Scorpair +Scorpidily +Serachu +Serumon +Shamite +Shapip +Shelphant +Shyazard +Shyichu +Shyirtle +Shyortle +Silveropotamus +Skelachu +Skelechu +Skelepion +Skelomon +Skelortle +Skullachu +Skullazard +Skullirtle +Skullymon +Slowacle +Slowdine +Slowwhale +Snarkartle +Snarkichu +Snarkimon +Sneezeirtle +Sneezeizard +Sneezeomon +Sneezeuchu +Sneezeyrtle +Soyster +Specibia +Specirilla +Spibat +Spiditar +Spiney +Starish +Stingrage +Stunzelle +Sulachu +Sulartle +Sulimon +Taiazard +Taimon +Tairtle +Tasamon +Tasortle +Termair +Terrium +Terrorb +Terroth +Terruar +Therychu +Thimblechu +Thortoise +Tigena +Tinuzard +Tinyzard +Tomatoad +Tonazard +Tonezard +Tonichu +Torertle +Toromon +Turechu +Turtusk +Turuchu +Turuzard +Twerpachu +Twerpizard +Twerpuchu +Twerpyrtle +Twitechu +Twitychu +Umamon +Umartle +Undartle +Undemon +Undertle +Undizard +Urnichu +Urnomon +Uskechu +Uskemon +Uskirtle +Uskuzard +Ustamon +Ustyzard +Venomapi +Verachu +Veruzard +Vesazard +Volting +Voltray +Voltzelle +Vorartle +Voruchu +Vultoom +Wadechu +Wadezard +Wadirtle +Wadochu +Wadumon +Wallasaur +Wallatone +Warartle +Warortle +Warpie +Weasaid +Weaseaf +Weaseal +Weasotic +Whaleaf +Whirlfly +Whirlium +Wimpichu +Wimpomon +Wimpuchu +Wimpumon +Wipeartle +Wipeomon +Wipeortle +Wipeurtle +Wipeychu +Wolvetle +Worechu +Woremon +Yerazard +Yerimon +Yerirtle diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/policegirl.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/policegirl.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/royalguard.cfg --- a/share/hedgewars/Data/Names/royalguard.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/scif_BrainSlug.cfg --- a/share/hedgewars/Data/Names/scif_BrainSlug.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/scif_BrainSlug.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,1 @@ -brainslug +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/scif_BrainSlug2.cfg --- a/share/hedgewars/Data/Names/scif_BrainSlug2.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/scif_BrainSlug2.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,1 @@ -brainslug +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/scif_swDarthvader.cfg --- a/share/hedgewars/Data/Names/scif_swDarthvader.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/scif_swDarthvader.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,1 @@ -generic +scif_swDarthvader diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/scif_swDarthvader.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/scif_swDarthvader.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,76 @@ +Assault Chief +Asthmatic +Black Beauty +Black Boss +Black Chief +Black Hat +Black Helmet +Black King +Black Leader +Black Queen +Boss +Captain John +Captain Albert +Chief Master +Commandeer +Council Chief +Dark +Dark Fader +Dark Lord +Darkness +Dark One +Dark Vapor +Darth Dan +Darth Hog +Darth Invader +Darthly +Dr Dark +Dr Darth +Dreamcrusher +Emperor +Empress +Galactic Emperor +High Command +Laser Swordsmaster +Lord Black +Lord Darkness +Lord Darth +Lord Helmet +Lord Hog +Lord Nightmare +Master +Master Chief +Master of Galaxy +Overlord +Overmind +Protector +Regina +Sith Lord +Space King +Space Lord +Space Ruler +Top Hog +Top Leader +Vaporizer +Darth Card +Darth Dis +Darth Xein +Darth Qydd +Darth Nuiph +Darth Scizzeth +Darth Trelfi +Darth Scael +Darth Vox +Darth Zat +Darth Kihl +Darth Prorn +Darth Bruyt +Darth Gluekru +Darth Attok +Darth Hater +Darth Bone +Darth Dawn +Darth Hes +Darth Verd +Darth Kir +Darth Vapor diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/scif_swStormtrooper.cfg --- a/share/hedgewars/Data/Names/scif_swStormtrooper.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/scif_swStormtrooper.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,1 +1,1 @@ -generic +scif_swStormtrooper diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/scif_swStormtrooper.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/scif_swStormtrooper.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,42 @@ +Stormtrooper +Wormstooper +Soldier +Infanterist +Rank +Combatant +Senner +Trooper +White Guard +White Helmet +Guard +Space Hog +Plastic Suit +Grunt +Space Grunt +Scooper +Runner +Loader +Lasergunner +Gunner +Hogface +Battlecrusher +Ground Pounder +Infantryhog +Foot Soldier +Laser Fighter +Laser Grunt +Laser Swordshog +Phase Gunner +Combat Unit +Invader +Darth’s Minion +Assault +Raider +Reese +Cantrell +Assault Trooper +Glover +Ortega +Mighty +Aurora +White Fighter \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/sf_chunli.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/sf_chunli.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/sf_ryu.cfg --- a/share/hedgewars/Data/Names/sf_ryu.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/sm_daisy.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/sm_daisy.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/sm_peach.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/sm_peach.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/tf_demoman.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/tf_demoman.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,2 @@ +generic +war diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/tf_scout.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/tf_scout.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,2 @@ +generic +war diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/thug.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/thug.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,2 @@ +bandit +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/thugclean.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/thugclean.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,2 @@ +bandit +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/tiara.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/tiara.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/touhou_remelia.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/touhou_remelia.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/touhou_yukari.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/touhou_yukari.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +female diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/types.ini --- a/share/hedgewars/Data/Names/types.ini Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/types.ini Sun Dec 17 00:09:24 2017 +0100 @@ -1,4 +1,339 @@ +Hedgehogs of Death +Beginners +Rookies +Young Ones +Hog Army +Doom Brigade +Death Brigade +Meatbags +Ploud +Fighters +Doom +Death +Killers +Moneymakers +Sheepers +Badgers +Bonebreakers +Pure Team +Good Team +Evil Team +Mad and Armed +Bad and Mad +Hogs of War +Spikes of War +Hogera Fighters +Hog Group +Weapon +Melon Fans +Ball Cannoneers +Generals +Team Spike +Team Hedgehog +Team Hedge +Team Hog +Team Nature +Team Cheese +Team Birdy +Team Cake +Team Hell +Team Snow +Team Underwater +Banana Phone +Melon Sheep +Bedbugs +Sleepers +Hurt You Plenty +Guns and Bombs +Leggers +Spikers +Rollers +Rolling Spikes +No Cowards +Ownage Group +Pro Army +Army of Eight +8-Ball +Crazy Hogs +Crazypants +Time to Die +Splinterers +Fragmentation +Clusterers +Frackers +Ultrahard +Superstrong +Megafast +Hypersmart +Superteam +Ultrateam +Terror Team +Mega +Gigantic +Fun Time +Nothing to Laugh +Ironic Iron Fists +Agency of Pain +Hunterkillers +Brigade +Soldiers +Spiked Doom +Number One +The Best +The Test +Skill +Little Nation +Hedgehogland +Hedgewarriors +Behind the Hedge +Hibernation +Winter +Nature's Eight +Four Plus Four +100 Points +Sniperkillers +Sweet Revenge +Nasty Team +Final Frontier +First Frontier +1st Infantery +Battalion X +Loonatics +Eight Hedgehog Army +Army +Hedges and Hogs +Funtime is Over +No More Mr Nice Hog +Double Trouble +Iconic Shopping Mall +Railroad to Hell +Elevator to Heaven +Challengers +Champs +Chumps +Friends +Sorrow Team +Victory +Victors +Rulers of Hogera +Planet Hedgehog +Grassy Grass Group +Crazy Grass +Naughty Hunters +Mighty Fighers +Fighters +The Hogs +Evil Overlords +Delayed Empire +No Time +One Shot Kill +Plop +Not Sorry +Ironic Hogs +Mammals of Terror +Hedgehogs, Inc. +Nasty Terrorists +Lawful Evil +True Neutral +Evil Good +Good Evil +Evil 8 +Good 8 +Overlords +Underlings +Endurance +Hogera +Goldshine +Sunshine +Nightmare +Sunset +Dawnhunters +Twilight Zone +Self-Defense +Egoists +Horror +Absurd +Jelly Beans +Mountain Rangers +Nature's Gift +Nature's Revenge +Pain or Pleasure +The Second Attempt +Seduction +Red Arrow +Yellow Spikes +Blue Sea +Silver Feet +Bronze Nose +Copper Ears +Tree +Nest +Bush +Shrub +Poor Fellows +Unlucky Sorrow +Lucky +Masters of Technology +Perfect Accuracy +H.O.G. +Gears of Hedge +Sheep Lovers +Melon Munchers +Melons of Doom +Hellgrenadiers +Grenadiers +Bazooka Skill +Explosion +Kaboom +Sproing +Bounce Around +Steel Rubber +Rubber Spikes +Hurt +Ouchies +Final Try +Angry Rage +Evil Horde +Locust Horde +Minions +Council +Hog Nation +Hog Republic +Dark Side +Bright Side +Side B +Rewind +Underbush +Perfect Podzol +Dirty Dirt +Grassy Grass +Grassmunchers +Munchers +Eternal Victory +Frontier +Seventh Frontier +Rubber Duck Force +The Pink Horde +Pink Brains +Rollup +Lots of Lemonade +United Guard +Alliance +Unity +Glorious +Fabulous +Impressive +Awesome +Great +Unbelievable +The Unbelievables +The Astounding +Trajectory +Fatal Water Push +Mudballs +Mudballs of Doom +Final Shot +Gun and Rifle +Watermelons +Fools +The Absolute +Silence +Flatline +Sneak +Alliance of Good +Good Hunters +Lawless Chaos +Total Annihilation +Complete Destruction +Crazy Cannon +Silver Lining +Golden Team +Black Sleep +Sentient Beings +Existance +High Horse +Elite +Avantgarde +Guard of Hope +Guards +Pink Poison +Health Loss +Part-Time Soldiers +Goldsilver +Drill Strike +Pianists +Dominant Strategy +Dominators +Poisonous Team +Poison Killers +Blowtorch +Blown Up +Shotgun! +Butter Spread +Brakefast +Blast +Neutralizers +Killing You Softly +##### +NoHat +##### Clowns +Humour +Humor +Funny Team +Why So Serious? +Flying Circus +Hoggy’s Circus +Funface +Ponty Mython +Circus Hog +Circus Frog +Circus Hedge +Circus Boom +Hedgehog Circus +Clown Brigade +Fun +Just For Fun +Kill For Fun +The Final Joke +Nothing To Laugh +Fun Over +Clowns of Doom +Clowns of Death +Danger Clowns +Jokers +Mad Hedgehogs +Woogliedumps +Hoogiehogs +Pootiewoopsies +Moogleswoshes +Woopsiedoops +Dimper Drainers +Finker Framers +Clickers +Circus +Comedy +Explosive Laughter +Laughingstock +Amusement +Applause Lamp +Funny +Ha-ha! +Laugh or Die +Forced Smile +Smiley Faces +Outlaughed +Boing +Boom +Sproing +Zoink +Pling +Whoosh +Ironic Irony +Sarcasm +Sad Clowns +Balloons +Smiley ##### clown clown-copper @@ -11,47 +346,516 @@ WhySoSerious ##### Fruit +Juiceland +Juice +Fruitland +True Fruit +We Shoot Back +Hogera Juice Factory +Fruit Planet +Sentient Fruit +Angry Fruit +Mad Fruit +Toxic Fruit +Tutti Frutti +Hogs with Hats +Not Veggies +Nanaland +Orange Apples +Lime Lemons +Green Bananas +Red Apples +Greenhorns +Gone Bad +Foul Fruit +Danger Fruit +Fruity +Fruitheads +Fruit Alliance +Apple-Banana Alliance +Lemon-Orange Group +Apple Alliance +Banana Bandits +Lemonheads +Apples and Oranges +Lemons and Bananas +Red Yellow Orange +Fruity Hogs +Fruity Fruit +Killer Fruit ##### fr_apple fr_banana fr_lemon fr_orange ##### -Indians +Amerindians +Howlers +Feather Tribe +Feather Fever Apache +Natives +Indus +America +Hawks +Birdy Tribe +Bird’s Call +Desert Eagles +Team Tipi +Hunter Tribe +Chief Council +Feathered Hats +Eagle Tribe +Team Hide +Hunt and Trap +Bear Clan +Eastern Alliance +Savannah Keepers +Desert Tribe +Tribehogs +Tribe +Eagle Eyes +White Eagles +Red Bears +Cactus Point +Bear Bearers +Black Eagles +Desertlanders +Soutern Tribe +Northlanders +Westbears +The Porcupines +Feather Clan +Funnyval +Middleland +Andes Tribus +Ash Warriors +Pure Bear Caste +Small Hunt Kin +Boulder Horde +Stalker Tribe +Oracle Tribe +Rage Tribe +Blind Bizon Clan +Ancestor Children +Hidden Warriors +Hidden Children +White Horde +Bright Heaven +Angry Hand Tribe +Phoenix +Raven Tribe +Dark Demon Tribe +Owl Tribe +Wolf Clan +Dragon Warriors +Ember Clan +Hell’s Fury +Ancestor Kin +Clan of Elders +Scorpion Children +Quiet Lion Tribe +Broken Scars +Cold Moon +Lightning Children +Blood Brothers +Paw Horde +Thunder Claps +Small Lion Clan +The Loyals +Loyality +Locals +Dark Ghosts ##### IndianChief ##### Pirates +Black Sea +Black Pearl +Skull of Death +Searobbers +Hedgehogs of the Sea +Hoggebean +Plankers +Old St. Mary +Doom Pirates +Water Curse +Jack’s Pirates +Rough Sea +Sword and Saber +Treasure Takers +Shipwreckers +Money Blenders +Gold Hunters +Take and Run +Chasers +Navy’s Doom +Seven Seas +Jolly Roger +Arr! +Scurvy Dogs +Curvy Hogs +Ocean Danger +Ship Raiders +Ocean Raiders +Black Spot +Black Curse +Skulls and Bone +Hoggy Joller +Crimson Pirates +Black Pirates +Cursed Pirates +Sabertooth +Anger of the Shark +Angry Murderers +Angry Raiders +Awful Corsair +Awful Manta +Bloody Death +Bloody Fall +Buccaneer’s Death +Buccaneer’s Plague +Calypso +Broken Compass +Coral Fear +Creepy Coral +Cruel Barnacle +Cruel Kill +Cruel Raiders +Cruelty of the Eel +Cruel Hedgehogs +Cruelty +Cry of the Ocean +Cry of Cthulhu +Cursed Death +The Damned +Dark Treasure +Davy Jones’ Locker +Death of the Eel +Decietful Strumpet +Cutlass +Horror +Damnation +Dirty Killers +Dirty Pirates +Disgraceful +Dishonorable +Doom of Tortuga +Dragon’s Skull +Evil Eel +Evil Fall +Evil Hate +Evil Sword +Foul Anger +Foul Gold +Foul Secret +Golden Deciet +Golden Treasure +Greed of the Sea +Hades’ Death +Hades’ Doom +Hades’ Greed +Hades’ Raider +Hades’ Servant +Hateful +Hate of the Knave +Hell-born +Hellish Pirates +Horrible Anger +Horrible Death +Horrible Killers +Plunderers +Horrible Poison +Horrible Rage +Horrible Shark +Horrid Barnacle +Horrid Corsair +Horrid Whore +Howling Strumpet +Howling Pirates +Killer’s Cry +Weird Wolf +Madness of Hell +Morbid Dream +Morbid Greed +Morbid Mermaid +Morbid Pearl +Morbid Plague +Morbid Scream +Death +Doom +Howl +Knave +Murder Mystery +Murderer’s Scream +Neptune’s Grail +Neptune’s Slaves +Night Blades +Night’s Horror +Ocean’s Fear +Ocean’s Madness +Ocean’s Murderer +Ocean’s Serpent +Poison Death +Poison Pearl +Posideon’s Anger +Posideon’s Gold +Posideon’s Raiders +Pride of Atlantis +Pride of Hades +Pride of the Shark +Privateer’s Serpent +Privateer’s Slave +Rage of the East +Rage of the Knave +Rage of the North +Red Gold +Red Grail +Satan’s Barnacle +Satan’s Gold +Satan’s Horror +Satan’s Nightmare +Satan’s Poison +Satan’s Sadness +Satan’s Storm +Scream of Tortuga +Scurvy Murder +Sea’s Disgrace +Sea’s Hoard +Sea’s Mermaid +Sea’s Plague +Eerie Eels +Shameful Wolves +Vicious Murderers +Wandering Curse +Wandering Disgrace +Wandering Raiders +Barnicles +Buccaneers +Black Bandanas +Black Sails +Black Skulls +Black Tooth Grins +Blackbeards +Bloody Bandits +Broken Bandits +Broken Bones +Cannon Balls +Cannonball Bandits +Crazy Eyes +Cutlasses +Dividers +Drifters +Driftwood Divers +Eternal Smiles +Filibusters +Fishguts +Flintlocks +Floaters +Golden Guns +Grand Cannoneers +High ’n’ Dry +Hired Guns +Hired Swords +Hydras +Keel Haulers +Landlocked +Lost Souls +Mad Marauders +Nautical Navigators +Ocean Shadows +Ocean Wanderers +Odd Jobs +Peg Legs +Peglegs +Pelicans +Pieces of Eight +Plagued Pillagers +Plank Walkers +Plunderers +Pillagers +Rattails +Red Raiders +Red Sails +Red Scarfs +Rustlers +Salty Dogs +Swabbers +Sea Angels +Sea Devils +Sea Dogs +Sea Foxes +Sea Monsters +Sea Sharks +Sea Terrors +Sea Wolves +Sea Hogs +Seagulls +Shellbacks +Silver Eyes +Silver Sailors +Silver Swords +Siren’s Song +Sirens +Skull & Crossbones +Hogs of the Sea +South Sea Sailors +Squids +Stray Dogs +Talking Parrots +Thirsty Thieves +Thunder Waves +Water Walkers +Wild Windjammers ##### pirate_jack +pirate_jack pirate_jack_bandana +pirate_jack_bandana +pirate_eyepatch ##### Bandits Gangsters +Gangstas +Gangsta Life +Robbers +Hell’s Hogs +Thug Life +Ocean’s Eight Thieves +Burglars +Criminals +Crime Squad +Squatters +Outlaws +Master Thieves +Guild of Thieves +Takers +Snatchers +Thugs +Crime +Little Mafia +Mafiosi +Crime Gang +Hedgehog Gang +Gang of Eight +Gang +Yellow Fang +Ravenclaw Band +Raven Riders +Flame Pistols +Seals +Azure Skulls +Copper Skeletons +The Abandoned +United Front +The Invisibles +The Nameless +Lawless +Chaotic Evil +Chaos +Destruction ##### Bandit ##### Futuristic Possessed Parasites +Ouchies +Victims +Accidents +Labhogs +Suckers +Controlled +Mindless +Brainiacs +Monsterhead +Brainslugged +Slugs and Shotguns +Nohead +Brainers +Symbiosis +Third Eye +Little Monsters +Over your Head +Slugs of Death ##### scif_BrainSlug scif_BrainSlug2 scif_BrainSlug2 ##### Bunnies +Rabbits +Easterhogs +Bad Disguise +My Little Zoo +Happy Easter +Bunnyhogs +Hedgebunnies +Team Carrot +Team Bunny +Bunny Around +Bunny Jumpers +Bunny Hoppers +Hoppers +Bunny Hill +Funny Bunnies +Fun Bun +Imitators +Cute and Deadly +Bunhogs +Grassy Fields +Fresh Grass +Fake Ears ##### zoo_Bunny ##### +Investigators Detectives +Cowboys +Western +Go West +Wild West +Wildest West +Hogtown +Gunslingers +Revolver Heroes +Western Heroes +Goodguys +Goodhogs +Cowboy Party +Yee-Haw! +Team West +Crime Hunters +Magnifier +Look-Look +Cowboy Hats +Lucky Eight ##### Cowboy ##### Monarchy Kingdom +Dynasty +Empire Royal +Royale +Royalty +High House +Hedgehog Kingdom +Majesty Team +The Crown +Holy Empire +Hedgehog Empire +The Quest +Royal Guard +Kingly Guard +Crown Team +Crowners +Tories +Loyality +Club of Kings +Before the King ##### crown royalguard @@ -61,12 +865,61 @@ ##### Ninja The Ninja +The Way of H +Shaolin +Hedgehog Clan +Spikes of Honor +Honor +Silent Death +Red Spider Clan +White Bird +Assasins +Team Black +Team Ninja +Rope Masters +Ninja Ropers +Pro-Ropers +Proper Ropers +Propers +Rope Masters +Rope Swingers +Rope Swinger Club +Rope-Knockers +Rope Paper Scissors +Sneaky +Blacksuits ##### NinjaFull NinjaStraight NinjaTriangle ##### Metal +Heavy +Heavy Metal +Black Metal Hedgehogs +Hog Metal +Rock’n’Roll’n’Die +Rock’n’Roll +Roll +Kiss Me! +Rock Hard +Death Metal +Death Rock +Deadly Music +Dark Faces +Dark Doom +Fists of Destiny +Hardcore +Danger Zone +Loudness +Dark +Dark Dark Dark +The Darkest +Dark Hogs +Dark Metal +Black Metal +Maniacs +Black Lords ##### kiss_criss kiss_frehley @@ -74,20 +927,160 @@ kiss_stanley ##### Wizzards +Wizards +Wizard School +Magicians +Magic School +Hedgehogwarts +Enchanters +Magic +Apprentices +Master School +School of Fire +School of Ice +School of Earth +School of Air +Airplane Summoners +Magic Melons +Enchanted Hogs +Tricksters +Magic Bullet Team +Blue Star +Sorcerers +Keepers of Magic +Magic Flow ##### WizardHat ##### StarHogs +Starhogs +Imperial Army +Darth Invaders +Invaders +Empire +Space Empire +Hogerian Empire +Space Army +Black and White +Space Guardians +Dark Forces +The Force +Darth’s Infantry +Space Infantry +Infantry X-54 +Imperialists +Star Gazers +Planet Exploders +Star Rushers +Space Invaders +Assault Troop +Darth’s Troop +Combat Units +Death Star +Galaxy +Galactic Empire +Frontier +Inferno Military +Ebon Force +Plague Squadron +Colonial Space Force +Thunder Flotilla +Neo Squadron +Space Corps +Overlord Navy +Space Navy +Fury Space Force +Zion Division +Star Forces +Fusillade Flotilla +Primal Fleet +Scourge Flotilla +Star Division +Judgment Corps +Supernova Service +Champion Navy +Pinnacle Space Navy +Abyss Force +Federation Armada +Immolation Armada +Attack Force +Daemon Defense +Prime Force +Dread Division +Defense Force +Assassination Corps +Guerrilla Force +Neo Armada +Raven Corps +Horde Space Force +Mayhem Navy +August Armada +Dread Space Force +Prophecy Flotilla +Attack Force +Martyr Space Corps +Federation Squadron +Immortal Corps +Rogue Space Corps +Ethereal Navy +Star League +Grand Navy +Sinner Armada +Prime Corps +Wreckage Forces +Demon Service +Astral Space Corps +Execution Force +Eos Defense Force +Royal Squadron +Bane Division ##### scif_swDarthvader scif_swStormtrooper scif_swStormtrooper ##### Hogtrix +Digital +The Coolest +Coolest Hogs +Megacool +Coolio +Cool +Awesome +The Bestest +Ego Boosters +Black Glasses +Uber +Great +Splendid +Ego-Trip +Inside +Club Cool +Hip ##### Sunglasses ##### Hog Fighters +Hedge Fighters +Fighter Clan +Combat Team +Melee Attack +Attackers +Combateers +Fistpunchers +Shoryuken! +Fists of Fire +Whippers +Team Fist +Team Melee +Team Ouch +Oucherers +Punchers +Punchline +Your Doom +The Clan +Take This +Revenge ##### sf_balrog sf_blanka @@ -100,6 +1093,26 @@ sf_vega ##### Mushroom Kingdom +Sarasaland +Birabuto Kingdom +Muda Kingdom +Easton Kingdom +Chai Kingdom +Golden Coins +Coingrabbers +Goombastompers +Stompers +Jumpers +Runners +Jump and Run +Hit, jump and run +Hit’n’Run +Hedgehogland +Mushroom Clan +Kingdom’s Army +Malupe +Daisy and Friends +Turtle Tramplers ##### sm_mario sm_luigi @@ -109,16 +1122,96 @@ sm_wario ##### Honor +Sunrise +Red Sun Clan +Better than Ninjas +Samurai +The First Samurai +Samurai Army +Samurai Alliance +Team Honor +Sunset +Rising Sun +Setting Sun +Team Sun +Red Sun +Yellow Sun +White Sun +Fight with Honor +Honorfighters +Final Samurai +Orient Defense +Expedition Corps +Emperor’s Finest +Emperor’s Chosen +The Chosen +Risers +Swordfighters ##### Samurai ##### Straw +Last Straw Brigade +Last Straw +Peasants +Nice Rice +Poor’s Peasants +Peanuts +Collectors +Workers +Outnumberers +Cool Hats +Worker Group +Rice Peasants +Menials +Workforce +Mad Hats +Strawgunners +Burning Grass +Hot Wheat +Mad as Fire +Pitchfork +Farmers ##### StrawHat StrawHatEyes StrawHatFacial ##### Rainbow +Hairy +Hairy Hedgehogs +Hair Heirs +Hairhogs +8 Colors +Colors of Doom +Colorful +Crazy Colored Hogs +Rainbow +Danger Colors +Red Green Blue +All Colors +Color World +Hairy Situation +Hairspray +Sprayers +Hairbombers +Ballers +Hairers +Haired Angry +Heads +Salloon +Sailor Sun +Barber's +Snip-snap +Scissors +Brass Head +Fashion +Fantasy +Hair Group +Color Group +Danger Group +Colors of Victory +United Colors ##### hair_green hair_blue @@ -129,10 +1222,75 @@ hair_grey ##### Pride +The Best +The Best of the Best +The Bestest +Better than You +Proudness +We Own All +Ownage +Team Boss +Ancient Rome +Caesar’s Pets +Rich and Dangerous +Everwinners +Awesome +Magnificent +Most Magnificent +Superlative +Splendid +Gorgeous +Rich +Classic +Bay Leaf +Laurel +Glorious +Brilliant +Great +Tremendous +Ultra +Hyper +Superb +Hundred Percent +Wholesome +Balance +Always Win +Zerofail +Perfect +Pros +Infinity +Don’t Lose +Neverfail +Pro Team +The Great +Greatness +Team Great +Twenty-Twenty ##### laurel ##### Green Hill +Hedgehog Hill +Hogera Group +Green Group +The Green Ones +Fast +Lightspeed +Faster than Light +Supersonic +Speed +Ultraspeed +Hyperspeed +Superspeed +Fast and Angry +Runners +Shoot and Run +Quickers +Fasteners +Speeders +Deathrunners +Speedrun +Sonic Speed ##### sth_Amy sth_AmyClassic @@ -145,6 +1303,43 @@ sth_Tails ##### Pocket Pros +Hogimon +Hedgemon +Minimon +Battlemon +Mutation +Hogmonsters +Weird Mutants +Lab Accidents +Catchies +Pokehogs +Gottacatch +Collectees +Pocket Zoo +Battle Pros +Hanto +Little Monsters +Minimon +Cuties +Team Spaceship +Team Pocket +Together +Monsters United +Small Danger +Pocket Hedgehogs +Hogballs +Hog Center +Hanto +Lavender Village +Pallet City +Victory Street +Gang of Eight +Gonna Frag Em All +Weird Monsters +Scary Creatures +Digihogs +Sentient Beings +Nerd Costume Party ##### poke_ash poke_charmander @@ -159,17 +1354,1255 @@ poke_voltorb ##### Vikings +Thor’s Team +Thor’s Selected +Centurio +Valhalla +Norsehogs +Seafearers +Red Rune +Skal +Viking +Strobo +Hun +Nordic Lights +Sword and Shield +Round Shield +Galley +Blue Bottle +Love of Sea +Water Clan +Hogs of War +Proud Warriors +Helmet Pride +Ancient Curse +Northern Tribe +Westwind +Ocean Pride ##### Viking ##### Guardian Angels +Angels +Heaven Guards +Heaven +Holy Spirits +Holy Nation +Godsent +Blessed +Holier Than Thou +The Holiest +Hogs From Heaven +Holy Hedgehogs +Saints +Divine Grace +Sacrament +Canon +Holy Spirit +Heavenly Justice +Righteous Wrath +Upright +Holy +Blessed Souls +Pure Souls +Church of Grass +Church of Hoglogy +Scientific Dogma +Church Bell +Cult +Cult of X +Inner Circle +Greater Circle +True Cult +True Dogma +True Spirit +Holy Hogs +Council of Holy +Our Holyness +Our Mother of Life +Mother Nature +Belief +The Selected +Chosen Ones +Eternal +Infinity +Great White Hedgehog +Rebirth +Holy Shine +Halo +Nimbus +Gloriole +Glory +Spiritual +Dogma +Seen the Light +Immortal Cult +The Idea +Holy Cult of Chaos +Holy Destruction +Church of Bazooka +Cult of the Bomb +Holy Scripture +True Religion +Prophets +Our dear Mother +Our dear Father +Scripture Squadron +Goldshine +Good +Paragons +Heroes +Shining +Shiny +Protected +Elite +Prophecy +Angels of Evil +Wicked Angels +Good Angels +Angels of the North +Angels of the Sky +Angels of Might +Angels of Power +Angels of Guns +Holy Watermelons +Holy Dynamite +Holy Bazookas +Holy Grenades +Holy Hunters +Holy Warriors +Warrior Angels +Angel Army +Angel Troop +Angel Team +Holy Wrath +Heavenly Defense +Heaven Forces +Heavenly +Heaven +Afterlife +Revival +Resurrection ##### angel ##### Snipers Sniper Team +Headhunters +Hedgehunters +Hithogs +One Shot One Kill +Silent Killers +Murderers +Sniper Clan +Pro Snipers +0 Misses +Perfect Accuracy +Bull’s Eye Snipers +Nice to Hit You +Hitters +Nerves +Aim +Perfect Aim +Heads-on +Ranger Danger +Rifle Slingers +Gun Nuts +Ammo Alliance +Quiet War +Headshot +Critical Hit +Always Hit +Perfection +Silent Death +Sneaky Snipers +Raging Rangers +Bullseye +Special Tactics +Special Forces ##### Sniper anzac +##### +Crazy +Weird +Fools +Weirdos +Freak Show +Freaks +Strange Folks +The Weird Ones +Badmad +Something Awful +Really Strange +Strange +Uncomfortable +Unnatural +Failures +Weird Pride +Freak Brigade +Freak Army +Freak Gang +Funny Gang +The Others +Uncommons +Unreal +Surreal +Everything but Normal +Not Normal +Anti-Normal +Unnormal +Gnarl +Mutated Hat Bearers +Angry Weirdos +Wild and Weierd +Weird Killers +Kill Kill Kill +Gang of Eight +Stutter +Hheeddggeehhooggss +Differnt +Dislexiks +Failures +Wrong +Fail +Mistake +Mistaken +Terrible Accident +Horrible Failure +Realm of Chaos +Entropy +Silly Team +Absurd Victory +Absurdity +Incorrect +Abyss +Chaos +Chaotica +##### +lamp +zoo_elephant +car +cyclops +Disguise +dish_Ladle +dish_SauceBoatSilver +dish_Teacup +dish_Teapot +eastertop +Laminaria +mechanicaltoy +Sleepwalker +ShaggyYeti +fr_tomato +InfernalHorns +bubble +Plunger +##### +Rich +Richest +Millionair’s Club +Billionair’s Club +Moneykeepers +Dollarbills +Euros +Dollar Eyes +Need More Money +Money Money Money +Ka-Tsching! +Monkeymakers +Business Suits +Business Lobby +Business As Usual +Businesshogs +Cash Grabbers +Grasshoppers +Noble +Team Money +Team Cash +Capitalist Union +More Money +Bank of Rich +Bankhogs +Upper Class +Top Class +The Wealthy +Wealth Club +Exclusive Club +Club Hoggerberger +Club Igelberg +The Hoglantic Bridge +Club of Clubs +Club of Hogera +Secret Society +Hotel de Hog +Clié +Exclusive +V.I.P. +Very Important Hedgehogs +Greed +Good +Better +High Society +Club +Fortune +Hog Hotel +##### +pinksunhat +pinksunhat +tophats +tophats +beefeater +beefeaterhat +Moustache +Moustache_glasses +tiara +tiara +Elvis +Elvis +touhou_marisa +touhou_marisa +touhou_remelia +touhou_remelia +touhou_yukari +touhou_yukari +##### +Builders +Construction Yard +Construction Workers +Constructors +Construction +Girder +Steel +Rebar +Hard Workers +Builder Guild +Girder Group +Engineers +Technicians +Girder and Rubber +Hardhats +Miners +Mine Workers +Construct and Destruct +Deconstructors +Crazy Builders +Team Cement +Team Girder +Team Construction +Team Rubber +Team Steel +Build And Defend +Fortress Builders +Fortress Team +##### +constructor +##### +Cyclops +Eye Land +Eye Nation +8 Eyes +See you later +Lookers +Pinkies +Eye Can See You +Eyeballers +Ballers +Oneeyed +One Times Eight +Eight +Nightshadows +Seers +Mythos +Cave Protectors +Cave Tribe +Labyrinth +Protectors +Eyes of Power +Team Destiny +Depth Perplexion +Outweird +Balls +Outcasts +##### +cyclops +##### +Hiders +The Hidden +Scared Team +Team Hidden +The Hidden Group +Terror Team +Gerila Grup +Guerillia +Frightened Fighers +Frighteners +Snipers +Secret Snipers +Sneaky +Never Seen +Secret +Disguised +Silent Death +Behind +The Furthest +Secret +Undercover +Covert Ops +Tall Grass +Tacticians +Grassbox +Sokoban +Fake Crates +Fake +Invisible +Hidden +Barrel Hiders +Bush Hiders +Crate Hiders +Hiders +Cowards +##### +bushhider +bushhider +cratehider +barrelhider +##### +Restaurant +Restaurant Team +Kitchen Khaos +Kitchen Chaos +The Kitchen +Chaotic Kitchen +Cleaver Throwers +Chefs +Cooks +Too Many Cooks +Yummyland +Kitchen Klan +Knifers +Danger Restaurant +Meal Makers +Diner Dash +Dinner +Tastes Good +Five Stars +Great Cooks +Eat this! +Broke Eats +Tasty +Delicious +Munchers +Fight for Food +Food Fighters +Soup Kitchen +Soup Salters +Salt Salsa +Spaghetti Toast +Jar Noodles +Instant Doodle +Rice Butter +Peanut Sausage +The Final Toast +Glassbreakers +Silver Tablet +Salt and Pepper +Pepper Throwers +Cleaver Clan +Dine and Mine +Death for Dinner +Tastes Like Hedgehog +Tastebuds +Cooks of Death +Cooks of Doom +Doom Kitchen +Death Servers +Killer Kitchen +Knife +Jurassic Pork +Jurassic Fork +Culinaries +Kitchen Raiders +##### +chef +##### +Techno +Cyborgs +Cybernetic Empire +Computerworld +Technic Freaks +Deckers +Team Technic +Team Cyborg +The Cyborgs +A.I. +Electronic Empire +Electro +Cybernetic Overloads +Terminal +Console +Computer +CPU +Artificial Minds +Robots +Overmind +Robotic +Robo Team +Team Robo +Team Computer +Does Not Compute +Error +Critical Failure +Shutdown +Gray Goo +System +No Resistance +Power +Bits +Bytes +Data +Transfer +Connection +Disconnect +Plus Plus +Null +Nil +Undefined +Artificial Hogs +Hogs of Steel +Iron Fist +Ironheads +Steelheads +Bionic +Enhancement +Advance +Wired +Port +Robo +File +##### +cyborg1 +cyborg1 +cyborg1 +cyborg1 +cyborg2 +##### +Youth +Young +Just For Fun +Young +Music Lovers +Sing Along +Happy +Fun +Funny ++1 +Funny Fighters +Interwebs +Web Surfers +Junior +Like Us +Summer Life +Yeah! +Smile +Music Life +Listen +Opus +Hipsters +Hipster Hogs +Hip Hogs +Like us! +Share +Music Nerds +Hogster +Hip-Hop-Hurrah! +Music Ears +Surfers +Cool +Nice +Well +Caps On +##### +mp3 +mp3 +mp3 +mp3 +mp3 +cap_junior +cap_red +cap_blue +cap_yellow +cap_green +##### +Domination +Terror Team +Bazooka Army +Shotgun Army +Infantery +Helmets +Spearheads +Spearhead Nation +Spearland +Gunland +Warland +Big Army +Boom Nation +Grenade Nation +Nadeland +Trenchies +Trenchheads +Invaders +World Masters +Bazookaland +Wartorn +Shotgun Nation +Grenade Republic +World Warriors +Krawonia +True Soldiers +Hedgehog Country +##### +war_germanww1helmet2 +war_germanww1tankhelm +war_germanww2medic +war_germanww2pith +war_trenchgrenadier1 +war_trenchgrenadier2 +war_trenchgrenadier3 +war_airwarden02 +##### +Helmets +Hogs with Helmets +Dominators +Overlords +Gray Army +Cluster Army +Warheads +Battallion +Sheep Bombers +Sheepland +Divide and Conquer +Clusterland +Cluster Nation +Bombers +Exploders +Explosion +War Zone +Fraggers +Fragmentation +Sheepkeepers +Secret Soldiers +##### +war_frenchww1helmet +war_frenchww1gasmask +war_trenchfrench01 +war_trenchfrench02 +##### +Piece Makers +United Team +United Nationalists +Blue Army +Blue Sky Team +Fake Peace +Peace Army +Peaceful Warriors +United Unit +Special Tactics +For Good +Blue Infantery +Blue Soldiers +Justification +Mandate +United We Stand +United +Troop of Good +Bluetroopers +Blue Helmets +Team Blue +Tactial Troop +Underminers +Blueland +Azure Nation +Peace Force +War and Peace +War for Peace +Ocean Force +Special Force +##### +war_UNPeacekeeper01 +war_UNPeacekeeper01 +war_UNPeacekeeper02 +##### +Desert Storm +Desert Troop +Sahel +Savanna +Desert +Dry Water +Dehydration +Blue Gold +Survialists +Sandland +Sand Nation +Sun Nation +Syliciastan +Sand Army +Desert Army +Desertland +Desert Planet +Desert Defenders +Sandgunners +Deathland +Death Nation +Hot Nation +Gnuland +Molotov Land +Sand Zone +Hot Zone +Extreme Conditions +Condition Zero +Terror Team +Plan A +X-Team +S-Team +##### +war_desertgrenadier1 +war_desertgrenadier2 +war_desertgrenadier4 +war_desertgrenadier5 +war_desertmedic +war_desertofficer +war_desertsapper1 +war_desertsapper2 +war_plainpith +##### +Hoppers +Airstrike +Strike +Airland +Hogland +Hedgeland +Hedgehog Nation +Best Nation +Royal Army +Royal Troop +Expedition Corps +Queenland +Kingland +Medicine Nation +Sap Nation +Farland +Tories +Wardens +Queen’s Pride +Artillery +War Heads +Above +Air Wardens +##### +war_airwarden02 +war_airwarden03 +war_britmedic +war_britpthhelmet +war_britsapper +war_trenchgrenadier1 +##### +Comrades +Red Star +Commune +Communal +State Lovers +Motherland +Ushanka +Red Nation +Soviet +Council +The Party +Winter +Hogistan +Best Nation +Hogerian Empire +Hogeric Army +Red Star Army +Great Nation +Snow Land +Army of Cold +Group of Comrades +Vowed Partners +Together Team +Ice Empire +Ice Bears +The Collective +Prosper +The Iron Curtain +##### +NoHat +ushanka +war_sovietcomrade1 +war_sovietcomrade2 +##### +Police +The Police +Law and Order +The Law +State’s Fist +State’s Finest +Crime Fighters +Team Good +Jailers +Bluehats +Security +Night Guard +Keeping You Safe +Safekeepers +Anti-Crime +Good-Doers +State Power +Authority +State Authority +Better Than You +Lawful Good +Lawkeepers +Executive +Police Hogs +##### +policecap +policecap +policecap +policecap +policegirl +##### +Knights +King’s Army +King Quest +Quest +Shield +Sight +Visor +Vizor +Fighters +Hogs on Horses +Team Horse +Chess Pieces +Riders +Knight Riders +Swordfighters +Ridererers +Medieval +Dark Ages +Darkest Age +Dark Lords +The Dark Ones +Shiny Armor +Silver Knights +Dragonslayers +Team Dragon +The Wolf +The Rat +The Hog +The Pig +The Dragon +Alliance +Winter Knights +Summer Knights +##### +knight +##### +Evil +Straight from Hell +Hell +Hell’s Gate +The 7th Gate +9th Circle of Hell +8th Circle of Hell +Hell’s Circle +The Red Circle +Horns +Team Evil +Badmad +Red and Bad +Bad +Superevil +Megaevil +Ultraevil +Bad-Doers +The Nether +The Red Ones +Soul Eaters +Soul Hunters +Team 666 +666th Infantery +Final Circle +Inner Circle +Pure Evil +Hounds of Hell +Hogs of Hell +Dark Lord’s Army +Clan of the Beast +Beasties +Beastie Hogs +Necron +Hades +Ghost +Null +Zion +Venom +Nite +Terror +Chrome +Virus +Collapse +Stigma +Harm +Swarm +Nano +Blaze +Serpent +Flock +Libra +Rise +Echo +Furor +Shock +Parallel +Avalon +Judgment Force +Blight Posse +Force of Odium +Blaze Brigade +Ghost Brotherhood +Toxin Brigade +Order of Onyx +Clan of Steel +Devil Tribe +Shock Squad +Assembly of Blight +Clan of the Shade +Posse of Ash +Posse of Fear +Clan of the Void +Onyx Clan +Void Order +Iron Force +Quantum Tribe +Posse of Obsidian +Council of Dire +Order of Hate +Diablo Tribe +Fear Order +Nether Council +Order of Vengeance +Nemesis Crew +Empty +Void +##### +Evil +InfernalHorns +InfernalHorns +##### +Cursed +Mummies +Team Pyramid +Walking Curse +Toilet Paper +Wrapped +Wrap-Around +Wrap +Damnation +Pharao Fighters +Secret Nation +Cursed Fighters +Cursed Army +Curse +Evil Curse +Evil Spirits +Possessed +The Further +Faraway +Outaminds +Controlled +Damned +##### +Mummy +##### +Extreme +Ultrasoldiers +Future +Technofreaks +Over +Above +Armed +Armor +Heavily Armored +MegaHogs +UltraHogs +SuperHogs +HyperHogs +Super Duper +Hyper Huper +Ultra +Metal +Team Meteor +Can’t Touch Us +Undefeatable +Impossible +Mission Possible +Metal Plates +Hard +Hogs of Steel +Strong +Advanced +Enhanced +Future Technology +Experimental +Meteor +Sparks +Metalbands +Cyberpunk +Power Armor +Energetic Rangers +Power Team +Honor Team +Strongheads +Superheads +##### +Meteorhelmet +MegaHogX +scif_SparkssHelmet +sth_Metal +scif_cyberpunk +##### +Zoo +Zoo Pack +Animal Park +Animals +Animal Kingdom +Role Players +Actors +Woof Meow Peep +Moosefish +Deerchicken +Batbeaver +Fishfrog +Pigmoose +Batpig +Elesnail +Turtlefrog +Animalia +Bunny & co. +Bat & co. +United Animals +Animal Fighters +Oh Deer +Forest Frontier +Discovery Channel +Variety +Together Forever +The Front +Crazy Costumes +Weird Disguise +Carnival +Happy Zoo +Animal Crossing +Mutations +Terrible Accident +Looney Bin +Wacky +##### +zoo_Bat +zoo_Beaver +zoo_Bunny +zoo_chicken +zoo_Deer +zoo_elephant +zoo_fish +zoo_frog +zoo_Hedgehog +zoo_Moose +zoo_Pig +zoo_Porkey +zoo_Sheep +zoo_snail +zoo_turtle +zoo_octopus +##### +Hospital +Team Health +Healers +Health Increasers +Pain Reducers +Team Medicine +Curers +Sickness Removers +Healthy Hogs +Doctors and Nurses +Clinic +Medication +Medical Center +Infirmary +Station 19c +Get Well Soon +Fit +Wholesome +Healthful +Good For You +Stay Healthy +Flying Doctors +Hedgehog Healers +Hedgehog Hospital +Medicine +Treatment +Doctor Cult +Caregivers +##### +doctor +doctor +nurse +nursehat +##### +Sparta +Ancient Greece +Greece +This is Sparta +Ancient +Warriors +Warriors of Hope +Mercenaries +Spartans +##### +spartan +##### +Geek Zone +Geeks +Nerds +Geek Squad +Science Squad +Nerdy +Intelligence +Natural Talents +Strategy +Checkmate +Highscore +For Science +Squadron +Scientists +Mad Scientists +Perish +Lambda Force +Lambda Lambda Labda +Half-Life +G-Hogs +Smart +Cooper Clan +Geeknerds +Nerdgeeks +Knowledge +Bookworms +##### +Glasses +Glasses +Glasses +lambda +lambda +lambdahat +NoHat +NoHat +Einstein +##### +Summer +Sunbathers +Warm Season +Hot Season +Butterfly +Happy +Good Life +Enjoy +Sunny +Sun +Hot +Warm +Warm Breeze +Wind +Beach +Crabs +Seagulls +##### +mexicansunbrero +pinksunhat +##### +Hunters +Hunter Gatherers +Hoggy Crockett +Anzack +The Coon +Skins +Forest Rangers +Forest +Nature Keepers +Shrub Group +Dry Shrub +Dead Bush +Tall Grass +Double Coon +Forest Keepers +Justice Team +##### +anzac +anzac +Coonskin3 +Coonskin3 +RobinHood +NoHat +##### +Fortress Team +Special Force +Special Tactics +Strategic Team +Situation Group +Corps +Tactics +Special Unit +Combat Unit +Defense Squad +Specialists +Demolition +##### +tf_demoman +tf_scout +Gasmask +##### +Dwarves +Eight Dwarves +Midgets +Little Hedgehogs +Munchkins +Squirt +Munt +Shorties +Shrimps +Mini +Sleepy +Good Night +##### +dwarf +##### +Hogs in Hats +Stripes +Red White +Funny +Chaotic +Breakers +Chaos +Slippy +Clippy +Cylinder +Hat +Messed Up +Gilde +Meow +Home +Sweet Home +##### +HogInTheHat *END* diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/ushanka.cfg --- a/share/hedgewars/Data/Names/ushanka.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,221 @@ +Acker +Ackles +Alberti +Allbritton +Alleman +Alpers +Appell +Apperson +Arenas +Avants +Averette +Bahena +Balas +Ballard +Bang +Basso +Beaudette +Begaye +Benefield +Bennefield +Bergen +Blaser +Blomquist +Boom +Bosco +Brazeal +Breneman +Bueno +Byron +Calender +Candler +Cannon +Cantrelle +Carlow +Carns +Cassinelli +Castruita +Caywood +Chappelle +Chism +Chynoweth +Cobos +Cochran +Coley +Collado +Collinson +Colter +Combatant +Comeaux +Crafford +Crandall +Credle +Dapolito +Dietrick +Dillenbeck +Dorrell +Duenas +Durrell +Dyck +Dykstra +Eagle +Ebel +Eckel +Elledge +Ellen +Ellers +Emmons +Enders +Esker +Explode +Eye +Fetterolf +Fill +Finch +Fleener +Forester +Fritsche +Fullenwider +Fussell +Gains +Gajewski +Garten +Gibbens +Giesler +Gloss +Godin +Goforth +Grabowski +Gravois +Grenade +Grennan +Griggs +Gugino +Guill +Gun +Gunner +Hagaman +Haider +Hakes +Hassett +Helmet +Hiott +Hollars +Hopkins +Hunter +Hyde +Infanterist +Izzi +Joo +Juel +Kaboom +Kilbane +Klocke +Kroh +Kyger +Lasseter +Latimore +Lauderback +Lefebre +Leslie +Lettinga +Liverman +Lobel +Lockridge +Logue +Loken +Luera +Manigo +Marling +Maske +Mcalpin +Mccarville +Mckittrick +Mclane +Mclemore +Mcroy +Melle +Mendivil +Mera +Michalec +Mifflin +Milliman +Monzon +Mortar +Murakami +Musich +Neuner +Newman +Nickens +Nuke +Ogburn +Ogg +Ogles +Onstad +Osburn +Parkin +Person +Pilkington +Plank +Plaza +Poplin +Port +Preslar +Prestidge +Pyatt +Quirion +Rachel +Rank +Rimmer +Rode +Romine +Rosebrock +Rustad +Saddler +Salamone +Sangster +Sapper +Schwein +Sciacca +Scriven +Senner +Sereno +Severa +Shams +Shooter +Shot +Shotgun +Showers +Siller +Sisler +Smidt +Soileau +Soldier +Stembridge +Stich +Stoodley +Strine +Tallant +Tenaglia +Tinney +Tomko +Towe +Treaster +Troche +Trooper +Troutman +Tye +Vandenbosch +Verhoeven +Viloria +Warhead +Weapon +Weese +Weist +Westbury +Westlake +Wicker +Wittner +Yost +Zaremba +Bazooka \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_UNPeacekeeper01.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_UNPeacekeeper01.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_UNPeacekeeper02.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_UNPeacekeeper02.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_airwarden02.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_airwarden02.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_airwarden03.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_airwarden03.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_americanww2helmet.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_americanww2helmet.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +war diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_britmedic.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_britmedic.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_britpthhelmet.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_britpthhelmet.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_britsapper.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_britsapper.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_desertgrenadier1.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_desertgrenadier1.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_desertgrenadier2.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_desertgrenadier2.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_desertgrenadier4.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_desertgrenadier4.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_desertgrenadier5.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_desertgrenadier5.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_desertmedic.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_desertmedic.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_desertofficer.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_desertofficer.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_desertsapper1.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_desertsapper1.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_desertsapper2.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_desertsapper2.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_frenchww1gasmask.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_frenchww1gasmask.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_frenchww1helmet.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_frenchww1helmet.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_germanww1helmet2.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_germanww1helmet2.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_germanww1tankhelm.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_germanww1tankhelm.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_germanww2medic.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_germanww2medic.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_germanww2pith.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_germanww2pith.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_grenadier1.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_grenadier1.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_trenchfrench01.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_trenchfrench01.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_trenchfrench02.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_trenchfrench02.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_trenchgrenadier1.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_trenchgrenadier1.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_trenchgrenadier2.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_trenchgrenadier2.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/war_trenchgrenadier3.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/war_trenchgrenadier3.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +war +war +generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/whysoserious.txt --- a/share/hedgewars/Data/Names/whysoserious.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Names/whysoserious.txt Sun Dec 17 00:09:24 2017 +0100 @@ -1,7 +1,251 @@ -Stranger +Airloaf +Airmeatclod +Airtwitknock +Anklefumble +Applause Lamp +Bad Joke +Ballankle +Ballbonewad +Ballclown +Ballcorn +Ballknock +Ballknocker +Beefface +Beeflunk +Belchdip +Blunbook +Boknit +Boneankle +Boobunt +Boof +Boozclown +Borkun +Bormong +Bormumb +Brorondork +Brug +Brugorg +Brung +Bruzzump +Bubblehead +Bult +Bumclownmunch +Bummunch +Bumnitlunk +Bumpclown +Bumpoof +Bumwad +Bungblunt +Bunk +Buzzmunch +Cheeseclown +Cheesehead +Cheeseknocker +Cheesepuff +Cheesesneeze +Clodheadclod +Clodknock +Clodtwit +Clook +Clotball +Clotfumble +Clotknuckle +Clownclot +Clownfumble +Clowngoof +Clownknuckle +Clownlumpskull +Clownpuff +Clownsnark +Clum +Cluzz +Cornclod +Cornknocker +Delch +Dipwad +Doltbum +Doltfoot +Dongjulf +Doo +Doofdork +Doog +Dorkcorn +Dorkdoof +Dorksnark +Dormgelch +Dumbhead +Dumbknock +Dumbloaf +Dumbmuck +Duntlunk +Elmao Entertrainment -Bad Joke +Facebump +Faceclot +Faceclown +Faceknucklecorn +Facemuck +Facepin +Felch +Final Laugh +Fingerclown +Fingerdoof +Fingerfumble +Fingermunch +Flokgump +Florongrunph +Flunankle +Flunggog +Footface +Footheadwad +Foottwerploaf +Freak +Frokgloob +Fromph +Frong +Froob +Froog +Froogmunch +Frugdork +Frunk +Frunkgoron +Fulf +Fumblecheese +Fumbleclown +Fumbpin +Fungolph +Fungult +Funtbeef +Gelch +Ghelch +Ghoron +Gidiotjook +Gloggug +Glolphclown +Gloozub +Glorg +Glormjonk +Glormuzz +Glungskull +Golt +Gomph +Goo +Goob +Goof +Goofmunch +Gromphwunph +Groog +Grum +Grumble +Grumbleball +Grumpypants +Gulf +Gum +Gumph +Gumphdoob +Gunb +Ha-ha +Headbeef +Headclot +Headgrumble +Headloafface +Hug +Jonk +Joob +Jormdip +Juboof +Jultpumph +Klidiotglog +Kloogob +Klub +Klug +Klumb +Kluntsnark +Knockball +Knockerdip +Knockergrum +Knockfin +Knockfinger +Knocksneeze +Knockwipe +Knucklenumb +Korgmorg +Kubcheese +Kumbdoof +Kuzzun +Laugh +Loafdork +Loaffinger +Loafmunch +Loaftwerp +Lollers +Lumpankle +Lumpdolt +Lunkbumble +Lunkloaf +Magic +Melchog +Mogfloron +Mok +Molph +Monglunk +Moog +Mork +Morm +Muckface +Mucktwit +Muckulf +Munchair +Munchdolt +Munchknuckle +Munchnit +Munk +Munlunk +Nitface +Noopub +Nultknock +Numbbone +Numbclot +Numbdork +Numbgoofdolt +Pidiotfooz +Pincornpuff +Pindorkbeef +Pinfootclot +Pinknock +Poksnark +Poltflum +Pomphtwerp +Poo +Pub +Pufflumpskull +Puffumble +Roffle +Skullclod +Skulldipsneeze +Skulldorkknock Smiling -A Freak +Snarkgoof +Snarksnark +Sneezefumble +Sneezeknocker Stranger -Magic +Thimbleface +Thimblesneeze +Tholphknuckle +Thomph +Thooblunk +Thork +Thum +Thumbpum +Thunbum +Twerpface +Twitgoof +Wadhead +Wadloaf +Wimpmeat +Woog +Woron +Wunkun +Wunmunch +Wuzz diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Names/zoo_Bunny.cfg --- a/share/hedgewars/Data/Names/zoo_Bunny.cfg Thu Aug 11 23:05:14 2016 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Animate.lua --- a/share/hedgewars/Data/Scripts/Animate.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Animate.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,10 +1,13 @@ local animPos, lastx, lasty, jumpTypes, jumpTimes, moveDirs, jumpStarted +local moveTime = 0 local backJumped, jTimer, awTime, globalWait, stageEvents, seNum, curEvent local needtoDecrease local AnimList, AnimListNum local FunctionList, FunctionListNum local skipFuncList local skipping +local baseInputMask = 0xFFFFFFFF +local extraInputMask = baseInputMask --------------------------------Animation--------------------------------- --------------------------(In-game cinematics)---------------------------- @@ -50,8 +53,28 @@ RemoveFunction() end -function AnimInit() - animPos = 1 +local function updateInputMask() + SetInputMask(band(baseInputMask, extraInputMask)) +end + +local function startCinemaLock() + SetCinematicMode(true) + baseInputMask = bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLeft+gmLJump+gmRight+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon) + updateInputMask() +end + +local function stopCinemaLock() + baseInputMask = 0xFFFFFFFF + updateInputMask() + SetCinematicMode(false) +end + +function AnimSetInputMask(newExtraInputMask) + extraInputMask = newExtraInputMask + updateInputMask() +end + +function AnimInit(startAnimating) lastx = 0 lasty = 0 jumpTypes = {long = gmLJump, high = gmHJump, back = gmHJump} @@ -72,6 +95,10 @@ FunctionListNum = 0 skipping = false skipFuncList = {} + animPos = 1 + if startAnimating then + startCinemaLock() + end end function AnimSwitchHog(gear) @@ -140,13 +167,22 @@ return true end -function AnimMove(gear, dir, posx, posy) +function AnimMove(gear, dir, posx, posy, maxMoveTime) dirr = moveDirs[dir] SetGearMessage(gear, dirr) - if GetX(gear) == posx or GetY(gear) == posy then + moveTime = moveTime + 1 + if (maxMoveTime and moveTime > maxMoveTime) then + SetGearMessage(gear, 0) + SetGearPosition(gear, posx, posy) + lastx = GetX(gear) + lasty = GetY(gear) + moveTime = 0 + return true + elseif GetX(gear) == posx or GetY(gear) == posy then SetGearMessage(gear, 0) lastx = GetX(gear) lasty = GetY(gear) + moveTime = 0 return true end return false @@ -288,7 +324,7 @@ function Animate(steps) if skipping == true then animPos = 1 - SetInputMask(0xFFFFFFFF) + stopCinemaLock() SkipAnimation(steps) return true end @@ -299,7 +335,7 @@ if steps[animPos] == nil then animPos = 1 - SetInputMask(0xFFFFFFFF) + stopCinemaLock() return true end @@ -308,7 +344,7 @@ AnimSwitchHog(steps[animPos].args[1]) end - SetInputMask(bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLeft+gmLJump+gmRight+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon)) + startCinemaLock() retVal = steps[animPos].func(unpack(steps[animPos].args)) if (retVal ~= false) then animPos = animPos + 1 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Locale.lua --- a/share/hedgewars/Data/Scripts/Locale.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Locale.lua Sun Dec 17 00:09:24 2017 +0100 @@ -7,3 +7,7 @@ else return text end end + +function loc_noop(text) + return text +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Balanced_Random_Weapon.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,10 +1,10 @@ HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Tracker.lua") -local weapons = { amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, amMine, amDEagle, amDynamite, amFirePunch, amWhip, amPickHammer, amBaseballBat, amMortar, amCake, amSeduction, amWatermelon, amHellishBomb, amDrill, amBallgun, amRCPlane, amSniperRifle, amMolotov, amBirdy, amBlowTorch, amGasBomb, amFlamethrower, amSMine, amKamikaze } +local weapons = { amGrenade, amClusterBomb, amBazooka, amBee, amShotgun, amMine, amDEagle, amDynamite, amFirePunch, amWhip, amPickHammer, amBaseballBat, amMortar, amCake, amSeduction, amWatermelon, amHellishBomb, amDrill, amBallgun, amRCPlane, amSniperRifle, amMolotov, amBirdy, amBlowTorch, amGasBomb, amFlamethrower, amSMine, amKamikaze, amDuck } --- G,C,B,B,S,M,D,D,F,W,P,B,M,C,S,W,H,D,B,R,S,M,B,B,G,F,S,K -local weapons_values = {1,1,1,2,1,1,1,2,1,1,1,2,1,3,1,3,3,2,3,3,1,1,2,1,1,2,2,1} +-- G,C,B,B,S,M,D,D,F,W,P,B,M,C,S,W,H,D,B,R,S,M,B,B,G,F,S,K,D +local weapons_values = {1,1,1,2,1,1,1,2,1,1,1,2,1,3,1,3,3,2,3,3,1,1,2,1,1,2,2,1,1} local airweapons = { amAirAttack, amMineStrike, amNapalm, amDrillStrike } diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Battalion.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Battalion.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,2 @@ +* +locked diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Battalion.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Battalion.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1723 @@ +--[[ + ######################################################################## + Name: Battalion + Made by: Anachron + ######################################################################## +]]-- + +--[[ + + Readme: + https://hedgewars.org/wiki/Battalion + + ######################################################################## +]]-- + +--[[ + ######################################################################## + Todo/Idea-List + ######################################################################## + + - Make Hogs sorted by rareness for teams with less hogs (more fair) + - Keep first picked up unused crate utitlity until next round + - Ship default scheme but let user overwrite it + - Make SuddenDeathWaterRise dynamic + - Make SuddenDeathTurns dynamic + - Add Hog Variants like Crazy Scientist or Astronaut + + ######################################################################## +]]-- + +--[[ + ############################################################################## + ### GENERAL SCRIPT LOADING AND VARIABLE INITIALISATION ### + ############################################################################## +]]-- + +HedgewarsScriptLoad("/Scripts/Locale.lua") +HedgewarsScriptLoad("/Scripts/Tracker.lua") +HedgewarsScriptLoad("/Scripts/Params.lua") + +-- List of all hog variants with belonging weapons, +-- hitpoints, chances and more +local variants = {} +local varName = "" +local newLine = ""--string.char(0x0A) +local gmAny = 0xFFFFFFFF +local version = "0.33" + +--[[ + ############################################################################## + ### VARIANT SETUP ### + ############################################################################## +]]-- + +varName = "Pyromancer" +variants[varName] = {} +variants[varName]["name"] = loc("Pyromancer") +variants[varName]["chance"] = 7 +variants[varName]["hat"] = "Gasmask" +variants[varName]["hp"] = 70 +variants[varName]["hogLimit"] = 2 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amFlamethrower, amMolotov, amWhip} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amRope, amParachute} +variants[varName]["special"] = false + +varName = "Builder" +variants[varName] = {} +variants[varName]["name"] = loc("Builder") +variants[varName]["chance"] = 10 +variants[varName]["hat"] = "constructor" +variants[varName]["hp"] = 100 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amDynamite, amWhip, amHammer} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amGirder, amBlowTorch} +variants[varName]["special"] = false + +varName = "Rifleman" +variants[varName] = {} +variants[varName]["name"] = loc("Rifleman") +variants[varName]["chance"] = 7 +variants[varName]["hat"] = "Sniper" +variants[varName]["hp"] = 70 +variants[varName]["hogLimit"] = 2 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amRCPlane, amShotgun, amSniperRifle} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amLowGravity, amParachute} +variants[varName]["special"] = false + +varName = "Warrior" +variants[varName] = {} +variants[varName]["name"] = loc("Warrior") +variants[varName]["chance"] = 12 +variants[varName]["hat"] = "spartan" +variants[varName]["hp"] = 120 +variants[varName]["hogLimit"] = 2 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amClusterBomb, amGrenade, amBazooka} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amParachute, amRope} +variants[varName]["special"] = false + +varName = "Chef" +variants[varName] = {} +variants[varName]["name"] = loc("Chef") +variants[varName]["chance"] = 7 +variants[varName]["hat"] = "chef" +variants[varName]["hp"] = 70 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amCake, amKnife, amWhip} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amRubber, amParachute} +variants[varName]["special"] = false + +varName = "Medic" +variants[varName] = {} +variants[varName]["name"] = loc("Medic") +variants[varName]["chance"] = 12 +variants[varName]["hat"] = "war_desertmedic" +variants[varName]["hp"] = 120 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amResurrector, amMine, amGasBomb} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amTeleport, amParachute} +variants[varName]["special"] = false + +varName = "Ninja" +variants[varName] = {} +variants[varName]["name"] = loc("Ninja") +variants[varName]["chance"] = 8 +variants[varName]["hat"] = "NinjaTriangle" +variants[varName]["hp"] = 80 +variants[varName]["hogLimit"] = 2 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amSMine, amMine, amFirePunch} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amRope, amParachute} +variants[varName]["special"] = false + +varName = "Athlete" +variants[varName] = {} +variants[varName]["name"] = loc("Athlete") +variants[varName]["chance"] = 8 +variants[varName]["hat"] = "footballhelmet" +variants[varName]["hp"] = 80 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amBaseballBat, amFirePunch, amSeduction} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amRope, amPickHammer} +variants[varName]["special"] = false + +varName = "Scientist" +variants[varName] = {} +variants[varName]["name"] = loc("Scientist") +variants[varName]["chance"] = 7 +variants[varName]["hat"] = "doctor" +variants[varName]["hp"] = 80 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amPortalGun, amSineGun, amIceGun} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amTeleport, amJetpack} +variants[varName]["special"] = false + +varName = "Air General" +variants[varName] = {} +variants[varName]["name"] = loc("Air General") +variants[varName]["chance"] = 5 +variants[varName]["hat"] = "war_desertofficer" +variants[varName]["hp"] = 50 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amMineStrike, amNapalm, amAirAttack} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amRope, amParachute} +variants[varName]["special"] = true + +varName = "Hunter" +variants[varName] = {} +variants[varName]["name"] = loc("Hunter") +variants[varName]["chance"] = 10 +variants[varName]["hat"] = "Skull" +variants[varName]["hp"] = 100 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amBee, amMortar, amDrill} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amRope, amParachute} +variants[varName]["special"] = false + +varName = "King" +variants[varName] = {} +variants[varName]["name"] = loc("King") +variants[varName]["chance"] = 3 +variants[varName]["hat"] = "crown" +variants[varName]["hp"] = 60 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amWatermelon, amHellishBomb, amBallgun} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amRope, amParachute} +variants[varName]["special"] = true + +varName = "Knight" +variants[varName] = {} +variants[varName]["name"] = loc("Knight") +variants[varName]["chance"] = 0 +variants[varName]["hat"] = "knight" +variants[varName]["hp"] = 80 +variants[varName]["hogLimit"] = 1 +variants[varName]["weaponLimit"] = 1 +variants[varName]["weapons"] = {amShotgun, amBazooka, amMine} +variants[varName]["helperLimit"] = 1 +variants[varName]["helpers"] = {amParachute, amRope} +variants[varName]["special"] = true + +--[[ + ############################################################################## + ### GENERAL VARIABLES USED FOR GAMEPLAY ### + ############################################################################## +]]-- + +local unused = {amSnowball, amDrillStrike, amTardis} +local lowWeaps = {amKamikaze} +local lowTresh = 25 + +local counter = {} -- Saves how many hogs of a variant a team has +local group = {} -- Saves randomized variants for all teams +local teamIndex = {} -- Temporary counter for amount of mutated hogs in team +local teamHogs = {} -- Saves a list of all hogs belonging to a team +local hogCount = {} -- Saves how many hogs a team has +local teamNames = {} -- Saves all teams and names +local hogInfo = {} -- Saves all hogs with their original values + +local LastHog = nil -- Last Hedgehog +local CurHog = nil -- Current Hedgehog +local LastTeam = nil -- Last Team +local CurTeam = nil -- Current Team +local TurnEnded = true -- Boolean whether current turn ended or not + +local mode = 'default' -- Which game type to play +local luck = 100 -- Multiplier for bonuses like crates +local strength = 1 -- Multiplier for more weapons +local mutate = false -- Whether or not to mutate the hogs + +local highHasBonusWeps = false -- whether or not a hog got bonus weapons on current turn +local highHasBonusHelp = false -- whether or not a hog got bonus helpers on current turn +local highPickupCount = 1 +local highPickupSDCount = 2 +local highHelperCount = 1 +local highHelperSDCount = 1 +local highEnemyKillHPBonus = 10 +local highFriendlyKillHPBonus = 15 +local highWeapons = {} -- Saves the weapons from kills +local highHelpers = {} -- Saves the helpers from kills +local highSpecialBonus = {amTeleport, amJetpack} +local highSpecialPool = {amExtraDamage, amVampiric} + +local kingLinkPerc = 50 -- Percentage of life to share from the team + +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 +local pointsWepTurn = 5 -- Round bonus points weapons +local pointsHlpTurn = 2 -- Round bonus points helpers +local pointsWepMax = 25 -- Maximum points for weapons +local pointsHlpMax = 10 -- Maximum points for helpers +local pointsKeepSDPerc = 60 -- Percentage of points to take to next round on SD +local pointsWepSDTurn = 7 -- Round bonus points weapons on SD +local pointsHlpSDTurn = 3 -- Round bonus points helpers on SD +local pointsWepSDMax = 35 -- Maximum points for weapons on SD +local pointsHlpSDMax = 15 -- Maximum points for helpers on SD + +local pointsWeaponVal = {} +pointsWeaponVal[amBazooka] = 5 +pointsWeaponVal[amShotgun] = 4 +pointsWeaponVal[amFirePunch] = 3 +pointsWeaponVal[amMine] = 5 +--pointsWeaponVal[amAirAttack] = 10 +pointsWeaponVal[amBee] = 6 +pointsWeaponVal[amClusterBomb] = 7 +pointsWeaponVal[amGrenade] = 5 +pointsWeaponVal[amDEagle] = 3 +pointsWeaponVal[amWhip] = 3 +pointsWeaponVal[amDynamite] = 7 +--pointsWeaponVal[amMineStrike] = 14 +pointsWeaponVal[amMortar] = 4 +pointsWeaponVal[amWatermelon] = 30 +pointsWeaponVal[amSniperRifle] = 3 +pointsWeaponVal[amBaseballBat] = 3 +pointsWeaponVal[amCake] = 7 +--pointsWeaponVal[amNapalm] = 11 +pointsWeaponVal[amDrill] = 6 +pointsWeaponVal[amHellishBomb] = 20 +pointsWeaponVal[amSineGun] = 4 +--pointsWeaponVal[amKamikaze] = 3 +--pointsWeaponVal[amBallgun] = 12 +--pointsWeaponVal[amPianoStrike] = 15 +pointsWeaponVal[amSnowball] = 2 +pointsWeaponVal[amMolotov] = 3 +pointsWeaponVal[amFlamethrower] = 4 +pointsWeaponVal[amRCPlane] = 7 +--pointsWeaponVal[amDrillStrike] = 12 +pointsWeaponVal[amGasBomb] = 2 +pointsWeaponVal[amHammer] = 3 +pointsWeaponVal[amSMine] = 4 +pointsWeaponVal[amAirMine] = 3 +pointsWeaponVal[amKnife] = 3 +pointsWeaponVal[amPortalGun] = 5 +--pointsWeaponVal[amIceGun] = 6 +pointsWeaponVal[amSeduction] = 2 + +local pointsHelperVal = {} +pointsHelperVal[amRope] = 5 +pointsHelperVal[amParachute] = 2 +--pointsHelperVal[amGirder] = 3 +pointsHelperVal[amBlowTorch] = 2 +pointsHelperVal[amLowGravity] = 3 +--pointsHelperVal[amRubber] = 4 +pointsHelperVal[amPickHammer] = 2 +pointsHelperVal[amTeleport] = 10 +pointsHelperVal[amJetpack] = 8 + +local pointsPerTeam = {} +local pointsToWep = {} -- List of [points] = {ammo1, ammo2} +local pointsToHlp = {} -- List of [points] = {ammo1, ammo2} +local wepPoints = {} +local hlpPoints = {} + +local suddenDeath = false + +local healthCrateChance = 7 +local utilCrateChance = 9 +local weaponCrateChance = 12 + +local healthCrateChanceSD = 12 +local utilCrateChanceSD = 16 +local weaponCrateChanceSD = 21 + +local emptyCrateChance = 7 +local bonusCrateChance = 5 +local cratePickupGap = 35 + +local utilities = {amInvulnerable, amVampiric, amExtraTime, amExtraDamage, amRope, amLandGun} +local autoSelectHelpers = {amRope, amParachute} + +local LastWaterLine = 0 -- Saves WaterLine to make sure a water rise wont trigger highland kill + +local helpers = {} +helpers[amSkip] = true +helpers[amRope] = true +helpers[amParachute] = true +helpers[amBlowTorch] = true +helpers[amGirder] = true +helpers[amTeleport] = true +helpers[amSwitch] = true +helpers[amJetpack] = true +helpers[amBirdy] = true +helpers[amPortalGun] = true +helpers[amResurrector] = true +helpers[amTardis] = true +helpers[amLandGun] = true +helpers[amRubber] = true +--helpers[amKamikaze] = true + +local posCaseAmmo = 1 +local posCaseHealth = 2 +local posCaseUtility = 4 +local posCaseDummy = 8 + +--[[ + ############################################################################## + ### GENERAL BONUS LUA FUNCTIONS ### + ############################################################################## +]]-- + +function swap(array, index1, index2) + array[index1], array[index2] = array[index2], array[index1] +end + +function shuffle(array) + local cnt = #array + while cnt > 1 do + local index = GetRandom(cnt) +1 + swap(array, index, cnt) + cnt = cnt - 1 + end +end + +function table.clone(org) + local copy = {} + for orig_key, orig_value in pairs(org) do + copy[orig_key] = orig_value + end + return copy +end + +--[[ + ############################################################################## + ### WEAPON, UTILITY AND AMMO FUNCTIONS ### + ############################################################################## +]]-- + +function clearHogAmmo(hog) + local lastNum = amRubber + + if amAirMine ~= nil then + lastNum = amAirMine + end + + for val=0,lastNum do + AddAmmo(hog, val, 0) + end +end + +function autoSelectAmmo(hog, var) + -- Check if hog has any "useful" helper, select helper, if yes + for key, val in pairs(autoSelectHelpers) do + if GetAmmoCount(hog, val) > 0 then + SetWeapon(val) + return + end + end +end + +function AddHogAmmo(hog, ammo) + -- Add weapons of variant + --for key, val in pairs(variants[var]["weapons"]) do + for key, val in pairs(ammo) do + --AddAmmo(hog, val, 1) + AddAmmo(hog, val, GetAmmoCount(hog, val) +1) + end +end + +function GetRandomAmmo(hog, sourceType) + local var = getHogInfo(hog, 'variant') + ammo = {} + local source = '' + + if variants[var] == nil then + return ammo + end + + if sourceType == "weapons" then + source = variants[var][sourceType] + sourceLimit = variants[var]["weaponLimit"] + elseif sourceType == "helpers" then + source = variants[var][sourceType] + sourceLimit = variants[var]["helperLimit"] + elseif sourceType == 'poolWeapons' then + if highWeapons[hog] == nil then + highWeapons[hog] = {} + end + source = highWeapons[hog] + if suddenDeath == false then + sourceLimit = highPickupCount + else + sourceLimit = highPickupSDCount + end + elseif sourceType == 'poolHelpers' then + if highHelpers[hog] == nil then + highHelpers[hog] = {} + end + source = highHelpers[hog] + if suddenDeath == false then + sourceLimit = highHelperCount + else + sourceLimit = highHelperSDCount + end + else + return ammo + end + + local varAmmo = {} + for key, val in pairs(source) do + varAmmo[key] = val + end + + -- If the amount of random weapons is equally to the amount of weapons possible + -- We don't need to randomize + if sourceLimit >= table.getn(source) then + return varAmmo + end + + local randIndex = 0 + local i = 0 + while i < sourceLimit and #varAmmo > 0 do + randIndex = GetRandom(#varAmmo) +1 + ammo[i] = varAmmo[randIndex] + + -- Shift last value to the current index + varAmmo[randIndex] = varAmmo[#varAmmo] + -- And remove the last index from the array + varAmmo[#varAmmo] = nil + i = i +1 + end + + return ammo +end + +function addTurnAmmo(hog) + -- Check if hog is valid + if hog == nil then + return + end + + -- Check if hog is alive + local hp = GetHealth(hog) + if hp == nil or hp <= 0 then + return + end + + -- Unless its points mode, get weapons normally by variant + if mode ~= "points" then + local maxHp = getHogInfo(hog, 'maxHp') + local hpPer = div(hp * 100, maxHp) + + local wep = getHogInfo(hog, 'weapons') + local hlp = getHogInfo(hog, 'helpers') + + if wep == nil or table.getn(wep) == 0 then + hogInfo[hog]['weapons'] = GetRandomAmmo(hog, "weapons") + wep = getHogInfo(hog, 'weapons') + end + + if hlp == nil or table.getn(hlp) == 0 then + hogInfo[hog]['helpers'] = GetRandomAmmo(hog, "helpers") + hlp = getHogInfo(hog, 'helpers') + end + + AddHogAmmo(hog, wep) + AddHogAmmo(hog, hlp) + + if mode == 'highland' then + local poolWeapons = GetRandomAmmo(hog, 'poolWeapons') + local poolHelpers = GetRandomAmmo(hog, 'poolHelpers') + + AddHogAmmo(hog, poolWeapons) + AddHogAmmo(hog, poolHelpers) + end + + if hpPer < lowTresh or suddenDeath == true then + AddHogAmmo(hog, lowWeaps) + end + -- We are on points mode, so we need to generate weapons based on points + else + setupPointsAmmo(hog) + end + + AddAmmo(hog, amSkip, -1) +end + +function setupPointsAmmo(hog) + local teamName = getHogInfo(hog, 'team') + local turnWepPoints = pointsPerTeam[teamName]['weapons'] + local turnHlpPoints = pointsPerTeam[teamName]['helpers'] + local weps = {} + local help = {} + + local wepPointsTmp = table.clone(wepPoints) + local wepMinPnt = wepPointsTmp[1] + local wepMaxPnt = wepPointsTmp[#wepPointsTmp] + + --AddCaption("Hog: " .. hog .. " Wep: " .. turnWepPoints .. " - Hlp: " .. turnHlpPoints, GetClanColor(GetHogClan(CurHog)), capgrpGameState) + --WriteLnToConsole("BEFORE ## Team: " .. teamName .. " Wep: " .. pointsPerTeam[teamName]['weapons'] .. " - Hlp: " .. pointsPerTeam[teamName]['helpers']) + + while true do + if turnWepPoints < wepMinPnt then + break + end + + if wepPointsTmp[#wepPointsTmp] > turnWepPoints then + while wepPointsTmp[#wepPointsTmp] > turnWepPoints do + table.remove(wepPointsTmp) + end + wepMaxPnt = turnWepPoints + end + + local randPoint = wepPointsTmp[GetRandom(#wepPointsTmp) +1] + local randWepList = pointsToWep[randPoint] + local randWep = randWepList[GetRandom(#randWepList) +1] + + table.insert(weps, randWep) + turnWepPoints = turnWepPoints -randPoint + end + + local hlpPointsTmp = table.clone(hlpPoints) + local hlpMinPnt = hlpPointsTmp[1] + local hlpMaxPnt = hlpPointsTmp[#hlpPointsTmp] + + while true do + if turnHlpPoints < hlpMinPnt then + break + end + + if hlpPointsTmp[#hlpPointsTmp] > turnHlpPoints then + while hlpPointsTmp[#hlpPointsTmp] > turnHlpPoints do + table.remove(hlpPointsTmp) + end + hlpMaxPnt = turnHlpPoints + end + + local randPoint = hlpPointsTmp[GetRandom(#hlpPointsTmp) +1] + local randHlpList = pointsToHlp[randPoint] + local randHlp = randHlpList[GetRandom(#randHlpList) +1] + + table.insert(help, randHlp) + turnHlpPoints = turnHlpPoints -randPoint + end + + AddHogAmmo(hog, weps) + AddHogAmmo(hog, help) + + -- Save remaining points + pointsPerTeam[teamName]['weaponsRem'] = turnWepPoints + pointsPerTeam[teamName]['helpersRem'] = turnHlpPoints + + -- Save already collected points so that they wont be "taxed" + pointsPerTeam[teamName]['weaponsFix'] = pointsPerTeam[teamName]['weapons'] + pointsPerTeam[teamName]['helpersFix'] = pointsPerTeam[teamName]['helpers'] + + --WriteLnToConsole("AFTER ## Team: " .. teamName .. " Wep: " .. pointsPerTeam[teamName]['weapons'] .. " - Hlp: " .. pointsPerTeam[teamName]['helpers']) +end + +--[[ + ############################################################################## + ### HOG SETUP FUNCTIONS ### + ############################################################################## +]]-- + +function MutateHog(hog) + local var = getHogInfo(hog, 'variant') + + SetHogName(hog, variants[var]["name"]) + SetHogHat(hog, variants[var]["hat"]) +end + +function GetRandomVariant() + local maxNum = 0 + + for key, val in pairs(variants) do + maxNum = maxNum + variants[key]["chance"] + end + + local rand = GetRandom(maxNum) + local lowBound = 0 + local highBound = 0 + local var = nil + + for key, val in pairs(variants) do + highBound = lowBound + variants[key]["chance"] + if rand <= highBound then + var = key + break + end + lowBound = highBound + end + + return var +end + +function addRandomVariantToTeam(team) + if counter[team] == nil then + counter[team] = {} + end + + while true do + local var = GetRandomVariant() + if counter[team][var] == nil and variants[var]["hogLimit"] > 0 then + counter[team][var] = 1 + break + elseif counter[team][var] ~= nil and counter[team][var] < variants[var]["hogLimit"] then + counter[team][var] = counter[team][var] +1 + break + end + end + + return var +end + +function setTeamHogs(team) + local maxHog = hogCount[team] + + group[team] = {} + counter[team] = {} + + if mode == 'king' then + maxHog = maxHog -1 + end + + for i=1,maxHog do + table.insert(group[team], group['all'][i]) + end + + if mode == 'king' then + counter[team]['King'] = 1 + table.insert(group[team], 'King') + end +end + +function countTeamHogs(hog) + local team = GetHogTeamName(hog) + + if hogCount[team] == nil then + hogCount[team] = 1 + teamHogs[team] = {} + else + hogCount[team] = hogCount[team] +1 + end + + teamHogs[team][hogCount[team]] = hog + + teamNames[team] = 1 +end + +function setHogVariant(hog) + local team = getHogInfo(hog, 'team') + + if teamIndex[team] == nil then + teamIndex[team] = 1 + else + teamIndex[team] = teamIndex[team] +1 + end + + local hogNum = teamIndex[team] + local hogVar = group[team][hogNum] + + hogInfo[hog]['variant'] = hogVar + SetHealth(hog, variants[hogVar]["hp"]) +end + +function getHogInfo(hog, info) + if hog == nil then + AddCaption(loc("ERROR [getHogInfo]: Hog is nil!"), 0xFFFFFFFF, capgrpMessage) + WriteLnToConsole(loc("ERROR [getHogInfo]: Hog is nil!"), 0xFFFFFFFF, capgrpMessage) + return + end + + if hogInfo[hog] == nil then + return nil + end + + return hogInfo[hog][info] +end + +function setHogInfo(hog) + if hog == nil then + AddCaption(loc("ERROR [getHogInfo]: Hog is nil!"), 0xFFFFFFFF, capgrpMessage) + WriteLnToConsole(loc("ERROR [getHogInfo]: Hog is nil!"), 0xFFFFFFFF, capgrpMessage) + return + end + + hogInfo[hog] = {} + hogInfo[hog]['maxHp'] = GetHealth(hog) + hogInfo[hog]['name'] = GetHogName(hog) + hogInfo[hog]['hat'] = GetHogHat(hog) + hogInfo[hog]['team'] = GetHogTeamName(hog) + hogInfo[hog]['clan'] = GetHogClan(hog) + hogInfo[hog]['clanColor'] = GetClanColor(hogInfo[hog]['clan']) +end + +--[[ + ############################################################################## + ### CRATE SPAWN AND PICKUP FUNCTIONS ### + ############################################################################## +]]-- + +--[[ + : Heals either 10 (95% chance) or 15 (5% chance) hitpoints + : Plus 10% of the hogs base hitpoints. + : + : Has a 7% chance to be empty. +]]-- +function onHealthCratePickup() + local factor = 2 + local msgColor = getHogInfo(CurHog, 'clanColor') + local healHp = 0 + PlaySound(sndShotgunReload) + + if GetRandom(100) < emptyCrateChance then + AddCaption(loc("It's empty!"), msgColor, capgrpMessage) + return + elseif GetRandom(100) < bonusCrateChance then + factor = 3 + end + + local var = getHogInfo(CurHog, 'variant') + local hogHealth = GetHealth(CurHog) + healHp = 5 * factor + + -- Add extra 10% of hogs base hp to heal + healHp = healHp + div(getHogInfo(CurHog, 'maxHp'), 10) + + AddCaption(string.format(loc("+%d"), healHp), msgColor, capgrpMessage) + + SetEffect(CurHog, hePoisoned, 0) + SetHealth(CurHog, hogHealth + healHp) + local effect = AddVisualGear(GetX(CurHog), GetY(CurHog) +cratePickupGap, vgtHealthTag, healHp, false) + -- (vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, msgColor) +end + +--[[ + : Adds either 1 (95% chance) or 2 (5% chance) random weapon(s) based on the hog variant. + : + : Has a 7% chance to be empty. +]]-- +function onWeaponCratePickup() + local factor = 1 * strength + local msgColor = GetClanColor(GetHogClan(CurHog)) + PlaySound(sndShotgunReload) + + if GetRandom(100) < emptyCrateChance then + if IsHogLocal(CurHog) then + AddCaption(loc("It's empty!"), msgColor, capgrpMessage) + end + return + elseif GetRandom(100) < bonusCrateChance then + factor = 2 * strength + end + + local randIndex + local randAmmo + + if mode ~= 'points' then + local var = getHogInfo(CurHog, 'variant') + randIndex = GetRandom(table.getn(variants[var]["weapons"])) +1 + randAmmo = variants[var]["weapons"][randIndex] + else + local possibleWeapons = {} + + for key, val in pairs(pointsWeaponVal) do + if val > 2 and val < 8 then + table.insert(possibleWeapons, key) + end + end + + randIndex = GetRandom(table.getn(possibleWeapons)) +1 + randAmmo = possibleWeapons[randIndex] + end + + AddAmmo(CurHog, randAmmo, GetAmmoCount(CurHog, randAmmo) +factor) + if IsHogLocal(CurHog) then + AddCaption(string.format(loc("+%d ammo"), factor), msgColor, capgrpMessage) + local effect = AddVisualGear(GetX(CurHog), GetY(CurHog) +cratePickupGap, vgtAmmo, 0, true) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, randAmmo, nil, nil, nil, msgColor) + end +end +--[[ + : Adds either 1 (95% chance) or 2 (5% chance) random helper(s) based on the hog variant. + : + : Has a 7% chance to be empty. +]]-- +function onUtilityCratePickup() + local factor = 1 * strength + local msgColor = GetClanColor(GetHogClan(CurHog)) + PlaySound(sndShotgunReload) + + if GetRandom(100) < emptyCrateChance then + if IsHogLocal(CurHog) then + AddCaption(loc("It's empty!"), msgColor, capgrpMessage) + end + return + elseif GetRandom(100) < bonusCrateChance then + factor = 2 * strength + end + + local randIndex + local randUtility + + if mode ~= 'points' then + randIndex = GetRandom(table.getn(utilities)) +1 + randUtility = utilities[randIndex] + else + local possibleHelpers = {} + + for key, val in pairs(pointsHelperVal) do + table.insert(possibleHelpers, key) + end + + randIndex = GetRandom(table.getn(possibleHelpers)) +1 + randUtility = possibleHelpers[randIndex] + end + + AddAmmo(CurHog, randUtility, GetAmmoCount(CurHog, randUtility) +factor) + if IsHogLocal(CurHog) then + AddCaption(string.format(loc("+%d ammo"), factor), msgColor, capgrpMessage) + local effect = AddVisualGear(GetX(CurHog), GetY(CurHog) +cratePickupGap, vgtAmmo, 0, true) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, randUtility, nil, nil, nil, msgColor) + end +end + +function onPickupCrate(crate) + local pos = GetGearPos(crate) + + -- Check if the crate is fake + if pos % posCaseDummy >= 1 then + if pos % posCaseDummy == posCaseAmmo then + onWeaponCratePickup() + elseif pos % posCaseDummy == posCaseHealth then + onHealthCratePickup() + elseif pos % posCaseDummy == posCaseUtility then + onUtilityCratePickup() + end + end +end + +function RandomTurnEvents() + if GetRandom(100) < weaponCrateChance then + SpawnFakeAmmoCrate(0, 0, false, false) + return 5000 + elseif GetRandom(100) < utilCrateChance then + SpawnFakeUtilityCrate(0, 0, false, false) + return 5000 + elseif GetRandom(100) < healthCrateChance then + SpawnFakeHealthCrate(0, 0, false, false) + return 5000 + end + return 0 +end + +--[[ + ############################################################################## + ### SUDDEN DEATH FUNCTIONS ### + ############################################################################## +]]-- + +function onSuddenDeathDamage(hog) + local hp = GetHealth(hog) + local maxHp = getHogInfo(hog, 'maxHp') + local newHp = 0 + local hpDec = 0 + local hpPer = div(hp * 100, maxHp) + + if hp > 1 then + local msgColor = GetClanColor(GetHogClan(hog)) + if hpPer <= 25 then + newHp = hp -2 + elseif hpPer <= 50 then + newHp = hp -3 + elseif hpPer <= 75 then + newHp = hp -4 + elseif hpPer <= 100 then + newHp = hp -5 + elseif hpPer <= 125 then + newHp = hp -6 + elseif hpPer <= 150 then + newHp = hp -7 + else + newHp = div(hp * 93, 100) + end + + if newHp <= 0 then + newHp = 1 + end + + 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) + end +end + +function onSuddenDeathTurn() + runOnGears(onSuddenDeathDamage) +end + +function onSuddenDeath() + suddenDeath = true + + healthCrateChance = healthCrateChanceSD + utilCrateChance = utilCrateChanceSD + weaponCrateChance = weaponCrateChanceSD + + if mode == 'highland' then + highEnemyKillHPBonus = highEnemyKillHPBonus +5 + highFriendlyKillHPBonus = highFriendlyKillHPBonus +10 + end + + if mode ~= 'points' then + for key, val in pairs(variants) do + if not variants[key]["special"] then + variants[key]["weaponLimit"] = variants[key]["weaponLimit"] +1 + end + end + end + + if mode ~= 'points' then + for hog, val in pairs(hogInfo) do + hogInfo[hog]['weapons'] = {} + hogInfo[hog]['helpers'] = {} + end + + runOnGears(setupHogTurn) + end +end + +--[[ + ############################################################################## + ### GEAR TRACKING FUNCTIONS ### + ############################################################################## +]]-- + +function onGearAdd(gear) + local gearType = GetGearType(gear) + + if gearType == gtHedgehog then + trackGear(gear) + elseif gearType == gtRCPlane then + SetHealth(gear, 2) + elseif gearType == gtAirBomb then + -- gearUid, Angle, Power, WDTimer, Radius, Density, Karma, DirAngle, AdvBounce, ImpactSound, ImpactSounds, Tint, Damage, Boom + SetGearValues(gear, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 20) + elseif gearType == gtCake then + -- gearUid, Angle, Power, WDTimer, Radius, Density, Karma, DirAngle, AdvBounce, ImpactSound, ImpactSounds, Tint, Damage, Boom + SetGearValues(gear, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 50) + elseif gearType == gtDEagleShot then + -- gearUid, Angle, Power, WDTimer, Radius, Density, Karma, DirAngle, AdvBounce, ImpactSound, ImpactSounds, Tint, Damage, Boom + SetGearValues(gear, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 12) + end +end + +function onHighlandKill(gear) + local deathVar = getHogInfo(gear, 'variant') + local killVar = getHogInfo(CurHog, 'variant') + local bonAmmo = {} + local deathMaxHP = getHogInfo(gear, 'maxHp') + local curHP = GetHealth(CurHog) + local newHP = 0 + local hpDiff = 0 + local addAmmo = false + + -- Killer hog is dead! Don't do anything + if curHP == nil or curHP <= 0 then + return + end + + -- Killer and victim is equal! Don't do anything + if CurHog == gear then + return + end + + -- Hog drowned because of water, not enemy + if LastWaterLine ~= WaterLine then + return + end + + -- Enemy kill! Add weapons to pool and to hog + if getHogInfo(gear, 'clan') ~= getHogInfo(CurHog, 'clan') then + + -- Initialize weapons if required + if highWeapons[CurHog] == nil then + highWeapons[CurHog] = {} + end + + if highHelpers[CurHog] == nil then + highHelpers[CurHog] = {} + end + + -- If not a special hog, use the victims weapons + if variants[deathVar]['special'] == false then + bonAmmo = variants[deathVar]['weapons'] + + if suddenDeath == true then + ammoCount = highPickupSDCount + else + ammoCount = highPickupCount + end + + -- Check if hog already got bonus weapons + if table.getn(highWeapons[CurHog]) == 0 and highHasBonusWeps == false then + highHasBonusWeps = true + addAmmo = true + end + + -- Pass turn bonus weapons to hog pool + for key, val in pairs(bonAmmo) do + local idx = table.getn(highWeapons[CurHog]) +1 + highWeapons[CurHog][idx] = val + end + -- It's a special hog, use special pool + else + bonAmmo = highSpecialBonus + + ammoCount = 1 + + -- Check if hog already got bonus helpers + if table.getn(highWeapons[CurHog]) == 0 and highHasBonusHelp == false then + highHasBonusHelp = true + addAmmo = true + end + + -- Pass turn bonus weapons to hog pool + for key, val in pairs(highSpecialPool) do + local idx = table.getn(highHelpers[CurHog]) +1 + highHelpers[CurHog][idx] = val + end + end + + if addAmmo then + local i = 1 + while i <= ammoCount and #bonAmmo > 0 do + local randAmmo = GetRandom(#bonAmmo) +1 + local randAmmoType = bonAmmo[randAmmo] + + -- Remove the randomized weapon so it cannot be picked up twice + table.remove(bonAmmo, randAmmo) + + AddAmmo(CurHog, randAmmoType, GetAmmoCount(CurHog, randAmmoType) +1) + + if IsHogLocal(CurHog) then + local effect = AddVisualGear(GetX(CurHog), GetY(CurHog) + (cratePickupGap * i), vgtAmmo, 0, true) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, randAmmoType, nil, nil, nil, nil) + end + + i = i +1 + end + end + + hpDiff = div(deathMaxHP * highEnemyKillHPBonus, 100) + newHP = curHP + hpDiff + SetHealth(CurHog, newHP) + + local effect = AddVisualGear(GetX(CurHog), GetY(CurHog) - cratePickupGap, vgtHealthTag, hpDiff, false) + -- (vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, GetClanColor(GetHogClan(CurHog))) + -- Friendly fire! Remove all weapons and helpers from pool + else + highWeapons[CurHog] = {} + highHelpers[CurHog] = {} + + hpDiff = div(deathMaxHP * highFriendlyKillHPBonus, 100) + newHP = curHP - hpDiff + if newHP > 0 then + SetHealth(CurHog, newHP) + else + SetHealth(CurHog, 0) + end + + local effect = AddVisualGear(GetX(CurHog), GetY(CurHog) - cratePickupGap, vgtHealthTag, hpDiff, false) + -- (vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, GetClanColor(GetHogClan(CurHog))) + end +end + +function onKingDeath(KingHog) + local team = getHogInfo(KingHog, 'team') + local msgColor = getHogInfo(KingHog, 'clanColor') + + AddCaption(string.format(loc("The king of %s has died!"), team), 0xFFFFFFFF, capgrpGameState) + PlaySound(sndByeBye) + DismissTeam(team) + + -- 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 +end + +function onPointsKill(gear) + local deathVar = getHogInfo(gear, 'variant') + local killVar = getHogInfo(CurHog, 'variant') + local deathClan = getHogInfo(gear, 'clan') + local killClan = getHogInfo(CurHog, 'clan') + local team = getHogInfo(CurHog, 'team') + + local curHP = GetHealth(CurHog) + + -- Killer hog is dead! Don't do anything + if curHP == nil or curHP <= 0 then + return + end + + -- Hog drowned because of water, not enemy + if LastWaterLine ~= WaterLine then + return + end + + -- Same clan, friendly kill, skip + if killClan == deathClan then + return + end + + pointsPerTeam[team]['weapons'] = pointsPerTeam[team]['weapons'] + 2 + pointsPerTeam[team]['helpers'] = pointsPerTeam[team]['helpers'] + 1 + + local effect = AddVisualGear(GetX(CurHog) - (cratePickupGap / 2), GetY(CurHog), vgtHealthTag, 2, false) + -- (vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0xFFFFFFFF) + + local effect = AddVisualGear(GetX(CurHog) + (cratePickupGap / 2), GetY(CurHog), vgtHealthTag, 1, false) + -- (vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0x444444FF) +end + +function onGearDelete(gear) + trackDeletion(gear) + + if GetGearType(gear) == gtCase and band(GetGearMessage(gear), gmDestroy) ~= 0 then + onPickupCrate(gear) + end + + if GetGearType(gear) == gtHedgehog then + if mode ~= 'points' then + hogInfo[gear]['weapons'] = {} + hogInfo[gear]['helpers'] = {} + end + + -- If dying gear is a hog and mode is highland, check for kills + if mode == 'highland' then + onHighlandKill(gear) + -- If current hog is dying and we are on points mode, we need to save the unused weapons/helpers + elseif mode == 'points' and CurHog == gear then + savePoints(gear) + elseif mode == 'points' and CurHog ~= gear then + onPointsKill(gear) + end + + if mode == 'king' and getHogInfo(gear, 'variant') == 'King' then + onKingDeath(gear) + end + end +end + +--[[ + ############################################################################## + ### TURN BASED FUNCTIONS ### + ############################################################################## +]]-- + +function calcKingHP() + local teamKings = {} + local teamHealth = {} + + for hog, val in pairs(hogInfo) do + local hp = GetHealth(hog) + + if hp ~= nil and hp > 0 then + local team = getHogInfo(hog, 'team') + + if teamHealth[team] == nil then + teamHealth[team] = 0 + end + + if getHogInfo(hog, 'variant') == 'King' then + teamKings[team] = hog + else + teamHealth[team] = teamHealth[team] + hp + end + end + end + + for team, hog in pairs(teamKings) do + local hp = GetHealth(hog) + local newHP = div(teamHealth[team] * kingLinkPerc, 100) + local diff = newHP - hp + + -- Set hitpoints to 1 if no other hog is alive or only has 1 hitpoint + if newHP <= 0 then + newHP = 1 + diff = 0 + end + + if diff < 0 then + diff = -diff + end + + if hp ~= newHP then + SetHealth(hog, newHP) + local effect = AddVisualGear(GetX(hog), GetY(hog) - cratePickupGap, vgtHealthTag, diff, false) + -- (vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, GetClanColor(GetHogClan(hog))) + end + end +end + +function setupHogTurn(hog) + clearHogAmmo(hog) + addTurnAmmo(hog) +end + +function onTurnEnd() + local anyHog = nil + for team, val in pairs(teamNames) do + -- Count amount of alive hogs in team + local c = 0 + for idx, hog in pairs(teamHogs[team]) do + if GetHealth(hog) ~= nil then + anyHog = hog + c = c + 1 + end + end + + -- Only one hog left, unfreeze the hog + if c == 1 then + if GetHealth(anyHog) ~= nil then + SetEffect(anyHog, heFrozen, 0) + end + end + end + + -- When we are on points mode count remaining weapon/helper points + if mode == 'points' and GetHealth(CurHog) ~= nil then + savePoints(CurHog) + end + + -- Run random turn events + RandomTurnEvents() +end + +function savePoints(hog) + local team = getHogInfo(hog, 'team') + local hogWepPoints = 0 + local hogHlpPoints = 0 + + for ammoType=0,amAirMine do + local ammoCount = GetAmmoCount(hog, ammoType) + + if pointsWeaponVal[ammoType] ~= nil then + hogWepPoints = hogWepPoints + (pointsWeaponVal[ammoType] * ammoCount) + elseif pointsHelperVal[ammoType] ~= nil then + hogHlpPoints = hogHlpPoints + (pointsHelperVal[ammoType] * ammoCount) + end + end + + local wepWoTax = pointsPerTeam[team]['weaponsFix'] + local hlpWoTax = pointsPerTeam[team]['helpersFix'] + local wepToTax = 0 + local hlpToTax = 0 + + if hogWepPoints <= wepWoTax then + wepWoTax = hogWepPoints + else + wepToTax = hogWepPoints - wepWoTax + end + + if hogHlpPoints <= hlpWoTax then + hlpWoTax = hogHlpPoints + else + hlpToTax = hogHlpPoints - hlpWoTax + end + + if suddenDeath == false then + pointsPerTeam[team]['weapons'] = pointsPerTeam[team]['weaponsRem'] + wepWoTax + div(wepToTax * pointsKeepPerc, 100) + pointsPerTeam[team]['helpers'] = pointsPerTeam[team]['helpersRem'] + hlpWoTax + div(hlpToTax * pointsKeepPerc, 100) + else + pointsPerTeam[team]['weapons'] = pointsPerTeam[team]['weaponsRem'] + wepWoTax + div(wepToTax * pointsKeepSDPerc, 100) + pointsPerTeam[team]['helpers'] = pointsPerTeam[team]['helpersRem'] + hlpWoTax + div(hlpToTax * pointsKeepSDPerc, 100) + end + + local effect = AddVisualGear(GetX(hog) - (cratePickupGap / 2), GetY(hog), vgtHealthTag, pointsPerTeam[team]['weapons'], false) + -- (vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0xFFFFFFFF) + + local effect = AddVisualGear(GetX(hog) + (cratePickupGap / 2), GetY(hog), vgtHealthTag, pointsPerTeam[team]['helpers'], false) + -- (vgUid, X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint) + SetVisualGearValues(effect, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0x444444FF) +end + +function onPointsTurn() + local hogWepPoints = 0 + local hogHlpPoints = 0 + + if suddenDeath == false then + pointsPerTeam[LastTeam]['weapons'] = pointsPerTeam[LastTeam]['weapons'] + pointsWepTurn + pointsPerTeam[LastTeam]['helpers'] = pointsPerTeam[LastTeam]['helpers'] + pointsHlpTurn + + if pointsPerTeam[LastTeam]['weapons'] > pointsWepMax then + pointsPerTeam[LastTeam]['weapons'] = pointsWepMax + end + + if pointsPerTeam[LastTeam]['helpers'] > pointsHlpMax then + pointsPerTeam[LastTeam]['helpers'] = pointsHlpMax + end + else + pointsPerTeam[LastTeam]['weapons'] = pointsPerTeam[LastTeam]['weapons'] + pointsWepSDTurn + pointsPerTeam[LastTeam]['helpers'] = pointsPerTeam[LastTeam]['helpers'] + pointsHlpSDTurn + + if pointsPerTeam[LastTeam]['weapons'] > pointsWepSDMax then + pointsPerTeam[LastTeam]['weapons'] = pointsWepSDMax + end + + if pointsPerTeam[LastTeam]['helpers'] > pointsHlpSDMax then + pointsPerTeam[LastTeam]['helpers'] = pointsHlpSDMax + end + end + + -- Take the first alive hog from LastTeam and setup new weapons and helpers + -- Since the weapons and helpers are shared the whole team, this is sufficent + for idx, teamHog in pairs(teamHogs[LastTeam]) do + if GetHealth(teamHog) ~= nil then + clearHogAmmo(teamHog) + addTurnAmmo(teamHog) + break + end + end +end + +function onNewTurn() + LastHog = CurHog + LastTeam = CurTeam + CurHog = CurrentHedgehog + CurTeam = getHogInfo(CurHog, 'team') + TurnEnded = false + + if suddenDeath == true then + onSuddenDeathTurn() + elseif (TotalRounds + 1 >= 1) then + AddCaption(string.format(loc("Round %d (Sudden Death in round %d)"), (TotalRounds +1), (SuddenDeathTurns +2)), 0xFFFFFFFF, capgrpGameState) + end + + -- Generate new weapons for last hog if it's still alive + if LastHog ~= nil and LastHog ~= CurHog then + if mode == 'points' then + onPointsTurn() + else + hogInfo[LastHog]['weapons'] = {} + hogInfo[LastHog]['helpers'] = {} + setupHogTurn(LastHog) + end + end + + -- Recalculate the kings hp if required + if mode == 'king' then + calcKingHP() + end + + if mode == 'highland' then + highHasBonusWeps = false + highHasBonusHelp = false + end + + -- Set LastWaterLine to the current water line + LastWaterLine = WaterLine +end + +function onGameTick20() + if TurnEnded == false and TurnTimeLeft <= 0 then + TurnEnded = true + onTurnEnd() + end +end + +--[[ + ############################################################################## + ### GAME START FUNCTIONS ### + ############################################################################## +]]-- + +function onAmmoStoreInit() + local lastNum = amAirMine + + for val=0,lastNum do + SetAmmo(val, 0, 0, 0, 0) + end +end + +function onParameters() + parseParams() + + if params['mode'] ~= nil then + mode = params['mode'] + end + + if params['mutate'] ~= nil then + mutate = params['mutate'] + end + + if params['strength'] ~= nil and tonumber(params['strength']) > 0 then + strength = tonumber(params['strength']) + -- Highland + if mode == 'highland' then + highPickupCount = highPickupCount * strength + highPickupSDCount = highPickupSDCount * strength + highHelperCount = highHelperCount * strength + highHelperSDCount = highHelperSDCount * strength + -- Points + elseif mode == 'points' then + pointsWepBase = pointsWepBase * strength + pointsHlpBase = pointsHlpBase * strength + pointsWepTurn = pointsWepTurn * strength + pointsHlpTurn = pointsHlpTurn * strength + pointsWepMax = pointsWepMax * strength + pointsHlpMax = pointsHlpMax * strength + pointsWepSDTurn = pointsWepSDTurn * strength + pointsHlpSDTurn = pointsHlpSDTurn * strength + pointsWepSDMax = pointsWepSDMax * strength + pointsHlpSDMax = pointsHlpSDMax * strength + -- Either king or normal mode, change variants + else + for name, data in pairs(variants) do + variants[name]["weaponLimit"] = variants[name]["weaponLimit"] * strength + variants[name]["helperLimit"] = variants[name]["helperLimit"] * strength + end + end + end + + if params['luck'] ~= nil and tonumber(params['luck']) > 0 then + luck = tonumber(params['luck']) + + healthCrateChance = div(healthCrateChance * luck, 100) + utilCrateChance = div(utilCrateChance * luck, 100) + weaponCrateChance = div(weaponCrateChance * luck, 100) + + healthCrateChanceSD = div(healthCrateChanceSD * luck, 100) + utilCrateChanceSD = div(utilCrateChanceSD * luck, 100) + weaponCrateChanceSD = div(weaponCrateChanceSD * luck, 100) + + emptyCrateChance = div(emptyCrateChance * 100, luck) + bonusCrateChance = div(bonusCrateChance * luck, 100) + end +end + +function onGameStart() + -- If we are not on points mode, we start randomizing everything + if mode ~= 'points' then + if GetGameFlag(gfBorder) or MapHasBorder() then + variants["Air General"] = nil + variants['Athlete'] = nil + end + + if mode == 'king' then + variants['King']['chance'] = 0 + end + + for i=1,8 do + addRandomVariantToTeam("all") + end + + -- Translate randomized team to a flat group + group['all'] = {} + for key, val in pairs(counter["all"]) do + for i=1, counter["all"][key] do + table.insert(group['all'], key) + end + end + + -- Shuffle group for more randomness + shuffle(group['all']) + -- We are in points mode, setup other weapons + elseif mode == 'points' then + --variants['King']['chance'] = 0 + --if variants['Air General'] ~= nil then + -- variants['Air General']['chance'] = 0 + --end + + -- Translate [ammo] -> points to [points] -> {ammo1, ammo2} + for ammoType, ammoPoints in pairs(pointsWeaponVal) do + if pointsToWep[ammoPoints] == nil then + pointsToWep[ammoPoints] = {} + end + + table.insert(pointsToWep[ammoPoints], ammoType) + end + + for ammoType, ammoPoints in pairs(pointsHelperVal) do + if pointsToHlp[ammoPoints] == nil then + pointsToHlp[ammoPoints] = {} + end + + table.insert(pointsToHlp[ammoPoints], ammoType) + end + + for points, ammoList in pairs(pointsToWep) do + table.insert(wepPoints, points) + end + + for points, ammoList in pairs(pointsToHlp) do + table.insert(hlpPoints, points) + end + + table.sort(wepPoints) + table.sort(hlpPoints) + + -- All done, sort the table + --table.sort(pointsToWep) + --table.sort(pointsToHlp) + end + + -- Initial Hog Setup + runOnGears(countTeamHogs) + + for key, val in pairs(teamNames) do + if mode == 'points' then + pointsPerTeam[key] = {} + pointsPerTeam[key]['weapons'] = pointsWepBase + pointsPerTeam[key]['helpers'] = pointsHlpBase + else + setTeamHogs(key) + end + end + + runOnGears(setHogInfo) + + if mode ~= 'points' then + runOnGears(setHogVariant) + runOnGears(setupHogTurn) + if mutate ~= false and mutate ~= 'false' then + runOnGears(MutateHog) + end + end + + if mode == 'points' then + for key, val in pairs(teamNames) do + clearHogAmmo(teamHogs[key][1]) + addTurnAmmo(teamHogs[key][1]) + end + end + + if mode == 'king' then + calcKingHP() + end + + local txt = '' + local icon = 0 + + if mode ~= 'points' then + txt = txt .. loc("Variants: Hogs will be randomized from 12 different variants") .. "|" + txt = txt .. loc("Weapons: Hogs will get 1 out of 3 weapons randomly each turn") .. "|" + txt = txt .. loc("Helpers: Hogs will get 1 out of 2 helpers randomly each turn") .. "|" + txt = txt .. loc("Crates: Crates drop randomly with chance of being empty") .. "|" + txt = txt .. loc("Last Resort: Having less than 25% base health gives kamikaze") .. "|" + txt = txt .. loc("Modifiers: Unlimited ammo, per-hog ammo") .. "|" + else + txt = txt .. loc("Crates: Crates drop randomly and may be empty") .. "|" + txt = txt .. loc("Modifiers: Unlimited ammo, shared clan ammo") .. "|" + end + + if luck ~= 100 then + txt = txt .. string.format(loc("Luck: %d%% (modifier for crates)"), luck) .. "|" + end + + if strength > 1 then + txt = txt .. string.format(loc("Strength: %d (multiplier for ammo)"), strength) .. "|" + end + + if mode == 'highland' then + txt = txt .. " |" + txt = txt .. loc("--- Highland ---").."|" + txt = txt .. string.format(loc("Enemy kills: Collect victim's weapons and +%d%% of its base health"), highEnemyKillHPBonus).."|" + txt = txt .. string.format(loc("Friendly kills: Clear killer's pool and -%d%% of its base health"), highFriendlyKillHPBonus).."|" + txt = txt .. string.format(loc("Turns: Hogs get %d random weapon(s) from their pool"), highPickupCount).."|" + txt = txt .. loc("Hint: Kills won't transfer a hog's pool to the killer's pool").."|" + txt = txt .. loc("Specials: Kings and air generals drop helpers, not weapons").."|" + icon = 1 -- Target + elseif mode == 'king' then + txt = txt .. " |" + txt = txt .. loc("--- King ---").."|" + txt = txt .. loc("Variants: The last hog of each team will be a king").."|" + txt = txt .. string.format(loc("Turns: King's health is set to %d%% of the team health"), kingLinkPerc).."|" + icon = 0 -- Golen Crown + elseif mode == 'points' then + txt = txt .. " |" + txt = txt .. loc("--- Points ---").."|" + txt = txt .. loc("Variants: Kings and air generals are disabled").."|" + txt = txt .. string.format(loc("Weapons: Each team starts with %d weapon points"), pointsWepBase).."|" + txt = txt .. string.format(loc("Helpers: Each team starts with %d helper points"), pointsHlpBase).."|" + txt = txt .. string.format(loc("Turns: Refill %d weapon and %d helper points|and randomize weapons and helpers based on team points"), pointsWepTurn, pointsHlpTurn).."|" + icon = 4 -- Golden Star + else + icon = -amGrenade -- Grenade + end + + --txt = txt .. "Switch: Max. 3 times a game per team, cooldown of 5 turns|" + txt = txt .. " |" + txt = txt .. loc("--- Sudden Death ---").."|" + txt = txt .. loc("Weapons: Nearly every hog variant gets 1 kamikaze").."|" + txt = txt .. loc("Crates: Crates drop more often with a higher chance of bonus ammo").."|" + txt = txt .. loc("Water: Rises by 37 per turn").."|" + txt = txt .. loc("Health: Hogs lose up to 7% base health per turn").."|" + + if mode == 'default' then + txt = txt .. " |" + txt = txt .. loc("--- Hint ---").."|" + txt = txt .. loc("Modes: Activate “highland”, “king” or “points” mode by putting mode=|into the script parameter").."|" + end + + if mode == 'highland' then + txt = txt .. string.format(loc("Highland: Hogs get %d random weapons from their pool"), highPickupSDCount) .. "|" + end + + SetAmmoDescriptionAppendix(amRCPlane, loc("The RC plane only carries 2 weak bombs.")) + SetAmmoDescriptionAppendix(amAirAttack, loc("The air bombs are weaker than usual.")) + SetAmmoDescriptionAppendix(amCake, loc("The explosion is weaker than usual.")) + SetAmmoDescriptionAppendix(amDEagle, loc("Base damage has been modified to 12 per shot.")) + + ShowMission(loc("Battalion"), loc("Less tools, more fun"), txt, icon, 0) +end + +function onGameInit() + --[[ CONFIGURATEABLE FOR PLAYERS ]]-- + --[[ ONCE IT HAS BEEN ADDED TO HW ]]-- + + --[[ REQUIRED CONFIGURATIONS ]]-- + + WaterRise = 37 -- Water rises by 37 + HealthDecrease = 0 -- No health decrease by game, script with 7% + CaseFreq = 0 -- don't spawn crates + + -- Removed gfResetWeps to see weapons next turn + EnableGameFlags(gfInfAttack) + DisableGameFlags(gfResetWeps) + + if mode ~= 'points' then + EnableGameFlags(gfPerHogAmmo) + else + DisableGameFlags(gfPerHogAmmo) + end +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Capture_the_Flag.lua Sun Dec 17 00:09:24 2017 +0100 @@ -3,6 +3,9 @@ -- by mikade --------------------------------------- +---- Script parameter +-- With “captures=” you can set your own capture limit, e.g. “captures=5” for 5 captures. + -- Version History --------- -- 0.1 @@ -76,6 +79,7 @@ -- enable awesome translaction support so we can use loc() wherever we want HedgewarsScriptLoad("/Scripts/Locale.lua") +HedgewarsScriptLoad("/Scripts/Params.lua") --------------------------------------------------------------- ----------lots of bad variables and things @@ -85,6 +89,7 @@ local gameStarted = false local gameTurns = 0 +local captureLimit = 3 -------------------------- -- hog and team tracking variales @@ -140,7 +145,7 @@ alt = 0 end - if fCaptures[teamID] == 3 then + if fCaptures[teamID] == captureLimit then for i = 0, (numhhs-1) do if hhs[i] ~= nil then if GetHogClan(hhs[i]) == alt then @@ -150,7 +155,8 @@ end end if CurrentHedgehog ~= nil then - ShowMission(loc("GAME OVER!"), loc("Victory for the ") .. GetHogTeamName(CurrentHedgehog), loc("Hooray!"), 0, 0) + AddCaption(string.format(loc("Victory for %s!"), GetHogTeamName(CurrentHedgehog))) + showMissionAndScorebar() end end @@ -177,8 +183,9 @@ fIsMissing[bbq] = false fNeedsRespawn[bbq] = true fCaptures[wtf] = fCaptures[wtf] +1 - ShowMission(loc("You have SCORED!!"), GetHogTeamName(CurrentHedgehog) .. ": " .. fCaptures[wtf], loc("Opposing Team: ") .. fCaptures[bbq], 0, 0) - PlaySound(sndVictory) + AddCaption(string.format(loc("%s has scored!"), GetHogName(CurrentHedgehog))) + showMissionAndScorebar() + PlaySound(sndHomerun) fThief[bbq] = nil -- player no longer has the enemy flag CheckScore(wtf) @@ -442,22 +449,66 @@ -- game methods ------------------------ +function onParameters() + parseParams() + if params["captures"] ~= nil then + local s = string.match(params["captures"], "(%d*)") + if s ~= nil then + captureLimit = math.max(1, tonumber(s)) + end + end +end + function onGameInit() - DisableGameFlags(gfKing, gfForts) + DisableGameFlags(gfKing) EnableGameFlags(gfDivideTeams) - --SuddenDeathTurns = 999 -- suddendeath is off, effectively + -- Disable Sudden Death WaterRise = 0 + HealthDecrease = 0 + Delay = 10 end +function showMissionAndScorebar(instaHide) + local captures + if captureLimit == 1 then + captures = string.format(loc("- First team to capture the flag wins"), captureLimit) + else + captures = string.format(loc("- First team to score %d captures wins"), captureLimit) + end + + local rules = loc("Rules:") .. " |" .. + loc("- Place your team flag at the end of your first turn") .. "|" .. + loc("- Return the enemy flag to your base to score") .."|".. + captures .. "|" .. + 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") + + local scoreboard = "" + + if gameStarted then + scoreboard = "|" .. loc("Scores: ") .. "|" + for i=0, 1 do + scoreboard = scoreboard .. string.format(loc("%s: %d"), teamNameArr[i], fCaptures[i]) + if i~=1 then scoreboard = scoreboard .. "|" end + end + end + local mission = rules .. scoreboard + + ShowMission(loc("Capture The Flag"), loc("A Hedgewars minigame"), mission, 0, 0) + if instaHide then + HideMission() + end +end function onGameStart() - --ShowMission(loc(caption), loc(subcaption), loc(goal), 0, 0) - ShowMission(loc("CAPTURE THE FLAG"), loc("Flags, and their home base will be placed where each team ends their first turn."), "", 0, 0) + showMissionAndScorebar() RebuildTeamInfo() @@ -496,10 +547,9 @@ HandleRespawns() --new method of placing starting flags elseif gameTurns == 1 then - ShowMission(loc("CAPTURE THE FLAG"), loc("Flags, and their home base will be placed where each team ends their first turn."), "", 0, 0) + showMissionAndScorebar() elseif gameTurns == 2 then fPlaced[0] = true - ShowMission(loc("CAPTURE THE FLAG"), loc("RULES OF THE GAME [Press ESC to view]"), 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) elseif gameTurns == 3 then fPlaced[1] = true StartTheGame() @@ -544,8 +594,10 @@ i = 1 end - fSpawnX[i] = GetX(CurrentHedgehog) - fSpawnY[i] = GetY(CurrentHedgehog) + if TurnTimeLeft == 0 then + fSpawnX[i] = GetX(CurrentHedgehog) + fSpawnY[i] = GetY(CurrentHedgehog) + end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.hwp Binary file share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.hwp has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Construction_Mode.lua Sun Dec 17 00:09:24 2017 +0100 @@ -30,11 +30,16 @@ -- -- Possible keys: --- initialenergy: Amount of energy that each team starts with (default: 550) +--- Note: Must be smaller than or equal to maxenergy --- energyperround: Amount of energy that each team gets per round (default: 50) --- maxenergy: Maximum amount of energy each team can hold (default: 1000) +--- cratesperround: Maximum number of crates you can place per round (default: 5) + +-- For the previous 2 keys, you can use the value “inf” for an unlimited amount -- Example: “initialenergy=750, maxenergy=2000” starts thee game with 750 energy --- and sets the maximum energy to 2000 +-- and sets the maximum energy to 2000. +-- Example: “craterperround=inf” disables the crate placement limit. ------------------------------------------------------------------------------ --version history @@ -191,7 +196,7 @@ wCol = {} margin = 20 -vTag = {} +clanPowerTag = nil lastWep = nil checkForSpecialWeaponsIn = -1 @@ -200,44 +205,25 @@ conf_initialEnergy = 550 conf_energyPerRound = 50 conf_maxEnergy = 1000 - -function HideTags() +conf_cratesPerRound = 5 - for i = 0, 2 do - SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00) - end - -end - -function DrawTag(i) +function DrawClanPowerTag() zoomL = 1.3 xOffset = 40 - if i == 0 then - yOffset = 40 - tCol = 0xffba00ff - tValue = 30 - elseif i == 1 then - zoomL = 1.1 - xOffset = 45 - yOffset = 70 - tCol = 0x00ff00ff - tValue = clanPower[GetHogClan(CurrentHedgehog)] - elseif i == 2 then - zoomL = 1.1 - xOffset = 60 + 35 - yOffset = 70 - tCol = 0xa800ffff - tValue = 10 - end + zoomL = 1.1 + xOffset = 45 + yOffset = 70 + tCol = 0x00ff00ff + tValue = clanPower[GetHogClan(CurrentHedgehog)] - DeleteVisualGear(vTag[i]) - vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i]) + DeleteVisualGear(clanPowerTag) + clanPowerTag = AddVisualGear(0, 0, vgtHealthTag, 0, false) + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(clanPowerTag) SetVisualGearValues ( - vTag[i], --id + clanPowerTag, --id -div(ScreenWidth,2) + xOffset, --xoffset ScreenHeight - yOffset, --yoffset 0, --dx @@ -256,9 +242,7 @@ -- redraw Tags so that their screen locations are updated if (CurrentHedgehog ~= nil) then - DrawTag(0) - DrawTag(1) - DrawTag(2) + DrawClanPowerTag() end end @@ -619,6 +603,9 @@ function CheckProximity(gear) dist = GetDistFromGearToXY(gear, GetX(strucGear[tempID]), GetY(strucGear[tempID])) + if not dist then + return + end -- calculate my real radius if I am an aura if strucCircType[tempID] == 0 then @@ -911,14 +898,8 @@ function checkForSpecialWeapons() - - - if (GetCurAmmoType() == amAirAttack) then - AddCaption(loc("Structure Placement Tool"),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo) - elseif (GetCurAmmoType() == amDrillStrike) then - AddCaption(loc("Object Placement Tool"),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo) - elseif (GetCurAmmoType() == amNapalm) then - AddCaption(loc("Crate Placement Tool"),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo) + if (GetCurAmmoType() == amDrillStrike) then + AddCaption(loc("Object Placer"),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpAmmoinfo) end lastWep = GetCurAmmoType() @@ -943,39 +924,39 @@ placeholder = 20 atkArray = { - {amBazooka, "amBazooka", 0, loc("Bazooka"), 2*placeholder}, + {amBazooka, "amBazooka", 0, 2*placeholder}, --{amBee, "amBee", 0, loc("Homing Bee"), 4*placeholder}, - {amMortar, "amMortar", 0, loc("Mortar"), 1*placeholder}, - {amDrill, "amDrill", 0, loc("Drill Rocket"), 3*placeholder}, - {amSnowball, "amSnowball", 0, loc("Mudball"), 3*placeholder}, + {amMortar, "amMortar", 0, 1*placeholder}, + {amDrill, "amDrill", 0, 3*placeholder}, + {amSnowball, "amSnowball", 0, 3*placeholder}, - {amGrenade, "amGrenade", 0, loc("Grenade"), 2*placeholder}, - {amClusterBomb, "amClusterBomb", 0, loc("Cluster Bomb"), 3*placeholder}, - {amWatermelon, "amWatermelon", 0, loc("Watermelon Bomb"), 25*placeholder}, - {amHellishBomb, "amHellishBomb", 0, loc("Hellish hand-grenade"), 25*placeholder}, - {amMolotov, "amMolotov", 0, loc("Molotov Cocktail"), 3*placeholder}, - {amGasBomb, "amGasBomb", 0, loc("Old Limburger"), 3*placeholder}, + {amGrenade, "amGrenade", 0, 2*placeholder}, + {amClusterBomb, "amClusterBomb", 0, 3*placeholder}, + {amWatermelon, "amWatermelon", 0, 25*placeholder}, + {amHellishBomb, "amHellishBomb", 0, 25*placeholder}, + {amMolotov, "amMolotov", 0, 3*placeholder}, + {amGasBomb, "amGasBomb", 0, 3*placeholder}, - {amShotgun, "amShotgun", 0, loc("Shotgun"), 2*placeholder}, - {amDEagle, "amDEagle", 0, loc("Desert Eagle"), 2*placeholder}, - {amSniperRifle, "amSniperRifle", 0, loc("Sniper Rifle"), 3*placeholder}, + {amShotgun, "amShotgun", 0, 2*placeholder}, + {amDEagle, "amDEagle", 0, 2*placeholder}, + {amSniperRifle, "amSniperRifle", 0, 3*placeholder}, --{amSineGun, "amSineGun", 0, loc("Sine Gun"), 6*placeholder}, - {amFlamethrower,"amFlamethrower", 0, loc("Flamethrower"), 4*placeholder}, - {amIceGun, "amIceGun", 0, loc("Freezer"), 15*placeholder}, + {amFlamethrower,"amFlamethrower", 0, 4*placeholder}, + {amIceGun, "amIceGun", 0, 15*placeholder}, - {amFirePunch, "amFirePunch", 0, loc("Shoryuken"), 3*placeholder}, - {amWhip, "amWhip", 0, loc("Whip"), 1*placeholder}, - {amBaseballBat, "amBaseballBat", 0, loc("Baseball Bat"), 7*placeholder}, + {amFirePunch, "amFirePunch", 0, 3*placeholder}, + {amWhip, "amWhip", 0, 1*placeholder}, + {amBaseballBat, "amBaseballBat", 0, 7*placeholder}, --{amKamikaze, "amKamikaze", 0, loc("Kamikaze"), 1*placeholder}, - {amSeduction, "amSeduction", 0, loc("Seduction"), 1*placeholder}, - {amHammer, "amHammer", 0, loc("Hammer"), 1*placeholder}, + {amSeduction, "amSeduction", 0, 1*placeholder}, + {amHammer, "amHammer", 0, 1*placeholder}, - {amMine, "amMine", 0, loc("Mine"), 1*placeholder}, - {amDynamite, "amDynamite", 0, loc("Dynamite"), 9*placeholder}, - {amCake, "amCake", 0, loc("Cake"), 25*placeholder}, - {amBallgun, "amBallgun", 0, loc("Ballgun"), 40*placeholder}, + {amMine, "amMine", 0, 1*placeholder}, + {amDynamite, "amDynamite", 0, 9*placeholder}, + {amCake, "amCake", 0, 25*placeholder}, + {amBallgun, "amBallgun", 0, 40*placeholder}, --{amRCPlane, "amRCPlane", 0, loc("RC Plane"), 25*placeholder}, - {amSMine, "amSMine", 0, loc("Sticky Mine"), 5*placeholder}, + {amSMine, "amSMine", 0, 5*placeholder}, --{amAirAttack, "amAirAttack", 0, loc("Air Attack"), 10*placeholder}, --{amMineStrike, "amMineStrike", 0, loc("Mine Strike"), 15*placeholder}, @@ -983,36 +964,38 @@ --{amPiano, "amPiano", 0, loc("Piano Strike"), 40*placeholder}, --{amDrillStrike, "amDrillStrike", 0, loc("Drill Strike"), 15*placeholder}, - {amKnife, "amKnife", 0, loc("Cleaver"), 2*placeholder}, + {amPickHammer, "amPickHammer", 0, 2*placeholder}, + {amBlowTorch, "amBlowTorch", 0, 4*placeholder}, + {amKnife, "amKnife", 0, 2*placeholder}, - {amBirdy, "amBirdy", 0, loc("Birdy"), 7*placeholder} + {amBirdy, "amBirdy", 0, 7*placeholder}, + + {amDuck, "amDuck", 0, 2*placeholder} } utilArray = { - {amPickHammer, "amPickHammer", 0, loc("Pick Hammer"), 2*placeholder}, - {amBlowTorch, "amBlowTorch", 0, loc("Blow Torch"), 4*placeholder}, --{amGirder, "amGirder", 0, loc("Girder"), 4*placeholder}, - {amLandGun, "amLandGun", 0, loc("Land Spray"), 5*placeholder}, + {amLandGun, "amLandGun", 0, 5*placeholder}, --{amRubber, "amRubber", 0, loc("Rubber"), 5*placeholder}, - {amRope, "amRope", 0, loc("Rope"), 7*placeholder}, - {amParachute, "amParachute", 0, loc("Parachute"), 2*placeholder}, + {amRope, "amRope", 0, 7*placeholder}, + {amParachute, "amParachute", 0, 2*placeholder}, --{amTeleport, "amTeleport", 0, loc("Teleport"), 6*placeholder}, - {amJetpack, "amJetpack", 0, loc("Flying Saucer"), 8*placeholder}, - {amPortalGun, "amPortalGun", 0, loc("Portable Portal Device"), 15*placeholder}, + {amJetpack, "amJetpack", 0, 8*placeholder}, + {amPortalGun, "amPortalGun", 0, 15*placeholder}, - {amInvulnerable, "amInvulnerable", 0, loc("Invulnerable"), 5*placeholder}, - {amLaserSight, "amLaserSight", 0, loc("Laser Sight"), 2*placeholder}, - {amVampiric, "amVampiric", 0, loc("Vampirism"), 6*placeholder}, + {amInvulnerable, "amInvulnerable", 0, 5*placeholder}, + {amLaserSight, "amLaserSight", 0, 2*placeholder}, + {amVampiric, "amVampiric", 0, 6*placeholder}, --{amResurrector, "amResurrector", 0, loc("Resurrector"), 8*placeholder}, --{amTardis, "amTardis", 0, loc("Time Box"), 2*placeholder}, --{amSwitch, "amSwitch", 0, loc("Switch Hog"), 4*placeholder} - {amLowGravity, "amLowGravity", 0, loc("Low Gravity"), 4*placeholder}, - {amExtraDamage, "amExtraDamage", 0, loc("Extra Damage"), 6*placeholder}, - {amExtraTime, "amExtraTime", 0, loc("Extra Time"), 8*placeholder} + {amLowGravity, "amLowGravity", 0, 4*placeholder}, + {amExtraDamage, "amExtraDamage", 0, 6*placeholder}, + {amExtraTime, "amExtraTime", 0, 8*placeholder} } @@ -1078,6 +1061,9 @@ function GetDistFromGearToXY(gear, g2X, g2Y) g1X, g1Y = GetGearPosition(gear) + if not g1X then + return nil + end q = g1X - g2X w = g1Y - g2Y @@ -1112,60 +1098,78 @@ placedSpec[placedCount] = pMode[pIndex] if (clanUsedExtraTime[GetHogClan(CurrentHedgehog)] == true) and (cat[cIndex] == "Utility Crate Placement Mode") and (utilArray[pIndex][1] == amExtraTime) then - AddCaption(loc("You may only spawn 1 Extra Time per turn."),0xffba00ff,capgrpVolume) + AddCaption(loc("You may only place 1 Extra Time crate per turn."),0xffba00ff,capgrpVolume) PlaySound(sndDenied) - elseif (clanCratesSpawned[GetHogClan(CurrentHedgehog)] > 4) and ( (cat[cIndex] == "Health Crate Placement Mode") or (cat[cIndex] == "Utility Crate Placement Mode") or (cat[cIndex] == "Weapon Crate Placement Mode") ) then - AddCaption(loc("You may only spawn 5 crates per turn."),0xffba00ff,capgrpVolume) + elseif (conf_cratesPerRound ~= "inf" and clanCratesSpawned[GetHogClan(CurrentHedgehog)] >= conf_cratesPerRound) and ( (cat[cIndex] == "Health Crate Placement Mode") or (cat[cIndex] == "Utility Crate Placement Mode") or (cat[cIndex] == "Weapon Crate Placement Mode") ) then + AddCaption(string.format(loc("You may only place %d crates per round."), conf_cratesPerRound),0xffba00ff,capgrpVolume) PlaySound(sndDenied) elseif (XYisInRect(x,y, clanBoundsSX[GetHogClan(CurrentHedgehog)],clanBoundsSY[GetHogClan(CurrentHedgehog)],clanBoundsEX[GetHogClan(CurrentHedgehog)],clanBoundsEY[GetHogClan(CurrentHedgehog)]) == true) and (clanPower[GetHogClan(CurrentHedgehog)] >= placedExpense) then - - - + -- For checking if the actual placement succeeded + local placed = false if cat[cIndex] == "Girder Placement Mode" then - PlaceGirder(x, y, CGR) + placed = PlaceGirder(x, y, CGR) placedSpec[placedCount] = CGR elseif cat[cIndex] == "Rubber Placement Mode" then - PlaceSprite(x,y, sprAmRubber, CGR, nil, nil, nil, nil, lfBouncy) + placed = PlaceRubber(x, y, CGR) placedSpec[placedCount] = CGR elseif cat[cIndex] == "Health Crate Placement Mode" then gear = SpawnHealthCrate(x,y) - SetHealth(gear, pMode[pIndex]) - setGearValue(gear,"caseType","med") - clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1 + if gear ~= nil then + placed = true + SetHealth(gear, pMode[pIndex]) + setGearValue(gear,"caseType","med") + clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1 + end elseif cat[cIndex] == "Weapon Crate Placement Mode" then gear = SpawnAmmoCrate(x, y, atkArray[pIndex][1]) - placedSpec[placedCount] = atkArray[pIndex][2] - setGearValue(gear,"caseType","ammo") - setGearValue(gear,"contents",atkArray[pIndex][2]) - clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1 + if gear ~= nil then + placed = true + placedSpec[placedCount] = atkArray[pIndex][2] + setGearValue(gear,"caseType","ammo") + setGearValue(gear,"contents",atkArray[pIndex][2]) + clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1 + end elseif cat[cIndex] == "Utility Crate Placement Mode" then gear = SpawnUtilityCrate(x, y, utilArray[pIndex][1]) - placedSpec[placedCount] = utilArray[pIndex][2] - setGearValue(gear,"caseType","util") - setGearValue(gear,"contents",utilArray[pIndex][2]) - if utilArray[pIndex][1] == amExtraTime then - clanUsedExtraTime[GetHogClan(CurrentHedgehog)] = true + if gear ~= nil then + placed = true + placedSpec[placedCount] = utilArray[pIndex][2] + setGearValue(gear,"caseType","util") + setGearValue(gear,"contents",utilArray[pIndex][2]) + if utilArray[pIndex][1] == amExtraTime then + clanUsedExtraTime[GetHogClan(CurrentHedgehog)] = true + end + clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1 end - clanCratesSpawned[GetHogClan(CurrentHedgehog)] = clanCratesSpawned[GetHogClan(CurrentHedgehog)] +1 elseif cat[cIndex] == "Barrel Placement Mode" then gear = AddGear(x, y, gtExplosives, 0, 0, 0, 0) - SetHealth(gear, pMode[pIndex]) + if gear ~= nil then + placed = true + SetHealth(gear, pMode[pIndex]) + end elseif cat[cIndex] == "Mine Placement Mode" then gear = AddGear(x, y, gtMine, 0, 0, 0, 0) - SetTimer(gear, pMode[pIndex]) + if gear ~= nil then + placed = true + SetTimer(gear, pMode[pIndex]) + end elseif cat[cIndex] == "Sticky Mine Placement Mode" then gear = AddGear(x, y, gtSMine, 0, 0, 0, 0) - + placed = gear ~= nil elseif cat[cIndex] == "Structure Placement Mode" then - AddStruc(x,y, pMode[pIndex],GetHogClan(CurrentHedgehog)) - + placed = true end - clanPower[GetHogClan(CurrentHedgehog)] = clanPower[GetHogClan(CurrentHedgehog)] - placedExpense - placedCount = placedCount + 1 + if placed then + clanPower[GetHogClan(CurrentHedgehog)] = clanPower[GetHogClan(CurrentHedgehog)] - placedExpense + placedCount = placedCount + 1 + else + AddCaption(loc("Invalid Placement"),0xffba00ff,capgrpVolume) + PlaySound(sndDenied) + end else if (clanPower[GetHogClan(CurrentHedgehog)] >= placedExpense) then @@ -1203,14 +1207,14 @@ placedExpense = 5 elseif cat[cIndex] == "Weapon Crate Placement Mode" then for i = 1, #atkArray do - pMode[i] = atkArray[i][4] + pMode[i] = GetAmmoName(atkArray[i][1]) end - placedExpense = atkArray[pIndex][5] + placedExpense = atkArray[pIndex][4] elseif cat[cIndex] == "Utility Crate Placement Mode" then for i = 1, #utilArray do - pMode[i] = utilArray[i][4] + pMode[i] = GetAmmoName(utilArray[i][1]) end - placedExpense = utilArray[pIndex][5] + placedExpense = utilArray[pIndex][4] elseif cat[cIndex] == "Mine Placement Mode" then pMode = {0,1000,2000,3000,4000,5000} placedExpense = 15 @@ -1250,7 +1254,7 @@ if GameTime % 100 == 0 then - DrawTag(1) + DrawClanPowerTag() curWep = GetCurAmmoType() @@ -1378,9 +1382,9 @@ elseif pMode[pIndex] == loc("Reflector Shield") then placedExpense = 200 elseif cat[cIndex] == "Weapon Crate Placement Mode" then - placedExpense = atkArray[pIndex][5] + placedExpense = atkArray[pIndex][4] elseif cat[cIndex] == "Utility Crate Placement Mode" then - placedExpense = utilArray[pIndex][5] + placedExpense = utilArray[pIndex][4] end AddCaption(loc("Cost") .. ": " .. placedExpense,0xffba00ff,capgrpAmmostate) @@ -1513,7 +1517,10 @@ ---------------------------- -- Parses a positive integer -function parseInt(str, default) +function parseInt(str, default, infinityPermitted) + if str == "inf" and infinityPermitted then + return "inf" + end if str == nil then return default end local s = string.match(str, "(%d*)") if s ~= nil then @@ -1528,11 +1535,8 @@ parseParams() conf_initialEnergy = parseInt(params["initialenergy"], conf_initialEnergy) conf_energyPerRound = parseInt(params["energyperround"], conf_energyPerRound) - if params["maxenergy"] == "inf" then - conf_maxEnergy = "inf" - else - conf_maxEnergy = parseInt(params["maxenergy"], conf_maxEnergy) - end + conf_maxEnergy = parseInt(params["maxenergy"], conf_maxEnergy, true) + conf_cratesPerRound = parseInt(params["cratesperround"], conf_cratesPerRound, true) end function onGameInit() @@ -1541,8 +1545,10 @@ MinesNum = 0 EnableGameFlags(gfInfAttack) + -- This is a hack to make sure all girder/rubber placement is handled by Construction Mode to overwrite the default behaviour + SetMaxBuildDistance(1) - fortMode = (MapGen == mgForts) or GetGameFlag(gfForts) + fortMode = MapGen == mgForts -- if there are forts, let engine place the hogs on them if fortMode then @@ -1576,27 +1582,43 @@ loc("a Hedgewars mini-game"), loc("Build a fortress and destroy your enemy.") .. "|" .. loc("There are a variety of structures available to aid you.") .. "|" .. - loc("Use the air-attack weapons and the arrow keys to select structures.") .. "|" .. - " " .. "|" .. - loc("Healing Station") .. ": " .. loc("Grants nearby hogs life-regeneration.") .. "|" .. - loc("Bio-Filter") .. ": " .. loc("Aggressively removes enemy hedgehogs.") .. "|" .. - loc("Weapon Filter") .. ": " .. loc("Dematerializes weapons and equipment carried by enemy hedgehogs.") .. "|" .. - loc("Reflector Shield") .. ": " .. loc("Reflects enemy projectiles.") .. "|" .. - - loc("Generator") .. ": " .. loc("Generates power.") .. "|" .. - loc("Respawner") .. ": " .. loc("Resurrects dead hedgehogs.") .. "|" .. - loc("Teleportation Node") .. ": " .. loc("Allows free teleportation between other nodes.") .. "|" .. - loc("Construction Station") .. ": " .. loc("Allows placement of girders, rubber-bands, mines, sticky mines and barrels.") .. "|" .. - loc("Support Station") .. ": " .. loc("Allows the placement of weapons, utiliites, and health crates.") + loc("Use the structure placer to place structures.") , 4, 5000 ) + SetAmmoTexts(amAirAttack, loc("Structure Placer"), loc("Construction Mode tool"), loc("Build one of multiple different structures|to aid you in victory, at the cost of energy.") .. "| |" .. + loc("Healing Station: Heals nearby hogs.") .. "|" .. + loc("Bio-Filter: Aggressively removes enemies.") .. "|" .. + loc("Weapon Filter: Dematerializes all ammo| carried by enemies entering it.") .. "|" .. + loc("Reflector Shield: Reflects enemy projectiles.") .. "|" .. + loc("Generator: Generates energy.") .. "|" .. + loc("Respawner: Resurrects dead hogs.") .. "|" .. + loc("Teleportation Node: Allows teleportation| between other nodes.") .. "|" .. + loc("Construction Station: Allows placement of| girders, rubber, mines, sticky mines| and barrels.") .. "|" .. + loc("Support Station: Allows placement of crates.") .. "| |" .. + loc("Left/right: Choose structure type|Cursor: Build structure")) + + local txt_crateLimit = "" + if conf_cratesPerRound ~= "inf" then + txt_crateLimit = string.format(loc("You may only place %d crates per round."), conf_cratesPerRound) .. "|" + end + + SetAmmoTexts(amNapalm, loc("Crate Placer"), loc("Construction Mode tool"), + loc("This allows you to create a crate anywhere|within your clan's area of influence,|at the cost of energy.") .. "|" .. + txt_crateLimit .. + loc("Up/down: Choose crate type") .. "|" .. + loc("Left/right: Choose crate contents") .. "|" .. + loc("|Cursor: Place crate")) + SetAmmoTexts(amDrillStrike, loc("Object Placer"), loc("Construction Mode tool"), loc("This allows you to create and place mines,|sticky mines and barrels anywhere within your|clan's area of influence at the cost of energy.|Up/down: Choose object type|Left/right: Choose timer (for mines)|Cursor: Place object")) + + SetAmmoDescriptionAppendix(amTeleport, loc("It only works in teleportation nodes of your own clan.")) + sCirc = AddVisualGear(0,0,vgtCircle,0,true) SetVisualGearValues(sCirc, 0, 0, 100, 255, 1, 10, 0, 40, 3, 0x00000000) for i = 0, ClansCount-1 do - clanPower[i] = conf_initialEnergy + clanPower[i] = math.min(conf_initialEnergy, conf_maxEnergy) clanLWepIndex[i] = 1 -- for ease of use let's track this stuff clanLUtilIndex[i] = 1 clanLGearIndex[i] = 1 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Continental_supplies.lua Sun Dec 17 00:09:24 2017 +0100 @@ -904,7 +904,7 @@ then AddAmmo(CurrentHedgehog,amSwitch,GetAmmoCount(CurrentHedgehog, amSwitch)+1) - ParseCommand("setweap " .. string.char(amSwitch)) + SetWeapon(amSwitch) GLOBAL_TEMP_VALUE=87 end end @@ -1228,7 +1228,7 @@ function onSlot(slot) if(GLOBAL_TEAM_CONTINENT[GetHogTeamName(CurrentHedgehog)]==0) then - ParseCommand("setweap " .. string.char(amSkip)) + SetWeapon(amSkip) end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Frenzy.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Frenzy.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Frenzy.lua Sun Dec 17 00:09:24 2017 +0100 @@ -4,37 +4,36 @@ ------------------------------------------- HedgewarsScriptLoad("/Scripts/Locale.lua") -HedgewarsScriptLoad("/Scripts/Tracker.lua") local cTimer = 0 local cn = 0 -function initialSetup(gear) - SetHealth(gear, 75) -- official is 80, but that assumes bazookas/grenades that do 50 damage -end +local frenzyAmmos = { + amBazooka, + amGrenade, + amMolotov, + amShotgun, + amFirePunch, + amMine, + amJetpack, + amBlowTorch, + amTeleport, + amLowGravity +} function showStartingInfo() ruleSet = "" .. - loc("RULES") .. ": " .. "|" .. + 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)") .. "|" .. - " |" .. - loc("SLOTS") .. ": " .. "|" .. - loc("Slot") .. " 1 - " .. loc("Bazooka") .. "|" .. - loc("Slot") .. " 2 - " .. loc("Grenade") .. "|" .. - loc("Slot") .. " 3 - " .. loc("Shotgun") .. "|" .. - loc("Slot") .. " 4 - " .. loc("Shoryuken") .. "|" .. - loc("Slot") .. " 5 - " .. loc("Mine") .. "|" .. - loc("Slot") .. " 6 - " .. loc("Teleport") .. "|" .. - loc("Slot") .. " 7 - " .. loc("Blowtorch") .. "|" .. - loc("Slot") .. " 8 - " .. loc("Flying Saucer") .. "|" .. - loc("Slot") .. " 9 - " .. loc("Molotov") .. "|" .. - loc("Slot") .. " 10 - " .. loc("Low Gravity") + 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 ShowMission(loc("FRENZY"), - loc("a frenetic Hedgewars mini-game"), + loc("A frenetic Hedgewars mini-game"), ruleSet, 0, 4000) end @@ -68,7 +67,6 @@ function onGameStart() showStartingInfo() - runOnHogs(initialSetup) end function onSlot(sln) @@ -87,56 +85,19 @@ end end +-- Keyboard slot shortcuts function ChangeWep(s) - if s == 0 then - SetWeapon(amBazooka) - elseif s == 1 then - SetWeapon(amGrenade) - elseif s == 2 then - SetWeapon(amShotgun) - elseif s == 3 then - SetWeapon(amFirePunch) - elseif s == 4 then - SetWeapon(amMine) - elseif s == 5 then - SetWeapon(amTeleport) - elseif s == 6 then - SetWeapon(amBlowTorch) - elseif s == 7 then - SetWeapon(amJetpack) - elseif s == 8 then - SetWeapon(amMolotov) - elseif s == 9 then - SetWeapon(amLowGravity) + if s >= 0 and s <= 9 then + SetWeapon(frenzyAmmos[s+1]) end end -function onGearAdd(gear) - if GetGearType(gear) == gtHedgehog then - trackGear(gear) +function onAmmoStoreInit() + -- Add frenzy ammos + for i=1, #frenzyAmmos do + SetAmmo(frenzyAmmos[i], 9, 0, 0, 0) end -end - -function onGearDelete(gear) - if GetGearType(gear) == gtHedgehog then - trackDeletion(gear) - end + SetAmmo(amSkip, 9, 0, 0, 0) end - -function onAmmoStoreInit() - SetAmmo(amBazooka, 9, 0, 0, 0) - SetAmmo(amGrenade, 9, 0, 0, 0) - SetAmmo(amMolotov, 9, 0, 0, 0) - SetAmmo(amShotgun, 9, 0, 0, 0) - --SetAmmo(amFlamethrower, 9, 0, 0, 0) -- this was suggested on hw.org but it's not present on base - SetAmmo(amFirePunch, 9, 0, 0, 0) - SetAmmo(amMine, 9, 0, 0, 0) - --SetAmmo(amCake, 1, 0, 2, 0) -- maybe it's beefcake? - SetAmmo(amJetpack, 9, 0, 0, 0) - SetAmmo(amBlowTorch, 9, 0, 0, 0) - SetAmmo(amTeleport, 9, 0, 0, 0) - SetAmmo(amLowGravity, 9, 0, 0, 0) - --SetAmmo(amSkipGo, 9, 0, 0, 0) -- not needed with 1s turn time -end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Gravity.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Gravity.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Gravity.lua Sun Dec 17 00:09:24 2017 +0100 @@ -4,19 +4,35 @@ local gravity = 100 local mingravity local maxgravity +local mingravity_normal +local maxgravity_normal +local mingravity_low +local maxgravity_low local delta = 0 local period local periodtimer = 0 local wdGameTicks = 0 local wdTTL = 0 local mln = 1000000 +local lowGravityUsed = false local script2_onNewTurn local script2_onGameTick20 -local script2_onGameStart +local script2_onGameInit +local script2_onHogAttack function grav_onNewTurn() + lowGravityUsed = false + if maxgravity_normal == nil then + gravity = mingravity_normal + else + mingravity = mingravity_normal + maxgravity = maxgravity_normal + if period > 0 then + delta = div(maxgravity_normal - mingravity_normal, period) + end + end if delta ~= nil and period == nil then SetGravity(gravity) else @@ -72,13 +88,27 @@ function onParameters() parseParams() - gravity = params["g"] + gravity = tonumber(params["g"]) or gravity - mingravity = gravity - maxgravity = params["g2"] + mingravity_normal = gravity + if mingravity_normal > 0 then + mingravity_low = div(mingravity_normal, 2) + else + mingravity_low = mingravity_normal * 2 + end + mingravity = mingravity_normal + if type(tonumber(params["g2"])) == "number" then + maxgravity_normal = tonumber(params["g2"]) + if maxgravity_normal > 0 then + maxgravity_low = div(maxgravity_normal, 2) + else + maxgravity_low = maxgravity_normal * 2 + end + maxgravity = maxgravity_normal + end period = params["period"] - if mingravity ~= nil and maxgravity ~= nil then + if type(mingravity) == "number" and type(maxgravity) == "number" then if period ~= nil then period = div(period, 40) else @@ -86,26 +116,27 @@ end mingravity = mingravity * mln + mingravity_normal = mingravity_normal * mln + mingravity_low = mingravity_low * mln maxgravity = maxgravity * mln + maxgravity_normal = maxgravity_normal * mln + maxgravity_low = maxgravity_low * mln - -- note: mingravity and maxgravity MUST NOT be strings at this point if mingravity > maxgravity then mingravity, maxgravity = maxgravity, mingravity + mingravity_normal, maxgravity_normal = maxgravity_normal, mingravity_normal + mingravity_low, maxgravity_low = maxgravity_low, mingravity_low end gravity = mingravity if period > 0 then - delta = div(maxgravity - mingravity, period) + delta = div(maxgravity_normal - mingravity_normal, period) else period = -period delta = nil end end - - if gravity == nil then - gravity = 100 - end secondScript = params["script2"] @@ -115,7 +146,8 @@ script2_onNewTurn = onNewTurn script2_onGameTick20 = onGameTick20 - script2_onGameStart = onGameStart + script2_onGameInit = onGameInit + script2_onHogAttack = onHogAttack if onParameters ~= nil then onParameters() @@ -124,28 +156,58 @@ onNewTurn = grav_onNewTurn onGameTick20 = grav_onGameTick20 - onGameStart = grav_onGameStart + onGameInit = grav_onGameInit + onHogAttack = grav_onHogAttack end -function grav_onGameStart() - if delta == nil then - v = string.format(loc("random in range from %i%% to %i%% with period of %i msec"), div(mingravity, mln), div(maxgravity, mln), period * 40) - elseif period ~= nil then - v = string.format(loc("changing range from %i%% to %i%% with period of %i msec"), div(mingravity, mln), div(maxgravity, mln), period * 40) - else - v = gravity .. "%" - end +function grav_onGameInit() + DisableGameFlags(gfLowGravity) - ShowMission(loc("Gravity"), - loc("Current setting is ") .. v, - loc("Setup:|'g=150', where 150 is 150% of normal gravity") .. "|" - .. loc("or 'g=50, g2=150, period=4000' for gravity changing|from 50 to 150 and back with period of 4000 msec") - .. "||" .. loc("Set period to negative value for random gravity"), - 0, 5000) - - if script2_onGameStart ~= nil then - script2_onGameStart() + local v, printperiod + if period ~= nil then + local period_ms = period * 40 + if period_ms % 1000 == 0 then + printperiod = string.format(loc("%i s"), div(period_ms, 1000)) + else + printperiod = string.format(loc("%i ms"), period_ms) + end + end + if delta == nil then + v = string.format(loc("Crazy Gravity: Gravity randomly changes within a range from %i%% to %i%% with a period of %s"), div(mingravity_normal, mln), div(maxgravity_normal, mln), printperiod) + elseif period ~= nil then + v = string.format(loc("Oscillating Gravity: Gravity periodically changes within a range from %i%% to %i%% with a period of %s"), div(mingravity_normal, mln), div(maxgravity_normal, mln), printperiod) + elseif gravity > 100 then + v = string.format(loc("High Gravity: Gravity is %i%%"), gravity) + elseif gravity < 100 then + v = string.format(loc("Low Gravity: Gravity is %i%%"), gravity) + else + v = loc("Gravity: 100%") .. "|" .. + loc("Script parameter examples:") .. "|" .. + loc("“g=150”, where 150 is 150% of normal gravity.") .. "|" .. + loc("“g=50, g2=150, period=4000” for gravity changing|from 50 to 150 and back with period of 4000 ms.") .. "|" .. + loc("Set period to negative value for random gravity.") + end + Goals = v + + if script2_onGameInit ~= nil then + script2_onGameInit() end end - +function grav_onHogAttack(ammoType) + if ammoType == amLowGravity then + lowGravityUsed = true + if maxgravity_normal == nil then + gravity = mingravity_low + else + mingravity = mingravity_low + maxgravity = maxgravity_low + if period > 0 then + delta = div(maxgravity_low - mingravity_low, period) + end + end + end + if script2_onHogAttack ~= nil then + script2_onHogAttack() + end +end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.cfg --- a/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,2 @@ -Default -Default +HedgeEditor +HedgeEditor diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.hwp Binary file share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.hwp has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/HedgeEditor.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,10 @@ ---------------------------------------------------------------- ---- HEDGE EDITOR 0.9 (for use with Hedgewars 0.9.22 and up) ---------------------------------------------------------------- --- a horrible mission editor by mikade --- place gears like a boss +----------------------------------------------------------- +--- HEDGE EDITOR (for use with Hedgewars 0.9.22 and up) --- +----------------------------------------------------------- +-- A not-so-horrible mission editor. +-- Place gears like a boss! + +-- Original author: mikade -- feel free to shower me with your adoration and/or hate mail -- more info can be found at http://hedgewars.org/HedgeEditor @@ -40,10 +42,6 @@ -- contextual cursor and menu graphics -- placement sounds that are slightly more soothing --- meaningless version number --- extra whitespace --- fewer capital letters than ideal - -- upon saving, all level data will be output to logs/game0.log. -- game0.log also includes a lot of other data so if you only want to see the relevant lines of code -- you can use GameLogExtractor.html to extract and prune the log into a cleaner form of data, @@ -83,7 +81,7 @@ -- script like TechRacer (or HedgeEditor itself) that can interpret the points using InterpretPoints() --------------------------------------- --- DISCLAIMER +-- MIKADE'S DISCLAIMER --------------------------------------- -- well, I really just made this for myself, so it's usage might be a little complicated for others. -- it also probably has a million errors, and has grown rather bloated over time due to the addition of @@ -110,40 +108,21 @@ -- possibly try show landflag addcaption constantly like we do for superdelete when -- using girders / rubbers. --- check to what extent hog info is preserved on saving (does health/weps really save correctly?) --- atm I think it's only for missions so I don't think it is preserved in core data - --- check if we lose a mission when the enemy collects our crate (we should) - --- try and find out why we can't save the Theme, that feels really dumb - -- How about a weapons profile tool that is used with team ammo -- and then hog identity tool would only be available if gfPerHogAmmo is set --- INVESTIGATE when you can bother to do so --- is airmine still missing anywhere, e.g. the weplist generated FOR THE TEMPLATE SCRIPT +-- [high] check if we lose a mission when the enemy collects our crate (we should) -- [high] waypoints don't reload yet --- [high] look into placing dud/random mines (probably needs a nil value) - --- [high] add missing weps/utils/gears as they appear --- some gameflags and settings are probably missing, too (diff border types etc) --- some themes are also probably missing: cake, hoggywood? --- the ongameinit stuff is probaably missing something akin to numAirMines --- and also probably scriptParam and gravity etc. +-- [high] add missing ammo types as they appear -- [med] add a limited form of save/load within level before mass-output --- [med] rework gameflag handling to use the newer API methods (done?) - -- [med] maybe incorporate portal effects / ufo tracking into the template generated script if -- you want the missions to use it -- [med] improve ammo handling (if possible, take more scheme settings into account) --- also be sure to generate wep data so crates don't have 0 in them (done?) - --- [low] match the user picked color to the color array -- [low] break up the division of labor of the tools into airstrike, minestrike, napalm, etc. --[[ @@ -165,42 +144,29 @@ napalm = arrow sprite (selection/modification/deletion mode) - "Advanced Repositioning Mode", -- also include a delete - "Tagging Mode", + "Repositioning Mode", -- also include a delete + "Goal Editing Mode", "Hog Identity Mode", "Team Identity Mode", "Health Modification Mode", "Sprite Testing Mode", "Sprite Modification Mode", "Sprite Placement Mode", - "Waypoint Placement Mode" + "Waypoint Editing Mode" }]] -- [low] improve support for ShoppaBalance and ConstructionMode, see ranking) --- [low] consider combining landflags - --- [low] periodically rework the code to make it less terrible (hahahahahaha!) - -- [low] eventually incorporate scripted structures into the editor / mission mode -- [low] some kind of support for single team training missions -- we could possibly add gfOneClanMode and kill the other team we're playing with? --- [never?] set all actors to heresurrectible (why did I want this?) - -- [never?] more detailed goal tagging and multi-stage triggers --- [never?] theoretically might be possible to create forts (and other grouped objects) --- that can be mirrored and generated/placed in a big enough space - -- [never?] add a pulsing glow thing for sprites you have selected, -- kind of like the invaders in SpaceInvader (currently they are just displayed as purple) --- [never?] add the thing that would be useful for this editor, but that others might use to cheat - --- [never?] improve "illegal" placement detection (pretty sure should just let people do what they want) - -- [never?] add GUIs for editing ammo, init settings, additional gear attributes -- perhaps using precise with timer to enable/disable certain features @@ -290,6 +256,9 @@ -- experimental crap --local destroyMap = false +-- Special frames in Ammos.png/Ammos_bw.png +local ammoFrameAirAttack = 63 + ----------------------------------------- -- tracking vars for save/load purposes ----------------------------------------- @@ -322,89 +291,98 @@ local shoppaPY = {} local shoppaPR = {} +-- Misc. state variables +local hedgeEditorMissionPanelShown = false +local tagGears = {} +local showGearTags = true + --------------------------------- -- crates are made of this stuff --------------------------------- local atkArray = { - {amBazooka, "amBazooka", 2, loc("Bazooka")}, - {amBee, "amBee", 3, loc("Homing Bee")}, - {amMortar, "amMortar", 21, loc("Mortar")}, - {amDrill, "amDrill", 28, loc("Drill Rocket")}, - {amSnowball, "amSnowball", 50, loc("Mudball")}, - - {amGrenade, "amGrenade", 0, loc("Grenade")}, - {amClusterBomb, "amClusterBomb", 1, loc("Cluster Bomb")}, - {amMolotov, "amMolotov", 39, loc("Molotov Cocktail")}, - {amWatermelon, "amWatermelon", 25, loc("Watermelon Bomb")}, - {amHellishBomb, "amHellishBomb", 26, loc("Hellish Handgrenade")}, - {amGasBomb, "amGasBomb", 43, loc("Limburger")}, - - {amShotgun, "amShotgun", 4, loc("Shotgun")}, - {amDEagle, "amDEagle", 9, loc("Desert Eagle")}, - {amFlamethrower,"amFlamethrower", 45, loc("Flamethrower")}, - {amSniperRifle, "amSniperRifle", 37, loc("Sniper Rifle")}, - {amSineGun, "amSineGun", 44, loc("SineGun")}, - {amIceGun, "amIceGun", 53, loc("Freezer")}, - {amLandGun, "amLandGun", 52, loc("Land Spray")}, - - {amFirePunch, "amFirePunch", 11, loc("Shoryuken")}, - {amWhip, "amWhip", 12, loc("Whip")}, - {amBaseballBat, "amBaseballBat", 13, loc("Baseball Bat")}, - {amKamikaze, "amKamikaze", 22, loc("Kamikaze")}, - {amSeduction, "amSeduction", 24, loc("Seduction")}, - {amHammer, "amHammer", 47, loc("Hammer")}, - - {amMine, "amMine", 8, loc("Mine")}, - {amDynamite, "amDynamite", 10, loc("Dynamite")}, - {amCake, "amCake", 23, loc("Cake")}, - {amBallgun, "amBallgun", 29, loc("Ballgun")}, - {amRCPlane, "amRCPlane", 30, loc("RC Plane")}, - {amSMine, "amSMine", 46, loc("Sticky Mine")}, - - {amAirAttack, "amAirAttack", 15, loc("Air Attack")}, - {amMineStrike, "amMineStrike", 16, loc("Mine Strike")}, - {amDrillStrike, "amDrillStrike", 49, loc("Drill Strike")}, - {amAirMine, "amAirMine", 56, loc("Air Mine")}, - {amNapalm, "amNapalm", 27, loc("Napalm")}, - {amPiano, "amPiano", 42, loc("Piano Strike")}, - - {amKnife, "amKnife", 54, loc("Cleaver")}, - - {amBirdy, "amBirdy", 40, loc("Birdy")} + + {amBazooka, "amBazooka"}, + {amBee, "amBee"}, + {amMortar, "amMortar"}, + {amDrill, "amDrill"}, + {amSnowball, "amSnowball"}, + + {amGrenade, "amGrenade"}, + {amClusterBomb, "amClusterBomb"}, + {amWatermelon, "amWatermelon"}, + {amHellishBomb, "amHellishBomb"}, + {amMolotov, "amMolotov"}, + {amGasBomb, "amGasBomb"}, + + {amShotgun, "amShotgun"}, + {amDEagle, "amDEagle"}, + {amSniperRifle, "amSniperRifle"}, + {amSineGun, "amSineGun"}, + {amFlamethrower,"amFlamethrower"}, + {amIceGun, "amIceGun"}, + + {amFirePunch, "amFirePunch"}, + {amWhip, "amWhip"}, + {amBaseballBat, "amBaseballBat"}, + {amKamikaze, "amKamikaze"}, + {amSeduction, "amSeduction"}, + {amHammer, "amHammer"}, + + {amMine, "amMine"}, + {amDynamite, "amDynamite"}, + {amCake, "amCake"}, + {amBallgun, "amBallgun"}, + {amRCPlane, "amRCPlane"}, + {amSMine, "amSMine"}, + + {amAirAttack, "amAirAttack", ammoFrameAirAttack}, -- overwritten icon in Ammos.png + {amMineStrike, "amMineStrike"}, + {amNapalm, "amNapalm"}, + {amPiano, "amPiano"}, + {amDrillStrike, "amDrillStrike"}, + {amAirMine, "amAirMine"}, + + {amPickHammer, "amPickHammer"}, + {amBlowTorch, "amBlowTorch"}, + {amKnife, "amKnife"}, + + {amBirdy, "amBirdy"}, + {amDuck, "amDuck"}, } local utilArray = { - {amBlowTorch, "amBlowTorch", 17, loc("BlowTorch")}, - {amPickHammer, "amPickHammer", 5, loc("PickHammer")}, - {amGirder, "amGirder", 18, loc("Girder")}, - {amRubber, "amRubber", 55, loc("Rubber")}, - {amPortalGun, "amPortalGun", 41, loc("Personal Portal Device")}, - - {amRope, "amRope", 7, loc("Rope")}, - {amParachute, "amParachute", 14, loc("Parachute")}, - {amTeleport, "amTeleport", 19, loc("Teleport")}, - {amJetpack, "amJetpack", 38, loc("Flying Saucer")}, - - {amInvulnerable, "amInvulnerable", 33, loc("Invulnerable")}, - {amLaserSight, "amLaserSight", 35, loc("Laser Sight")}, - {amVampiric, "amVampiric", 36, loc("Vampirism")}, - - {amLowGravity, "amLowGravity", 31, loc("Low Gravity")}, - {amExtraDamage, "amExtraDamage", 32, loc("Extra Damage")}, - {amExtraTime, "amExtraTime", 34, loc("Extra Time")}, - - {amResurrector, "amResurrector", 48, loc("Resurrector")}, - {amTardis, "amTardis", 51, loc("Tardis")}, - - {amSwitch, "amSwitch", 20, loc("Switch Hog")} + {amGirder, "amGirder"}, + {amLandGun, "amLandGun"}, + {amRubber, "amRubber"}, + + {amRope, "amRope"}, + {amParachute, "amParachute"}, + {amTeleport, "amTeleport"}, + {amJetpack, "amJetpack"}, + {amPortalGun, "amPortalGun"}, + + {amInvulnerable,"amInvulnerable"}, + {amLaserSight, "amLaserSight"}, + {amVampiric, "amVampiric"}, + {amResurrector, "amResurrector"}, + {amTardis, "amTardis"}, + + {amSwitch, "amSwitch"}, + {amLowGravity, "amLowGravity"}, + {amExtraDamage, "amExtraDamage"}, + {amExtraTime, "amExtraTime"}, + } --skiphog is 6 +local effectArray = { heInvulnerable, hePoisoned, heResurrectable, heResurrected, heFrozen } +local effectStr = { "heInvulnerable", "hePoisoned", "heResurrectable", "heResurrected", "heFrozen" } + ---------------------------- -- hog and map editing junk ---------------------------- @@ -412,299 +390,143 @@ local preMadeTeam = { { - "Clowns", + loc_noop("Clowns"), {"WhySoSerious","clown-copper","clown-crossed","clown","Joker"}, - {"Baggy","Bingo","Bobo","Bozo","Buster","Chester","Copper","Heckles","Giggles","Jingo","Molly","Loopy","Patches","Tatters"}, - "R","cm_birdy","Mobster","Rubberduck","Castle" + {loc_noop("Baggy"),loc_noop("Bingo"),loc_noop("Bobo"),loc_noop("Bozo"),loc_noop("Buster"),loc_noop("Chester"),loc_noop("Copper"),loc_noop("Heckles"),loc_noop("Giggles"),loc_noop("Jingo"),loc_noop("Molly"),loc_noop("Loopy"),loc_noop("Patches"),loc_noop("Tatters")}, + "R","cm_balls","Mobster","Rubberduck","Castle" }, { - "Street Fighters", + loc_noop("Street Fighters"), {"sf_balrog","sf_blanka","sf_chunli","sf_guile","sf_honda","sf_ken","sf_ryu","sf_vega"}, - {"Balrog","Blanka","Chunli","Guile","Honda","Ken","Ryu","Vega"}, + {loc_noop("Balrog"),loc_noop("Blanka"),loc_noop("Chunli"),loc_noop("Guile"),loc_noop("Honda"),loc_noop("Ken"),loc_noop("Ryu"),loc_noop("Vega")}, "F","cm_balrog","Surfer","dragonball","Castle" }, { - "Cybernetic Empire", + loc_noop("Cybernetic Empire"), {"cyborg1","cyborg2"}, - {"Unit 189","Unit 234","Unit 333","Unit 485","Unit 527","Unit 638","Unit 709","Unit 883"}, + {loc_noop("Unit 189"),loc_noop("Unit 234"),loc_noop("Unit 333"),loc_noop("Unit 485"),loc_noop("Unit 527"),loc_noop("Unit 638"),loc_noop("Unit 709"),loc_noop("Unit 883")}, "R","cm_binary","Robot","Grave","Castle" }, { - "Color Squad", + loc_noop("Color Squad"), {"hair_blue","hair_green","hair_red","hair_yellow","hair_purple","hair_grey","hair_orange","hair_pink"}, - {"Blue","Green","Red","Yellow","Purple","Grey","Orange","Pink"}, - "F","cm_birdy","Singer","Grave","Castle" + {loc_noop("Blue"),loc_noop("Green"),loc_noop("Red"),loc_noop("Yellow"),loc_noop("Purple"),loc_noop("Grey"),loc_noop("Orange"),loc_noop("Pink")}, + "F","mauritius","Singer","Grave","Castle" }, { - "Fruit", + loc_noop("Fruit"), {"fr_apple","fr_banana","fr_lemon","fr_orange","fr_pumpkin","fr_tomato"}, - {"Juicy","Squishy","Sweet","Sour","Bitter","Ripe","Rotten","Fruity"}, + {loc_noop("Juicy"),loc_noop("Squishy"),loc_noop("Sweet"),loc_noop("Sour"),loc_noop("Bitter"),loc_noop("Ripe"),loc_noop("Rotten"),loc_noop("Fruity")}, "R","cm_mog","Default","Cherry","Castle" }, { - "The Police", + loc_noop("The Police"), {"bobby","bobby2v","policecap","policegirl","royalguard"}, - {"Hightower","Lassard","Callahan","Jones","Harris","Thompson","Mahoney","Hooks","Tackleberry"}, + {loc_noop("Hightower"),loc_noop("Lassard"),loc_noop("Callahan"),loc_noop("Jones"),loc_noop("Harris"),loc_noop("Thompson"),loc_noop("Mahoney"),loc_noop("Hooks"),loc_noop("Tackleberry")}, "R","cm_star","British","Statue","Castle" }, { - "The Ninja-Samurai Alliance", + loc_noop("The Ninja-Samurai Alliance"), {"NinjaFull","NinjaStraight","NinjaTriangle","Samurai","StrawHat","StrawHatEyes","StrawHatFacial","naruto"}, - {"Bushi","Tatsujin","Itami","Arashi","Shinobi","Ukemi","Godai","Kenshi","Ninpo"}, + {loc_noop("Bushi"),loc_noop("Tatsujin"),loc_noop("Itami"),loc_noop("Arashi"),loc_noop("Shinobi"),loc_noop("Ukemi"),loc_noop("Godai"),loc_noop("Kenshi"),loc_noop("Ninpo")}, "R","japan","Default","octopus","Castle" }, { - "Pokemon", + loc_noop("Pokémon"), {"poke_ash","poke_charmander","poke_chikorita","poke_jigglypuff","poke_lugia","poke_mudkip","poke_pikachu","poke_slowpoke","poke_squirtle","poke_voltorb"}, - {"Ash","Charmander","Chikorita","Jigglypuff","Lugia","Mudkip","Pikachu","Slowpoke","Squirtle","Voltorb"}, + {loc_noop("Ash"),loc_noop("Charmander"),loc_noop("Chikorita"),loc_noop("Jigglypuff"),loc_noop("Lugia"),loc_noop("Mudkip"),loc_noop("Pikachu"),loc_noop("Slowpoke"),loc_noop("Squirtle"),loc_noop("Voltorb")}, "FR","cm_pokemon","Default","pokeball","Castle" }, { - "The Zoo", + loc_noop("The Zoo"), {"zoo_Bat","zoo_Beaver","zoo_Bunny","zoo_Deer","zoo_Hedgehog","zoo_Moose","zoo_Pig","zoo_Porkey","zoo_Sheep","zoo_chicken","zoo_elephant","zoo_fish","zoo_frog","zoo_snail","zoo_turtle"}, - {"Batty","Tails","Bunny","Deer","Spikes","Horns","Bacon","Porkey","Sheepy","Chicken","Trunks","Fishy","Legs","Slimer","Roshi"}, - "FR","cm_hurrah","Default","Bone","Castle" + {loc_noop("Batty"),loc_noop("Tails"),loc_noop("Bunny"),loc_noop("Deer"),loc_noop("Spikes"),loc_noop("Horns"),loc_noop("Bacon"),loc_noop("Porkey"),loc_noop("Sheepy"),loc_noop("Chicken"),loc_noop("Trunks"),loc_noop("Fishy"),loc_noop("Legs"),loc_noop("Slimer"),loc_noop("Roshi")}, + "FR","cm_birdy","Default","Bone","Castle" }, { - "The Devs", + loc_noop("The Devs"), {"ushanka","zoo_Sheep","bb_bob","Skull","poke_mudkip","lambda","WizardHat","sf_ryu","android","fr_lemon","mp3"}, - {"unC0Rr", "sheepluva", "nemo", "mikade", "koda", "burp","HeneK","Tiyuri","Xeli","Displacer","szczur"}, - "FR","hedgewars","Classic","Statue","Castle" + {loc_noop("unC0Rr"), loc_noop("sheepluva"), loc_noop("nemo"), loc_noop("mikade"), loc_noop("koda"), loc_noop("burp"),loc_noop("HeneK"),loc_noop("Tiyuri"),loc_noop("Xeli"),loc_noop("Displacer"),loc_noop("szczur")}, + "FR","cm_hw","Classic","Statue","Castle" }, { - "Mushroom Kingdom", - {"sm_daisy","sm_luigi","sm_mario","sm_peach","sm_toad","sm_wario"}, - {"Daisy","Luigi","Mario","Princess Peach","Toad","Wario"}, - "FR","cm_birdy","Default","Badger","Castle" + loc_noop("Mushroom Kingdom"), + {"sm_daisy","sm_luigi","sm_mario","sm_peach","sm_toad","sm_wario","NoHat","NoHat"}, + {loc_noop("Daisy"),loc_noop("Luigi"),loc_noop("Mario"),loc_noop("Princess Peach"),loc_noop("Toad"),loc_noop("Wario"),loc_noop("Yoshi"),loc_noop("Waluigi")}, + "FR","comoros","Default","Badger","Castle" }, { - "Pirates", + loc_noop("Pirates"), {"pirate_jack","pirate_jack_bandana"}, - {"Rusted Diego","Fuzzy Beard","Al.Kaholic","Morris","Yumme Gunpowder","Cutlass Cain","Jim Morgan","Silver","Dubloon Devil","Ugly Mug","Fair Wind","Scallywag","Salty Dog","Bearded Beast","Timbers","Both Barrels","Jolly Roger"}, + {loc_noop("Rusted Diego"),loc_noop("Fuzzy Beard"),loc_noop("Al.Kaholic"),loc_noop("Morris"),loc_noop("Yumme Gunpowder"),loc_noop("Cutlass Cain"),loc_noop("Jim Morgan"),loc_noop("Silver"),loc_noop("Dubloon Devil"),loc_noop("Ugly Mug"),loc_noop("Fair Wind"),loc_noop("Scallywag"),loc_noop("Salty Dog"),loc_noop("Bearded Beast"),loc_noop("Timbers"),loc_noop("Both Barrels"),loc_noop("Jolly Roger")}, "R","cm_pirate","Pirate","chest","Castle" }, { - "Gangsters", + loc_noop("Gangsters"), {"Moustache","Cowboy","anzac","Bandit","thug","Jason","NinjaFull","chef"}, - {"The Boss","Jimmy","Frankie","Morris","Mooney","Knives","Tony","Meals"}, + {loc_noop("The Boss"),loc_noop("Jimmy"),loc_noop("Frankie"),loc_noop("Morris"),loc_noop("Mooney"),loc_noop("Knives"),loc_noop("Tony"),loc_noop("Meals")}, "F","cm_anarchy","Mobster","deadhog","Castle" }, { - "Twenty-Twenty", + loc_noop("Twenty-Twenty"), {"Glasses","lambda","SunGlasses","Sniper","Terminator_Glasses","Moustache_glasses","doctor","punkman","rasta"}, - {"Specs","Speckles","Spectator","Glasses","Glassy","Harry Potter","Goggles","Clark Kent","Goggs","Lightbender","Specs Appeal","Four Eyes"}, + {loc_noop("Specs"),loc_noop("Speckles"),loc_noop("Spectator"),loc_noop("Glasses"),loc_noop("Glassy"),loc_noop("Harry Potter"),loc_noop("Goggles"),loc_noop("Clark Kent"),loc_noop("Goggs"),loc_noop("Lightbender"),loc_noop("Specs Appeal"),loc_noop("Four Eyes")}, "R","cm_face","Default","eyecross","Castle" }, { - "Monsters", + loc_noop("Monsters"), {"Skull","Jason","ShaggyYeti","Zombi","cyclops","Mummy","hogpharoah","vampirichog"}, - {"Bones","Jason","Yeti","Zombie","Old One Eye","Ramesses","Xerxes","Count Hogula"}, + {loc_noop("Bones"),loc_noop("Jason"),loc_noop("Yeti"),loc_noop("Zombie"),loc_noop("Old One Eye"),loc_noop("Ramesses"),loc_noop("Xerxes"),loc_noop("Count Hogula")}, "FR","cm_vampire","Default","octopus","Castle" }, { - "The Iron Curtain", + loc_noop("The Iron Curtain"), {"ushanka","war_sovietcomrade1","war_sovietcomrade1","ushanka"}, - {"Alex","Sergey","Vladimir","Andrey","Dimitry","Ivan","Oleg","Kostya","Anton","Eugene"}, + {loc_noop("Alex"),loc_noop("Sergey"),loc_noop("Vladimir"),loc_noop("Andrey"),loc_noop("Dimitry"),loc_noop("Ivan"),loc_noop("Oleg"),loc_noop("Kostya"),loc_noop("Anton"),loc_noop("Eugene")}, "R","cm_soviet","Russian","skull","Castle" }, { - "Desert Storm", + loc_noop("Desert Storm"), {"war_desertofficer","war_desertgrenadier1","war_desertmedic","war_desertsapper1","war_desertgrenadier2","war_desertgrenadier4","war_desertsapper2","war_desertgrenadier5"}, - {"Brigadier Briggs","Lt. Luke","Sgt. Smith","Corporal Calvin","Frank","Joe","Sam","Donald"}, - "F","cm_birdy","Default","Grave","Castle" + {loc_noop("Brigadier Briggs"),loc_noop("Lt. Luke"),loc_noop("Sgt. Smith"),loc_noop("Corporal Calvin"),loc_noop("Frank"),loc_noop("Joe"),loc_noop("Sam"),loc_noop("Donald")}, + "F","bhutan","Default","Grave","Castle" }, - --{ - --"Sci-Fi", - --{"scif_2001O","scif_2001Y","scif_BrainSlug","scif_BrainSlug2","scif_Geordi","scif_SparkssHelmet","scif_cosmonaut","scif_cyberpunk","scif_swDarthvader","scif_swStormtrooper"}, - --{}, - --"R","cm_birdy","Default","Grave","Castle" - --}, - - - - - -- - - --{ - --, - --{}, - --{}, - --"R","cm_birdy","Default","Grave","Castle" - --}, - - -- don't forget new additions need to be added to: - --pMode = {"Clowns","Street Fighters","Cybernetic Empire","Color Squad","Fruit","The Police","The Ninja-Samurai Alliance","Pokemon","The Zoo","The Devs","The Hospital"} - -- but maybe we can just get the size of this array and automatically generate a list instead - - { - "The Hospital", + loc_noop("The Hospital"), {"doctor","nurse","war_britmedic","war_desertmedic","war_germanww2medic"}, - {"Dr. Blackwell","Dr. Drew","Dr. Harvey","Dr. Crushing","Dr. Jenner","Dr. Barnard","Dr. Parkinson","Dr. Banting","Dr. Horace","Dr. Hollows","Dr. Jung"}, - "R","cm_birdy","Default","heart","Castle" + {loc_noop("Dr. Blackwell"),loc_noop("Dr. Drew"),loc_noop("Dr. Harvey"),loc_noop("Dr. Crushing"),loc_noop("Dr. Jenner"),loc_noop("Dr. Barnard"),loc_noop("Dr. Parkinson"),loc_noop("Dr. Banting"),loc_noop("Dr. Horace"),loc_noop("Dr. Hollows"),loc_noop("Dr. Jung")}, + "R","cm_firstaid","Default","heart","Castle" } } - ---local menuArray = { --- "Initialisation Menu", "Team Menu" --- } - ---local hatArray = {hahahaha, you're joking, right?} ---[[well, here are most of them as vaguely ordered by theme, there may be some duplicates -NoHat, -NinjaFull,NinjaStraight,NinjaTriangle,Samurai,StrawHat,StrawHatEyes,StrawHatFacial,naruto -sm_daisy,sm_luigi,sm_mario,sm_peach,sm_toad,sm_wario, -ShortHair_Black,ShortHair_Brown,ShortHair_Grey,ShortHair_Red,ShortHair_Yellow -hair_blue,hair_green,hair_red,hair_yellow,hair_purple,hair_grey,hair_orange,hair_pink -Skull,Jason,ShaggyYeti,Zombi,cyclops,Mummy,hogpharoah,vampirichog -cap_blue,cap_red,cap_green,cap_junior,cap_yellow,cap_thinking -WhySoSerious,clown-copper,clown-crossed,clown,Joker -bobby,bobby2v,policecap,policegirl,royalguard, -spcartman,spstan,spkenny,spkyle, -sf_balrog,sf_blanka,sf_blankatoothless,sf_chunli,sf_guile,sf_honda,sf_ken,sf_ryu,sf_vega -Glasses,lambda,SunGlasses,Terminator_Glasses,Moustache_glasses -Laminaria,Dragon, -cyborg1,cyborg2, -dish_Ladle,dish_SauceBoatSilver,dish_Teacup,dish_Teapot -laurel,flag_french,flag_germany,flag_italy,flag_usa -fr_apple,fr_banana,fr_lemon,fr_orange,fr_pumpkin,fr_tomato -doctor,nurse,war_britmedic,war_desertmedic,war_germanww2medic, -poke_ash,poke_charmander,poke_chikorita,poke_jigglypuff, -poke_lugia,poke_mudkip,poke_pikachu,poke_slowpoke,poke_squirtle,poke_voltorb -zoo_Bat,zoo_Beaver,zoo_Bunny,zoo_Deer,zoo_Hedgehog,zoo_Moose,zoo_Pig,zoo_Porkey,zoo_Sheep -zoo_chicken,zoo_elephant,zoo_fish,zoo_frog,zoo_snail,zoo_turtle -bushhider,cratehider,Disguise, -tf_demoman,tf_scout,Sniper, -Bandit,thug,anzac,Cowboy -pirate_jack,pirate_jack_bandana, -tiara,crown,royalguard -punkman,Einstein, -sth_Amy,sth_AmyClassic,sth_Eggman,sth_Knux,sth_Metal,sth_Shadow,sth_Sonic,sth_SonicClassic,sth_Super,sth_Tails -vc_gakupo,vc_gumi,vc_kaito,vc_len,vc_luka,vc_meiko,vc_miku,vc_rin -touhou_chen,touhou_marisa,touhou_patchouli,touhou_remelia,touhou_suwako,touhou_yukari, -TeamHeadband,TeamSoldier,TeamTopHat,TeamWheatley,cap_team,hair_team, -bb_bob,bb_bub,bb_cororon,bb_kululun,bubble, -Viking,spartan,swordsmensquire,knight,dwarf, -WizardHat,tophats,pinksunhat,ushanka,mexicansunbrero,HogInTheHat, -4gsuif, -AkuAku, -noface, -Coonskin3, -Dan, -Dauber, -Eva_00b,Eva_00y, -Evil,InfernalHorns,angel, -Gasmask, -IndianChief,Cowboy, -MegaHogX, -Meteorhelmet, -Moustache, -OldMan, -Pantsu, -Plunger, -RSR, -Rain,stormcloud,DayAndNight, -chuckl,Rambo,RobinHood, -Santa,snowhog,ShaggyYeti,eastertop, -Sleepwalker, -SparkleSuperFun, -SunWukong, -android, -beefeater, -car, -chef, -constructor, -footballhelmet, -judo, -lamp, -mechanicaltoy, -mickey_ears, -snorkel, -quotecap, -rasta, - -metalband, -kiss_criss,kiss_frehley,kiss_simmons,kiss_stanley,mp3,Elvis -mv_Spidey,mv_Venom, -ntd_Falcon,ntd_Kirby,ntd_Link,ntd_Samus, -scif_2001O,scif_2001Y,scif_BrainSlug,scif_BrainSlug2,scif_Geordi,scif_SparkssHelmet, -scif_cosmonaut,scif_cyberpunk,scif_swDarthvader,scif_swStormtrooper, -war_UNPeacekeeper01,war_UNPeacekeeper02, -war_airwarden02,war_airwarden03, -war_americanww2helmet, -war_britmedic,war_britpthhelmet,war_britsapper, -war_desertgrenadier1,war_desertgrenadier2,war_desertgrenadier4,war_desertgrenadier5,war_desertmedic, -war_desertofficer,war_desertsapper1,war_desertsapper2, -war_frenchww1gasmask,war_frenchww1helmet, -war_germanww1helmet2,war_germanww1tankhelm,war_germanww2medic,war_germanww2pith, -war_grenadier1,war_trenchgrenadier1,war_trenchgrenadier2,war_trenchgrenadier3, -war_plainpith, -war_sovietcomrade1,war_sovietcomrade2, -war_trenchfrench01,war_trenchfrench02,]] - -local colorArray = { - --{0xff0000ff, "0xff0000ff", "Red"}, -- look up hw red - {0xff4980c1, "0xff4980c1", "Blue"}, - {0xff1de6ba, "0xff1de6ba", "Teal"}, - {0xffb541ef, "0xffb541ef", "Purple"}, - {0xffe55bb0, "0xffe55bb0", "Pink"}, - {0xff20bf00, "0xff20bf00", "Green"}, - {0xfffe8b0e, "0xfffe8b0e", "Orange"}, - {0xff5f3605, "0xff5f3605", "Brown"}, - {0xffffff01, "0xffffff01", "Yellow"} - } - -local graveArray = { - "Badger", "Bone", "bp2", "bubble", "Cherry", - "chest", "coffin", "deadhog", "dragonball", "Duck2", - "Earth", "Egg", "eyecross", "Flower", "Ghost", - "Grave", "heart", "money", "mouton1", "octopus", - "plant2", "plant3", "Plinko", "pokeball", "pyramid", - "ring", "Rip", "Rubberduck", "Simple", "skull", - "star", "Status" - } - -local voiceArray = { - "British","Classic","Default","Default_es","Default_uk", - "HillBilly","Mobster","Pirate","Robot","Russian","Singer", - "Surfer" - } - -local fortArray = { - "Cake", "Castle", "Earth", "EvilChicken", "Flowerhog", - "Hydrant", "Lego", "Plane", "Statue", "Tank", - "UFO", "Wood" - } - --- non-exhaustive list of flags, feel free to choose others -local flagArray = { - "cm_binary", "cm_birdy", "cm_earth", "cm_pirate", "cm_star", - "cm_hurrah", "cm_hax0r", "cm_balrog", "cm_spider", "cm_eyeofhorus" - } +local preMadeTeamNamesTranslated = {} +local preMadeTeamNamesOriginal = {} +for i=1, #preMadeTeam do + table.insert(preMadeTeamNamesOriginal, preMadeTeam[i][1]) + table.insert(preMadeTeamNamesTranslated, loc(preMadeTeam[i][1])) +end local gameFlagList = { - {"gfForts", false, gfForts}, {"gfMultiWeapon", false, gfMultiWeapon}, {"gfBorder", false, gfBorder}, {"gfSolidLand", false, gfSolidLand}, @@ -734,113 +556,20 @@ {"gfTagTeam", false, gfTagTeam} } -local themeList = {"Art", "Bamboo", "Bath", --[["Blox",]] "Brick", "Cake", "Castle", "Cave", "Cheese", - "Christmas", "City", "Compost", --[["CrazyMission", "Deepspace",]] "Desert", "Earthrise", - --[["Eyes",]] "Freeway", "Golf", "Halloween", "Hell", --[["HogggyWood",]] "Island", "Jungle", "Nature", - "Olympics", "Planes", "Sheep", "Snow", "Stage", "Underwater" - } - -local mapList = { - "Bamboo", "BambooPlinko", "Basketball", "Bath", "Blizzard", "Blox", "Bubbleflow", - "Battlefield", "Cake", "Castle", "Cave", "Cheese", "Cogs", "Control", "Earthrise", - "Eyes", "Hammock", "Hedgelove", "Hedgewars", "Hogville", "Hydrant", "Islands", - "Knockball", "Lonely_Island", "Mushrooms", "Octorama", "PirateFlag", - "Plane", "Ropes", "Ruler", "Sheep", "ShoppaKing", "Sticks", "Trash", "Tree", - "TrophyRace" - } - ---local spriteArray = { --- {sprBigDigit, "sprBigDigit", 0} --- } - -local spriteIDArray = {sprWater, sprCloud, sprBomb, sprBigDigit, sprFrame, -sprLag, sprArrow, sprBazookaShell, sprTargetP, sprBee, -sprSmokeTrace, sprRopeHook, sprExplosion50, sprMineOff, -sprMineOn, sprMineDead, sprCase, sprFAid, sprDynamite, sprPower, -sprClusterBomb, sprClusterParticle, sprFlame, -sprHorizont, sprHorizontL, sprHorizontR, sprSky, sprSkyL, sprSkyR, -sprAMSlot, sprAMAmmos, sprAMAmmosBW, sprAMSlotKeys, sprAMCorners, -sprFinger, sprAirBomb, sprAirplane, sprAmAirplane, sprAmGirder, -sprHHTelepMask, sprSwitch, sprParachute, sprTarget, sprRopeNode, -sprQuestion, sprPowerBar, sprWindBar, sprWindL, sprWindR, - -sprFireButton, sprArrowUp, sprArrowDown, sprArrowLeft, sprArrowRight, -sprJumpWidget, sprAMWidget, sprPauseButton, sprTimerButton, sprTargetButton, - -sprFlake, sprHandRope, sprHandBazooka, sprHandShotgun, -sprHandDEagle, sprHandAirAttack, sprHandBaseball, sprPHammer, -sprHandBlowTorch, sprBlowTorch, sprTeleport, sprHHDeath, -sprShotgun, sprDEagle, sprHHIdle, sprMortar, sprTurnsLeft, -sprKamikaze, sprWhip, sprKowtow, sprSad, sprWave, -sprHurrah, sprLemonade, sprShrug, sprJuggle, sprExplPart, sprExplPart2, -sprCakeWalk, sprCakeDown, sprWatermelon, -sprEvilTrace, sprHellishBomb, sprSeduction, sprDress, -sprCensored, sprDrill, sprHandDrill, sprHandBallgun, sprBalls, -sprPlane, sprHandPlane, sprUtility, sprInvulnerable, sprVampiric, sprGirder, -sprSpeechCorner, sprSpeechEdge, sprSpeechTail, -sprThoughtCorner, sprThoughtEdge, sprThoughtTail, -sprShoutCorner, sprShoutEdge, sprShoutTail, -sprSniperRifle, sprBubbles, sprJetpack, sprHealth, sprHandMolotov, sprMolotov, -sprSmoke, sprSmokeWhite, sprShell, sprDust, sprSnowDust, sprExplosives, sprExplosivesRoll, -sprAmTeleport, sprSplash, sprDroplet, sprBirdy, sprHandCake, sprHandConstruction, -sprHandGrenade, sprHandMelon, sprHandMortar, sprHandSkip, sprHandCluster, -sprHandDynamite, sprHandHellish, sprHandMine, sprHandSeduction, sprHandVamp, -sprBigExplosion, sprSmokeRing, sprBeeTrace, sprEgg, sprTargetBee, sprHandBee, -sprFeather, sprPiano, sprHandSineGun, sprPortalGun, sprPortal, -sprCheese, sprHandCheese, sprHandFlamethrower, sprChunk, sprNote, -sprSMineOff, sprSMineOn, sprHandSMine, sprHammer, -sprHandResurrector, sprCross, sprAirDrill, sprNapalmBomb, -sprBulletHit, sprSnowball, sprHandSnowball, sprSnow, -sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet, sprTardis, -sprSlider, sprBotlevels, sprHandKnife, sprKnife, sprStar, sprIceTexture, sprIceGun, sprFrozenHog, sprAmRubber, sprBoing} - - -local spriteTextArray = {"sprWater", "sprCloud", "sprBomb", "sprBigDigit", "sprFrame", -"sprLag", "sprArrow", "sprBazookaShell", "sprTargetP", "sprBee", -"sprSmokeTrace", "sprRopeHook", "sprExplosion50", "sprMineOff", -"sprMineOn", "sprMineDead", "sprCase", "sprFAid", "sprDynamite", "sprPower", -"sprClusterBomb", "sprClusterParticle", "sprFlame", "sprHorizont", -"sprHorizontL", "sprHorizontR", "sprSky", "sprSkyL", "sprSkyR", "sprAMSlot", -"sprAMAmmos", "sprAMAmmosBW", "sprAMSlotKeys", "sprAMCorners", "sprFinger", -"sprAirBomb", "sprAirplane", "sprAmAirplane", "sprAmGirder", "sprHHTelepMask", - "sprSwitch", "sprParachute", "sprTarget", "sprRopeNode", "sprQuestion", - "sprPowerBar", "sprWindBar", "sprWindL", "sprWindR", "sprFireButton", - "sprArrowUp", "sprArrowDown", "sprArrowLeft", "sprArrowRight", "sprJumpWidget", - "sprAMWidget", "sprPauseButton", "sprTimerButton", "sprTargetButton", - "sprFlake", "sprHandRope", "sprHandBazooka", "sprHandShotgun", - "sprHandDEagle", "sprHandAirAttack", "sprHandBaseball", "sprPHammer", - "sprHandBlowTorch", "sprBlowTorch", "sprTeleport", "sprHHDeath", "sprShotgun", - "sprDEagle", "sprHHIdle", "sprMortar", "sprTurnsLeft", "sprKamikaze", "sprWhip", - "sprKowtow", "sprSad", "sprWave", "sprHurrah", "sprLemonade", "sprShrug", - "sprJuggle", "sprExplPart", "sprExplPart2", "sprCakeWalk", "sprCakeDown", - "sprWatermelon", "sprEvilTrace", "sprHellishBomb", "sprSeduction", "sprDress", - "sprCensored", "sprDrill", "sprHandDrill", "sprHandBallgun", "sprBalls", "sprPlane", - "sprHandPlane", "sprUtility", "sprInvulnerable", "sprVampiric", "sprGirder", - "sprSpeechCorner", "sprSpeechEdge", "sprSpeechTail", "sprThoughtCorner", - "sprThoughtEdge", "sprThoughtTail", "sprShoutCorner", "sprShoutEdge", - "sprShoutTail", "sprSniperRifle", "sprBubbles", "sprJetpack", "sprHealth", - "sprHandMolotov", "sprMolotov", "sprSmoke", "sprSmokeWhite", "sprShell", "sprDust", - "sprSnowDust", "sprExplosives", "sprExplosivesRoll", "sprAmTeleport", "sprSplash", - "sprDroplet", "sprBirdy", "sprHandCake", "sprHandConstruction", "sprHandGrenade", - "sprHandMelon", "sprHandMortar", "sprHandSkip", "sprHandCluster", "sprHandDynamite", - "sprHandHellish", "sprHandMine", "sprHandSeduction", "sprHandVamp", "sprBigExplosion", - "sprSmokeRing", "sprBeeTrace", "sprEgg", "sprTargetBee", "sprHandBee", "sprFeather", - "sprPiano", "sprHandSineGun", "sprPortalGun", "sprPortal", "sprCheese", "sprHandCheese", - "sprHandFlamethrower", "sprChunk", "sprNote", "sprSMineOff", "sprSMineOn", "sprHandSMine", - "sprHammer", "sprHandResurrector", "sprCross", "sprAirDrill", "sprNapalmBomb", "sprBulletHit", - "sprSnowball", "sprHandSnowball", "sprSnow", "sprSDFlake", "sprSDWater", "sprSDCloud", - "sprSDSplash", "sprSDDroplet", "sprTardis", "sprSlider", "sprBotlevels", "sprHandKnife", - "sprKnife", "sprStar", "sprIceTexture", "sprIceGun", "sprFrozenHog", "sprAmRubber", "sprBoing"} - local reducedSpriteIDArray = { - sprAmRubber, sprAmGirder, sprAMSlot, sprAMAmmos, sprAMAmmosBW, sprAMCorners, sprHHTelepMask, sprTurnsLeft, - sprSpeechCorner, sprSpeechEdge, sprSpeechTail, sprThoughtCorner, sprThoughtEdge, sprThoughtTail, sprShoutCorner, - sprShoutEdge, sprShoutTail, sprBotlevels, sprIceTexture, sprCustom1, sprCustom2, } + sprTargetBee, sprAmGirder, sprAmRubber, sprIceTexture, sprHHTelepMask, + sprAMAmmos, sprAMAmmosBW, sprAMSlot, sprAMCorners, sprTurnsLeft, sprBotlevels, + sprSpeechCorner, sprSpeechEdge, sprSpeechTail, sprThoughtCorner, sprThoughtEdge, sprThoughtTail, + sprShoutCorner, sprShoutEdge, sprShoutTail, sprCustom1, sprCustom2, } + + -- Set in onGameInit + local reducedSpriteIDArrayFrames local reducedSpriteTextArray = { - "sprAmRubber", "sprAmGirder", "sprAMSlot", "sprAMAmmos", "sprAMAmmosBW", "sprAMCorners", "sprHHTelepMask", "sprTurnsLeft", - "sprSpeechCorner", "sprSpeechEdge", "sprSpeechTail", "sprThoughtCorner", "sprThoughtEdge", "sprThoughtTail", "sprShoutCorner", - "sprShoutEdge", "sprShoutTail", "sprBotlevels", "sprIceTexture", "sprCustom1", "sprCustom2", } + "sprTargetBee", "sprAmGirder", "sprAmRubber", "sprIceTexture", "sprHHTelepMask", + "sprAMAmmos", "sprAMAmmosBW", "sprAMSlot", "sprAMCorners", "sprTurnsLeft", "sprBotlevels", + "sprSpeechCorner", "sprSpeechEdge", "sprSpeechTail", "sprThoughtCorner", "sprThoughtEdge", "sprThoughtTail", + "sprShoutCorner", "sprShoutEdge", "sprShoutTail", "sprCustom1", "sprCustom2", } ---------------------------- -- placement shite @@ -869,6 +598,7 @@ loc("Girder Placement Mode"), loc("Rubber Placement Mode"), loc("Mine Placement Mode"), + loc("Dud Mine Placement Mode"), loc("Sticky Mine Placement Mode"), loc("Air Mine Placement Mode"), loc("Barrel Placement Mode"), @@ -877,20 +607,20 @@ loc("Utility Crate Placement Mode"), loc("Target Placement Mode"), loc("Cleaver Placement Mode"), - loc("Advanced Repositioning Mode"), - loc("Tagging Mode"), + loc("Repositioning Mode"), + loc("Goal Definition Mode"), loc("Hog Identity Mode"), loc("Team Identity Mode"), loc("Health Modification Mode"), - --loc("Sprite Testing Mode"), loc("Sprite Placement Mode"), loc("Sprite Modification Mode"), - loc("Waypoint Placement Mode") + loc("Waypoint Editing Mode") } local pMode = {} -- pMode contains custom subsets of the main categories local pIndex = 1 +local sFrame = 0 -- frame in sprite placement mode local genTimer = 0 @@ -899,7 +629,6 @@ local placedX = {} -- x coord of placed object local placedY = {} -- y coord of placed object local placedSpec = {} -- this is different depending on what was placed, for mines it is their time, for crates it is their content, (for girders/rubbers it used to be their rotation, and for sprites, their name, but this has been moved to different variables to allow more complex / smooth editing) ---local placedSuperSpec = {} -- used to be used by girders/rubbers/sprites for their landFlag local placedType = {} -- what kind of object was placed: mine, crate, girder, rubber, barrel, etc. local placedTint = {} -- only girders/rubbers/sprites use this, it is their tint / colouration @@ -917,22 +646,6 @@ local closestSpriteID = nil ------------------------ --- menu shite (more or less unused currently) ------------------------- ---local menuEnabled = false ---local menuIndex = 1 ---local menu = {} ---local subMenu = {} ---local sMI = 1 -- sub menu index ---local preMenuCfg ---local postMenuCfg ---local initMenu = { --- {"Selected Menu", "Initialisation Menu"}, --- {"List of Gameflags", ""}, --- {"List of Gameflags", ""} --- } - ------------------------- -- SOME GENERAL METHODS ------------------------ @@ -974,19 +687,6 @@ -- after the first set is expended have the last 1 be 127 -- and then increment some other counter so like --- bobCounter = 1 --- specialPoint(5) --- specialPoint(127) --- specialPoint(5) - --- if BobCounter = 1 then --- if specialPointsFlag == 5 then createMine --- if specialPointFlag == 127 then bobCounter = 2 --- elseif bobCounter == 2 then --- if specialPointsFlag == 5 then createExlosives --- end --- - -- this function interprets special points that have been embedded into an HWPMAP function InterpretPoints() @@ -1049,38 +749,18 @@ -- Weapon Crates elseif (specialPointsFlag[i] >= 20) and (specialPointsFlag[i] < (#atkArray+20)) then tempG = SpawnAmmoCrate(specialPointsX[i],specialPointsY[i],atkArray[specialPointsFlag[i]-19][1]) - setGearValue(tempG,"caseType","ammo") setGearValue(tempG,"contents",atkArray[specialPointsFlag[i]-19][2]) -- Utility Crates elseif (specialPointsFlag[i] >= (#atkArray+20)) and (specialPointsFlag[i] < (#atkArray+20+#utilArray)) then tempG = SpawnUtilityCrate(specialPointsX[i],specialPointsY[i],utilArray[specialPointsFlag[i]-19-#atkArray][1]) - setGearValue(tempG,"caseType","util") setGearValue(tempG,"contents",utilArray[specialPointsFlag[i]-19-#atkArray][2]) --79-82 (reserved for future wep crates) --89,88,87,86 and 85,84,83,82 (reserved for the 2 custom sprites and their landflags) --90-99 reserved for scripted structures - --[[elseif specialPointsFlag[i] == 90 then - --PlaceStruc("generator") - elseif specialPointsFlag[i] == 91 then - --PlaceStruc("healingstation") - elseif specialPointsFlag[i] == 92 then - --PlaceStruc("respawner") - elseif specialPointsFlag[i] == 93 then - --PlaceStruc("teleportationnode") - elseif specialPointsFlag[i] == 94 then - --PlaceStruc("biofilter") - elseif specialPointsFlag[i] == 95 then - --PlaceStruc("supportstation") - elseif specialPointsFlag[i] == 96 then - --PlaceStruc("constructionstation") - elseif specialPointsFlag[i] == 97 then - --PlaceStruc("reflectorshield") - elseif specialPointsFlag[i] == 98 then - --PlaceStruc("weaponfilter")]] elseif specialPointsFlag[i] == 98 then portalDistance = div(specialPointsX[i],5) @@ -1159,128 +839,6 @@ end ----------------------------- --- just fucking around ----------------------------- --- ancient stuff that no longer has any relevance ---[[ -function BoostVeloctiy(gear) - - if (GetGearType(gear) == gtSMine) or - (GetGearType(gear) == gtMine) or - (GetGearType(gear) == gtHedgehog) then - - dx,dy = GetGearVelocity(gear) - SetGearVelocity(gear,dx*1.5,dy*1.5) - end - -end - --- use this stuff when you want to get some idea of land and/or blow up /everything/ -function CheckGrenades(gear) - - if GetGearType(gear) == gtGrenade then - dx, dy = GetGearVelocity(gear) - if (dy == 0) then - - else - DeleteGear(gear) - end - end - -end - -function BlowShitUpPartTwo() - - destroyMap = false - runOnGears(CheckGrenades) - -end - -function BlowShitUp() - - destroyMap = true - - mapWidth = 4096 - mapHeight = 2048 - blockSize = 50 - - mY = 0 - - while (mY < WaterLine) do - - mX = 0 - mY = mY + 1*blockSize - while (mX < mapWidth) do - - mX = mX + (1*blockSize) - gear = AddGear(mX, mY, gtGrenade, 0, 0, 0, 5000) - SetState(gear, bor(GetState(gear),gstInvisible) ) - - end - - end - -end]] - - --- you know, using this it might be possible to have a self destructing track, --- or a moving one. --- edit: this was from the gold old days before it was possible to erase sprites) ---[[function BoomGirder(x,y,rot) - girTime = 1 - if rot < 4 then - AddGear(x, y, gtGrenade, 0, 0, 0, girTime) - elseif rot == 4 then - g = AddGear(x-45, y, gtGrenade, 0, 0, 0, girTime) -- needed? - g = AddGear(x-30, y, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x, y, gtGrenade, 0, 0, 0, girTime) -- needed? - g = AddGear(x+30, y, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x+45, y, gtGrenade, 0, 0, 0, girTime) -- needed? - elseif rot == 5 then ------- diag - g = AddGear(x+45, y+45, gtGrenade, 0, 0, 0, girTime) --n - g = AddGear(x+30, y+30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x, y, gtGrenade, 0, 0, 0, girTime) -- needed? - g = AddGear(x-30, y-30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x-45, y-45, gtGrenade, 0, 0, 0, girTime) --n - elseif rot == 6 then - g = AddGear(x, y-45, gtGrenade, 0, 0, 0, girTime) -- needed? - g = AddGear(x, y+30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x, y, gtGrenade, 0, 0, 0, girTime) -- needed? - g = AddGear(x, y-30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x, y+45, gtGrenade, 0, 0, 0, girTime) -- needed? - elseif rot == 7 then ------- - g = AddGear(x+45, y-45, gtGrenade, 0, 0, 0, girTime) --n - g = AddGear(x+30, y-30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x, y, gtGrenade, 0, 0, 0, girTime) -- needed? - g = AddGear(x-30, y+30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x-45, y+45, gtGrenade, 0, 0, 0, girTime) --n - end -end]] - ---[[function SpecialGirderPlacement(x,y,rot) - - PlaceGirder(x, y, rot) - girTime = 10000 - - if rot < 4 then - AddGear(x, y, gtGrenade, 0, 0, 0, girTime) - elseif rot == 4 then - g = AddGear(x-30, y, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x+30, y, gtGrenade, 0, 0, 0, girTime) - elseif rot == 5 then ------- - g = AddGear(x+30, y+30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x-30, y-30, gtGrenade, 0, 0, 0, girTime) - elseif rot == 6 then - g = AddGear(x, y+30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x, y-30, gtGrenade, 0, 0, 0, girTime) - elseif rot == 7 then ------- - g = AddGear(x+30, y-30, gtGrenade, 0, 0, 0, girTime) - g = AddGear(x-30, y+30, gtGrenade, 0, 0, 0, girTime) - end - -end]] - --shoppabalance crap function AddShoppaPoint(x,y,c) table.insert(shoppaPX, x) @@ -1309,7 +867,6 @@ function GetClosestGear() closestDist = 999999999 closestGear = nil - --sGear = nil runOnGears(SelectGear) return(closestGear) end @@ -1329,7 +886,7 @@ placedX[placedCount] = x placedY[placedCount] = y - placedType[placedCount] = loc("Waypoint Placement Mode") + placedType[placedCount] = loc("Waypoint Editing Mode") placedLandFlags[placedCount] = nil -- use this to specify waypoint type maybe placedHWMapFlag[placedCount] = 0 @@ -1375,7 +932,6 @@ placedType[placedCount] = loc("Sprite Placement Mode") end - --placedLandFlags[placedCount] = pLandFlags if pLandFlags == lfIce then placedLandFlags[placedCount] = "lfIce" elseif pLandFlags == lfIndestructible then @@ -1386,16 +942,15 @@ placedLandFlags[placedCount] = "lfNormal" end - --placedSuperSpec[placedCount] = nil - placedTint[placedCount] = pTint placedFrame[placedCount] = pFrame placedSprite[placedCount] = pSprite - PlaceSprite(pX, pY, pSprite, pFrame, pTint, nil, nil, nil, pLandFlags) - - placedCount = placedCount + 1 + local success = PlaceSprite(pX, pY, pSprite, pFrame, pTint, nil, nil, nil, pLandFlags) + if succcess then + placedCount = placedCount + 1 + end end @@ -1416,7 +971,13 @@ placedTint[pID] = 255 + (255*0x100) + (255*0x10000) + (255*0x1000000) -- A BGR end - PlaceSprite(placedX[pID], placedY[pID], placedSprite[pID], placedFrame[pID], + -- Special case: Placing amAirAttack of the ammos sprite (since this one is overwritten) + local actualDisplayedImage = placedFrame[pID] + if (placedSprite[pID] == sprAMAmmos or placedSprite[pID] == sprAMAmmosBW) and (actualDisplayedImage == (amAirAttack - 1)) then + actualDisplayedImage = ammoFrameAirAttack + end + + return PlaceSprite(placedX[pID], placedY[pID], placedSprite[pID], actualDisplayedImage, placedTint[pID], nil, -- overrite existing land nil, nil, -- this stuff specifies flipping @@ -1440,12 +1001,10 @@ if d < closestDist then closestDist = d closestSpriteID = i - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(sSprite) - - --newTint = placedTint[i] + newTint = 0xFF00FFFF - SetVisualGearValues(sSprite, placedX[i], placedY[i], 0, 0, g5, placedFrame[i], 10000, placedSprite[i], 10000, newTint ) + SetVisualGearValues(sSprite, placedX[i], placedY[i], 0, 0, nil, placedFrame[i], 10000, placedSprite[i], 10000, newTint ) end end @@ -1465,7 +1024,6 @@ placedX[closestSpriteID] = nil placedY[closestSpriteID] = nil placedSpec[closestSpriteID] = nil - --placedSuperSpec[closestSpriteID] = nil placedType[closestSpriteID] = nil placedTint[closestSpriteID] = nil placedSprite[closestSpriteID] = nil @@ -1483,19 +1041,15 @@ closestSpriteID = nil -- just in case for i = 0, (placedCount-1) do - if (placedType[i] == loc("Waypoint Placement Mode")) then + if (placedType[i] == loc("Waypoint Editing Mode")) then q = placedX[i] - placedX[placedCount] w = placedY[i] - placedY[placedCount] d = ( (q*q) + (w*w) ) if d < closestDist then closestDist = d closestSpriteID = i - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(sSprite) - - --newTint = placedTint[i] - newTint = 0xFF00FFFF - - SetVisualGearValues(sSprite, placedX[i], placedY[i], 0, 0, g5, placedFrame[i], 10000, placedSprite[i], 10000, newTint ) + + SetVisualGearValues(sSprite, placedX[i], placedY[i], 0, 0, nil, placedFrame[i], 10000, placedSprite[i], 10000, newTint ) end end @@ -1506,7 +1060,6 @@ placedX[closestSpriteID] = nil placedY[closestSpriteID] = nil placedSpec[closestSpriteID] = nil - --placedSuperSpec[closestSpriteID] = nil placedType[closestSpriteID] = nil placedTint[closestSpriteID] = nil placedSprite[closestSpriteID] = nil @@ -1526,12 +1079,12 @@ placedY[placedCount] = y placedType[placedCount] = cat[cIndex] placedSpec[placedCount] = pMode[pIndex] - --placedSuperSpec[placedCount] = nil placedTint[placedCount] = nil placedFrame[placedCount] = nil placedLandFlags[placedCount] = nil placedSprite[placedCount] = nil placedHWMapFlag[placedCount] = nil + placementSucceeded = true -- We assume success unless the placement logic said otherwise if cat[cIndex] == loc("Girder Placement Mode") then @@ -1539,13 +1092,17 @@ --lfObject and lfBasic placedFrame[placedCount] = CGR placedSprite[placedCount] = sprAmGirder - CallPlaceSprite(placedCount) - - if landType == lfIndestructible then specialMod = 1 - elseif landType == lfIce then specialMod = 2 - else specialMod = 0 + placementSucceeded = CallPlaceSprite(placedCount) + + if placementSucceeded then + if landType == lfIndestructible then specialMod = 1 + elseif landType == lfIce then specialMod = 2 + else specialMod = 0 + end + placedHWMapFlag[placedCount] = CGR+100+(8*specialMod) + else + placedType[placedCount] = "bogus" end - placedHWMapFlag[placedCount] = CGR+100+(8*specialMod) else placedType[placedCount] = "bogus" -- we need this so we don't think we've placed a new girder and are trying to erase the things we just placed?? SelectClosestSprite() @@ -1558,20 +1115,23 @@ placedFrame[placedCount] = CGR placedSprite[placedCount] = sprAmRubber - --CallPlaceSprite(placedCount) --new ermagerd placedLandFlags[placedCount] = "lfBouncy" placedTint[placedCount] = 255 + (255*0x100) + (255*0x10000) + (255*0x1000000) -- A BGR - PlaceSprite(placedX[placedCount], placedY[placedCount], placedSprite[placedCount], placedFrame[placedCount], + placementSucceeded = PlaceSprite(placedX[placedCount], placedY[placedCount], placedSprite[placedCount], placedFrame[placedCount], placedTint[placedCount], nil, nil, nil, landType) - if CGR == 0 then placedHWMapFlag[placedCount] = 124 - elseif CGR == 1 then placedHWMapFlag[placedCount] = 125 - elseif CGR == 2 then placedHWMapFlag[placedCount] = 126 - elseif CGR == 3 then placedHWMapFlag[placedCount] = 127 + if placementSucceeded then + if CGR == 0 then placedHWMapFlag[placedCount] = 124 + elseif CGR == 1 then placedHWMapFlag[placedCount] = 125 + elseif CGR == 2 then placedHWMapFlag[placedCount] = 126 + elseif CGR == 3 then placedHWMapFlag[placedCount] = 127 + end + else + placedType[placedCount] = "bogus" end else placedType[placedCount] = "bogus" @@ -1586,16 +1146,13 @@ elseif cat[cIndex] == loc("Health Crate Placement Mode") then gear = SpawnHealthCrate(x,y) SetHealth(gear, pMode[pIndex]) - setGearValue(gear,"caseType","med") elseif cat[cIndex] == loc("Weapon Crate Placement Mode") then gear = SpawnAmmoCrate(x, y, atkArray[pIndex][1]) placedSpec[placedCount] = atkArray[pIndex][2] - setGearValue(gear,"caseType","ammo") setGearValue(gear,"contents",atkArray[pIndex][2]) elseif cat[cIndex] == loc("Utility Crate Placement Mode") then gear = SpawnUtilityCrate(x, y, utilArray[pIndex][1]) placedSpec[placedCount] = utilArray[pIndex][2] - setGearValue(gear,"caseType","util") setGearValue(gear,"contents",utilArray[pIndex][2]) elseif cat[cIndex] == loc("Barrel Placement Mode") then gear = AddGear(x, y, gtExplosives, 0, 0, 0, 0) @@ -1603,12 +1160,18 @@ elseif cat[cIndex] == loc("Mine Placement Mode") then gear = AddGear(x, y, gtMine, 0, 0, 0, 0) SetTimer(gear, pMode[pIndex]) + elseif cat[cIndex] == loc("Dud Mine Placement Mode") then + gear = AddGear(x, y, gtMine, 0, 0, 0, 0) + SetHealth(gear, 0) + SetGearValues(gear, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 36 - pMode[pIndex]) elseif cat[cIndex] == loc("Sticky Mine Placement Mode") then gear = AddGear(x, y, gtSMine, 0, 0, 0, 0) + SetTimer(gear, pMode[pIndex]) elseif cat[cIndex] == loc("Air Mine Placement Mode") then gear = AddGear(x, y, gtAirMine, 0, 0, 0, 0) SetTimer(gear, pMode[pIndex]) - elseif cat[cIndex] == loc("Advanced Repositioning Mode") then + SetGearValues(gear, nil, nil, pMode[pIndex]) + elseif cat[cIndex] == loc("Repositioning Mode") then if pMode[pIndex] == loc("Selection Mode") then sGear = GetClosestGear() @@ -1618,10 +1181,14 @@ end elseif pMode[pIndex] == loc("Deletion Mode") then sGear = GetClosestGear() - if (sGear ~= nil) and (GetGearType(sGear) ~= gtHedgehog) then + if (sGear == nil) then + AddCaption(loc("Please click on a gear."),0xffba00ff,capgrpVolume) + elseif (GetGearType(sGear) == gtHedgehog) then + AddCaption(loc("Hedgehogs can not be deleted."),0xffba00ff,capgrpVolume) + else DeleteGear(sGear) - sGear = nil end + sGear = nil end elseif (cat[cIndex] == loc("Hog Identity Mode")) or (cat[cIndex] == loc("Team Identity Mode")) then @@ -1647,11 +1214,26 @@ if pMode[pIndex][2] == "set" then SetHealth(sGear, pMode[pIndex][1]) elseif pMode[pIndex][2] == "mod" then - local newHealth = math.max(1, GetHealth(sGear) + tonumber(pMode[pIndex][1])) + local min + if gt == gtCase then min = 0 else min = 1 end + local newHealth = math.max(min, GetHealth(sGear) + tonumber(pMode[pIndex][1])) SetHealth(sGear, newHealth) end + elseif gt == gtMine and GetHealth(sGear) == 0 then + local newHealth + if pMode[pIndex][2] == "set" then + newHealth = pMode[pIndex][1] + elseif pMode[pIndex][2] == "mod" then + local _, oldHealth + _,_,_,_,_,_,_,_,_,_,_, oldHealth = GetGearValues(sGear) + oldHealth = 36 - oldHealth + newHealth = math.max(1, oldHealth + tonumber(pMode[pIndex][1])) + end + if newHealth ~= nil then + SetGearValues(sGear, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 36 - newHealth) + end else - AddCaption(loc("Please click on a hedgehog, barrel or health crate."),0xffba00ff,capgrpVolume) + AddCaption(loc("Please click on a hedgehog, barrel, health crate or dud mine."),0xffba00ff,capgrpVolume) end elseif cat[cIndex] == loc("Sprite Modification Mode") then @@ -1659,15 +1241,13 @@ SelectClosestSprite() if closestSpriteID ~= nil then - -- we have a sprite selected somewhere - --if pMode[pIndex] == "Sprite Selection Mode" then - -- sprite is now selected, good job - --elseif pMode[pIndex] == "LandFlag Modification Mode" then if pMode[pIndex] == loc("LandFlag Modification Mode") then EraseSprite(placedX[closestSpriteID], placedY[closestSpriteID], placedSprite[closestSpriteID], placedFrame[closestSpriteID], nil, nil, nil, nil, placedLandFlags[closestSpriteID]) - CallPlaceSprite(closestSpriteID) - closestSpriteID = nil - SetVisualGearValues(sSprite, 0, 0, 0, 0, 0, 1, 10000, sprAmGirder, 10000, 0x00000000 ) + placementSucceeded = CallPlaceSprite(closestSpriteID) + if placementSucceeded then + closestSpriteID = nil + SetVisualGearValues(sSprite, 0, 0, 0, 0, 0, 1, 10000, sprAmGirder, 10000, 0x00000000 ) + end elseif pMode[pIndex] == loc("Sprite Erasure Mode") then EraseClosestSprite() @@ -1676,23 +1256,23 @@ end - elseif cat[cIndex] == loc("Tagging Mode") then + elseif cat[cIndex] == loc("Goal Definition Mode") then sGear = GetClosestGear() if sGear ~= nil then -- used to be closestGear if getGearValue(sGear,"tag") == nil then - if pMode[pIndex] == loc("Tag Collection Mode") then + if pMode[pIndex] == loc("Victory Condition: Collect") then if GetGearType(sGear) == gtCase then setGearValue(sGear, "tag","collection") else AddCaption(loc("Please click on a crate."),0xffba00ff,capgrpVolume) end else - if pMode[pIndex] == loc("Tag Victory Mode") then + if pMode[pIndex] == loc("Victory Condition: Destroy") then setGearValue(sGear, "tag","victory") - elseif pMode[pIndex] == loc("Tag Failure Mode") then + elseif pMode[pIndex] == loc("Losing Condition: Destroy") then setGearValue(sGear, "tag","failure") end end @@ -1709,41 +1289,36 @@ end - --elseif cat[cIndex] == loc("Sprite Testing Mode") then - - -- frameID = 0 - -- visualSprite = reducedSpriteIDArray[pIndex] - -- tempE = AddVisualGear(x, y, vgtStraightShot, 0, true,1) - -- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - -- SetVisualGearValues(tempE, g1, g2, 0, 0, g5, frameID, g7, visualSprite, g9, g10 ) - - elseif cat[cIndex] == loc("Sprite Placement Mode") then if superDelete == false then - placedFrame[placedCount] = 1 + placedFrame[placedCount] = sFrame placedSprite[placedCount] = reducedSpriteIDArray[pIndex] - CallPlaceSprite(placedCount) + placementSucceeded = CallPlaceSprite(placedCount) + if placementSucceeded then + PlaySound(sndPlaced) + end else placedType[placedCount] = "bogus" SelectClosestSprite() EraseClosestSprite() end - elseif cat[cIndex] == loc("Waypoint Placement Mode") then - - - if pMode[pIndex] == loc("Waypoint Deletion Mode") then + elseif cat[cIndex] == loc("Waypoint Editing Mode") then + + + if pMode[pIndex] == loc("Delete Waypoint") then + placedType[placedCount] = "bogus" EraseClosestWaypoint() else PlaceWaypoint(x,y) placedCount = placedCount - 1 + PlaySound(sndPlaced) end end placedCount = placedCount + 1 - end -- called when user changes primary selection @@ -1759,58 +1334,58 @@ if cat[cIndex] == loc("Girder Placement Mode") then pIndex = CGR pMode = {loc("Girder")} - -- pCount = 1 elseif cat[cIndex] == loc("Rubber Placement Mode") then pIndex = CGR pMode = {loc("Rubber")} landType = lfBouncy -- for now, let's not allow anything else (-- fairly new addition) - -- pCount = 1??? elseif cat[cIndex] == loc("Target Placement Mode") then - pMode = {loc("Standard Target")} + pMode = {loc("Target")} elseif cat[cIndex] == loc("Cleaver Placement Mode") then - pMode = {loc("Standard Cleaver")} + pMode = {loc("Cleaver")} elseif cat[cIndex] == loc("Barrel Placement Mode") then - pMode = {1,50,60,75,100,120} + pMode = {60,80,100,120,160,200,240,1,10,20,30,40,50} elseif cat[cIndex] == loc("Health Crate Placement Mode") then - pMode = {25,50,75,100} + pMode = {25,30,40,50,75,100,150,200,0,5,10,15,20} elseif cat[cIndex] == loc("Weapon Crate Placement Mode") then for i = 1, #atkArray do - pMode[i] = atkArray[i][4] --pMode[i] = atkArray[i][2] + pMode[i] = GetAmmoName(atkArray[i][1], true) end elseif cat[cIndex] == loc("Utility Crate Placement Mode") then for i = 1, #utilArray do - pMode[i] = utilArray[i][4] --pMode[i] = utilArray[i][2] + pMode[i] = GetAmmoName(utilArray[i][1], true) end elseif cat[cIndex] == loc("Mine Placement Mode") then - pMode = {1,1000,2000,3000,4000,5000,0} - -- 0 is dud right, or is that nil? + pMode = {3000,4000,5000,0,1000,2000} + elseif cat[cIndex] == loc("Dud Mine Placement Mode") then + pMode = {36,48,60,72,96,1,6,12,18,24} + elseif cat[cIndex] == loc("Mine Placement Mode") then + pMode = {3000,4000,5000,0,1000,2000} elseif cat[cIndex] == loc("Sticky Mine Placement Mode") then - pMode = {loc("Normal Sticky Mine")} + pMode = {500,1000,1500,2000,2500,0} elseif cat[cIndex] == loc("Air Mine Placement Mode") then - pMode = {1,1000,2000,3000,4000,5000,0} - elseif cat[cIndex] == loc("Advanced Repositioning Mode") then + pMode = {750,1000,1250,0,250,500} + elseif cat[cIndex] == loc("Repositioning Mode") then pMode = {loc("Selection Mode"),loc("Placement Mode"), loc("Deletion Mode")} - elseif cat[cIndex] == loc("Tagging Mode") then - pMode = {loc("Tag Victory Mode"),loc("Tag Failure Mode"),loc("Tag Collection Mode")} + elseif cat[cIndex] == loc("Goal Definition Mode") then + pMode = {loc("Victory Condition: Destroy"),loc("Losing Condition: Destroy"),loc("Victory Condition: Collect")} elseif cat[cIndex] == loc("Hog Identity Mode") then pMode = {loc("Soldier"),loc("Grenadier"),loc("Sniper"),loc("Pyro"),loc("Ninja"),loc("Commander"),loc("Chef"),loc("Engineer"),loc("Physicist"),loc("Trapper"),loc("Saint"),loc("Clown")} elseif cat[cIndex] == loc("Team Identity Mode") then - pMode = {"Clowns","Street Fighters","Cybernetic Empire","Color Squad","Fruit","The Police","The Ninja-Samurai Alliance","Pokemon","The Zoo","The Devs","Mushroom Kingdom","Pirates","Gangsters","Twenty-Twenty","Monsters","The Iron Curtain","The Hospital"} + pMode = preMadeTeamNamesTranslated elseif cat[cIndex] == loc("Health Modification Mode") then - pMode = { {1, "set"}, {25, "set"}, {30, "set"}, {50, "set"}, {75, "set"}, {100, "set"}, {120, "set"}, {150, "set"}, {200, "set"}, {1000, "set"}, - {"+1", "mod"}, {"+10", "mod"}, {"+100", "mod"}, {"-1", "mod"}, {"-10", "mod"}, {"-100", "mod"} } + pMode = { {100, "set"}, {125, "set"}, {150, "set"}, {200, "set"}, {300, "set"}, {1000, "set"}, + {"-100", "mod"}, {"-10", "mod"}, {"-1", "mod"}, {"+1", "mod"}, {"+10", "mod"}, {"+100", "mod"}, + {1, "set"}, {10, "set"}, {15, "set"}, {20, "set"}, {25, "set"}, {30, "set"}, {40, "set"}, {50, "set"}, {75, "set"}, +} elseif cat[cIndex] == loc("Sprite Modification Mode") then - --pMode = {"Sprite Selection Mode","LandFlag Modification Mode","Sprite Erasure Mode"} pMode = {loc("LandFlag Modification Mode"),loc("Sprite Erasure Mode")} elseif cat[cIndex] == loc("Sprite Testing Mode") or cat[cIndex] == loc("Sprite Placement Mode") then - --for i = 1, #spriteTextArray do - -- pMode[i] = spriteTextArray[i] - --end for i = 1, #reducedSpriteTextArray do pMode[i] = reducedSpriteTextArray[i] end - elseif cat[cIndex] == loc("Waypoint Placement Mode") then - pMode = {loc("Standard Waypoint"), loc("Waypoint Deletion Mode")} + sFrame = 0 + elseif cat[cIndex] == loc("Waypoint Editing Mode") then + pMode = {loc("Place Waypoint"), loc("Delete Waypoint")} end end @@ -1838,12 +1413,9 @@ -- generates the AddTeam and AddHog function calls for onGameInit() function GetDataForSavingHogs(gear) - --AddTeam(teamname, color, grave, fort, voicepack, flag) - --AddHog(hogname, botlevel, health, hat) - --this is a quick hack so that the human team(s) will always be --given the first move ahead of the AI - tempDataList = {} + local tempDataList = {} if GetHogLevel(gear) == 0 then tempDataList = hogDataList else @@ -1857,48 +1429,40 @@ teamCounter = 1 end - -- try match team colour to the colours recorded in the colour array - - tColor = 0x00000000 - for i = 1, #colorArray do - if GetClanColor(GetHogClan(gear)) == colorArray[i][1] then - tColor = colorArray[i][2] - end - end - - -- no match, just give him a default colour from the array, then - if tColor == 0x00000000 then - tColor = colorArray[teamCounter][2] - end - - - -- there is used to be no way to read this data, so - -- I was assigning teams a random grave, fort, flag and voice - -- but now we should be able to get the real thing - -- so let's do it if they haven't used one of the preset teams + -- Convert color to string + local rgba = GetClanColor(GetHogClan(gear)) + local rgb = div(band(rgba, 0xFFFFFF00), 0x100) + local tColor = string.format("0x%X", rgb) + + local tFort, tGrave, tFlag, tVoice if getGearValue(gear,"grave") == nil then - tFort = fortArray[1+GetRandom(#fortArray)] + tFort = GetHogFort(gear) tGrave = GetHogGrave(gear) tFlag = GetHogFlag(gear) tVoice = GetHogVoicepack(gear) - --tGrave = graveArray[1+GetRandom(#graveArray)] - --tFlag = flagArray[1+GetRandom(#flagArray)] - --tVoice = voiceArray[1+GetRandom(#voiceArray)] else tGrave = getGearValue(gear,"grave") tFort = getGearValue(gear,"fort") tFlag = getGearValue(gear,"flag") tVoice = getGearValue(gear,"voice") end + if not tFort then tFort = "Castle" end + if not tGrave then tGrave = "Statue" end + if not tFlag then tFlag= "hedgewars" end + if not tVoice then tVoice = "Default" end lastRecordedTeam = GetHogTeamName(gear) table.insert(tempDataList, "") + + local oTeamName = getGearValue(gear, "originalTeamName") + if oTeamName == nil or oTeamName == "" then + oTeamName = GetHogTeamName(gear) + end table.insert (tempDataList, - " AddTeam(\"" .. - GetHogTeamName(gear) .."\"" .. - ", " .. "\"" ..tColor .. "\"" .. - -- --", " .. colorArray[teamCounter][2] .. + " AddTeam(loc(\"" .. + oTeamName .. "\")" .. + ", " .. tColor .. ", " .. "\"" .. tGrave .. "\"" .. ", " .. "\"" .. tFort .. "\"" .. ", " .. "\"" .. tVoice .. "\"" .. @@ -1910,8 +1474,12 @@ table.insert(hhs, gear) - table.insert (tempDataList, " hhs[" .. #hhs .."] = AddHog(\"" .. - GetHogName(gear) .. "\", " .. + local oName = getGearValue(gear, "originalName") + if oName == nil or oName == "" then + oName = GetHogName(gear) + end + table.insert (tempDataList, " hhs[" .. #hhs .."] = AddHog(loc(\"" .. + oName .. "\"), " .. GetHogLevel(gear) .. ", " .. GetHealth(gear) .. ", \"" .. GetHogHat(gear) .. "\"" .. @@ -1920,6 +1488,16 @@ table.insert (tempDataList," SetGearPosition(hhs[" .. #hhs .. "], " .. GetX(gear) .. ", " .. GetY(gear) .. ")") + for e=1, #effectArray do + if GetEffect(gear, effectArray[e]) ~= 0 then + table.insert (tempDataList," SetEffect(hhs[" .. #hhs .. "], " .. effectStr[e] .. ", " .. GetEffect(gear, effectArray[e]) .. ")") + end + end + local dX, _ = GetGearVelocity(gear) + if dX < 0 then + table.insert (tempDataList," HogTurnLeft(hhs[" .. #hhs .. "], true)") + end + if getGearValue(gear,"tag") ~= nil then table.insert (tempDataList," setGearValue(hhs[" .. #hhs .. "], \"tag\", \"" .. getGearValue(gear,"tag") .. "\")") end @@ -1950,6 +1528,10 @@ -- output hog and team data to the console function SaveHogData() + teamCounter = 0 + lastRecordedTeam = "" + hhs = {} + runOnHogs(GetDataForSavingHogs) WriteLnToConsole(" ------ TEAM LIST ------") @@ -1991,7 +1573,12 @@ WriteLnToConsole(temp .. ")") WriteLnToConsole(" Map = \"" .. Map .. "\"") - WriteLnToConsole(" Theme = \"" .. "Nature" .. "\"") + WriteLnToConsole(" Seed = \"" .. Seed .. "\"") + WriteLnToConsole(" Theme = \"" .. Theme .. "\"") + WriteLnToConsole(" MapGen = " .. MapGen) + WriteLnToConsole(" MapFeatureSize = " .. MapFeatureSize) + WriteLnToConsole(" TemplateFilter = " .. TemplateFilter) + WriteLnToConsole(" TemplateNumber = " .. TemplateNumber) WriteLnToConsole(" TurnTime = " .. TurnTime) WriteLnToConsole(" Explosives = " .. Explosives) WriteLnToConsole(" MinesNum = " .. MinesNum) @@ -2001,16 +1588,19 @@ WriteLnToConsole(" HealthCaseProb = " .. HealthCaseProb) WriteLnToConsole(" HealthCaseAmount = " .. HealthCaseAmount) WriteLnToConsole(" DamagePercent = " .. DamagePercent) + WriteLnToConsole(" RopePercent = " .. RopePercent) WriteLnToConsole(" MinesTime = " .. MinesTime) WriteLnToConsole(" MineDudPercent = " .. MineDudPercent) WriteLnToConsole(" SuddenDeathTurns = " .. SuddenDeathTurns) WriteLnToConsole(" WaterRise = " .. WaterRise) WriteLnToConsole(" HealthDecrease = " .. HealthDecrease) - --WriteLnToConsole(" Ready = " .. Ready) - --WriteLnToConsole(" AirMinesNum = " .. AirMinesNum) - --WriteLnToConsole(" ScriptParam = " .. ScriptParam) - --WriteLnToConsole(" GetAwayTime = " .. GetAwayTime) + WriteLnToConsole(" Ready = " .. Ready) + WriteLnToConsole(" AirMinesNum = " .. AirMinesNum) + WriteLnToConsole(" GetAwayTime = " .. GetAwayTime) + WriteLnToConsole(" WorldEdge = " .. WorldEdge) + + -- ScriptParam intentionally left out, it doesn't make sense for missions. WriteLnToConsole("") @@ -2046,30 +1636,30 @@ -- distinction betweeen the need to track victory/win conditions or not function GetDataForGearSaving(gear) - temp = nil - specialFlag = nil - arrayList = nil + local temp = nil + local specialFlag = nil + local arrayList = nil if GetGearType(gear) == gtMine then + temp = " tempG = AddGear(" .. + GetX(gear) .. ", " .. + GetY(gear) .. ", gtMine, 0, 0, 0, 0)" + table.insert(mineList, temp) + table.insert(mineList, " SetTimer(tempG, " .. GetTimer(gear) .. ")") + if (GetHealth(gear) == 0) then + table.insert(mineList, " SetHealth(tempG, 0)") + local _, damage + _,_,_,_,_,_,_,_,_,_,_,damage = GetGearValues(gear) + if damage ~= 0 then + table.insert(mineList, " SetGearValues(tempG, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, "..damage..")") + end + end if (getGearValue(gear, "tag") ~= nil) then - temp = " tempG = AddGear(" .. - GetX(gear) .. ", " .. - GetY(gear) .. ", gtMine, 0, 0, 0, 0)" - table.insert(mineList, temp) - table.insert(mineList, " SetTimer(tempG, " .. GetTimer(gear) .. ")") table.insert(mineList, " setGearValue(tempG, \"tag\", \"" .. getGearValue(gear,"tag") .. "\")") - else - - temp = " SetTimer(" .. "AddGear(" .. - GetX(gear) .. ", " .. - GetY(gear) .. ", gtMine, 0, 0, 0, 0)" .. ", " .. - GetTimer(gear) ..")" - table.insert(mineList, temp) - end - if GetTimer(gear) == 1 then specialFlag = 1 + if GetTimer(gear) == 0 then specialFlag = 1 elseif GetTimer(gear) == 1000 then specialFlag = 2 elseif GetTimer(gear) == 2000 then specialFlag = 3 elseif GetTimer(gear) == 3000 then specialFlag = 4 @@ -2084,25 +1674,19 @@ GetX(gear) .. ", " .. GetY(gear) .. ", gtSMine, 0, 0, 0, 0)" table.insert(sMineList, temp) + table.insert(sMineList, " SetTimer(tempG, " .. GetTimer(gear) .. ")") specialFlag = 7 elseif GetGearType(gear) == gtAirMine then + temp = " tempG = AddGear(" .. + GetX(gear) .. ", " .. + GetY(gear) .. ", gtAirMine, 0, 0, 0, 0)" + table.insert(airMineList, temp) + table.insert(airMineList, " SetTimer(tempG, " .. GetTimer(gear) .. ")") + table.insert(airMineList, " SetGearValues(tempG, nil, nil, " .. GetTimer(gear) .. ")") if (getGearValue(gear, "tag") ~= nil) then - temp = " tempG = AddGear(" .. - GetX(gear) .. ", " .. - GetY(gear) .. ", gtAirMine, 0, 0, 0, 0)" - table.insert(airMineList, temp) - table.insert(airMineList, " SetTimer(tempG, " .. GetTimer(gear) .. ")") table.insert(airMineList, " setGearValue(tempG, \"tag\", \"" .. getGearValue(gear,"tag") .. "\")") - else - - temp = " SetTimer(" .. "AddGear(" .. - GetX(gear) .. ", " .. - GetY(gear) .. ", gtAirMine, 0, 0, 0, 0)" .. ", " .. - GetTimer(gear) ..")" - table.insert(airMineList, temp) - end table.insert(previewDataList, " PreviewPlacedGear(" .. GetX(gear) ..", " .. GetY(gear) .. ")") @@ -2110,21 +1694,13 @@ elseif GetGearType(gear) == gtExplosives then + temp = " tempG = AddGear(" .. + GetX(gear) .. ", " .. + GetY(gear) .. ", gtExplosives, 0, 0, 0, 0)" + table.insert(explosivesList, temp) + table.insert(explosivesList, " SetHealth(tempG, " .. GetHealth(gear) .. ")") if (getGearValue(gear, "tag") ~= nil) then - temp = " tempG = AddGear(" .. - GetX(gear) .. ", " .. - GetY(gear) .. ", gtExplosives, 0, 0, 0, 0)" - table.insert(explosivesList, temp) - table.insert(explosivesList, " SetHealth(tempG, " .. GetHealth(gear) .. ")") table.insert(explosivesList, " setGearValue(tempG, \"tag\", \"" .. getGearValue(gear,"tag") .. "\")") - else - - temp = " SetHealth(" .. "AddGear(" .. - GetX(gear) .. ", " .. - GetY(gear) .. ", gtExplosives, 0, 0, 0, 0)" .. ", " .. - GetHealth(gear) ..")" - table.insert(explosivesList, temp) - end table.insert(previewDataList, " PreviewPlacedGear(" .. GetX(gear) ..", " .. GetY(gear) .. ")") @@ -2158,23 +1734,16 @@ table.insert(previewDataList, " PreviewPlacedGear(" .. GetX(gear) ..", " .. GetY(gear) .. ")") - if (GetHealth(gear) ~= nil) and (GetHealth(gear) ~= 0) then - + -- Health crate + if band(GetGearPos(gear), 0x2) ~= 0 then + + temp = " tempG = SpawnHealthCrate(" .. + GetX(gear) ..", " .. + GetY(gear) ..", " .. + GetHealth(gear) .. ")" + table.insert(healthCrateList, temp) if (getGearValue(gear, "tag") ~= nil) then - temp = " tempG = SpawnHealthCrate(" .. - GetX(gear) ..", " .. - GetY(gear) .. - ")" - table.insert(healthCrateList, temp) - table.insert(healthCrateList, " SetHealth(tempG, " .. GetHealth(gear) .. ")") table.insert(healthCrateList, " setGearValue(tempG, \"tag\", \"" .. getGearValue(gear,"tag") .. "\")") - else - temp = " SetHealth(SpawnHealthCrate(" .. - GetX(gear) ..", " .. - GetY(gear) .. - "), " .. - GetHealth(gear) ..")" - table.insert(healthCrateList, temp) end if GetHealth(gear) == 25 then specialFlag = 9 @@ -2183,7 +1752,8 @@ elseif GetHealth(gear) == 100 then specialFlag = 12 end - elseif getGearValue(gear,"caseType") == "ammo" then + -- Ammo crate + elseif band(GetGearPos(gear), 0x1) ~= 0 then arrayList = wepCrateList temp = " tempG = SpawnAmmoCrate(" .. @@ -2200,12 +1770,11 @@ end end - --dammit, we probably need two more entries if we want to allow editing of existing maps - table.insert(wepCrateList, " setGearValue(tempG, \"caseType\", \"" .. getGearValue(gear,"caseType") .. "\")") + --dammit, we probably need more entries if we want to allow editing of existing maps table.insert(wepCrateList, " setGearValue(tempG, \"contents\", \"" .. getGearValue(gear,"contents") .. "\")") - - elseif getGearValue(gear,"caseType") == "util" then + -- Utility crate + elseif band(GetGearPos(gear), 0x4) ~= 0 then arrayList = utilCrateList temp = " tempG = SpawnUtilityCrate(" .. @@ -2222,8 +1791,7 @@ end end - --dammit, we probably need two more entries if we want to allow editing of existing maps - table.insert(utilCrateList, " setGearValue(tempG, \"caseType\", \"" .. getGearValue(gear,"caseType") .. "\")") + --dammit, we probably need more entries if we want to allow editing of existing maps table.insert(utilCrateList, " setGearValue(tempG, \"contents\", \"" .. getGearValue(gear,"contents") .. "\")") end @@ -2355,6 +1923,25 @@ -- saves all level data to logs/game0.log and generates a simple script template function SaveLevelData() + waypointList = {} + girderList = {} + rubberList = {} + spriteList = {} + mineList = {} + sMineList = {} + airMineList = {} + targetList = {} + knifeList = {} + explosivesList = {} + healthCrateList = {} + wepCrateList = {} + utilCrateList = {} + hFlagList = {} + previewDataList = {} + shoppaPointList = {} + hogDataList = {} + AIHogDataList = {} + WriteLnToConsole("------ BEGIN SCRIPT ------") WriteLnToConsole("-- Copy and Paste this text into an empty text file, and save it as") WriteLnToConsole("-- YOURTITLEHERE.lua, in your Data/Missions/Training/ folder.") @@ -2366,24 +1953,8 @@ WriteLnToConsole("") WriteLnToConsole("local hhs = {}") - --WriteLnToConsole("local ufoGear = nil") WriteLnToConsole("") - WriteLnToConsole("local wepArray = {") - WriteLnToConsole(" amBazooka, amBee, amMortar, amDrill, amSnowball,") - WriteLnToConsole(" amGrenade, amClusterBomb, amMolotov, amWatermelon, amHellishBomb, amGasBomb,") - WriteLnToConsole(" amShotgun, amDEagle, amSniperRifle, amSineGun, amLandGun, amIceGun,") - WriteLnToConsole(" amFirePunch, amWhip, amBaseballBat, amKamikaze, amSeduction, amHammer,") - WriteLnToConsole(" amMine, amDynamite, amCake, amBallgun, amRCPlane, amSMine, amAirMine,") - WriteLnToConsole(" amAirAttack, amMineStrike, amDrillStrike, amNapalm, amPiano, amBirdy,") - WriteLnToConsole(" amBlowTorch, amPickHammer, amGirder, amRubber, amPortalGun,") - WriteLnToConsole(" amRope, amParachute, amTeleport, amJetpack,") - WriteLnToConsole(" amInvulnerable, amLaserSight, amVampiric,") - WriteLnToConsole(" amLowGravity, amExtraDamage, amExtraTime, amResurrector, amTardis, amSwitch") - WriteLnToConsole(" }") - WriteLnToConsole("") - - SaveConfigData() @@ -2439,14 +2010,18 @@ WriteLnToConsole("") for i = 0, (placedCount-1) do - if placedType[i] == loc("Waypoint Placement Mode") then + if placedType[i] == loc("Waypoint Editing Mode") then + --[[ TODO/FIXME: Somehow incorporate the waypoints in an actual useful manner. + The functions AddWayPoint and PreviewWayPoint do not exist and will thus be commented-out + in the output code. They are added anyway so the user sees the coordinates + ]] table.insert(waypointList, - " AddWayPoint(" .. + "-- AddWayPoint(" .. placedX[i] ..", " .. placedY[i] ..")" ) table.insert(hFlagList, " " .. placedX[i] .. " " .. placedY[i] .. " " .. "0") - table.insert(previewDataList, " PreviewWayPoint(" .. placedX[i] ..", " .. placedY[i] .. ")") + table.insert(previewDataList, "-- PreviewWayPoint(" .. placedX[i] ..", " .. placedY[i] .. ")") end end @@ -2458,7 +2033,7 @@ placedY[i] ..", sprAmGirder, " .. placedFrame[i] .. -- the rotation/frame ", " .. - placedTint[i] ..", " .. -- "nil, " .. -- color + placedTint[i] ..", " .. -- color "nil, nil, nil, " .. placedLandFlags[i] .. ")" --the landType ) @@ -2475,9 +2050,9 @@ placedY[i] ..", sprAmRubber, " .. placedFrame[i] .. ", " .. - placedTint[i] ..", " .. -- "nil, " .. -- color + placedTint[i] ..", " .. -- color "nil, nil, nil, " .. - "lfBouncy)" --placedLandFlags[i] .. ")" --the landType + "lfBouncy)" --the landType ) table.insert(hFlagList, " " .. placedX[i] .. " " .. placedY[i] .. " " .. placedHWMapFlag[i]) table.insert(previewDataList, " PreviewRubber(" .. placedX[i] ..", " .. placedY[i] .. ", " .. placedFrame[i] .. ")") @@ -2492,7 +2067,7 @@ placedY[i] ..", " .. placedSprite[i] .. ", " .. placedFrame[i] .. -- I think this is the frame, can't remember ", " .. - placedTint[i] ..", " .. -- "nil, " .. -- color + placedTint[i] ..", " .. -- color "nil, nil, nil, " .. placedLandFlags[i] .. ")" --the landType ) @@ -2623,35 +2198,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(" else") --- WriteLnToConsole(" vComment = loc(\"Destroy the enemy.\")") WriteLnToConsole(" end") WriteLnToConsole("") WriteLnToConsole(" if collectObj > 0 then ") WriteLnToConsole(" if collectObj == 1 then ") - WriteLnToConsole(" collectComment = loc(\"Collect the blue target\")") + WriteLnToConsole(" collectComment = loc(\"- Collect the blue crate\") .. \"|\"") WriteLnToConsole(" else ") - WriteLnToConsole(" collectComment = loc(\"Collect all the blue targets\")") + 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 Challenge\"), loc(\"Mission Goals\") .. \":\", collectComment .. \"|\" .. vComment .. \"|\" .. fComment, 0, 0)") + WriteLnToConsole(" ShowMission(loc(\"User Mission\"), loc(\"Mission\"), collectComment .. vComment .. fComment, 1, 0)") WriteLnToConsole("") WriteLnToConsole("end") @@ -2677,18 +2250,9 @@ WriteLnToConsole("") WriteLnToConsole("function onGearAdd(gear)") - --WriteLnToConsole(" if GetGearType(gear) == gtJetpack then") - --WriteLnToConsole(" ufoGear = gear") - --WriteLnToConsole(" if (ufoFuel ~= 0) then") - --WriteLnToConsole(" SetHealth(ufoGear, ufoFuel)") - --WriteLnToConsole(" end") - --WriteLnToConsole(" end") WriteLnToConsole(" if isATrackedGear(gear) then") WriteLnToConsole(" trackGear(gear)") - --WriteLnToConsole(" if GetGearType(gear) == gtPortal then") - --WriteLnToConsole(" setGearValue(gear,\"life\",portalDistance)") - --WriteLnToConsole(" end") WriteLnToConsole(" end") WriteLnToConsole("end") @@ -2711,10 +2275,12 @@ WriteLnToConsole("") WriteLnToConsole(" if (c == \"victory\") and (GetHogLevel(hhs[i]) ~= 0) then") WriteLnToConsole(" DismissTeam(GetHogTeamName(hhs[i]))") - WriteLnToConsole(" ShowMission(loc(\"User Challenge\"), loc(\"MISSION SUCCESSFUL\"), loc(\"Congratulations!\"), 0, 0)") + WriteLnToConsole(" AddCaption(loc(\"Victory!\"), 0xFFFFFFFF, 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(" ShowMission(loc(\"User Challenge\"), loc(\"MISSION FAILED\"), loc(\"Oh no! Just try again!\"), -amSkip, 0)") + WriteLnToConsole(" AddCaption(loc(\"Defeat!\"), 0xFFFFFFFF, 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") @@ -2730,9 +2296,6 @@ WriteLnToConsole("function onGearDelete(gear)") WriteLnToConsole("") WriteLnToConsole(" --insert code according to taste") - --WriteLnToConsole(" if GetGearType(gear) == gtJetpack then") - --WriteLnToConsole(" ufoGear = nil") - --WriteLnToConsole(" end") WriteLnToConsole("") WriteLnToConsole(" if isATrackedGear(gear) then") WriteLnToConsole("") @@ -2740,11 +2303,6 @@ WriteLnToConsole(" CheckForConclusion(gear)") WriteLnToConsole(" end") - --WriteLnToConsole(" if getGearValue(gear,\"tag\") == \"failure\" then") - --WriteLnToConsole(" EndGameIn(\"failure\")") - --WriteLnToConsole(" elseif getGearValue(gear,\"tag\") == \"victory\" then") - --WriteLnToConsole(" EndGameIn(\"victory\")") - --WriteLnToConsole(" end") WriteLnToConsole("") WriteLnToConsole(" if getGearValue(gear, \"tCirc\") ~= nil then") WriteLnToConsole(" DeleteVisualGear(getGearValue(gear, \"tCirc\"))") @@ -2762,13 +2320,12 @@ WriteLnToConsole("function onAmmoStoreInit()") WriteLnToConsole("") - WriteLnToConsole(" for i = 1, #wepArray do") - WriteLnToConsole(" SetAmmo(wepArray[i], 0, 0, 0, 1)") + WriteLnToConsole(" for i = 0, AmmoTypeMax do") + WriteLnToConsole(" if i ~= amNothing then") + WriteLnToConsole(" SetAmmo(i, 0, 0, 0, 1)") + WriteLnToConsole(" end") WriteLnToConsole(" end") WriteLnToConsole("") - --WriteLnToConsole(" SetAmmo(amBazooka, 2, 0, 0, 0)") - --WriteLnToConsole(" SetAmmo(amGrenade, 1, 0, 0, 0)") - --WriteLnToConsole(" SetAmmo(amRope, 9, 0, 0, 0)") WriteLnToConsole(" SetAmmo(amSkip, 9, 0, 0, 0)") WriteLnToConsole("") WriteLnToConsole("end") @@ -2801,8 +2358,7 @@ ---------------------------------- function SmokePuff(x,y,c) tempE = AddVisualGear(x, y, vgtSmoke, 0, false) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, 1, g9, c ) + SetVisualGearValues(tempE, nil, nil, nil, nil, nil, nil, nil, 1, nil, c ) end function HandleGearBasedRankingEffects(gear) @@ -2822,7 +2378,7 @@ if getGearValue(gear,"tag") ~= nil then - if cat[cIndex] == loc("Tagging Mode") then + if cat[cIndex] == loc("Goal Definition Mode") then -- generate circs for tagged gears that don't have a circ yet (new) if getGearValue(gear,"tCirc") == nil then @@ -2863,8 +2419,7 @@ if (tag == 0) or (tag == 2) then -- i.e ball form tempE = AddVisualGear(GetX(gear), GetY(gear), vgtDust, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, 1, g9, col ) + SetVisualGearValues(tempE, nil, nil, nil, nil, nil, nil, nil, 1, nil, col ) remLife = getGearValue(gear,"life") remLife = remLife - 1 @@ -2873,20 +2428,16 @@ if remLife == 0 then tempE = AddVisualGear(GetX(gear)+15, GetY(gear), vgtSmoke, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, col ) + SetVisualGearValues(tempE, nil, nil, nil, nil, nil, nil, nil, nil, col) tempE = AddVisualGear(GetX(gear)-15, GetY(gear), vgtSmoke, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, col ) + SetVisualGearValues(tempE, nil, nil, nil, nil, nil, nil, nil, nil, col) tempE = AddVisualGear(GetX(gear), GetY(gear)+15, vgtSmoke, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, col ) + SetVisualGearValues(tempE, nil, nil, nil, nil, nil, nil, nil, nil, col) tempE = AddVisualGear(GetX(gear), GetY(gear)-15, vgtSmoke, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, col ) + SetVisualGearValues(tempE, nil, nil, nil, nil, nil, nil, nil, nil, col) PlaySound(sndVaporize) @@ -2900,316 +2451,355 @@ end -function updateHelp() - - if (GetCurAmmoType() ~= amGirder) and (GetCurAmmoType() ~= amRubber) and (GetCurAmmoType() ~= amAirAttack) then - - ShowMission ( - loc("HEDGE EDITOR"), - loc("(well... kind of...)"), - loc("Place Girder: Girder") .. "|" .. - loc("Place Rubber: Rubber") .. "|" .. - loc("Place Gear: Air Attack") .. "|" .. - loc("Change Selection: [Up], [Down], [Left], [Right]") .. "|" .. - loc("Toggle Help: Precise+1 (While a tool is selected)") .. "|" .. - " " .. "|" .. - loc("COMMANDS: (Use while no weapon is selected)") .. "|" .. - loc("Save Level: Precise+4") .. "|" .. - loc("Toggle Editing Weapons and Tools: Precise+2") .. "|" .. - " " .. "|" .. - --" " .. "|" .. - "", 4, 5000 - ) - --4 +function updateHelp(curAmmoType) + if curAmmoType == nil then + curAmmoType = GetCurAmmoType() + end + + if (curAmmoType ~= amGirder) and (curAmmoType ~= amRubber) and (curAmmoType ~= amAirAttack) then + + if not hedgeEditorMissionPanelShown then + showHedgeEditorMissionPanel() + end + elseif cat[cIndex] == loc("Girder Placement Mode") then ShowMission ( loc("GIRDER PLACEMENT MODE"), - loc("Use this mode to place girders"), + loc("Place girders"), loc("Place Girder: [Left Click]") .. "|" .. loc("Change Rotation: [Left], [Right]") .. "|" .. - loc("Change LandFlag: [1], [2], [3], [4]") .. "|" .. " " .. "|" .. - loc("1 - Normal Girder") .. "|" .. - loc("2 - Indestructible Girder") .. "|" .. - loc("3 - Icy Girder") .. "|" .. - loc("4 - Bouncy Girder") .. "|" .. + loc("Normal Girder: [1]") .. "|" .. + loc("Indestructible Girder: [2]") .. "|" .. + loc("Icy Girder: [3]") .. "|" .. + loc("Bouncy Girder: [4]") .. "|" .. " " .. "|" .. loc("Deletion Mode: [5]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + " " .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", -amGirder, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Rubber Placement Mode") then ShowMission ( loc("RUBBER PLACEMENT MODE"), - loc("Use this mode to place rubberbands"), + loc("Place rubber"), loc("Place Object: [Left Click]") .. "|" .. loc("Change Rotation: [Left], [Right]") .. "|" .. - --"Change LandFlag: [1], [2], [3]" .. "|" .. - --" " .. "|" .. - loc("1 - Normal Rubber") .. "|" .. - --"2 - Indestructible Rubber" .. "|" .. - --"3 - Icy Rubber" .. "|" .. + " " .. "|" .. + loc("Normal Rubber: [1]") .. "|" .. " " .. "|" .. loc("Deletion Mode: [5]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + " " .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", -amRubber, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Barrel Placement Mode") then ShowMission ( loc("BARREL PLACEMENT MODE"), - loc("Use this mode to place barrels"), + loc("Place barrels"), loc("Place Object: [Left Click]") .. "|" .. loc("Change Health: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", 8, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Cleaver Placement Mode") then ShowMission ( - loc("CLEAVER MINE PLACEMENT MODE"), - loc("Use this mode to place cleavers"), + loc("CLEAVER PLACEMENT MODE"), + loc("Place cleavers"), loc("Place Object: [Left Click]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", -amKnife, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Target Placement Mode") then ShowMission ( - loc("TARGET MINE PLACEMENT MODE"), - loc("Use this mode to place targets"), + loc("TARGET PLACEMENT MODE"), + loc("Place targets"), loc("Place Object: [Left Click]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", 1, 60000 ) - - elseif cat[cIndex] == loc("Waypoint Placement Mode") then + hedgeEditorMissionPanelShown = false + + elseif cat[cIndex] == loc("Waypoint Editing Mode") then ShowMission ( - loc("WAYPOINT PLACEMENT MODE"), - loc("Use this mode to waypoints"), - loc("Place Waypoint: [Left Click]") .. "|" .. + loc("WAYPOINT EDITING MODE"), + loc("Place or delete waypoints"), + loc("Place/Delete Waypoint: [Left Click]") .. "|" .. + loc("Toggle Placement/Deletion: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", -amAirAttack, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Mine Placement Mode") then ShowMission ( loc("MINE PLACEMENT MODE"), - loc("Use this mode to place mines"), + loc("Place mines"), loc("Place Object: [Left Click]") .. "|" .. - loc("Change Timer (in milliseconds): [Left], [Right]") .. "|" .. + loc("Change Timer: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", -amMine, 60000 ) + hedgeEditorMissionPanelShown = false + + elseif cat[cIndex] == loc("Dud Mine Placement Mode") then + + ShowMission ( + loc("DUD MINE PLACEMENT MODE"), + loc("Place dud mines"), + loc("Place Object: [Left Click]") .. "|" .. + loc("Change Health: [Left], [Right]") .. "|" .. + " " .. "|" .. + loc("Change Placement Mode: [Up], [Down]") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. + "", 9, 60000 + ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Sticky Mine Placement Mode") then ShowMission ( - loc("STiCKY MINE PLACEMENT MODE"), - loc("Use this mode to place sticky mines"), + loc("STICKY MINE PLACEMENT MODE"), + loc("Place sticky mines"), loc("Place Object: [Left Click]") .. "|" .. + loc("Change Timer: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", -amSMine, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Air Mine Placement Mode") then ShowMission ( loc("AIR MINE PLACEMENT MODE"), - loc("Use this mode to place air mines"), + loc("Place air mines"), loc("Place Object: [Left Click]") .. "|" .. + loc("Change Timer: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", -amAirMine, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Weapon Crate Placement Mode") then ShowMission ( - "WEAPON CRATE PLACEMENT MODE", - loc("Use this mode to place weapon crates"), + loc("WEAPON CRATE PLACEMENT MODE"), + loc("Place weapon crates"), loc("Place Object: [Left Click]") .. "|" .. loc("Change Content: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", 7, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Utility Crate Placement Mode") then ShowMission ( loc("UTILITY CRATE PLACEMENT MODE"), - loc("Use this mode to place utility crates"), + loc("Place utility crates"), loc("Place Object: [Left Click]") .. "|" .. loc("Change Content: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", 5, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Health Crate Placement Mode") then ShowMission ( loc("HEALTH CRATE PLACEMENT MODE"), - loc("Use this mode to place utility crates"), + loc("Place health crates"), loc("Place Object: [Left Click]") .. "|" .. loc("Change Health Boost: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", 6, 60000 ) - - elseif cat[cIndex] == loc("Advanced Repositioning Mode") then + hedgeEditorMissionPanelShown = false + + elseif cat[cIndex] == loc("Repositioning Mode") then ShowMission ( - loc("ADVANCED REPOSITIONING MODE"), - loc("Use this mode to select and reposition gears"), - loc("[Left], [Right]: Change between selection and placement mode.") .. "|" .. + loc("REPOSITIONING MODE"), + loc("Select, reposition and delete gears"), + loc("Select/Place/Delete Gear: [Left Click]") .. "|" .. + loc("Choose Selection/Placement/Deletion: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", -amAirAttack, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Sprite Modification Mode") then ShowMission ( loc("SPRITE MODIFICATION MODE"), - "", - "Use this mode to select, modify, or delete existing girders," .. "|" .. - "rubbers, or sprites." .. "|" .. - "[Left], [Right]: Change between land-flag" .. "|" .. - --"[Left], [Right]: Change between selection, land-flag" .. "|" .. - "modification, and deletion modes." .. "|" .. - "While in modification mode, you can " .. "|" .. - "change land-flag by clicking on an object." .. "|" .. - loc("Set LandFlag: [1], [2], [3], [4]") .. "|" .. + loc("Select, modify, or delete girders, rubbers and sprites"), + loc("Modify Sprite under Cursor: [Left Click]") .. "|" .. + loc("Change modification mode: [Left], [Right]") .."|".. + loc("While in modification mode, you can change|the LandFlag by clicking on an object.") .. "|" .. " " .. "|" .. - loc("1 - Normal Land") .. "|" .. - loc("2 - Indestructible Land") .. "|" .. - loc("3 - Icy Land") .. "|" .. - loc("4 - Bouncy Land") .. "|" .. + loc("Normal Land: [1]") .. "|" .. + loc("Indestructible Land: [2]") .. "|" .. + loc("Icy Land: [3]") .. "|" .. + loc("Bouncy Land: [4]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. - "", -amAirAttack, 60000 + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. + "", 2, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Sprite Placement Mode") then ShowMission ( loc("SPRITE PLACEMENT MODE"), - loc("Use this mode to place custom sprites."), - loc("[Left], [Right]: Change sprite selection") .. "|" .. - loc("Set LandFlag: [1], [2], [3], [4]") .. "|" .. + loc("Place sprites to build land"), + loc("Place Sprite: [Left Click]") .. "|" .. + loc("Change Sprite: [Left], [Right]") .. "|" .. + loc("Change Sprite Frame: [Precise]+[Left], [Precise]+[Right]") .. "|" .. " " .. "|" .. - loc("1 - Normal Land") .. "|" .. - loc("2 - Indestructible Land") .. "|" .. - loc("3 - Icy Land") .. "|" .. - loc("4 - Bouncy Land") .. "|" .. + loc("Normal Land: [1]") .. "|" .. + loc("Indestructible Land: [2]") .. "|" .. + loc("Icy Land: [3]") .. "|" .. + loc("Bouncy Land: [4]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. - "", 2, 60000 + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. + "", -amAirAttack, 60000 ) - - --elseif cat[cIndex] == loc("Sprite Testing Mode") then - - -- ShowMission ( - -- "SPRITE TESTING MODE", - -- "Use this mode to test sprites before you place them.", - -- "Place Temporary Visual Test: [Left Click]" .. "|" .. - -- "[Left], [Right]: Change between sprites." .. "|" .. - -- " " .. "|" .. - -- loc("Change Placement Mode: [Up], [Down]") .. "|" .. - -- loc("Toggle Help: Precise+1") .. "|" .. - -- "", 3, 60000 - -- ) - - elseif cat[cIndex] == loc("Tagging Mode") then + hedgeEditorMissionPanelShown = false + + elseif cat[cIndex] == loc("Goal Definition Mode") then ShowMission ( - loc("TAGGING MODE"), - loc("Use this mode to tag gears for win/lose conditions."), - loc("Tag Gear: [Left Click]") .. "|" .. - loc("[Left], [Right]: Change between tagging modes.") .. "|" .. + loc("GOAL DEFINITION MODE"), + loc("Mark gears for win/lose conditions"), + loc("Mark/unmark gear: [Left Click]") .. "|" .. + loc("Select win/lose condition: [Left], [Right]") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. - "", 3, 60000 + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. + "", 0, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Hog Identity Mode") then ShowMission ( loc("HOG IDENTITY MODE"), - loc("Use this mode to give a hog a preset identity and weapons."), + loc("Give a hog a preset identity and weapons"), loc("Set Identity: [Left Click]") .. "|" .. loc("[Left], [Right]: Change between identities.") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", 3, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Team Identity Mode") then ShowMission ( loc("TEAM IDENTITY MODE"), - loc("Use this mode to give an entire team themed hats and names."), + loc("Give an entire team themed hats and names"), loc("Set Identity: [Left Click]") .. "|" .. loc("[Left], [Right]: Change between identities.") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. "", 3, 60000 ) + hedgeEditorMissionPanelShown = false elseif cat[cIndex] == loc("Health Modification Mode") then ShowMission ( loc("HEALTH MODIFICATION MODE"), - loc("Use this mode to set the health of hogs, health crates and barrels."), + loc("Set the health of hogs, health crates, barrels and duds"), loc("Set Health: [Left Click]") .. "|" .. loc("[Left], [Right]: Change health value.") .. "|" .. " " .. "|" .. loc("Change Placement Mode: [Up], [Down]") .. "|" .. - loc("Toggle Help: Precise+1") .. "|" .. - "", 3, 60000 + loc("Toggle Help: [Precise]+[1]") .. "|" .. + loc("Toggle Gear Information: [Precise]+[3]") .. "|" .. + "", 2, 60000 ) + hedgeEditorMissionPanelShown = false end if helpDisabled == true then HideMission() + hedgeEditorMissionPanelShown = false end end +function onSetWeapon(ammoType) + curWep = ammoType + updateHelp(ammoType) +end + +function onSlot() + curWep = GetCurAmmoType() + updateHelp(ammoType) +end + -- called in onGameTick() function HandleHedgeEditor() @@ -3232,6 +2822,9 @@ if (cat[cIndex] == loc("Mine Placement Mode")) then dSprite = sprBotlevels--sprMineOff dFrame = 1 + elseif (cat[cIndex] == loc("Dud Mine Placement Mode")) then + dSprite = sprBotlevels--sprMineDead + dFrame = 3 elseif (cat[cIndex] == loc("Sticky Mine Placement Mode")) then dSprite = sprBotlevels--sprSMineOff dFrame = 2 @@ -3252,7 +2845,11 @@ dSprite = sprKnife elseif (cat[cIndex] == loc("Sprite Placement Mode")) then dSprite = reducedSpriteIDArray[pIndex] - dFrame = 1 + dFrame = sFrame + if ((dSprite == sprAMAmmos) or (dSprite == sprAMAmmosBW)) and (dFrame == (amAirAttack - 1)) then + -- Special case: Air attack icon of ammos sprite needs to be fixed (since this icon is overwritten) + dFrame = ammoFrameAirAttack + end else dCol = 0xFFFFFF00 dSprite = sprArrow @@ -3261,7 +2858,6 @@ if CG == nil then CG = AddVisualGear(CursorX, CursorY, vgtStraightShot,0,true,3) end - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(CG) SetVisualGearValues(CG, CursorX, CursorY, 0, 0, dAngle, dFrame, 1000, dSprite, 1000, dCol) @@ -3282,8 +2878,14 @@ end tSprCol = 0xFFFFFFFF - tempFrame = tArr[pIndex][3] - + -- Get ammo icon + if tArr[pIndex][3] then + -- Overwritten ammo icon + tempFrame = tArr[pIndex][3] + else + -- Use default ammo icon + tempFrame = tArr[pIndex][1] - 1 + end end else @@ -3293,20 +2895,16 @@ end SetVisualGearValues(crateSprite, CursorX+xDisplacement, CursorY+yDisplacement, 0, 0, dAngle, tempFrame, 1000, sprAMAmmos, 1000, tSprCol) - SetVisualGearValues(tSpr[1], CursorX+xDisplacement-2, CursorY+yDisplacement-2, 0, 0, dAngle, 10, 1000, sprTarget, 1000, tSprCol) - SetVisualGearValues(tSpr[2], CursorX+xDisplacement-2, CursorY+yDisplacement+2, 0, 0, dAngle, 10, 1000, sprTarget, 1000, tSprCol) - SetVisualGearValues(tSpr[3], CursorX+xDisplacement+2, CursorY+yDisplacement-2, 0, 0, dAngle, 10, 1000, sprTarget, 1000, tSprCol) - SetVisualGearValues(tSpr[4], CursorX+xDisplacement+2, CursorY+yDisplacement+2, 0, 0, dAngle, 10, 1000, sprTarget, 1000, tSprCol) + SetVisualGearValues(tSpr[1], CursorX+xDisplacement-2, CursorY+yDisplacement-2, 0, 0, dAngle, 1, 1000, sprTarget, 1000, tSprCol) + SetVisualGearValues(tSpr[2], CursorX+xDisplacement-2, CursorY+yDisplacement+2, 0, 0, dAngle, 1, 1000, sprTarget, 1000, tSprCol) + SetVisualGearValues(tSpr[3], CursorX+xDisplacement+2, CursorY+yDisplacement-2, 0, 0, dAngle, 1, 1000, sprTarget, 1000, tSprCol) + SetVisualGearValues(tSpr[4], CursorX+xDisplacement+2, CursorY+yDisplacement+2, 0, 0, dAngle, 1, 1000, sprTarget, 1000, tSprCol) if genTimer >= 100 then genTimer = 0 - --if destroyMap == true then - -- BlowShitUpPartTwo() - --end - curWep = GetCurAmmoType() HandleRankingEffects() @@ -3325,36 +2923,27 @@ elseif (cIndex == 1) and (curWep ~= amGirder) then cIndex = 3 -- was 2 RedefineSubset() - --updateHelp() elseif (cIndex == 2) and (curWep ~= amRubber) then cIndex = 3 --new RedefineSubset() - --updateHelp() - end -- update display selection criteria if (curWep == amGirder) or (curWep == amRubber) or (curWep == amAirAttack) then AddCaption(cat[cIndex],0xffba00ff,capgrpMessage) - local caption2 - if type(pMode[pIndex]) == "table" then - caption2 = tostring(pMode[pIndex][1]) - else - caption2 = tostring(pMode[pIndex]) - end - AddCaption(caption2,0xffba00ff,capgrpMessage2) + showSecondaryMessage() if superDelete == true then - AddCaption(loc("Warning: Deletition Mode Active"),0xffba00ff,capgrpAmmoinfo) + AddCaption(loc("Deletition Mode"),0xffba00ff,capgrpAmmoinfo) end end if sSprite ~= nil then - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(sSprite) - SetVisualGearValues(sSprite, g1, g2, 0, 0, g5, g6, 10000, g8, 10000, g10 ) - --AddCaption(g7) + SetVisualGearValues(sSprite, nil, nil, 0, 0, nil, nil, 10000, nil, 10000 ) end + updateHelp() + end end @@ -3369,15 +2958,12 @@ -- kinda lazy, but at least we don't have to do elaborate tacking elsewhere SetVisualGearValues(sCirc, 0, 0, 0, 1, 1, 10, 0, 1, 1, 0x00000000) --update selected gear display - if (cat[cIndex] == loc("Advanced Repositioning Mode")) and (sGear ~= nil) then + if (cat[cIndex] == loc("Repositioning Mode")) and (sGear ~= nil) then SetVisualGearValues(sCirc, GetX(sGear), GetY(sGear), 100, 255, 1, 10, 0, 300, 3, 0xff00ffff) elseif (cat[cIndex] == loc("Sprite Modification Mode")) and (sSprite ~= nil) then - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(sSprite) - SetVisualGearValues(sSprite, g1, g2, 0, 0, g5, g6, 10000, g8, 10000, g10 ) - elseif (cat[cIndex] == loc("Tagging Mode")) then + SetVisualGearValues(sSprite, nil, nil, 0, 0, nil, nil, 10000, nil, 10000) + elseif (cat[cIndex] == loc("Goal Definition Mode")) then if (sGear ~= nil) or (closestGear ~= nil) then - --recently disabled - --SetVisualGearValues(sCirc, GetX(sGear), GetY(sGear), 0, 1, 1, 10, 0, 1, 1, 0x00000000) closestGear = nil sGear = nil end @@ -3392,7 +2978,7 @@ x,y = GetGearTarget(cGear) - if GetGearType(cGear) == gtAirAttack then + if GetGearType(cGear) == gtAirAttack and GetCurAmmoType() == amAirAttack then DeleteGear(cGear) PlaceObject(x, y) elseif GetGearType(cGear) == gtGirder then @@ -3400,34 +2986,122 @@ CGR = GetState(cGear) -- improve rectangle test based on CGR when you can be bothered - --if TestRectForObstacle(x-20, y-20, x+20, y+20, true) then - -- AddCaption(loc("Invalid Girder Placement"),0xffba00ff,capgrpVolume) - --else - PlaceObject(x, y) - --end - - -- this allows the girder tool to be used like a mining laser - - --[[ - - if CGR < 4 then - AddGear(x, y, gtGrenade, 0, 0, 0, 1) - elseif CGR == 4 then - g = AddGear(x-30, y, gtGrenade, 0, 0, 0, 1) - g = AddGear(x+30, y, gtGrenade, 0, 0, 0, 1) - elseif CGR == 5 then ------- - g = AddGear(x+30, y+30, gtGrenade, 0, 0, 0, 1) - g = AddGear(x-30, y-30, gtGrenade, 0, 0, 0, 1) - elseif CGR == 6 then - g = AddGear(x, y+30, gtGrenade, 0, 0, 0, 1) - g = AddGear(x, y-30, gtGrenade, 0, 0, 0, 1) - elseif CGR == 7 then ------- - g = AddGear(x+30, y-30, gtGrenade, 0, 0, 0, 1) - g = AddGear(x-30, y+30, gtGrenade, 0, 0, 0, 1) + PlaceObject(x, y) + end + + end + + -- 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 + 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 @@ -3458,16 +3132,30 @@ AddCaption(loc("The editor weapons and tools have been added!")) end elseif (preciseOn == true) and (s == 1) then - if (GetCurAmmoType() == amGirder) or (GetCurAmmoType() == amRubber) or (GetCurAmmoType() == amAirAttack) then - helpDisabled = not(helpDisabled) - AddCaption("Help Disabled: " .. BoolToString(helpDisabled),0xffba00ff,capgrpVolume) - updateHelp() + helpDisabled = not(helpDisabled) + if helpDisabled then + AddCaption(loc("Help Disabled"),0xffba00ff,capgrpVolume) + else + AddCaption(loc("Help Enabled"),0xffba00ff,capgrpVolume) end + updateHelp() + elseif (preciseOn == true) and (s == 3) then + showGearTags = not(showGearTags) + if showGearTags then + AddCaption(loc("Gear information shown"),0xffba00ff,capgrpVolume) + else + AddCaption(loc("Gear information hidden"),0xffba00ff,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")) and (s ~= 5) then - landType = lfBouncy - AddCaption(loc("Bouncy Land"),0xffba00ff,capgrpAmmoinfo) + if (cat[cIndex] == loc("Rubber Placement Mode")) then + if s == 1 then + landType = lfBouncy + AddCaption(loc("Bouncy Land"),0xffba00ff,capgrpAmmoinfo) + elseif s == 5 then + superDelete = true + end elseif s == 1 then landType = 0 AddCaption(loc("Normal Land"),0xffba00ff,capgrpAmmoinfo) @@ -3477,17 +3165,16 @@ elseif s == 3 then landType = lfIce AddCaption(loc("Icy Land"),0xffba00ff,capgrpAmmoinfo) - elseif (s == 4) then --and (cat[cIndex] == "Sprite Placement Mode") then + elseif (s == 4) then landType = lfBouncy AddCaption(loc("Bouncy Land"),0xffba00ff,capgrpAmmoinfo) - elseif (s == 5) and (cat[cIndex] ~= loc("Sprite Modification Mode")) then + elseif (s == 5) and (cat[cIndex] ~= loc("Sprite Modification Mode")) and (cat[cIndex] ~= loc("Sprite Placement Mode")) then superDelete = true - -- this and the above should probably be shown in another place where the other - -- two add captions are displayed for this kinda thing - --AddCaption(loc("Warning: Deletition Mode Active"),0xffba00ff,capgrpAmmoinfo) end elseif pMode[pIndex] == loc("Selection Mode") then - setGearValue(sGear, "ranking", s) + if sGear ~= nil and GetGearType(sGear) == gtHedgehog then + setGearValue(sGear, "ranking", s) + end end end @@ -3496,118 +3183,44 @@ preciseOn = true - --ParseCommand("voicepack " .. "Surfer") - --AddCaption(GetHogGrave(CurrentHedgehog)) - - --if (pMode[pIndex] == "Selection Mode") and (closestGear ~= nil) then - -- menuEnabled = not(menuEnabled) - --showmenu - --end - - --BlowShitUp() - ---[[ - frameID = 1 - visualSprite = sprAmGirder--reducedSpriteIDArray[pIndex] - --visualSprite = spriteIDArray[pIndex] - tempE = AddVisualGear(1, 1, vgtStraightShot, 0, true,1) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, g1, g2, 0, 0, g5, frameID, g7, visualSprite, g9, g10 ) - -]] - end function onPreciseUp() preciseOn = false end ---[[function onLJump() -end - -function onHJump() -end]] - ---[[function UpdateMenu() - - preMenuCfg = loc("Use the arrow keys to navigate this menu") .. "|" - postMenuCfg = loc("Press [Fire] to accept this configuration.") - - menu = { - loc("Walls Required") .. ": " .. #wTouched .. "|", - loc("Surf Before Crate") .. ": " .. BoolToCfgTxt(requireSurfer) .. "|", - loc("Attack From Rope") .. ": " .. BoolToCfgTxt(AFR) .. "|", - loc("Super Weapons") .. ": " .. BoolToCfgTxt(allowCrazyWeps) .. "|" - } -end - -function HandleStartingStage() - - temp = menu[menuIndex] - menu[menuIndex] = "--> " .. menu[menuIndex] - - missionComment = "" - for i = 1, #menu do - missionComment = missionComment .. menu[i] +function showSecondaryMessage() + local caption2 + if curWep == amGirder then + caption2 = loc("Girder") + elseif curWep == amRubber then + caption2 = loc("Rubber") + elseif cat[cIndex] == loc("Mine Placement Mode") or cat[cIndex] == loc("Sticky Mine Placement Mode") or cat[cIndex] == loc("Air Mine Placement Mode") then + caption2 = string.format(loc("%d ms"), pMode[pIndex]) + elseif cat[cIndex] == loc("Dud Mine Placement Mode") or cat[cIndex] == loc("Barrel Placement Mode") or cat[cIndex] == loc("Health Crate Placement Mode") then + caption2 = string.format(loc("Health: %d"), pMode[pIndex]) + elseif cat[cIndex] == loc("Health Modification Mode") then + local health = tonumber(pMode[pIndex][1]) + local mode = pMode[pIndex][2] + if mode == "set" then + caption2 = string.format(loc("Set to %d"), health) + elseif mode == "mod" then + if health < 0 then + caption2 = string.format(loc("Subtract %d"), math.abs(health)) + else + caption2 = string.format(loc("Add %d"), health) + end + else + caption2 = "ERROR" + end + elseif type(pMode[pIndex]) == "table" then + caption2 = tostring(pMode[pIndex][1]) + else + caption2 = tostring(pMode[pIndex]) end - - ShowMission ( - loc("HEDGE EDITOR") .. " 0.4", - loc("Edit gear properties"), - preMenuCfg.. - missionComment .. - postMenuCfg .. - --" " .. "|" .. - "", 4, 300000 - ) - - menu[menuIndex] = temp - + AddCaption(caption2, 0xffba00ff, capgrpMessage2) end -function UpdateMenuCategoryOrSomething() - temp = menu[1] - menu = {} - if temp == "Initialisation Menu" then - for i = 1, #initMenuArray do - menu[i] = initMenuArray[i] .. ": " .. initMenuArray[2] - end - elseif temp == "GameFlag Menu" then - for i = 1, #gameFlagList do - menu[i] = gameFlagList[1] .. ": " .. BoolToStr(gameFlagList[2]) - end - elseif temp == "Ammo Menu" then - for i = 1, #atkArray do --except, this should be per hog, not overall :( - --menu[i] = atkArray[i][2] .. ": " .. atkArray[i][3] - menu[i] = atkArray[i][2] .. ": " .. getGearValue(sGear,atkArray[i][1]) - end - -- you should run through all the hogs and assign them ammo values based on the - -- ammo set, yea, let's write that function in 5th - for i = #menu, #utilArray do - end - end -end - -function doMenuShit(d) - - if d == "up" then - menuIndex = menuIndex -1 - if menuIndex == 0 then - menuIndex = #menu - end - elseif d == "down" then - menuIndex = menuIndex +1 - if menuIndex > #menu then - menuIndex = 1 - end - elseif d == "left" then - - elseif d == "right" then - - end - -end]] - --------------------------------------------------------------- -- Cycle through selection subsets (by changing pIndex, pMode) -- i.e health of barrels, medikits, @@ -3616,47 +3229,61 @@ --------------------------------------------------------------- function onLeft() - leftHeld = true - rightHeld = false - - --if menuEnabled == true then - --doMenuShit("left") - - --else -- normal case - - pIndex = pIndex - 1 - if pIndex == 0 then - pIndex = #pMode + if (curWep == amAirAttack) then + leftHeld = true + rightHeld = false + + if preciseOn then + if cat[cIndex] == loc("Sprite Placement Mode") then + sFrame = sFrame - 1 + if sFrame < 0 then + sFrame = reducedSpriteIDArrayFrames[pIndex] - 1 + end + end + else + pIndex = pIndex - 1 + if pIndex == 0 then + pIndex = #pMode + end + if cat[cIndex] == loc("Sprite Placement Mode") then + sFrame = math.min(sFrame, reducedSpriteIDArrayFrames[pIndex] - 1) + end + + if (curWep == amGirder) or (curWep == amRubber) or (curWep == amAirAttack) then + showSecondaryMessage() + end end - - if (curWep == amGirder) or (curWep == amRubber) or (curWep == amAirAttack) then - AddCaption(pMode[pIndex],0xffba00ff,capgrpMessage2) - end - - --end + end end function onRight() - leftHeld = false - rightHeld = true - - --if menuEnabled == true then - --doMenuShit("right") - - --else -- normal case - - pIndex = pIndex + 1 - if pIndex > #pMode then - pIndex = 1 + if (curWep == amAirAttack) then + leftHeld = false + rightHeld = true + + if preciseOn then + if cat[cIndex] == loc("Sprite Placement Mode") then + sFrame = sFrame + 1 + if sFrame >= reducedSpriteIDArrayFrames[pIndex] then + sFrame = 0 + end + end + else + pIndex = pIndex + 1 + if pIndex > #pMode then + pIndex = 1 + end + if cat[cIndex] == loc("Sprite Placement Mode") then + sFrame = math.min(sFrame, reducedSpriteIDArrayFrames[pIndex] - 1) + end + + if (curWep == amGirder) or (curWep == amRubber) or (curWep == amAirAttack) then + showSecondaryMessage() + end end - - if (curWep == amGirder) or (curWep == amRubber) or (curWep == amAirAttack) then - AddCaption(pMode[pIndex],0xffba00ff,capgrpMessage2) - end - - --end + end end @@ -3667,12 +3294,7 @@ --------------------------------------------------------- function onUp() - --if menuEnabled == true then - --doMenuShit("up") - - --elseif (curWep ~= amGirder) then - if (curWep ~= amGirder) then - --AddCaption(cIndex) + if (curWep == amAirAttack) then cIndex = cIndex - 1 if (cIndex == 1) or (cIndex == 2) then --1 --we no longer hit girder by normal means cIndex = #cat @@ -3687,11 +3309,7 @@ function onDown() - --if menuEnabled == true then - --doMenuShit("down") - - --elseif (curWep ~= amGirder) then - if (curWep ~= amGirder) then + if (curWep == amAirAttack) then cIndex = cIndex + 1 if cIndex > #cat then cIndex = 3 -- 2 ----we no longer hit girder by normal means @@ -3737,11 +3355,6 @@ function onGameInit() -- perhaps we can get some of this better info in parsecommandoverride - --Map = "Islands" - --Theme = "Deepspace" - --Seed = "{bacb2f87-f316-4691-a333-3bcfc4fb3d88}" - --MapGen = 0 -- 0:generated map, 1:generated maze, 2:hand drawn map - --TemplateFilter = 5 -- small=1,med=2,large=3,cavern=4,wacky=5 if mapID == nil then mapID = 1 @@ -3756,16 +3369,51 @@ end end + reducedSpriteIDArrayFrames = { + 1, 8, 4, 1, 1, + AmmoTypeMax, AmmoTypeMax, 3, 4, 8, 1, + 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, + } + Explosives = 0 MinesNum = 0 - --GameFlags = GameFlags + gfInfAttack EnableGameFlags(gfInfAttack, gfDisableWind) RedefineSubset() end +function showHedgeEditorMissionPanel() + ShowMission ( + loc("HEDGEEDITOR"), + loc("An experimental (and buggy!) editing tool for missions and more"), + loc("Manual: https://hedgewars.org/hedgeeditor") .. "|" .. + " " .. "|" .. + loc("Place Girder: Girder") .. "|" .. + 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]") .. "|" .. + loc("Toggle Editing Weapons and Tools: [Precise]+[2]") + , 4, 5000 + ) + + SetAmmoTexts(amAirAttack, + loc("Gear Placement Tool"), + loc("HedgeEditor tool"), + loc("Place, modify and delete gears (e.g. objects)|and waypoints, edit hedgehog settings, values,|victory conditions, and more.") .. "|" .. + loc("Select a placement mode and read the infos|in the mission panel to learn how to use it.") .. "|" .. + loc("Up/Down: Change placement mode") .. "|" .. + loc("Cursor: Mode action")) + + hedgeEditorMissionPanelShown = true +end + function onGameStart() trackTeams() @@ -3774,40 +3422,23 @@ InterpretPoints() LoadLevelData() - ShowMission ( - loc("HEDGE EDITOR"), - loc("(well... kind of...)"), - loc("Place Girder: Girder") .. "|" .. - loc("Place Rubber: Rubber") .. "|" .. - loc("Place Gear: Air Attack") .. "|" .. - loc("Change Selection: [Up], [Down], [Left], [Right]") .. "|" .. - loc("Toggle Help: Precise+1 (While a tool is selected)") .. "|" .. - " " .. "|" .. - loc("COMMANDS: (Use while no weapon is selected)") .. "|" .. - loc("Save Level: Precise+4") .. "|" .. - loc("Toggle Editing Weapons and Tools: Precise+2") .. "|" .. - " " .. "|" .. - --" " .. "|" .. - "", 4, 5000 - ) - + showHedgeEditorMissionPanel() sCirc = AddVisualGear(0,0,vgtCircle,0,true) SetVisualGearValues(sCirc, 0, 0, 100, 255, 1, 10, 0, 40, 3, 0xffba00ff) + --[[ This is a small hack to disable Hedgewars' girder placement since we do it on our own; + this will remove the "girder circle" and gets rid of the placement failure animation ]] + SetMaxBuildDistance(1) frameID = 1 visualSprite = sprAmGirder sSprite = AddVisualGear(0, 0, vgtStraightShot, 0, true,1) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(sSprite) - SetVisualGearValues(sSprite, 1, 1, 0, 0, g5, frameID, 20000, visualSprite, 20000, g10 ) + SetVisualGearValues(sSprite, 1, 1, 0, 0, nil, frameID, 20000, visualSprite, 20000, 0 ) SetAmmoDelay(amAirAttack,0) SetAmmoDelay(amGirder,0) SetAmmoDelay(amRubber,0) - --SetAmmoDelay(amNapalm,0) - --SetAmmoDelay(amDrillStrike,0) - --SetAmmoDelay(amMineStrike,0) end @@ -3816,12 +3447,9 @@ AddAmmo(CurrentHedgehog, amAirAttack, ammoCount) AddAmmo(CurrentHedgehog, amGirder, ammoCount) AddAmmo(CurrentHedgehog, amRubber, ammoCount) - --AddAmmo(CurrentHedgehog, amPortalGun, ammoCount) AddAmmo(CurrentHedgehog, amTeleport, ammoCount) AddAmmo(CurrentHedgehog, amRope, ammoCount) - --AddAmmo(CurrentHedgehog, amJetpack, ammoCount) - --AddAmmo(CurrentHedgehog, amParachute, ammoCount) - AddAmmo(CurrentHedgehog, amSwitch, 100) --ammoCount + AddAmmo(CurrentHedgehog, amSwitch, 100) AddAmmo(CurrentHedgehog, amSkip, 100) end @@ -3850,7 +3478,6 @@ table.insert(nArr,preMadeTeam[pIndex][3][i]) end SetHogTeamName(gear, tName) - --runOnHogsInTeam(AssignTeam(gear),tName) runOnHogs(AssignTeam) end @@ -3862,6 +3489,7 @@ setGearValue(gear,"voice",preMadeTeam[pIndex][6]) setGearValue(gear,"grave",preMadeTeam[pIndex][7]) setGearValue(gear,"fort",preMadeTeam[pIndex][8]) + setGearValue(gear,"originalTeamName",preMadeTeamNamesOriginal[pIndex]) if preMadeTeam[pIndex][4] == "R" then -- random team @@ -3878,14 +3506,14 @@ if #nArr > 0 then i = 1+GetRandom(#nArr) - SetHogName(gear,nArr[i]) + SetHogNameAndTranslate(gear, nArr[i]) table.remove(nArr,i) else - SetHogName(gear,preMadeTeam[pIndex][3][1+GetRandom(#preMadeTeam[pIndex][3])]) + SetHogNameAndTranslate(gear, preMadeTeam[pIndex][3][1+GetRandom(#preMadeTeam[pIndex][3])]) end elseif preMadeTeam[pIndex][4] == "F" then -- fixed team w/ exactly 8 guys - SetHogName(gear,preMadeTeam[pIndex][3][hIndex]) + SetHogNameAndTranslate(gear, preMadeTeam[pIndex][3][hIndex]) SetHogHat(gear,preMadeTeam[pIndex][2][hIndex]) hIndex = hIndex +1 else -- FR fixed random team with more or less than 8 guys @@ -3893,12 +3521,12 @@ if #hArr > 0 then i = 1+GetRandom(#hArr) SetHogHat(gear,hArr[i]) - SetHogName(gear,nArr[i]) + SetHogNameAndTranslate(gear, nArr[i]) table.remove(hArr,i) table.remove(nArr,i) else SetHogHat(gear,"NoHat") - SetHogName(gear,"Uninspiring hog") + SetHogNameAndTranslate(gear,loc_noop("Hedgehog")) end end @@ -3915,7 +3543,7 @@ if pro == loc("Sniper") then - SetHogName(gear,"Sniper") + SetHogNameAndTranslate(gear, "Sniper") SetHogHat(gear, "Sniper") SetHealth(gear, 50) AddAmmo(gear, amSniperRifle, 100) @@ -3923,7 +3551,7 @@ elseif pro == loc("Pyro") then - SetHogName(gear,loc("Pyro")) + SetHogNameAndTranslate(gear, "Pyro") SetHogHat(gear, "Gasmask") SetHealth(gear, 80) AddAmmo(gear, amFlamethrower, 100) @@ -3932,9 +3560,8 @@ elseif pro == loc("Soldier") then - SetHogName(gear,loc("Soldier")) - --SetHogHat(gear, "war_americanww2helmet") - SetHogHat(gear, "TeamSoldier") + SetHogNameAndTranslate(gear, "Soldier") + SetHogHat(gear, "war_americanww2helmet") SetHealth(gear, 100) AddAmmo(gear, amBazooka, 100) AddAmmo(gear, amShotgun, 100) @@ -3942,7 +3569,7 @@ elseif pro == loc("Grenadier") then - SetHogName(gear,loc("Grenadier")) + SetHogNameAndTranslate(gear, "Grenadier") SetHogHat(gear, "war_desertgrenadier1") SetHealth(gear, 100) AddAmmo(gear, amGrenade, 100) @@ -3951,17 +3578,16 @@ elseif pro == loc("Chef") then - SetHogName(gear,loc("Chef")) + SetHogNameAndTranslate(gear, "Chef") SetHogHat(gear, "chef") SetHealth(gear, 65) AddAmmo(gear, amGasBomb, 100) AddAmmo(gear, amKnife, 100) AddAmmo(gear, amCake, 1) - --AddAmmo(gear, amWatermelon, 1) elseif pro == loc("Ninja") then - SetHogName(gear,loc("Ninja")) + SetHogNameAndTranslate(gear, "Ninja") SetHogHat(gear, "NinjaFull") SetHealth(gear, 80) AddAmmo(gear, amRope, 100) @@ -3970,7 +3596,7 @@ elseif pro == loc("Commander") then - SetHogName(gear,loc("Commander")) + SetHogNameAndTranslate(gear, "Commander") SetHogHat(gear, "sf_vega") SetHealth(gear, 120) AddAmmo(gear, amDEagle, 100) @@ -3981,7 +3607,7 @@ elseif pro == loc("Engineer") then - SetHogName(gear,loc("Engineer")) + SetHogNameAndTranslate(gear, "Engineer") SetHogHat(gear, "Glasses") SetHealth(gear, 45) AddAmmo(gear, amGirder, 4) @@ -3992,7 +3618,7 @@ elseif pro == loc("Physicist") then - SetHogName(gear,loc("Physicist")) + SetHogNameAndTranslate(gear, "Physicist") SetHogHat(gear, "lambda") SetHealth(gear, 80) AddAmmo(gear, amIceGun, 2) @@ -4002,7 +3628,7 @@ elseif pro == loc("Trapper") then - SetHogName(gear,loc("Trapper")) + SetHogNameAndTranslate(gear, "Trapper") SetHogHat(gear, "Skull") SetHealth(gear, 100) AddAmmo(gear, amMine, 100) @@ -4012,7 +3638,7 @@ elseif pro == loc("Saint") then - SetHogName(gear,loc("Saint")) + SetHogNameAndTranslate(gear, "Saint") SetHogHat(gear, "angel") SetHealth(gear, 200) AddAmmo(gear, amSeduction, 100) @@ -4023,14 +3649,13 @@ elseif pro == loc("Clown") then - SetHogName(gear,loc("Clown")) + SetHogNameAndTranslate(gear, "Clown") SetHogHat(gear, "clown-copper") SetHealth(gear, 70) AddAmmo(gear, amBaseballBat, 100) AddAmmo(gear, amGasBomb, 100) AddAmmo(gear, amBallgun, 1) AddAmmo(gear, amKamikaze, 1) - --AddAmmo(gear, amPiano, 1) -- some other ideas/roles -- relocator: portal, teleport, tardis, extra time, lasersite @@ -4055,7 +3680,7 @@ if GetHogLevel(CurrentHedgehog) == 0 then TurnTimeLeft = -1 -- is that turntime in your pocket? :D else - TurnTimeLeft = 1 -- skip the computer's turn + ParseCommand("skip") -- skip the computer's turn end end @@ -4082,6 +3707,14 @@ end end +function SetHogNameAndTranslate(gear, originalName) + SetHogName(gear, loc(originalName)) + --[[ Store the original (usually English) hog name, since we need it for exporting. + This way, we can display the translated name in the editor and export the properly + loc()'ed original name afterwards ]] + setGearValue(gear, "originalName", originalName) +end + -- track hedgehogs and placement gears function onGearAdd(gear) @@ -4092,12 +3725,40 @@ end end - if GetGearType(gear) == gtHedgehog then - --table.insert(hhs, gear) - elseif (GetGearType(gear) == gtAirAttack) or (GetGearType(gear) == gtGirder) then + if (GetGearType(gear) == gtAirAttack and GetCurAmmoType() == amAirAttack) or (GetGearType(gear) == gtGirder) then cGear = gear end + local tagTint + if showGearTags then + tagTint = 0xFFFFFFFF + else + tagTint = 0x00000000 + end + if ((GetGearType(gear) == gtMine and GetHealth(gear) ~= 0) or GetGearType(gear) == gtSMine) 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) 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) @@ -4110,15 +3771,24 @@ end function onGearDelete(gear) - - if GetGearType(gear) == gtJetpack then + local gt = GetGearType(gear) + + if gt == gtJetpack then ufoGear = nil end - if (GetGearType(gear) == gtAirAttack) or (GetGearType(gear) == gtGirder) then + if (gt == gtAirAttack and GetGearPos(gear) == 0) or gt == gtGirder then 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 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Highlander.cfg --- a/share/hedgewars/Data/Scripts/Multiplayer/Highlander.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Highlander.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,2 @@ -* +Default Highlander diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,9 +1,10 @@ -------------------------------- -- HIGHLANDER / HOGS OF WAR --- version 0.4b -- by mikade -------------------------------- +-- Ancient changelog: + ----------- --0.1 ----------- @@ -91,7 +92,7 @@ HedgewarsScriptLoad("/Scripts/Tracker.lua") HedgewarsScriptLoad("/Scripts/Params.lua") --- These define weps allowed by the script. At present Tardis and Resurrection is banned for example +-- These define weps allowed by the script. -- These were arbitrarily defined out-of-order in initial script, so that was preserved here, resulting -- in a moderately odd syntax. local atkWeps = { @@ -103,6 +104,7 @@ [amSeduction]=true, [amHammer]=true, [amMine]=true, [amDynamite]=true, [amCake]=true, [amBallgun]=true, [amSMine]=true, [amRCPlane]=true, [amBirdy]=true, [amKnife]=true, [amAirAttack]=true, [amMineStrike]=true, [amNapalm]=true, [amDrillStrike]=true, [amPiano]=true, [amAirMine] = true, + [amDuck]=true, } local utilWeps = { @@ -113,6 +115,11 @@ [amLandGun]=true, [amRubber]=true, [amIceGun]=true, } +-- Intentionally left out: +-- * Resurrector (guaranteed to screw up the game) +-- * Time Box +-- * Switch Hedgehog (not sure why) + local wepArray = {} local atkChoices = {} @@ -129,15 +136,20 @@ local probability = {1,2,5,10,20,50,200,500,1000000}; local atktot = 0 local utiltot = 0 -local maxWep = 57 -- game crashes if you exceed supported # local someHog = nil -- just for looking up the weps +-- Script parameter stuff local mode = nil +-- If true, killing hogs of your own clan doesn't give you their weapons. +-- Otherwise, killing any hog gives you their weapons. +local loyal = false + function onParameters() parseParams() mode = params["mode"] + loyal = params["loyal"] == "true" end function CheckForWeaponSwap() @@ -161,8 +173,10 @@ end function StartingSetUp(gear) - for i = 1,maxWep do - setGearValue(gear,i,0) + for i = 0, AmmoTypeMax do + if i ~= amNothing then + setGearValue(gear,i,0) + end end for w,c in pairs(wepArray) do if c == 9 and (atkWeps[w] or utilWeps[w]) then @@ -175,23 +189,23 @@ local r = 0 if atktot > 0 then r = GetRandom(atktot)+1 - for i = 1,maxWep do - --for w,c in pairs(atkChoices) do - --WriteLnToConsole(' c: '..c..' w:'..w..' r:'..r) - if atkChoices[i] >= r then - setGearValue(gear,i,1) - break + for i = 0, AmmoTypeMax do + if i ~= amNothing then + if atkChoices[i] >= r then + setGearValue(gear,i,1) + break + end end end end if utiltot > 0 then r = GetRandom(utiltot)+1 - for i = 1,maxWep do - -- for w,c in pairs(utilChoices) do - --WriteLnToConsole('util c: '..c..' w:'..w..' r:'..r) - if utilChoices[i] >= r then - setGearValue(gear,i,1) - break + for i = 0, AmmoTypeMax do + if i ~= amNothing then + if utilChoices[i] >= r then + setGearValue(gear,i,1) + break + end end end end @@ -216,7 +230,18 @@ -- this is called when a hog dies function TransferWeps(gear) - if CurrentHedgehog ~= nil then + if CurrentHedgehog ~= nil and CurrentHedgehog ~= gear and (not loyal or (GetHogClan(CurrentHedgehog) ~= GetHogClan(gear))) then + + local x,y,color + local vgear + local vgtX, vgtY, vgtdX, vgtdY, vgtAngle, vgtFrame, vgtFrameTicks, vgtState, vgtTimer, vgtTint + local dspl = IsHogLocal(CurrentHedgehog) + local ammolist = '' + + if dspl then + x,y = GetGearPosition(CurrentHedgehog) + color = GetClanColor(GetHogClan(CurrentHedgehog)) + end for w,c in pairs(wepArray) do val = getGearValue(gear,w) @@ -230,10 +255,29 @@ else AddAmmo(CurrentHedgehog, w, val) end + if dspl then + if ammolist == '' then + ammolist = GetAmmoName(w) + else + ammolist = ammolist .. ' • ' .. GetAmmoName(w) + end + x = x + 2 + y = y + 32 + vgear = AddVisualGear(x, y, vgtAmmo, 0, true) + if vgear ~= nil then + vgtX,vgtY,vgtdX,vgtdY,vgtAngle,vgtFrame,vgtFrameTicks,vgtState,vgtTimer,vgtTint = GetVisualGearValues(vgear) + vgtFrame = w + SetVisualGearValues(vgear,vgtX,vgtY,vgtdX,vgtdY,vgtAngle,vgtFrame,vgtFrameTicks,vgtState,vgtTimer,vgtTint) + end + end end end + if dspl and ammolist ~= '' then + PlaySound(sndShotgunReload); + AddCaption(ammolist, color, capgrpAmmoinfo) + end end end @@ -242,30 +286,37 @@ EnableGameFlags(gfInfAttack, gfRandomOrder, gfPerHogAmmo) DisableGameFlags(gfResetWeps, gfSharedAmmo) HealthCaseProb = 100 - Goals = loc("Highlander: Eliminate enemy hogs and take their weapons.") .."|" .. - loc("Weapons are reset on end of turn.") + if loyal then + Goals = loc("Loyal Highlander: Eliminate enemy hogs to take their weapons") .. "|" + else + Goals = loc("Highlander: Eliminate hogs to take their weapons") .. "|" + end + Goals = Goals .. loc("Replenishment: Weapons are restocked on turn start of a new hog") .. "|" .. + loc("Ammo Limit: Hogs can’t have more than 1 ammo per type") end function onGameStart() utilChoices[amSkip] = 0 local c = 0 - for i = 1,maxWep do - atkChoices[i] = 0 - utilChoices[i] = 0 - if i ~= 7 then - wepArray[i] = 0 - c = GetAmmoCount(someHog, i) - if c > 8 then c = 9 end - wepArray[i] = c - if c < 9 and c > 0 then - if atkWeps[i] then - --WriteLnToConsole('a c: '..c..' w:'..i) - atktot = atktot + probability[c] - atkChoices[i] = atktot - elseif utilWeps[i] then - --WriteLnToConsole('u c: '..c..' w:'..i) - utiltot = utiltot + probability[c] - utilChoices[i] = utiltot + for i = 0, AmmoTypeMax do + if i ~= amNothing then + atkChoices[i] = 0 + utilChoices[i] = 0 + if i ~= 7 then + wepArray[i] = 0 + c = GetAmmoCount(someHog, i) + if c > 8 then c = 9 end + wepArray[i] = c + if c < 9 and c > 0 then + if atkWeps[i] then + --WriteLnToConsole('a c: '..c..' w:'..i) + atktot = atktot + probability[c] + atkChoices[i] = atktot + elseif utilWeps[i] then + --WriteLnToConsole('u c: '..c..' w:'..i) + utiltot = utiltot + probability[c] + utilChoices[i] = utiltot + end end end end @@ -280,6 +331,10 @@ function CheckForHogSwitch() + --[[ Restock the weapons of the hog on turn start, provided it is not the same hog as before. + This exception is done do avoid a single hog receiving tons of weapons when it is the only unfrozen + hog and takes consecutive turns. ]] + if (CurrentHedgehog ~= nil) then currHog = CurrentHedgehog diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,5 +1,3 @@ -local MUTANT_VERSION = "v0.9.5" - --[[ ___ ___ ( ) ( ) ___ .-. .-. ___ ___ | |_ .---. ___ .-. | |_ @@ -67,36 +65,74 @@ local circles = {} local circleFrame = -1 -function showStartingInfo() +-- Variables for custom achievements + +-- Most kills in 1 turn +local recordKills = 0 +local recordKillsHogName = nil +local recordKillsTeamName = nil + +-- Most suicides +local recordSuicides = 0 +local recordSuicidesHogName = nil +local recordSuicidesTeamName = nil + +-- Most skips +local recordSkips = 0 +local recordSkipsHogName = nil +local recordSkipsTeamName = nil - ruleSet = loc("RULES") .. ": " .. - " |" .. --" |" .. - loc("The first player to kill someone becomes the Mutant.") .. "|" .. +-- Most crates collected +local recordCrates = 0 +local recordCratesHogName = nil +local recordCratesTeamName = nil + +-- Most deaths +local recordDeaths = 0 +local recordDeathsHogName = nil +local recordDeathsTeamName = nil + +-- Total killed hedgehogs +local totalKills = 0 + +-- Total damage +local totalDamage = 0 + +function rules() + + local ruleSet = loc("Rules: ") .. "|" .. + loc("Hedgehogs will be revived after their death.") .. "|" .. + string.format(loc("Mines explode after %d s."), div(MinesTime, 1000)) .. "|" .. + " |".. + loc("The first hedgehog to kill someone becomes the Mutant.") .. "|" .. loc("The Mutant has super-weapons and a lot of health.") .. "|" .. loc("The Mutant loses health quickly if he doesn't keep scoring kills.") .. "|" .. " |" .. - loc("Normal players can only score points by killing the mutant.") .. "|" .. - " |" .. "" .. - loc("The player with least points (or most deaths) becomes the Bottom Feeder.") .. "|" .. - loc("The Bottom Feeder can score points by killing anyone.") .. "|" .. - " |" .. - loc("POINTS") .. ": " .. - " |" .. - loc("+2 for becoming a Mutant") .. "|" .. - loc("+1 to a Mutant for killing anyone") .. "|" .. - loc("+1 to a Bottom Feeder for killing anyone") .. "|" .. + loc("Score points by killing other hedgehogs (see below).") .. "|" .. + loc("The hedgehog with least points (or most deaths) becomes the Bottom Feeder.") .. "|" .. + string.format(loc("The first hedgehog which scores %d or more wins the game."), winScore) .. "|" .. + " |" .. + loc("Scoring: ") .. "|" .. + loc("+2 for becoming the Mutant") .. "|" .. + loc("+1 to the Mutant for killing anyone") .. "|" .. + loc("+1 to the Bottom Feeder for killing anyone") .. "|" .. loc("-1 to anyone for a suicide") .. "|" .. loc("Other kills don't give you points.") - ShowMission(loc("Mutant"), - loc("a Hedgewars tag game"), - ruleSet, 0, 5000) + return ruleSet + +end + +function showStartingInfo() + + ShowMission(loc("Mutant"), loc("A Hedgewars tag game"), rules(), 1, 5000) end function onGameInit() TurnTime = 20000 WaterRise = 0 + HealthDecrease = 0 EnableGameFlags(gfResetWeps, gfPerHogAmmo) HealthCaseProb=0 HealthCaseAmount=0 @@ -110,17 +146,17 @@ if cnthhs > 1 then hogLimitHit = true SetEffect(gear, heResurrectable, false) - --SetHealth(gear, 0) SetGearPosition(gear, -100,LAND_HEIGHT) end end function onGameStart() + SendHealthStatsOff() + SendRankingStatsOff() + SendAchievementsStatsOff() trackTeams() teamScan() runOnHogs(saveStuff) - --local str = "/say " .. MUTANT_VERSION - --ParseCommand(str) hogLimitHit = false for i=0 , TeamsCount - 1 do @@ -128,7 +164,7 @@ runOnHogsInTeam(limitHogs, teams[i]) end if hogLimitHit then - AddCaption(loc("ONE HOG PER TEAM! KILLING EXCESS HEDGES")) + AddCaption(loc("Only one hog per team allowed! Excess hogs will be removed"), 0xFFFFFFFF, capgrpGameState) end showStartingInfo() end @@ -197,10 +233,15 @@ killsCounter = 0 if mutant == nil then - AddCaption( loc("FIRST BLOOD MUTATES") ) + AddCaption( loc("First killer will mutate"), 0xFFFFFFFF, capgrpGameState ) end checkScore() + + for i=0, TeamsCount-1 do + SendStat(siClanHealth, getTeamValue(teams[i], "Score"), teams[i]) + end + giveWeapons(CurrentHedgehog) drawCircles() setAIHints() @@ -219,23 +260,29 @@ function countBodies() if killsCounter == 2 then - AddCaption(loc("DOUBLE KILL")) + AddCaption(loc("Double kill!"), 0xFFFFFFFF, capgrpGameState ) elseif killsCounter == 3 then - AddCaption(loc("MEGA KILL")) + AddCaption(loc("Mega kill!"), 0xFFFFFFFF, capgrpGameState ) PlaySound(sndRegret) elseif killsCounter == 4 then - AddCaption(loc("ULTRA KILL")) + AddCaption(loc("Ultra kill!"), 0xFFFFFFFF, capgrpGameState ) elseif killsCounter == 5 then - AddCaption(loc("MONSTER KILL")) + AddCaption(loc("Monster kill!"), 0xFFFFFFFF, capgrpGameState ) PlaySound(sndIllGetYou) elseif killsCounter == 6 then - AddCaption(loc("LUDICROUS KILL")) + AddCaption(loc("Ludicrous kill!"), 0xFFFFFFFF, capgrpGameState ) PlaySound(sndNutter) elseif killsCounter == 7 then - AddCaption(loc("HOLY SHYTE!")) + AddCaption(loc("Holy shit!"), 0xFFFFFFFF, capgrpGameState ) PlaySound(sndLaugh) elseif killsCounter > 8 then - AddCaption(loc("INSANITY")) + AddCaption(loc("Insanity!"), 0xFFFFFFFF, capgrpGameState ) + end + + if killsCounter > recordKills then + recordKills = killsCounter + recordKillsHogName = getGearValue(CurrentHedgehog, "Name") + recordKillsTeamName = GetHogTeamName(CurrentHedgehog) end end @@ -276,7 +323,7 @@ SetHealth(mutant,0) mt_hurt= false setGearValue(mutant,"SelfDestruct",true) - TurnTimeLeft = 0 + EndTurn() end end end @@ -302,14 +349,14 @@ if teams[i]~= nil then local curr_score = getTeamValue(teams[i], "Score") - showScore = showScore .. teams[i] .. ": " .. curr_score .. " (" .. loc("deaths") .. ": " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|" + showScore = showScore .. string.format(loc("%s: %d (deaths: %d)"), teams[i], curr_score, getTeamValue(teams[i], "DeadHogs")) .. "|" end end - ShowMission(loc("Score"), - "-------", - showScore, 0, 200) + ShowMission(loc("Mutant"), + loc("Scores"), + showScore, 4, 1) HideMission() @@ -329,7 +376,7 @@ runOnHogsInTeam(removeFeeder, teams[i]) - showScore = showScore .. teams[i] ..": " .. curr_score .. " (" .. loc("deaths") .. ": " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|" + showScore = showScore .. string.format(loc("%s: %d (deaths: %d)"), teams[i], curr_score, getTeamValue(teams[i], "DeadHogs")) .. "|" if curr_score >= winScore then gameOver = true @@ -362,16 +409,68 @@ end if gameOver then - TurnTimeLeft = 0 - for i=0, #teams do + SendStat(siGraphTitle, loc("Score graph")) + + EndTurn(true) + + teamsSorted = {} + + for i=0, TeamsCount-1 do if teams[i]~=winTeam then runOnHogsInTeam(armageddon, teams[i]) end + teamsSorted[i+1] = teams[i] end - ShowMission( loc("WINNER IS ") .. winTeam, - "~~~~~~~~~~~~~~~~~~~~~~~~~", - showScore, 0, 200) + -- Achievements stuff + local achievements = 0 + --- Most kills per turn + if recordKills >= 3 then + SendStat(siMaxStepKills, string.format("%d %s (%s)", recordKills, recordKillsHogName, recordKillsTeamName)) + achievements = achievements + 1 + end + --- Most crates collected + if recordCrates >= 5 then + SendStat(siCustomAchievement, string.format(loc("%s (%s) was the greediest hedgehog and collected %d crates."), recordCratesHogName, recordCratesTeamName, recordCrates)) + achievements = achievements + 1 + end + --- Most suicides + if recordSuicides >= 5 then + SendStat(siCustomAchievement, string.format(loc("%s (%s) hate life and suicided %d times."), recordSuicidesHogName, recordSuicidesTeamName, recordSuicides)) + achievements = achievements + 1 + end + --- Most deaths + if recordDeaths >= 5 then + SendStat(siCustomAchievement, string.format(loc("Poor %s (%s) died %d times."), recordDeathsHogName, recordDeathsTeamName, recordDeaths)) + achievements = achievements + 1 + end + --- Most skips + if recordSkips >= 3 then + SendStat(siMaxTurnSkips, string.format("%d %s (%s)", recordSkips, recordSkipsHogName, recordSkipsTeamName)) + achievements = achievements + 1 + end + --- Total damage + if totalDamage >= 900 then + SendStat(siCustomAchievement, string.format(loc("%d damage was dealt in this game."), totalDamage)) + achievements = achievements + 1 + end + --- Total kills + if totalKills >= 20 or achievements <= 0 then + SendStat(siKilledHHs, tostring(totalKills)) + achievements = achievements + 1 + end + + -- Score and stats stuff + table.sort(teamsSorted, function(team1, team2) return getTeamValue(team1, "Score") < getTeamValue(team2, "Score") end) + for i=TeamsCount, 1, -1 do + SendStat(siPointType, loc("point(s)")) + SendStat(siPlayerKills, getTeamValue(teamsSorted[i], "Score"), teamsSorted[i]) + end + + ShowMission( loc("Mutant"), + loc("Final result"), + string.format(loc("Winner: %s"), winTeam) .. "| |" .. loc("Scores:") .. " |" .. + showScore, 0, 15000) else if only_low_score then @@ -381,9 +480,10 @@ if meh == false then meh = true else - ShowMission( loc("Score"), - loc("-------"), - showScore, 0, 200) + ShowMission( loc("Mutant"), + loc("Scores"), + showScore, 4, 1) + HideMission() end end @@ -421,7 +521,7 @@ function setFeeder(gear) if gear~= mutant and gear~= nil then - SetHogName(gear, loc("BOTTOM FEEDER")) + SetHogName(gear, loc("Bottom Feeder")) SetHogHat(gear, 'poke_slowpoke') setGearValue(gear,"Feeder", true) end @@ -430,16 +530,18 @@ function setMutantStuff(gear) mutant = gear - SetHogName(gear, loc("MUTANT")) + SetHogName(gear, loc("Mutant")) SetHogHat(gear,'WhySoSerious') SetHealth(gear, ( mutant_base_health + numhhs*25) ) SetEffect(gear, hePoisoned, 1) setGearValue(mutant,"SelfDestruct",false) setGearValue(gear, "Feeder", false) - AddCaption(getGearValue(gear, "Name") .. loc(" HAS MUTATED")) + AddCaption(string.format(loc("%s has mutated! +2 points"), getGearValue(gear, "Name")), GetClanColor(GetHogClan(gear)), capgrpMessage) - TurnTimeLeft=0 + if TurnTimeLeft > 0 then + EndTurn(true) + end AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false) AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false) @@ -459,7 +561,10 @@ for j=0, TeamsCount-1 do if teams[j] ==nil and hhs[i]~=nil then teams[j] = GetHogTeamName(hhs[i]) - setTeamValue(teams[j],"Score",0) + setTeamValue(teams[j], "Score",0) + setTeamValue(teams[j], "Suicides",0) + setTeamValue(teams[j], "Skips",0) + setTeamValue(teams[j], "Crates",0) setTeamValue(teams[j], "DeadHogs",0) break end @@ -498,6 +603,13 @@ end else setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment)) + increaseTeamValue(curr_team,"Suicides") + if(getTeamValue(curr_team, "Suicides") > recordSuicides) then + recordSuicides = getTeamValue(curr_team, "Suicides") + recordSuicidesHogName = getGearValue(CurrentHedgehog, "Name") + recordSuicidesTeamName = curr_team + end + AddCaption(loc("-1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) end else if mutant==nil then @@ -510,19 +622,29 @@ end else setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment)) + increaseTeamValue(curr_team,"Suicides") + if(getTeamValue(curr_team, "Suicides") > recordSuicides) then + recordSuicides = getTeamValue(curr_team, "Suicides") + recordSuicidesHogName = getGearValue(CurrentHedgehog, "Name") + recordSuicidesTeamName = curr_team + end + AddCaption(loc("-1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) end else if curr_team ~=GetHogTeamName(gear) then if CurrentHedgehog==mutant and getGearValue(mutant,"SelfDestruct")==false then SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+kill_reward) - AddCaption("+" .. kill_reward .. loc(" HP") ) + AddCaption(loc("+1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) + AddCaption(string.format(loc("+%d health"), kill_reward), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage2) increaseTeamValue(curr_team,"Score") end if getGearValue(CurrentHedgehog,"Feeder") then increaseTeamValue(curr_team,"Score") + AddCaption(loc("+1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) end else setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment)) + AddCaption(loc("+1 point"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage) end end end @@ -534,6 +656,12 @@ if GetGearType(gear) == gtHedgehog then increaseTeamValue(GetHogTeamName(gear), "DeadHogs") + totalKills = totalKills + 1 + if(getTeamValue(GetHogTeamName(gear), "DeadHogs") > recordDeaths) then + recordDeaths = getTeamValue(GetHogTeamName(gear), "DeadHogs") + recordDeathsHogName = getGearValue(gear, "Name") + recordDeathsTeamName = GetHogTeamName(gear) + end if gear==CurrentHedgehog then setGearValue(CurrentHedgehog, "Alive", false) @@ -550,6 +678,25 @@ end end +function onGearDamage(gear, damage) + if not gameOver and GetGearType(gear) == gtHedgehog then + totalDamage = totalDamage + damage + end +end + +function onHogAttack(ammoType) + -- Record skips for achievement + if ammoType == amSkip then + local team = GetHogTeamName(CurrentHedgehog) + increaseTeamValue(team, "Skips") + if(getTeamValue(team, "Skips") > recordSkips) then + recordSkips = getTeamValue(team, "Skips") + recordSkipsHogName = getGearValue(CurrentHedgehog, "Name") + recordSkipsTeamName = team + end + end +end + function onGearAdd(gear) -- Catch hedgehogs for the tracker @@ -605,6 +752,17 @@ end AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) trackDeletion(gear) + elseif GetGearType(gear) == gtCase then + -- Check if a crate has been collected + if band(GetGearMessage(gear), gmDestroy) ~= 0 and CurrentHedgehog ~= nil then + -- Update crate collection achievement + increaseTeamValue(GetHogTeamName(CurrentHedgehog), "Crates") + if(getTeamValue(GetHogTeamName(CurrentHedgehog), "Crates") > recordCrates) then + recordCrates = getTeamValue(GetHogTeamName(CurrentHedgehog), "Crates") + recordCratesHogName = getGearValue(CurrentHedgehog, "Name") + recordCratesTeamName = GetHogTeamName(CurrentHedgehog) + end + end end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Racer.hwp Binary file share/hedgewars/Data/Scripts/Multiplayer/Racer.hwp has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Racer.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Sun Dec 17 00:09:24 2017 +0100 @@ -5,6 +5,11 @@ -- by mikade ----------------------------------------- +-- DEVELOPER WARNING - FOR OFFICIAL DEVELOPMENT -- +-- Be careful when editig this script, do not introduce changes lightly! +-- This script is used for time records on the official Hedgewars server. +-- Introducing breaking changes means we have to invalidate past time records! + ----------------------------------- --0.1: took all the code from crazy racer and scrapped most of it ----------------------------------- @@ -133,8 +138,8 @@ local cGear = nil -local bestClan = nil -local bestTime = nil +local bestClan = 10 +local bestTime = 1000000 local gameBegun = false local gameOver = false @@ -146,7 +151,7 @@ local wpY = {} local wpCol = {} local wpActive = {} -local wpRad = 450 --75 +local wpRad = 450 local wpCount = 0 local wpLimit = 8 @@ -155,6 +160,7 @@ local roundN local lastRound local RoundHasChanged +local turnSkipped = false local boostX = 0 local boostY = 0 @@ -164,11 +170,46 @@ -- general methods ------------------- +--[[ +Parameters syntax: + +teamrope=true +--> The team will be colored in the color of the team. + +rounds=N +--> The game will be played with N rounds (default: 3) + +waypointradius=N +--> The waypoints have a radius of N pixels (default: 450) + +maxwaypoints=N +--> The maximum number of waypoints to be placed (default: 8) + +]] + function onParameters() parseParams() if params["teamrope"] ~= nil then TeamRope = true end + if params["rounds"] ~= nil then + roundLimit = math.max(1, math.floor(tonumber(params["rounds"]))) + if type(roundLimit) ~= "number" then + roundLimit = 3 + end + end + if params["waypointradius"] ~= nil then + wpRad = math.max(40, math.floor(tonumber(params["waypointradius"]))) + if type(wpRad) ~= "number" then + wpRad = 450 + end + end + if params["maxwaypoints"] ~= nil then + wpLimit = math.max(2, math.floor(tonumber(params["maxwaypoints"]))) + if type(wpLimit) ~= "number" then + wpLimit = 8 + end + end end function RebuildTeamInfo() @@ -176,10 +217,10 @@ -- make a list of individual team names for i = 0, (TeamsCount-1) do - teamNameArr[i] = " " -- = i + teamNameArr[i] = " " teamSize[i] = 0 teamIndex[i] = 0 - teamScore[i] = 100000 + teamScore[i] = 1000000 end numTeams = 0 @@ -271,17 +312,10 @@ g1Y = g1Y - g2Y dist = (g1X*g1X) + (g1Y*g1Y) - --if i == 0 then - -- AddCaption(dist .. "/" .. (wpRad*wpRad) ) - --end - NR = (48/100*wpRad)/2 if dist < (NR*NR) then - --if dist < (wpRad*wpRad) then - --AddCaption("howdy") - wpActive[i] = true - wpCol[i] = GetClanColor(GetHogClan(CurrentHedgehog)) -- new --GetClanColor(1) + wpCol[i] = GetClanColor(GetHogClan(CurrentHedgehog)) SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i]) wpRem = 0 @@ -291,7 +325,16 @@ end end - AddCaption(loc("Way-Points Remaining") .. ": " .. wpRem,0xffba00ff,capgrpAmmoinfo) + if wpActive[i] == false then + local wpMessage = "" + if wpRem-1 == 0 then + wpMessage = loc("Track completed!") + else + wpMessage = string.format(loc("Waypoints remaining: %d"), wpRem-1) + end + AddCaption(wpMessage, 0xffba00ff, capgrpGameState) + end + wpActive[i] = true end @@ -306,12 +349,7 @@ end function AdjustScores() - - if bestTime == nil then - bestTime = 100000 - bestClan = 10 - bestTimeComment = "N/A" - end + bestTimeComment = loc("Did not finish") newScore = false @@ -327,9 +365,6 @@ end end - --bestTime = 100000 - --bestClan = 10 - -- find the best time out of those so far for i = 0, (numTeams-1) do if teamScore[i] < bestTime then @@ -338,38 +373,33 @@ end end - if bestTime ~= 100000 then - bestTimeComment = (bestTime/1000) ..loc("s") + if bestTime ~= 1000000 then + bestTimeComment = string.format(loc("%.1fs"), (bestTime/1000)) end if newScore == true then if trackTime == bestTime then -- best time of the race - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("NEW RACE RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, 0, 4000) + ShowMission(loc("Racer"), + loc("Track completed!"), + string.format(loc("New race record: %.1fs"), (trackTime/1000)) .. "|" .. + string.format(loc("Winning time: %s"), bestTimeComment), 0, 4000) PlaySound(sndHomerun) else -- best time for the clan - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("NEW CLAN RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, 4, 4000) + ShowMission(loc("Racer"), + loc("Track completed!"), + string.format(loc("New clan record: %.1fs"), (trackTime/1000)) .. "|" .. + string.format(loc("Winning time: %s"), bestTimeComment), 4, 4000) end else -- not any kind of new score - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("TIME: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000) + ShowMission(loc("Racer"), + loc("Track completed!"), + string.format(loc("Time: %.1fs"), (trackTime/1000)) .. "|" .. + string.format(loc("Winning time: %s"), bestTimeComment), -amSkip, 4000) PlaySound(sndHellish) end - -------- - --new - -------- - if bestTime == trackTime then - --AddCaption("wooooooooooooooooooooooooooooo") fastColour = GetClanColor(GetHogClan(CurrentHedgehog)) @@ -381,8 +411,6 @@ fastCount = currCount fastIndex = 0 - --currCount = 0 -- is this needed? - else currCount = 0 fastIndex = 0 @@ -397,93 +425,94 @@ totalComment = "" for i = 0, (TeamsCount-1) do - if teamNameArr[i] ~= " " then -- teamScore[teamClan[i]] - teamComment[i] = teamNameArr[i] .. ": " .. (teamScore[i]/1000) .. loc("s|") - totalComment = totalComment .. teamComment[i] - elseif teamNameArr[i] == " " then - teamComment[i] = "|" + if teamNameArr[i] ~= " " and teamScore[i] ~= 1000000 then + teamComment[i] = string.format(loc("%s: %.1fs"), teamNameArr[i], (teamScore[i]/1000)) .. "|" + else + teamComment[i] = string.format(loc("%s: Did not finish"), teamNameArr[i]) .. "|" end + totalComment = totalComment .. teamComment[i] end - ShowMission( loc("RACER"), - loc("STATUS UPDATE"), - loc("Rounds Complete: ") .. roundNumber .. "/" .. roundLimit .. "|" .. " " .. "|" .. - loc("Best Team Times: ") .. "|" .. totalComment, 0, 4000) + ShowMission( loc("Racer"), + loc("Status update"), + string.format(loc("Rounds complete: %d/%d"), roundNumber, roundLimit) .. "|" .. " " .. "|" .. + loc("Best team times: ") .. "|" .. totalComment, 0, 4000) -- end game if its at round limit if roundNumber >= roundLimit then - for i = 0, (numhhs-1) do - if GetHogClan(hhs[i]) ~= bestClan then - SetEffect(hhs[i], heResurrectable, 0) - SetHealth(hhs[i],0) + -- Sort the scores for the ranking list + local unfinishedArray = {} + local sortedTeams = {} + local k = 1 + for i = 0, TeamsCount-1 do + if teamScore[i] ~= 1000000 and teamNameArr[i] ~= " " then + sortedTeams[k] = {} + sortedTeams[k].name = teamNameArr[i] + sortedTeams[k].score = teamScore[i] + k = k + 1 + else + table.insert(unfinishedArray, string.format(loc("%s did not finish the race."), teamNameArr[i])) end end - gameOver = true - TurnTimeLeft = 1 + table.sort(sortedTeams, function(team1, team2) return team1.score < team2.score end) + + -- Write all the stats! + + for i = 1, #sortedTeams do + SendStat(siPointType, loc("milliseconds")) + SendStat(siPlayerKills, sortedTeams[i].score, sortedTeams[i].name) + end + + if #sortedTeams >= 1 then + SendStat(siGameResult, string.format(loc("%s wins!"), sortedTeams[1].name)) + SendStat(siGameResult, string.format(loc("%s wins!"), sortedTeams[1].name)) + SendStat(siCustomAchievement, string.format(loc("%s wins with a best time of %.1fs."), sortedTeams[1].name, (sortedTeams[1].score/1000))) + for i=1,#unfinishedArray do + SendStat(siCustomAchievement, unfinishedArray[i]) + end + else + SendStat(siGameResult, loc("Round draw")) + SendStat(siCustomAchievement, loc("Nobody managed to finish the race. What a shame!")) + if specialPointsCount > 0 then + SendStat(siCustomAchievement, loc("Maybe you should try an easier map next time.")) + else + SendStat(siCustomAchievement, loc("Maybe you should try easier waypoints next time.")) + end + end + + -- Kill all the losers + for i = 0, (numhhs-1) do + if GetHogClan(hhs[i]) ~= bestClan then + SetEffect(hhs[i], heResurrectable, 0) + SetHealth(hhs[i],0) + end + end + + gameOver = true + EndTurn(true) + end end function CheckForNewRound() - ------------- - ------ new - ------------- - - --[[turnN = turnN + 1 - if gameBegun == false then - if turnN == 2 then - for i = 0, (numhhs-1) do - if hhs[i] ~= nil then - SetEffect(hhs[i], heResurrectable, 0) - SetHealth(hhs[i],0) - end - end - gameOver = true - TurnTimeLeft = 1 - end - else - - - end]] - - --[[if roundBegun == true then - - if RoundHasChanged == true then - roundN = roundN + 1 - RoundHasChanged = false - onNewRound() - end - - if lastRound ~= TotalRounds then -- new round, but not really - - if RoundHasChanged == false then - RoundHasChanged = true - end - - end - - AddCaption("RoundN:" .. roundN .. "; " .. "TR: " .. TotalRounds) - - lastRound = TotalRounds - - end]] - - ------------ - ----- old - ------------ - if GetHogClan(CurrentHedgehog) == firstClan then onNewRound() end end -function DisableTumbler() - currCount = 0 - fastIndex = 0 - TurnTimeLeft = 0 - racerActive = false -- newadd +function DisableTumbler(endTurn) + if endTurn == nil then endTurn = true end + if racerActive then + currCount = 0 + fastIndex = 0 + if endTurn then + EndTurn(true) + end + racerActive = false -- newadd + end end function HandleGhost() @@ -502,16 +531,8 @@ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, fastColour ) - --AddCaption("fC: " .. fastIndex .. " / " .. fastCount) - - else - - --AddCaption("excep fC: " .. fastIndex .. " / " .. fastCount) - end - - end function TryRepositionHogs() @@ -537,53 +558,108 @@ CaseFreq = 0 TurnTime = 90000 WaterRise = 0 + HealthDecrease = 0 + +end + +function InstructionsBuild() + ShowMission( + loc("Racer"), + loc("A Hedgewars mini-game"), + loc("Build a track and race.") .. "|" .. + string.format(loc("Round limit: %d"), roundLimit), + 4, 4000) end +function InstructionsRace() + ShowMission(loc("Racer"), + loc("A Hedgewars mini-game"), + loc("Touch all waypoints as fast as you can!"), + 2, 4000) +end function onGameStart() + SendGameResultOff() + SendRankingStatsOff() + SendHealthStatsOff() + SendAchievementsStatsOff() roundN = 0 lastRound = TotalRounds - RoundHasChanged = false -- true + RoundHasChanged = false for i = 0, (specialPointsCount-1) do - PlaceWayPoint(specialPointsX[i], specialPointsY[i]) + PlaceWayPoint(specialPointsX[i], specialPointsY[i], false) end RebuildTeamInfo() - ShowMission ( - loc("RACER"), - loc("a Hedgewars mini-game"), + if specialPointsCount > 0 then + InstructionsRace() + else + InstructionsBuild() + end - loc("Build a track and race.") .. "|" .. - loc("Round Limit:") .. " " .. roundLimit .. "|" .. + SetAmmoTexts(amAirAttack, loc("Place waypoint"), loc("Racer tool"), + loc("Build an awesome race track by placing|waypoints which the hedgehogs have to|touch in any order to finish a round.") .. "|" .. + loc("Hedgehogs will start in the first waypoint.") .. "|" .. + loc("Cursor: Place waypoint") .. "|" .. + loc("Precise: Remove previous waypoint")) - "", 4, 4000 - ) + SetAmmoTexts(amSkip, loc("Finish waypoint placement"), loc("Racer tool"), + loc("Happy with your race track?|Then stop building and start racing!") .. "|" .. + loc("Or let the next player place waypoints|if less than 2 waypoints have been placed.") .. "|" .. + loc("Attack: Activate")) TryRepositionHogs() end -function PlaceWayPoint(x,y) +function PlaceWayPoint(x,y,placedByUser) if not racerActive then if wpCount == 0 or wpX[wpCount - 1] ~= x or wpY[wpCount - 1] ~= y then wpX[wpCount] = x wpY[wpCount] = y - wpCol[wpCount] = 0xffffffff + if wpCount == 0 then + wpCol[wpCount] = 0x80ff80ff + else + wpCol[wpCount] = 0xffffffff + end wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true) SetVisualGearValues(wpCirc[wpCount], wpX[wpCount], wpY[wpCount], 20, 100, 1, 10, 0, wpRad, 5, wpCol[wpCount]) wpCount = wpCount + 1 - AddCaption(loc("Waypoint placed.") .. " " .. loc("Available points remaining: ") .. (wpLimit-wpCount)) + if placedByUser then + AddCaption(string.format(loc("Waypoint placed. Available points remaining: %d"), wpLimit-wpCount)) + end end end end +function onPrecise() + if not racerActive and CurrentHedgehog ~= nil and GetCurAmmoType() == amAirAttack then + DeletePreviousWayPoint() + end +end + +function DeletePreviousWayPoint() + if wpCount > 0 then + wpCount = wpCount - 1 + wpX[wpCount] = nil + wpY[wpCount] = nil + wpCol[wpCount] = nil + DeleteVisualGear(wpCirc[wpCount]) + wpCirc[wpCount] = nil + AddCaption(string.format(loc("Waypoint removed. Available points: %d"), wpLimit-wpCount)) + else + PlaySound(sndDenied) + AddCaption(loc("No waypoint to be removed!")) + end +end + function onSpecialPoint(x,y,flag) if flag == 99 then fastX[fastCount] = x @@ -605,6 +681,7 @@ TryRepositionHogs() racerActive = false + turnSkipped = false trackTime = 0 @@ -621,17 +698,24 @@ -- Handle Starting Stage of Game if (gameOver == false) and (gameBegun == false) then - if wpCount >= 3 then + if wpCount >= 2 then gameBegun = true roundNumber = 0 firstClan = GetHogClan(CurrentHedgehog) - ShowMission(loc("RACER"), - loc("GAME BEGUN!!!"), - loc("Complete the track as fast as you can!"), 2, 4000) + if specialPointsCount == 0 then + InstructionsRace() + end + + SetAmmoTexts(amSkip, nil, nil, nil) else - ShowMission(loc("RACER"), - loc("NOT ENOUGH WAYPOINTS"), - loc("Place more waypoints using the 'Air Attack' weapon."), 2, 4000) + local infoString + if wpLimit > 2 then + infoString = string.format(loc("Place 2-%d waypoints using the waypoint placement tool."), wpLimit) + else + infoString = loc("Place 2 waypoints using the waypoint placement tool.") + end + ShowMission(loc("Racer"), + loc("Waypoint placement phase"), infoString, 2, 4000) AddAmmo(CurrentHedgehog, amAirAttack, 4000) SetWeapon(amAirAttack) end @@ -660,16 +744,16 @@ if TestRectForObstacle(x-20, y-20, x+20, y+20, true) then - AddCaption(loc("Please place the way-point in the open, within the map boundaries.")) + AddCaption(loc("Please place the waypoint in the air, within the map boundaries")) PlaySound(sndDenied) elseif (y > WaterLine-50) then - AddCaption(loc("Please place the way-point further from the waterline.")) + AddCaption(loc("Please place the waypoint further away from the waterline")) PlaySound(sndDenied) else - PlaceWayPoint(x, y) + PlaceWayPoint(x, y, true) if wpCount == wpLimit then - AddCaption(loc("Race complexity limit reached.")) - DisableTumbler() + AddCaption(loc("Race complexity limit reached")) + EndTurn(true) end end else @@ -726,11 +810,7 @@ if GameTime%100 == 0 then - if trackTime%1000 == 0 then - AddCaption((trackTime/1000)..'.0',GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) - else - AddCaption(trackTime/1000,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) - end + AddCaption(string.format(loc("Time: %.1fs"), (trackTime/1000)),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) if (CheckWaypoints() == true) then AdjustScores() @@ -742,7 +822,7 @@ end -- if the player has expended his tunbling time, stop him tumbling - if TurnTimeLeft <= 20 then + if TurnTimeLeft <= 20 and not turnSkipped then DisableTumbler() end @@ -755,7 +835,7 @@ AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) if gear == CurrentHedgehog then - DisableTumbler() + DisableTumbler(false) end end @@ -790,6 +870,12 @@ usedWeapons[at] = 0 end +function onHogAttack(ammoType) + if ammoType == amSkip then + turnSkipped = true + end +end + function onAchievementsDeclaration() usedWeapons[amSkip] = nil usedWeapons[amExtraTime] = nil @@ -822,7 +908,7 @@ map = detectMapWithDigest() for i = 0, (numTeams-1) do - if teamScore[i] < 100000 then + if teamScore[i] < 1000000 then DeclareAchievement(raceType, teamNameArr[i], map, teamScore[i]) end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Random_Weapon.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Random_Weapon.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Random_Weapon.lua Sun Dec 17 00:09:24 2017 +0100 @@ -12,7 +12,7 @@ amBaseballBat, amTeleport, amMortar, amCake, amSeduction, amWatermelon, amHellishBomb, amDrill, amBallgun, amRCPlane, amSniperRifle, amMolotov, amBirdy, amBlowTorch, amGasBomb, - amFlamethrower, amSMine, amHammer } + amFlamethrower, amSMine, amHammer, amDuck } -- List of weapons that attack from the air local airweapons = { amAirAttack, amMineStrike, amNapalm, amDrillStrike } diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.cfg --- a/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,2 @@ -* -* +Default +locked diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,13 +1,86 @@ HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Tracker.lua") - ---------------------------------------------------- ---------------------------------------------------- ---------------------------------------------------- ---- Space Invasion Code Follows (1.1) ---------------------------------------------------- ---------------------------------------------------- +HedgewarsScriptLoad("/Scripts/Params.lua") + +--[[ +Space Invasion 1.2 + +=== DOCUMENTATION === + +== SCRIPT CONFIGURATION == +You can configure this script a little bit, you only have to edit the game scheme. +The script makes heavy use of the script parameters, but you can also use some, +but not all, of the other settings in a game scheme. + +You CAN use the following options: +- disable girders (highly recommended!) +- disable land objects +- random order +- solid land +- low gravity (makes this game much easier, but this script is probably not optimized for it yet) +- bottom border +- fort mode (just changes the landscape) +- teams start at opposite parts of land +- wind affects almost everything + +Those options are also possible, but have no real gameplay effect: +- disable wind +- tag team +- king mode (here it only changes hats, so this is just for fun) +- vampiric (has no real gameplay effect; just for the grapical effect) +- full border (it’s techincally possible, but the script is currently not very well optimized for this mode) + +You CANNOT use any other of the on/off options in the game scheme. Those settings are simply discarded by the script. + +You also can change the following settings in the game scheme: +- time per round (very important) +- script parameters, see below + +The other settings are technically possible, but their effect is limited: +- damage percentage +- mines/air mines (they don’t harm the active hedgehog, however) +- number of barrels + +All other variables are discarded, the script forces its own settings. +There will be never Sudden Death, any crate drops, any mines and any +barrels. + + +== SCRIPT PARAMETERS == +This script can be configured mostly with the script parameters. +The script parameters are specified in a key=value format each, +and each pair is delimeted by a comma. +All values must be integer of 0 or higher. All values are optional +and have a default if unspecified + +List of parameters: +- rounds: Number of rounds (default: 3) +- shield: Amount of shield you start with (default: 30) +- barrels: Amount of ammo (barrels) you start with (default: 5) +- pings: How many time you can use the radar per round (default: 2) +- barrelbonus: How many barrels you get for collecting/destroning a green invader (default: 3) +- shieldbonus: How much shield you get for collecting/destroying a purple invader (default: 30) +- timebonus: How many seconds you get for killing a drone (red) (default: 4) +- forcetheme: If set to false, the game will use your chosen theme instead of forcing EarthRise +- Please note that the game may not be able to be played in some themes if the sky + color is very bright (i.e. Bath) + +Example input for the field “Script parameters”: + +rounds=5 +>>> 5 rounds, everything else is default + +forcetheme=false +>>> Makes the game use whatever thme + +shield=0, barrels=3, pings=0 +>>> no shield, no radar pings and only 3 barrels (could be some hard mode) + +(empty string) +>>> Use defaults for everything + + -- VERSION HISTORY ---------------- -- version 0.1 @@ -141,11 +214,43 @@ -- added "fierce Competition" achievement for shooting an enemy hog (once per round) -- some support for more weapons later --------------------------- ---notes for later +------------------------ +-- version 1.2 +------------------------ +-- show actual scores in stats screen +-- show a couple of “awards” and more or less snarky comments in stats screen +-- for various accomplisments and events those are just for fun, they don’t +-- affect score or game outcome +-- use script parameters for configuration, see top of file for more information +-- stop overwriting game most scheme’s parameters +-- disable weapon scheme +-- play “denied” sound when trying to use empty radar, ammo or shield +-- play “Hurry!” taunt when 5 seconds are left +-- play throw sound when throwing a barrel +-- play sonar sound for using radar +-- play “Kamikaze!” taunt for receiving one of the kamikaze bonuses +-- show total team score in HUD (white number) +-- show message when trying to use empty radar +-- show message when time’s up +-- show message with round score at end of a round +-- disabled health graph, replaced with score per round +-- removed “selected weapon” message, we only have one weapon +-- removed unused bubbleSort function +-- play “Ooff” sound when hit by bazooka +-- fix explosion being drawn twice when colliding with circle +-- play explosion sound when barrel’s lifespan is over +]] + -------------------------- +-- TODO list: notes for later +-------------------------- +-- imitate winning animation at end instead of just ending the game + +-- add support for other world edges (they are currently disabled) + -- maybe add a check for a tie, IMPOSSIBRU THERE ARE NO TIES --- more achievements? (3 kamikazes in a row, supreme shield expert/miser etc?) +-- more achievements? +-- more just-for-fun awards (for stats screen) -- if more weps are added, replace primshotsfired all over the place @@ -167,6 +272,9 @@ -- maybe replace (48/100*vCircRadius[i])/2 with something better +------- CODE FOLLOWS ------- + + --[[CAPTION CATEGORIES ----------------- capgrpGameState @@ -229,7 +337,6 @@ -- so I herd u liek wariables ---------------------------------- ---local fMod = 1 -- for use in .15 single player only, otherwise desync local fMod = 1000000 -- use this for dev and .16+ games -- some console stuff @@ -239,7 +346,7 @@ -- gaudyRacer local boosterOn = false -local roundLimit = 3 -- no longer set here (see version history) +local roundLimit = 3 -- can be overridden by script parameter "rounds" local roundNumber = 0 local firstClan = 10 local gameOver = false @@ -255,6 +362,15 @@ local lastRound local RoundHasChanged = true +-- for script parameters +local startBarrels = 5 -- "barrels" +local startShield = 30 -- "shield" +local startRadShots = 2 -- "pings" +local shieldBonus = 30 -- "shieldbonus" +local barrelBonus = 3 -- "barrelbonus" +local timeBonus = 4 -- "timebonus" +local forceTheme = true -- "forcetheme" + -------------------------- -- hog and team tracking variales -------------------------- @@ -268,17 +384,13 @@ local teamSize = {} local teamIndex = {} -local teamComment = {} local teamScore = {} local teamCircsKilled = {} local teamSurfer = {} -- stats variables ---local teamRed = {} ---local teamBlue = {} ---local teamOrange = {} ---local teamGreen = {} local roundKills = 0 +local roundScore = 0 local RK = 0 local GK = 0 local BK = 0 @@ -292,6 +404,19 @@ local shotsHit = 0 local sniperHits = 0 local pointBlankHits = 0 + +--------------------- +-- awards (for stats section, just for fun) +--------------------- +-- global awards +local awardTotalKills=0 -- overall killed invaders (min. 30) + +-- hog awards +local awardRoundScore -- hog with most score in 1 round (min. 50) +local awardRoundKills -- most kills in 1 round (min. 5) +local awardAccuracy -- awarded to hog who didn’t miss once in his round, with most kills (min. 5) +local awardCombo -- hog with longest combo (min. 5) + --------------------- -- tumbler goods --------------------- @@ -392,7 +517,7 @@ function HideTags() - for i = 0, 2 do + for i = 0, 4 do SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00) end @@ -400,13 +525,13 @@ function DrawTag(i) - zoomL = 1.3 - - xOffset = 40 + local zoomL = 1.3 + local xOffset = 40 + local yOffset, tValue, tCol if i == 0 then yOffset = 40 - tCol = 0xffba00ff + tCol = 0xffee00ff tValue = TimeLeft elseif i == 1 then zoomL = 1.1 @@ -419,6 +544,12 @@ yOffset = 70 tCol = 0xa800ffff tValue = shieldHealth - 80 + elseif i == 4 then + zoomL = 1.1 + xOffset = 40 + 80 + yOffset = 70 + tCol = 0xffffffff + tValue = roundScore end DeleteVisualGear(vTag[i]) @@ -501,6 +632,8 @@ -- control function AwardPoints(p) + roundScore = roundScore + p + DrawTag(4) for i = 0,(TeamsCount-1) do if teamClan[i] == GetHogClan(CurrentHedgehog) then @@ -517,25 +650,8 @@ for i = 0,(TeamsCount-1) do if teamClan[i] == GetHogClan(CurrentHedgehog) then teamCircsKilled[i] = teamCircsKilled[i] + 1 - - if teamCircsKilled[i] == 10 then - AddCaption(loc("Boom!") .. " +25 " .. loc("points").."!",0xffba00ff,capgrpVolume) - AwardPoints(25) - elseif teamCircsKilled[i] == 25 then - AddCaption(loc("BOOM!") .. " +50 " .. loc("points") .. "!",0xffba00ff,capgrpVolume) - AwardPoints(50) - elseif teamCircsKilled[i] == 50 then - AddCaption(loc("BOOM!") .. loc("BOOM!") .. loc("BOOM!") .. " +100 " .. loc("points") .. "!",0xffba00ff,capgrpVolume) - AwardPoints(100) - end - - --[[ - if t == "R" then - redCircsKilled[i] = redCircsKilled[i] + 1 - end - --etc - --etc - ]] + awardTotalKills = awardTotalKills + 1 + end end @@ -543,62 +659,229 @@ ----------------- -function bubbleSort(table) - - for i = 1, #table do - for j = 2, #table do - if table[j] < table[j-1] then - - temp = table[j-1] - t2 = sdName[j-1] - t3 = sdKills[j-1] - - table[j-1] = table[j] - sdName[j-1] = sdName[j] - sdKills[j-1] = sdKills[j] - - table[j] = temp - sdName[j] = t2 - sdKills[j] = t3 - - end - end - end - - return - +function UpdateSimpleAward(oldAward, value, threshold) + local awarded = false + local newAward + if oldAward == nil then + if threshold == nil then + awarded = true + elseif value > threshold then + awarded = true + end + elseif value > oldAward.value then + if threshold == nil then + awarded = true + elseif value > threshold then + awarded = true + end + end + if awarded then + newAward = { + hogName = GetHogName(CurrentHedgehog), + teamName = GetHogTeamName(CurrentHedgehog), + value = value + } + else + newAward = oldAward + end + return newAward end ------------------ - function CommentOnScore() - + local teamStats = {} for i = 0,(TeamsCount-1) do sdScore[i] = teamScore[i] sdKills[i] = teamCircsKilled[i] sdName[i] = teamNameArr[i] + table.insert(teamStats, {score = teamScore[i], kills = teamCircsKilled[i], name = teamNameArr[i]}) end - --bubbleSort(sdScore) - - for i = 0,(TeamsCount-1) do - if sdName[i] ~= " " then - teamComment[i] = sdName[i] .. " |" .. - loc("SCORE") .. ": " .. sdScore[i] .. " " .. loc("points") .. "|" .. - loc("KILLS") .. ": " .. sdKills[i] .. " " .. loc("invaders destroyed") .. "|" .. - " " .. "|" - elseif sdName[i] == " " then - teamComment[i] = "|" + local scorecomp = function (v1, v2) + if v1.score > v2.score then + return true + else + return false end end - - entireC = "" - for i = (TeamsCount-1),0,-1 do + table.sort(teamStats, scorecomp) + local teamComment = {} + for i = TeamsCount,1,-1 do + local comment + if teamStats[i].name ~= " " then + local comment = teamStats[i].name .. " |" .. + string.format(loc("Score: %d"), teamStats[i].score) .. "|" .. + string.format(loc("Kills: %d"), teamStats[i].kills) + if i < TeamsCount then + comment = comment .. "| |" + end + table.insert(teamComment, comment) + + SendStat(siClanHealth, tostring(teamStats[i].score), teamStats[i].name) + else + comment = "|" + end + table.insert(teamComment, comment) + end + + local entireC = "" + for i = TeamsCount,1,-1 do entireC = entireC .. teamComment[i] end - - ShowMission("SPACE INVASION", loc("STATUS UPDATE"), loc("Rounds Complete") .. ": " .. roundNumber .. "/" .. roundLimit .. "| " .. "|" .. loc("Team Scores") .. ": |" ..entireC, 4, 1) - + local statusText, scoreText + if roundNumber >= roundLimit then + if teamStats[1].score == teamStats[2].score then + statusText = loc("Status Update") + scoreText = loc("Team scores:") + else + statusText = loc("Game over!") + scoreText = loc("Final team scores:") + end + else + statusText = loc("Status Update") + scoreText = loc("Team scores:") + end + local displayTime + if roundNumber >= roundLimit then + displayTime = 20000 + else + displayTime = 1 + end + ShowMission( loc("Space Invasion"), + statusText, + string.format(loc("Rounds complete: %d/%d"), roundNumber, roundLimit) .. "| " .. "|" .. + scoreText .. " |" ..entireC, 4, displayTime) + + if roundNumber >= roundLimit then + local winnerTeam = teamStats[1].name + for i = 0, (numhhs-1) do + if GetHogTeamName(hhs[i]) == winnerTeam then + SetState(hhs[i], bor(GetState(hhs[i]), gstWinner)) + end + end + AddCaption(string.format(loc("%s wins!"), winnerTeam)) + SendStat(siGameResult, string.format(loc("%s wins!"), winnerTeam)) + + for i = 1, TeamsCount do + SendStat(siPointType, loc("points")) + SendStat(siPlayerKills, tostring(teamStats[i].score), teamStats[i].name) + end + + local killscomp = function (v1, v2) + if v1.kills > v2.kills then + return true + else + return false + end + end + + +--[[ Award some awards (just for fun, its for the stats screen only +and has no effect on the score or game outcome. ]] + local awardsGiven = 0 + + if awardTotalKills >= 30 then + awardsGiven = awardsGiven + 1 + SendStat(siCustomAchievement, + string.format(loc("%d invaders have been destroyed in this game."), awardTotalKills)) + end + + table.sort(teamStats, killscomp) + local bestKills = teamStats[1].kills + if bestKills > 10 then + awardsGiven = awardsGiven + 1 + local text + if bestKills >= 50 then + text = loc("BOOM! BOOM! BOOM! %s are the masters of destruction with %d destroyed invaders.") + elseif bestKills >= 25 then + text = loc("BOOM! %s really didn't like the invaders, so they decided to destroy as much as %d of them.") + else + text = loc("Boom! %s has destroyed %d invaders.") + end + SendStat(siCustomAchievement, + string.format(text, + teamStats[1].name, teamStats[1].kills)) + end + + if awardRoundKills ~= nil then + awardsGiven = awardsGiven + 1 + local text + if awardRoundKills.value >= 33 then + text = loc("%s (%s) has been invited to join the Planetary Association of the Hedgehogs, it destroyed a staggering %d invaders in just one round!") + elseif awardRoundKills.value >= 22 then + if awardRoundKills.hogName == "Rambo" then + text = loc("The hardships of the war turned %s (%s) into a killing machine: %d invaders destroyed in one round!") + else + text = loc("%s (%s) is Rambo in a hedgehog costume! He destroyed %d invaders in one round.") + end + elseif awardRoundKills.value >= 11 then + text = loc("%s (%s) is addicted to killing: %d invaders destroyed in one round.") + else + text = loc("%s (%s) destroyed %d invaders in one round.") + end + SendStat(siCustomAchievement, + string.format(text, + awardRoundKills.hogName, awardRoundKills.teamName, awardRoundKills.value)) + end + if awardRoundScore ~= nil then + awardsGiven = awardsGiven + 1 + local text + if awardRoundScore.value >= 300 then + text = loc("%s (%s) was undoubtedly the very best professional tumbler in this game: %d points in one round!") + elseif awardRoundScore.value >= 250 then + text = loc("%s (%s) struck like a meteor: %d points in only one round!") + elseif awardRoundScore.value >= 200 then + text = loc("%s (%s) is good at this: %d points in only one round!") + elseif awardRoundScore.value >= 150 then + text = loc("%s (%s) tumbles like no other: %d points in one round.") + elseif awardRoundScore.value >= 100 then + text = loc("%s (%s) is a tumbleweed: %d points in one round.") + else + text = loc("%s (%s) was the best baby tumbler: %d points in one round.") + end + SendStat(siCustomAchievement, + string.format(text, + awardRoundScore.hogName, awardRoundScore.teamName, awardRoundScore.value)) + end + if awardAccuracy ~= nil then + awardsGiven = awardsGiven + 1 + local text + if awardAccuracy.value >= 20 then + text = loc("The Society of Perfectionists greets %s (%s): No misses and %d hits in its best round.") + elseif awardAccuracy.value >= 10 then + text = loc("%s (%s) is a hardened hunter: No misses and %d hits in its best round!") + else + text = loc("%s (%s) shot %d invaders and never missed in the best round!") + end + SendStat(siCustomAchievement, + string.format(text, + awardAccuracy.hogName, awardAccuracy.teamName, awardAccuracy.value)) + end + if awardCombo ~= nil then + awardsGiven = awardsGiven + 1 + local text + if awardCombo.value >= 11 then + text = loc("%s (%s) was lightning-fast! Longest combo of %d, absolutely insane!") + elseif awardCombo.value >= 8 then + text = loc("%s (%s) gave short shrift to the invaders: Longest combo of %d!") + else + text = loc("%s (%s) was on fire: Longest combo of %d.") + end + SendStat(siCustomAchievement, + string.format(text, + awardCombo.hogName, awardCombo.teamName, awardCombo.value)) + end + if awardsGiven == 0 then + local text + local r = math.random(1,4) + if r == 1 then text = loc("This game wasn’t really exciting.") + elseif r == 2 then text = loc("Did I miss something?") + elseif r == 3 then text = loc("Nothing of interest has happened.") + elseif r == 4 then text = loc("There are no snarky comments this time.") + end + + SendStat(siCustomAchievement, text) + end + end end function onNewRound() @@ -607,7 +890,7 @@ CommentOnScore() -- end game if its at round limit - if roundNumber == roundLimit then + if roundNumber >= roundLimit then for i = 0, (TeamsCount-1) do if teamScore[i] > bestScore then @@ -616,49 +899,25 @@ end end + -- Kill off all the losers for i = 0, (numhhs-1) do if GetHogClan(hhs[i]) ~= bestClan then SetEffect(hhs[i], heResurrectable, 0) SetHealth(hhs[i],0) end end + + -- Game over gameOver = true - TurnTimeLeft = 0 --1 + EndTurn(true) TimeLeft = 0 + SendStat(siGraphTitle, loc("Score graph")) end end -- gaudy racer function CheckForNewRound() - ---------- - -- new - ---------- - - --[[if gameBegun == true then - - if RoundHasChanged == true then - roundN = roundN + 1 - RoundHasChanged = false - onNewRound() - end - - if lastRound ~= TotalRounds then -- new round, but not really - - if RoundHasChanged == false then - RoundHasChanged = true - end - - end - - --AddCaption("RoundN:" .. roundN .. "; " .. "TR: " .. TotalRounds) - lastRound = TotalRounds - - end]] - - ---------- - -- old - ---------- if GetHogClan(CurrentHedgehog) == firstClan then onNewRound() end @@ -673,7 +932,7 @@ function isATrackedGear(gear) if (GetGearType(gear) == gtExplosives) or (GetGearType(gear) == gtShell) or - (GetGearType(gear) == gtFlame) or-- new -- gtBall + (GetGearType(gear) == gtFlame) or (GetGearType(gear) == gtBall) then return(true) @@ -722,15 +981,13 @@ if GetGearType(gear) == gtShell then AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false) + WriteLnToConsole("about to delete a shell due to lifespan == 0") - --elseif GetGearType(gear) == gtBall then - -- AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, true) elseif GetGearType(gear) == gtExplosives then AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) - --nw WriteLnToConsole("about to delete a explosive due to lifespan == 0") + PlaySound(sndExplosion) elseif GetGearType(gear) == gtFlame then AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false) - --WriteLnToConsole("about to delete flame due to lifespan == 0") end DeleteGear(gear) @@ -749,7 +1006,6 @@ then AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) DeleteGear(gear) - --SetHealth(gear, 0) --WriteLnToConsole("I'm setting barrel ID " .. getGearValue(gear,"ID") .. " to 0 health because it's been flung too close to the map edges. at Game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) end @@ -762,55 +1018,6 @@ -- action keys ----------------------- -function HandleFlameThrower() - - -- - --flamer - - fireTimer = fireTimer + 1 - if fireTimer == 6 then -- 6 - fireTimer = 0 - - if (wep[wepIndex] == loc("Flamer") ) and (preciseOn == true) and (wepAmmo[wepIndex] > 0) and (stopMovement == false) and (tumbleStarted == true) then - - wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 - AddCaption( - loc("Flamer") .. ": " .. - (wepAmmo[wepIndex]/800*100) - (wepAmmo[wepIndex]/800*100)%2 .. "%", - wepCol[2], - capgrpMessage2 - ) - DrawTag(3) - - dx, dy = GetGearVelocity(CurrentHedgehog) --gtFlame -- gtSnowball -- gtAirBomb - shell = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0) - - xdev = 1 + GetRandom(35) --25 - xdev = xdev / 100 - - r = GetRandom(2) - if r == 1 then - xdev = xdev*-1 - end - - ydev = 1 + GetRandom(35) --25 - ydev = ydev / 100 - - r = GetRandom(2) - if r == 1 then - ydev = ydev*-1 - end - - --4.5 or 2.5 nonflames --4.5 - SetGearVelocity(shell, (dx*4.5)+(xdev*fMod), (dy*4.5)+(ydev*fMod)) --10 - - end - - end - - -end - function ChangeWeapon() wepIndex = wepIndex + 1 @@ -818,77 +1025,21 @@ wepIndex = 0 end +--[[ + NOTE: Don’t show selected weapon as long we only have one. Remove this comment and activate this code + again as soon as at least one other weapon appears. AddCaption(wep[wepIndex] .. " " .. loc("selected!"), wepCol[wepIndex],capgrpAmmoinfo ) AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) +]] end ---function onTimer() - - -- experimental wep - --[[SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, 0xff33ffff) - AddCaption("boom") - PlaySound(sndWarp) - shockwaveHealth = 100 - shockwaveRad = 100]] - - - --change wep - --ChangeWeapon() - - -- booster - --[[if boosterOn == false then - boosterOn = true - else - boosterOn = false - end]] - ---end - --- o rite dis wan iz liek synched n stuff hope full lee --- old method ---[[function onPrecise() - - - -- Fire Barrel - if (primShotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then - - shotsFired = shotsFired +1 - - morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1) - - primShotsLeft = primShotsLeft - 1 - - if primShotsLeft == 0 then - PlaySound(sndSuddenDeath) - AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) - else - AddCaption(loc("Ammo") .. ": " .. primShotsLeft) - end - DrawTag(1) - - CopyPV(CurrentHedgehog, morte) -- new addition - x,y = GetGearVelocity(morte) - - x = x*2 - y = y*2 - SetGearVelocity(morte, x, y) - - - elseif (primShotsLeft == 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then - AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) - end - - -end]] - -- derp tumbler function onPrecise() if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (wepAmmo[wepIndex] > 0) then wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 - --AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) if wep[wepIndex] == loc("Barrel Launcher") then shotsFired = shotsFired +1 @@ -901,10 +1052,10 @@ SetGearVelocity(morte, x, y) if wepAmmo[wepIndex] == 0 then - PlaySound(sndSuddenDeath) - AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) + PlaySound(sndSuddenDeath) + AddCaption(loc("Ammo depleted!"),0xff0000ff,capgrpMessage) else - --AddCaption(loc("Ammo") .. ": " .. wepAmmo[wepIndex]) + PlaySound(sndThrowRelease) end DrawTag(1) @@ -915,7 +1066,8 @@ end elseif (wepAmmo[wepIndex] == 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then - AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) + PlaySound(sndDenied) + AddCaption(loc("Ammo depleted!"),0xff0000ff,capgrpMessage) end preciseOn = true @@ -931,18 +1083,17 @@ if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then shieldMiser = false if shieldHealth == 80 then - AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage) - PlaySound(sndMineTick) - PlaySound(sndSwitchHog) + AddCaption(loc("Shield depleted"),0xff0000ff,capgrpMessage) + PlaySound(sndDenied) elseif (beam == false) and (shieldHealth > 80) then beam = true SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, 0xa800ffff) - AddCaption( loc("Shield ON:") .. " " .. shieldHealth - 80 .. " " .. loc("Power Remaining") ) + AddCaption( string.format(loc("Shield ON: %d power remaining"), shieldHealth - 80)) PlaySound(sndWarp) else beam = false SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 0, 0, 1, 10, 0, 0, 0, 0xa800ffff) - AddCaption(loc("Shield OFF:") .. " " .. shieldHealth - 80 .. " " .. loc("Power Remaining") ) + AddCaption( string.format(loc("Shield OFF: %d power remaining"), shieldHealth - 80)) end end end @@ -950,11 +1101,19 @@ function onHJump() if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and - (rAlpha == 255) and (radShotsLeft > 0) then - rPingTimer = 0 - rAlpha = 0 - radShotsLeft = radShotsLeft -1 - AddCaption(loc("Pings left:") .. " " .. radShotsLeft,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage) + (rAlpha == 255) then + if radShotsLeft > 0 then + rPingTimer = 0 + rAlpha = 0 + radShotsLeft = radShotsLeft -1 + AddCaption(string.format(loc("Pings left: %d"), radShotsLeft),GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage) + -- Play sonar sound + PlaySound(sndJetpackLaunch) + + else + AddCaption(loc("No radar pings left!"),0xFF0000FF,capgrpMessage) + PlaySound(sndDenied) + end end end @@ -999,17 +1158,67 @@ -- other event handlers -------------------------- +function onParameters() + parseParams() + if params["rounds"] ~= nil then + roundLimit = math.floor(tonumber(params["rounds"])) + end + if params["barrels"] ~= nil then + startBarrels = math.floor(tonumber(params["barrels"])) + end + if params["pings"] ~= nil then + startRadShots = math.floor(tonumber(params["pings"])) + end + if params["shield"] ~= nil then + startShield = math.floor(tonumber(params["shield"])) + end + + if params["barrelbonus"] ~= nil then + barrelBonus = math.floor(tonumber(params["barrelbonus"])) + end + if params["shieldbonus"] ~= nil then + shieldBonus = math.floor(tonumber(params["shieldbonus"])) + end + if params["timebonus"] ~= nil then + timeBonus = math.floor(tonumber(params["timebonus"])) + end + if params["forcetheme"] == "false" then + forceTheme = false + else + forceTheme = true + end +end + function onGameInit() - ClearGameFlags() - EnableGameFlags(gfRandomOrder) - Theme = "EarthRise" + --[[ Only GameFlags which are listed here are allowed. All other game flags will be discarded. + Nonetheless this allows for some configuration in the game scheme ]] + local allowedFlags = + -- those flags are probably the most realistic one to use + gfDisableGirders + gfRandomOrder + -- highly recommended! + gfDisableLandObjects + gfSolidLand + gfLowGravity + + -- a bit unusual but may still be useful + gfBottomBorder + gfForts + gfDivideTeams + + gfDisableWind + gfMoreWind + gfTagTeam + + -- very unusual flags, they don’t affect gameplay really, they are mostly for funny graphical effects + gfKing + -- King Mode doesn’t work like expected, since hedgehogs never really die here in this mode + gfVampiric + -- just for the grapical effects + gfBorder -- technically possible, but not very fun to play + -- any other flag is FORBIDDEN and will be disabled when it is on anyways! + + GameFlags = band(GameFlags, allowedFlags) + + if forceTheme then + Theme = "EarthRise" + end CaseFreq = 0 HealthCaseProb = 0 - MinesNum = 0 - Explosives = 0 Delay = 1000 - - for i = 0, 3 do + SuddenDeathTurns = 50 + WaterRise = 0 + HealthDecrease = 0 + WorldEdge = weNone + + for i = 0, 4 do vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false) end @@ -1028,38 +1237,34 @@ end function onGameStart() - - if (MinesTime == -1000) or (MinesTime == 0) then - roundLimit = 3 - else - roundLimit = (MinesTime / 1000) - end + SendGameResultOff() + SendRankingStatsOff() + SendAchievementsStatsOff() + SendHealthStatsOff() ShowMission ( - "SPACE INVASION", - loc("a Hedgewars mini-game"), - - loc("Destroy invaders to score points.") .. "|" .. + loc("SPACE INVASION"), + loc("A Hedgewars mini-game"), + + loc("Fly into space to fight off the invaders with barrels!") .."|".. + loc("Destroy invaders and collect bonuses to score points.") .. "|" .. + loc("Get the highest score to win.") .. "|" .. " " .. "|" .. - - loc("Round Limit") .. ": " .. roundLimit .. "|" .. - loc("Turn Time") .. ": " .. (TurnTime/1000) .. loc("sec") .. "|" .. + loc("Avoid bazookas, red and blue invaders.") .. "|" .. + loc("Collect the green and purple invaders.") .. "|" .. + loc("Use the shield to protect yourself from bazookas.") .. "|" .. + " " .. "|" .. + + string.format(loc("Round Limit: %d"), roundLimit) .. "|" .. + string.format(loc("Turn Time: %dsec"), (TurnTime/1000)) .. "|" .. " " .. "|" .. loc("Movement: [Up], [Down], [Left], [Right]") .. "|" .. - loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" .. - loc("Toggle Shield") .. ": " .. loc("[Enter]") .. "|" .. - loc("Radar Ping") .. ": " .. loc("[Backspace]") .. "|" .. - - --" " .. "|" .. - --LOC_NOT("Invaders List: ") .. "|" .. - --LOC_NOT("Blue Jabberwock: (50 points)") .. "|" .. - --LOC_NOT("Red Warbler: (10 points)") .. "|" .. - --LOC_NOT("Orange Gob: (5 points)") .. "|" .. - --LOC_NOT("Green Wrangler: (3 points)") .. "|" .. - - - "", 4, 4000 + loc("Fire: [Precise]") .. "|" .. + loc("Toggle Shield: [Long jump]") .. "|" .. + loc("Radar Ping: [High jump]") .. "|" .. + + "", 4, 5000 ) CreateMeSomeCircles() @@ -1075,19 +1280,19 @@ DrawTag(0) DrawTag(1) DrawTag(2) + DrawTag(4) end end function onNewTurn() - --primShotsLeft = primShotsMax - radShotsLeft = 2 + radShotsLeft = startRadShots stopMovement = false tumbleStarted = false boosterOn = false beam = false - shieldHealth = 30 + 80 -- 50 = 5 secs, roughly + shieldHealth = startShield + 80 -- 50 = 5 secs, roughly shockwaveHealth = 0 RK = 0 @@ -1096,6 +1301,7 @@ OK = 0 SK = 0 roundKills = 0 + roundScore = 0 shieldMiser = true fierceComp = false shotsFired = 0 @@ -1129,8 +1335,8 @@ -- tumbler ---- - wepAmmo[0] = 5 - wepAmmo[1] = 2 + wepAmmo[0] = startBarrels + wepAmmo[1] = startRadShots wepAmmo[2] = 5000 wepIndex = 2 ChangeWeapon() @@ -1180,13 +1386,6 @@ HandleCircles() - -- derp - --if shockwaveHealth > 0 then - -- shockwaveHealth = shockwaveHealth - 1 - -- shockwaveRad = shockwaveRad + 5 - --end - - Timer100 = Timer100 + 1 if Timer100 >= 100 then Timer100 = 0 @@ -1196,7 +1395,7 @@ if shieldHealth < 80 then -- <= 80 shieldHealth = 80 beam = false - AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage) + AddCaption(loc("Shield depleted"),0xff0000ff,capgrpMessage) PlaySound(sndMineTick) PlaySound(sndSwitchHog) end @@ -1210,13 +1409,8 @@ --nw WriteLnToConsole("Finished ThingsToBeRunOnGears()") - --runOnGears(HandleLifeSpan) - --runOnGears(DeleteFarFlungBarrel) - if CirclesAreGo == true then CheckDistances() - --runOnGears(CheckVarious) -- used to be in handletracking for some bizarre reason - --runOnGears(ProjectileTrack) end -- white smoke trail as player falls from the sky @@ -1235,15 +1429,15 @@ -- start the player tumbling with a boom once their turn has actually begun if (tumbleStarted == false) and (gameOver == false) then if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then - --AddCaption(LOC_NOT("Good to go!")) tumbleStarted = true - TimeLeft = (TurnTime/1000) --45 + TimeLeft = (TurnTime/1000) FadeAlpha = 0 rAlpha = 255 AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1) DrawTag(0) DrawTag(1) DrawTag(2) + DrawTag(4) SetMyCircles(true) end end @@ -1252,8 +1446,6 @@ if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then - --AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog) ) - -- Calculate and display turn time TimeLeftCounter = TimeLeftCounter + 1 if TimeLeftCounter == 1000 then @@ -1261,12 +1453,19 @@ TimeLeft = TimeLeft - 1 if TimeLeft >= 0 then - --AddCaption(LOC_NOT("Time Left: ") .. TimeLeft) DrawTag(0) end end + if (TimeLeftCounter % 1000) == 0 then + if TimeLeft == 5 then + PlaySound(sndHurry, CurrentHedgehog) + elseif TimeLeft <= 4 and TimeLeft >= 1 then + PlaySound(_G["sndCountdown"..TimeLeft]) + end + end + --WriteLnToConsole("Finished timeleft calculations") ------------------------------- @@ -1280,32 +1479,61 @@ --WriteLnToConsole("successfully checked playerIsFine") if (TimeLeft == 0) then + if PlayerIsFine() then AddCaption(loc("Time's up!")) end if (stopMovement == false) then --time to stop the player stopMovement = true boosterOn = false beam = false upOn = false - down = false + downOn = false leftOn = false rightOn = false SetMyCircles(false) - HideTags() rAlpha = 255 + FailGraphics() --nw WriteLnToConsole("Player is out of luck") if shieldMiser == true then p = (roundKills*3.5) - ((roundKills*3.5)%1) + 2 - AddCaption(loc("Shield Miser!") .." +" .. p .." ".. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo) + AddCaption(string.format(loc("Shield Miser! +%d points!"), p),0xffba00ff,capgrpAmmoinfo) AwardPoints(p) end - if ((shotsHit / shotsFired * 100) >= 80) and (shotsFired > 4) then - AddCaption(loc("Accuracy Bonus!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpVolume) + local accuracy = (shotsHit / shotsFired) * 100 + if (accuracy >= 80) and (shotsFired > 4) then + AddCaption(loc("Accuracy Bonus! +15 points"),0xffba00ff,capgrpVolume) AwardPoints(15) + + + -- special award for no misses + local award = false + if awardAccuracy == nil then + if (shotsHit >= shotsFired) then + award = true + end + elseif (shotsHit == shotsFired) and shotsHit > awardAccuracy.value then + award = true + end + if award then + awardAccuracy = { + hogName = GetHogName(CurrentHedgehog), + teamName = GetHogTeamName(CurrentHedgehog), + value = shotsHit, + } + end + end + AddCaption(loc(string.format(loc("Round score: %d"), roundScore)), 0xFFFFFFFF, capgrpMessage2) + + -- other awards + awardRoundScore = UpdateSimpleAward(awardRoundScore, roundScore, 50) + awardRoundKills = UpdateSimpleAward(awardRoundKills, roundKills, 5) + + HideTags() + end else -- remove this if you want tumbler to fall slowly on death ------------------------------- @@ -1392,9 +1620,6 @@ end - HandleFlameThrower() - - end -- new end I put here to check if he's still alive or not end @@ -1407,7 +1632,7 @@ if GetGearType(gear) == gtHedgehog then if (fierceComp == false) and (damage >= 60) and (GetHogClan(gear) ~= GetHogClan(CurrentHedgehog)) then fierceComp = true - AddCaption(loc("Fierce Competition!") .. " +8 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) + AddCaption(loc("Fierce Competition! +8 points!"),0xffba00ff,capgrpGameState) AwardPoints(8) end end @@ -1418,6 +1643,7 @@ -- did I fall into the water? well, that was a stupid thing to do if gear == CurrentHedgehog then TimeLeft = 0 + playerIsFine = false --WriteLnToConsole("Current hedgehog just drowned himself") --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) end @@ -1431,10 +1657,6 @@ setNewGearValues(gear) end - --if GetGearType(gear) == gtBall then - -- SetTimer(gear, 5000) - --end - if GetGearType(gear) == gtHedgehog then SetEffect(gear, heResurrectable, 1) @@ -1449,25 +1671,6 @@ function onGearDelete(gear) - - --[[if GetGearType(gear) == gtShell then - --nw WriteLnToConsole("on GearDelete call. Shell ID: " .. getGearValue(gear,"ID")) - --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) - - --if CurrentHedgehog ~= nil then - -- WriteLnToConsole("As it happens, player is at: " .. GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog)) - --end - elseif GetGearType(gear) == gtExplosives then - --nw WriteLnToConsole("on GearDelete call. Explosives ID: " .. getGearValue(gear,"ID")) - --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) - - --if CurrentHedgehog ~= nil then - -- WriteLnToConsole("As it happens, player is at: " .. GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog)) - --end - elseif GetGearType(gear) == gtFlame then - --WriteLnToConsole("on GearDelete flame") - end]] - if isATrackedGear(gear) then trackDeletion(gear) end @@ -1551,22 +1754,6 @@ q = g1X - g2X w = g1Y - g2Y - - --[[ - WriteLnToConsole("I just got the position of two gears and calculated the distance betwen them") - if gear == CurrentHedgehog then - WriteLnToConsole("Gear 1 is CurrentHedgehog.") - end - if gear2 == CurrentHedgehog then - WriteLnToConsole("Gear 2 is CurrentHedgehog.") - end - WriteLnToConsole("G1X: " .. g1X .. "; G1Y: " .. g1Y) - WriteLnToConsole("G2X: " .. g2X .. "; G2Y: " .. g2Y) - WriteLnToConsole("Their distance is " .. (q*q) + (w*w) ) - WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) -]] - - return ( (q*q) + (w*w) ) end @@ -1577,22 +1764,8 @@ q = g1X - g2X w = g1Y - g2Y - - --[[WriteLnToConsole("I just got the position of a gear and calculated the distance betwen it and another xy") - if gear == CurrentHedgehog then - WriteLnToConsole("Gear 1 is CurrentHedgehog.") - end - - WriteLnToConsole("G1X: " .. g1X .. "; G1Y: " .. g1Y) - WriteLnToConsole("Other X: " .. g2X .. "; Other Y: " .. g2Y) - WriteLnToConsole("Their distance is " .. (q*q) + (w*w) ) - WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) -]] - - return ( (q*q) + (w*w) ) - end function CreateMeSomeCircles() @@ -1614,13 +1787,13 @@ vCircScore[i] = 0 vCircHealth[i] = 1 - vCircMinA[i] = 80 --80 --20 + vCircMinA[i] = 80 vCircMaxA[i] = 255 - vCircType[i] = 1 --1 + vCircType[i] = 1 vCircPulse[i] = 10 vCircFuckAll[i] = 0 vCircRadius[i] = 0 - vCircWidth[i] = 3 --5 + vCircWidth[i] = 3 vCircRadMax[i] = 0 vCircRadMin[i] = 0 @@ -1638,8 +1811,6 @@ end pShield = AddVisualGear(0,0,vgtCircle,0,true) - --SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 80, 200, 1, 10, 0, 200, 5, 0xff00ffff) - shockwave = AddVisualGear(0,0,vgtCircle,0,true) @@ -1649,10 +1820,6 @@ acceptibleDistance = 800 - -- put this in here to thwart attempts at repositioning and test sanity limit - --vCircX[i] = GetX(CurrentHedgehog)+250 - --vCircY[i] = GetY(CurrentHedgehog)+250 - vCircX[i] = GetRandom(5000) vCircY[i] = GetRandom(2000) dist = GetDistFromGearToXY(CurrentHedgehog, vCircX[i], vCircY[i]) @@ -1676,8 +1843,8 @@ if (vType[i] == "drone") then PlaySound(sndHellishImpact4) - TimeLeft = TimeLeft + 4 - AddCaption(loc("Time Extended!") .. "+" .. 4 .. loc("sec"), 0xff0000ff,capgrpMessage ) + TimeLeft = TimeLeft + timeBonus + AddCaption(string.format(loc("Time extended! +%dsec"), timeBonus), 0xff0000ff,capgrpMessage ) DrawTag(0) morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1) @@ -1686,7 +1853,7 @@ RK = RK + 1 if RK == 5 then RK = 0 - AddCaption(loc("Drone Hunter!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2) + AddCaption(loc("Drone Hunter! +10 points!"),0xffba00ff,capgrpMessage2) AwardPoints(10) end @@ -1694,15 +1861,14 @@ AddVisualGear(vCircX[i], vCircY[i], vgtExplosion, 0, false) PlaySound(sndExplosion) PlaySound(sndShotgunReload) - wepAmmo[0] = wepAmmo[0] +3 - --primShotsLeft = primShotsLeft + 3 - AddCaption("+" .. 3 .. " " .. loc("Ammo"), 0x00ff00ff,capgrpMessage) + wepAmmo[0] = wepAmmo[0] + barrelBonus + AddCaption(string.format(loc("+%d Ammo"), barrelBonus), 0x00ff00ff,capgrpMessage) DrawTag(1) GK = GK + 1 if GK == 3 then GK = 0 - AddCaption(loc("Ammo Maniac!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2) + AddCaption(loc("Ammo Maniac! +5 points!"),0xffba00ff,capgrpMessage2) AwardPoints(5) end @@ -1719,10 +1885,9 @@ AddVisualGear(vCircX[i], vCircY[i], vgtSmoke, 0, false) PlaySound(sndVaporize) - --sndWarp sndMineTick --sndSwitchHog --sndSuddenDeath - - shieldHealth = shieldHealth + 30 - AddCaption(loc("Shield boosted! +30 power"), 0xa800ffff,capgrpMessage) + + shieldHealth = shieldHealth + shieldBonus + AddCaption(string.format(loc("Shield boosted! +%d power"),shieldBonus), 0xa800ffff,capgrpMessage) if shieldHealth >= 250 then shieldHealth = 250 AddCaption(loc("Shield is fully recharged!"),0xa800ffff,capgrpMessage) @@ -1732,13 +1897,13 @@ OK = OK + 1 if OK == 3 then OK = 0 - AddCaption(loc("Shield Seeker!") .. " + 10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2) + AddCaption(loc("Shield Seeker! +10 points!"),0xffba00ff,capgrpMessage2) AwardPoints(10) end elseif (vType[i] == "blueboss") then PlaySound(sndHellishImpact3) - AddCaption(loc("Boss defeated!") .. " +30 " .. loc("points") .. "!", 0x0050ffff,capgrpMessage) + AddCaption(loc("Boss defeated! +30 points!"), 0x0050ffff,capgrpMessage) morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1) SetHealth(morte, 0) @@ -1746,7 +1911,7 @@ BK = BK + 1 if BK == 2 then BK = 0 - AddCaption(loc("Boss Slayer!") .. " +25 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2) + AddCaption(loc("Boss Slayer! +25 points!"),0xffba00ff,capgrpMessage2) AwardPoints(25) end @@ -1760,24 +1925,18 @@ chainCounter = 3000 chainLength = chainLength + 1 if chainLength > 1 then - AddCaption( chainLength .. "-" .. loc("Hit Combo!") .. " +" .. chainLength*2 .. " " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate) + AddCaption( string.format(loc("%d-Hit Combo! +%d points!"), chainLength, chainLength*2),0xffba00ff,capgrpAmmostate) AwardPoints(chainLength*2) end + awardCombo = UpdateSimpleAward(awardCombo, chainLength, 5) + else -- circle is merely damaged -- do damage effects/sounds AddVisualGear(vCircX[i], vCircY[i], vgtSteam, 0, false) - r = GetRandom(4) - if r == 0 then - PlaySound(sndHellishImpact1) - elseif r == 1 then - PlaySound(sndHellishImpact2) - elseif r == 2 then - PlaySound(sndHellishImpact3) - elseif r == 3 then - PlaySound(sndHellishImpact4) - end + r = math.random(1,4) + PlaySound(_G["sndHellishImpact" .. tostring(r)]) res = "non-fatal" end @@ -1790,15 +1949,11 @@ r = GetRandom(10) - --r = 8 -- 80% of spawning either red/green if r <= 7 then - --r = GetRandom(5) r = GetRandom(2) - --r = 1 if r == 0 then - --if r <= 2 then vCircCol[i] = 0xff0000ff -- red vType[i] = "drone" vCircRadMin[i] = 50 *5 @@ -1806,7 +1961,6 @@ vCounterLim[i] = 3000 vCircScore[i] = 10 vCircHealth[i] = 1 - --else elseif r == 1 then vCircCol[i] = 0x00ff00ff -- green vType[i] = "ammo" @@ -1819,10 +1973,7 @@ -- 20% chance of spawning boss or bonus else r = GetRandom(5) - --r = GetRandom(2) - --r = 0 if r <= 1 then - --if r == 0 then vCircCol[i] = 0x0050ffff -- sexy blue vType[i] = "blueboss" vCircRadMin[i] = 100*5 @@ -1832,8 +1983,6 @@ vCircScore[i] = 30 vCircHealth[i] = 3 else - --elseif r == 1 then - --vCircCol[i] = 0xffae00ff -- orange vCircCol[i] = 0xa800ffff -- purp vType[i] = "bonus" vCircRadMin[i] = 20 *7 @@ -1846,28 +1995,24 @@ -- regenerate circle xy if too close to player or until sanity limit kicks in reN = 0 - --zzz = 0 while (reN < 10) do if IGotMeASafeXYValue(i) == false then reN = reN + 1 - --zzz = zzz + 1 else reN = 15 end end - --AddCaption("Took me this many retries: " .. zzz) -- number of times it took to work vCircRadius[i] = vCircRadMax[i] - GetRandom(vCircRadMin[i]) g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], vCircWidth[i], vCircCol[i]-0x000000ff) - -- - -0x000000ff g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(rCirc[i]) SetVisualGearValues(rCirc[i], 0, 0, g3, g4, g5, g6, g7, g8, g9, vCircCol[i]-0x000000ff) - vCircActive[i] = true -- new + vCircActive[i] = true --nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i]) --nw WriteLnToConsole("CIRC " .. i .. ": dX: " .. vCircDX[i] .. "; dY: " .. vCircDY[i]) @@ -1903,27 +2048,33 @@ end -function WellHeAintGonnaJumpNoMore(x,y) - - AddVisualGear(x, y, vgtBigExplosion, 0, false) +function WellHeAintGonnaJumpNoMore(x,y,explode) + if explode==true then + AddVisualGear(x, y, vgtBigExplosion, 0, false) + PlaySound(sndExplosion) + local r = math.random(1,3) + PlaySound(_G["sndOoff"..r], CurrentHedgehog) + end + playerIsFine = false AddCaption(loc("GOTCHA!")) - PlaySound(sndExplosion) + FailGraphics() PlaySound(sndHellish) targetHit = true end +-- Turn all circles white to indicate they can't be hit anymore +function FailGraphics() + for i = 0,(vCCount-1) do + vCircCol[i] = 0xffffffff + end +end + --- collision detection for weapons fire function CheckVarious(gear) - --if (GetGearType(gear) == gtExplosives) then - --nw WriteLnToConsole("Start of CheckVarious(): Exp ID: " .. getGearValue(gear,"ID")) - --elseif (GetGearType(gear) == gtShell) then - --nw WriteLnToConsole("Start of CheckVarious(): Shell ID: " .. getGearValue(gear,"ID")) - --end - targetHit = false -- if circle is hit by player fire @@ -1934,73 +2085,64 @@ --nw WriteLnToConsole("Is it neccessary to check for collision with circ " .. i) - --if (vCircActive[i] == true) and ( (vType[i] == "drone") ) then - - --nw WriteLnToConsole("YES. about to calc distance between gtExplosives and circ " .. i) - - dist = GetDistFromGearToXY(gear, vCircX[i], vCircY[i]) - - -- calculate my real radius if I am an aura - if vCircType[i] == 0 then - NR = vCircRadius[i] - else - NR = (48/100*vCircRadius[i])/2 + --nw WriteLnToConsole("YES. about to calc distance between gtExplosives and circ " .. i) + + dist = GetDistFromGearToXY(gear, vCircX[i], vCircY[i]) + + -- calculate my real radius if I am an aura + if vCircType[i] == 0 then + NR = vCircRadius[i] + else + NR = (48/100*vCircRadius[i])/2 + end + + if dist <= NR*NR then + + + --nw WriteLnToConsole("Collision confirmed. The gtExplosives is within the circ radius!") + + dist = (GetDistFromXYtoXY(vCircX[i], vCircY[i], getGearValue(gear,"XP"), getGearValue(gear,"YP")) - (NR*NR)) + if dist >= 1000000 then + sniperHits = sniperHits +1 + AddCaption(loc("Sniper! +8 points!"),0xffba00ff,capgrpGameState) + AwardPoints(8) + if sniperHits == 3 then + sniperHits = 0 + AddCaption(loc("They Call Me Bullseye! +16 points!"),0xffba00ff,capgrpGameState) + AwardPoints(16) + end + elseif dist <= 6000 then + pointBlankHits = pointBlankHits +1 + if pointBlankHits == 3 then + pointBlankHits = 0 + AddCaption(loc("Point Blank Combo! +5 points!"),0xffba00ff,capgrpGameState) + AwardPoints(5) + end end - if dist <= NR*NR then - - - --nw WriteLnToConsole("Collision confirmed. The gtExplosives is within the circ radius!") - - dist = (GetDistFromXYtoXY(vCircX[i], vCircY[i], getGearValue(gear,"XP"), getGearValue(gear,"YP")) - (NR*NR)) - --AddCaption(loc("Dist: ") .. dist .. "!",0xffba00ff,capgrpGameState) - if dist >= 1000000 then - sniperHits = sniperHits +1 - AddCaption(loc("Sniper!") .. " +8 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) - AwardPoints(8) - if sniperHits == 3 then - sniperHits = 0 - AddCaption(loc("They Call Me Bullseye!") .. " +16 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) - AwardPoints(15) - end - elseif dist <= 6000 then - pointBlankHits = pointBlankHits +1 - if pointBlankHits == 3 then - pointBlankHits = 0 - AddCaption(loc("Point Blank Combo!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) - AwardPoints(5) - end - end - - AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) - - targetHit = true - --DeleteGear(gear) - --SetHealth(gear,0) - --WriteLnToConsole("set " .. "Exp ID: " .. getGearValue(gear,"ID") .. " health to 0") - --WriteLnToConsole("targetHit set to true, explosive is at distance " .. dist .. "(within range " .. NR*NR.. ") of circ" ) - - CircleDamaged(i) - - circsHit = circsHit + 1 - if circsHit > 1 then - AddCaption(loc("Multi-shot!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate) - AwardPoints(15) + AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) + + targetHit = true + --WriteLnToConsole("set " .. "Exp ID: " .. getGearValue(gear,"ID") .. " health to 0") + --WriteLnToConsole("targetHit set to true, explosive is at distance " .. dist .. "(within range " .. NR*NR.. ") of circ" ) + + CircleDamaged(i) + + circsHit = circsHit + 1 + if circsHit > 1 then + AddCaption(loc("Multi-shot! +15 points!"),0xffba00ff,capgrpAmmostate) + AwardPoints(15) circsHit = 0 - end - - shotsHit = shotsHit + 1 - - - end - --end + shotsHit = shotsHit + 1 + + end end -- if player is hit by circle bazooka - elseif (GetGearType(gear) == gtShell) then --or (GetGearType(gear) == gtBall) then + elseif (GetGearType(gear) == gtShell) then dist = GetDistFromGearToGear(gear, CurrentHedgehog) @@ -2016,22 +2158,15 @@ SK = SK + 1 if SK == 5 then SK = 0 - AddCaption(loc("Shield Master!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo) + AddCaption(loc("Shield Master! +10 points!"),0xffba00ff,capgrpAmmoinfo) AwardPoints(10) end end elseif dist < 1600 then - WellHeAintGonnaJumpNoMore(GetX(gear), GetY(gear)) + WellHeAintGonnaJumpNoMore(GetX(gear), GetY(gear), true) end - --[[if targetHit == true then - WriteLnToConsole("about to delete shell due to targetHit being set to true earlier") - DeleteGear(gear) - WriteLnToConsole("there, I deleted it") - end]] - - end if targetHit == true then @@ -2061,8 +2196,6 @@ g1Y = g1Y - g2Y dist = (g1X*g1X) + (g1Y*g1Y) - --DoHorribleThings(i, g1X, g1Y, g2X, g2Y, dist) - --nw WriteLnToConsole("Calcs done. Dist to CurrentHedgehog is " .. dist) -- calculate my real radius if I am an aura @@ -2085,20 +2218,24 @@ then ss = CircleDamaged(i) - WellHeAintGonnaJumpNoMore(GetX(CurrentHedgehog),GetY(CurrentHedgehog)) + local explosion + if vType[i] == "blueboss" then explosion = true else explosion = false end + WellHeAintGonnaJumpNoMore(GetX(CurrentHedgehog),GetY(CurrentHedgehog),explosion) if ss == "fatal" then if (wepAmmo[0] == 0) and (TimeLeft <= 9) then - --if (primShotsLeft == 0) and (TimeLeft <= 9) then - AddCaption(loc("Kamikaze Expert!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpMessage) + AddCaption(loc("Kamikaze Expert! +15 points!"),0xffba00ff,capgrpMessage) AwardPoints(15) + PlaySound(sndKamikaze, CurrentHedgehog) elseif (wepAmmo[0] == 0) then - AddCaption(loc("Depleted Kamikaze!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage) + AddCaption(loc("Depleted Kamikaze! +5 points!"),0xffba00ff,capgrpMessage) AwardPoints(5) + PlaySound(sndKamikaze, CurrentHedgehog) elseif TimeLeft <= 9 then - AddCaption(loc("Timed Kamikaze!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage) + AddCaption(loc("Timed Kamikaze! +10 points!"),0xffba00ff,capgrpMessage) AwardPoints(10) + PlaySound(sndKamikaze, CurrentHedgehog) end end @@ -2115,20 +2252,6 @@ function HandleCircles() - --[[if CirclesAreGo == true then - - --CheckDistances() - --runOnGears(CheckVarious) -- used to be in handletracking for some bizarre reason - - --pTimer = pTimer + 1 - --if pTimer == 100 then - -- pTimer = 0 - -- runOnGears(ProjectileTrack) - --end - - end]] - - if rAlpha ~= 255 then rPingTimer = rPingTimer + 1 @@ -2145,11 +2268,7 @@ for i = 0,(vCCount-1) do - --if (vCircActive[i] == true) then - SetVisualGearValues(rCirc[i], rCircX[i], rCircY[i], 100, 255, 1, 10, 0, 40, 3, vCircCol[i]-rAlpha) - --end - - + SetVisualGearValues(rCirc[i], rCircX[i], rCircY[i], 100, 255, 1, 10, 0, 40, 3, vCircCol[i]-rAlpha) vCounter[i] = vCounter[i] + 1 if vCounter[i] >= vCounterLim[i] then @@ -2160,14 +2279,6 @@ (vCircActive[i] == true) then AddGear(vCircX[i], vCircY[i], gtShell, 0, 0, 0, 1) - --WriteLnToConsole("Circle " .. i .. " just fired/added a gtShell") - --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) - - --elseif (vType[i] == "bluebottle") and (vCircActive[i] == true) then - -- AddGear(vCircX[i], vCircY[i]-vCircRadius[i], gtBall, 0, 0, 0, 1) - -- AddGear(vCircX[i], vCircY[i]+vCircRadius[i], gtBall, 0, 0, 0, 1) - -- AddGear(vCircX[i]-vCircRadius[i], vCircY[i], gtBall, 0, 0, 0, 1) - -- AddGear(vCircX[i]+vCircRadius[i], vCircY[i], gtBall, 0, 0, 0, 1) end end @@ -2204,15 +2315,13 @@ if vType[i] == "ammo" then tempE = AddVisualGear(vCircX[i], vCircY[i], vgtSmoke, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, vCircX[i], vCircY[i], g3, g4, g5, g6, g7, g8, g9, vCircCol[i] ) - --AddVisualGear(vCircX[i], vCircY[i], vgtDust, 0, true) - elseif vType[i] == "bonus" then tempE = AddVisualGear(vCircX[i], vCircY[i], vgtDust, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff --vCircCol[i] + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, vCircX[i], vCircY[i], g3, g4, g5, g6, g7, 1, g9, 0xff00ffff ) @@ -2226,15 +2335,15 @@ -- 0xae00ffff -- purp tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, vCircX[i], vCircY[i]+k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 ) tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, vCircX[i]+k, vCircY[i]-k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 ) tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true) - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) SetVisualGearValues(tempE, vCircX[i]-k, vCircY[i]-k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 ) @@ -2302,7 +2411,7 @@ vCircY[i] = vCircY[i] + vCircDY[i] if (CurrentHedgehog ~= nil) and (rAlpha ~= 255) then - DoHorribleThings(i)--(i, g1X, g1Y, g2X, g2Y, dist) + DoHorribleThings(i) end end @@ -2314,15 +2423,6 @@ FadeAlpha = 255 end - --new - --if FadeAlpha == 1 then - -- AddCaption("GOT IT") - -- for i = 0,(vCCount-1) do - -- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) - -- vCircCol[i] = g10 - -- end - --end - end @@ -2330,24 +2430,19 @@ if shockwaveHealth > 0 then shockwaveHealth = shockwaveHealth - 1 shockwaveRad = shockwaveRad + 80 - - --mrm = ((48/100*shockwaveRad)/2) - --AddVisualGear(GetX(CurrentHedgehog)-mrm+GetRandom(mrm*2),GetY(CurrentHedgehog)-mrm+GetRandom(mrm*2), vgtSmoke, 0, false) end - - end for i = 0,(vCCount-1) do - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) -- vCircCol[i] g10 + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], g9, g10) end if (TimeLeft == 0) or ((tumbleStarted == false)) then for i = 0,(vCCount-1) do - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) -- vCircCol[i] g10 + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], g9, (vCircCol[i]-FadeAlpha)) end end @@ -2356,7 +2451,6 @@ if (CurrentHedgehog ~= nil) then if beam == true then g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(pShield) - --SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, g10 ) SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, 0xa800ffff-0x000000ff - -shieldHealth ) DrawTag(2) else @@ -2381,11 +2475,8 @@ --nw WriteLnToConsole("ProjectileTrack() for Shell ID: " .. getGearValue(gear,"ID")) - -- newnew if (GetGearType(gear) == gtShell) then turningSpeed = 0.1*fMod - --elseif (GetGearType(gear) == gtBall) then - -- turningSpeed = 0.2*fMod end dx, dy = GetGearVelocity(gear) @@ -2395,24 +2486,21 @@ --WriteLnToConsole("CurrentHedgehog is at X: " .. GetX(CurrentHedgehog) .. "; Y: " .. GetY(CurrentHedgehog) ) if GetX(gear) > GetX(CurrentHedgehog) then - dx = dx - turningSpeed--0.1 + dx = dx - turningSpeed else - dx = dx + turningSpeed--0.1 + dx = dx + turningSpeed end if GetY(gear) > GetY(CurrentHedgehog) then - dy = dy - turningSpeed--0.1 + dy = dy - turningSpeed else - dy = dy + turningSpeed--0.1 + dy = dy + turningSpeed end if (GetGearType(gear) == gtShell) then dxlimit = 0.4*fMod dylimit = 0.4*fMod - --elseif (GetGearType(gear) == gtBall) then - -- dxlimit = 0.5 -- 0.5 is about the same - -- dylimit = 0.5 -- 0.6 is faster than player end if dx > dxlimit then diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/TechRacer.cfg --- a/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,2 @@ Shoppa -Shoppa +locked diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Sun Dec 17 00:09:24 2017 +0100 @@ -2,6 +2,11 @@ -- TECH RACER v0.8 ----------------------------------------- +-- DEVELOPER WARNING - FOR OFFICIAL DEVELOPMENT -- +-- Be careful when editig this script, do not introduce changes lightly! +-- This script is used for time records on the official Hedgewars server. +-- Introducing breaking changes means we have to invalidate past time records! + -------------- -- TO DO -------------- @@ -208,8 +213,8 @@ local cGear = nil -local bestClan = nil -local bestTime = nil +local bestClan = 10 +local bestTime = 1000000 local gameBegun = false local gameOver = false @@ -322,7 +327,6 @@ if dist < (NR*NR) then --if dist < (wpRad*wpRad) then --AddCaption("howdy") - wpActive[i] = true wpCol[i] = GetClanColor(GetHogClan(CurrentHedgehog)) -- new --GetClanColor(1) SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i]) @@ -333,7 +337,17 @@ end end - AddCaption(loc("Way-Points Remaining") .. ": " .. wpRem,0xffba00ff,capgrpAmmoinfo) + if not wpActive[i] then + local wpMessage = "" + if wpRem-1 == 0 then + wpMessage = loc("Track completed!") + else + wpMessage = string.format(loc("Waypoints remaining: %d"), wpRem-1) + end + AddCaption(wpMessage, 0xffba00ff, capgrpGameState) + end + + wpActive[i] = true end @@ -349,11 +363,7 @@ function AdjustScores() - if bestTime == nil then - bestTime = 1000000 - bestClan = 10 - bestTimeComment = "N/A" - end + local bestTimeComment = loc("Did not finish") newScore = false @@ -369,9 +379,6 @@ end end - --bestTime = 100000 - --bestClan = 10 - -- find the best time out of those so far for i = 0, (numTeams-1) do if teamScore[i] < bestTime then @@ -381,27 +388,27 @@ end if bestTime ~= 1000000 then - bestTimeComment = (bestTime/1000) ..loc("s") + bestTimeComment = string.format(loc("%.1fs"), (bestTime/1000)) end if newScore == true then if trackTime == bestTime then -- best time of the race - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("NEW RACE RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, 0, 4000) + ShowMission(loc("TechRacer"), + loc("Track completed!"), + string.format(loc("New race record: %.1fs"), (trackTime/1000)) .. "|" .. + string.format(loc("Winning time: %s"), bestTimeComment), 0, 4000) PlaySound(sndHomerun) else -- best time for the clan - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("NEW CLAN RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, 4, 4000) + ShowMission(loc("TechRacer"), + loc("Track completed!"), + string.format(loc("New clan record: %.1fs"), (trackTime/1000)) .. "|" .. + string.format(loc("Winning time: %s"), bestTimeComment), 4, 4000) end else -- not any kind of new score - ShowMission(loc("RACER"), - loc("TRACK COMPLETED"), - loc("TIME: ") .. (trackTime/1000) ..loc("s") .. "|" .. - loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000) + ShowMission(loc("TechRacer"), + loc("Track completed!"), + string.format(loc("Time: %.1fs"), (trackTime/1000)) .. "|" .. + string.format(loc("Winning time: %s"), bestTimeComment), -amSkip, 4000) PlaySound(sndHellish) end @@ -440,28 +447,69 @@ totalComment = "" for i = 0, (TeamsCount-1) do if teamNameArr[i] ~= " " then -- teamScore[teamClan[i]] - teamComment[i] = teamNameArr[i] .. ": " .. (teamScore[i]/1000) .. loc("s|") + if teamScore[i] ~= 1000000 then + teamComment[i] = string.format(loc("%s: %.1fs"), teamNameArr[i], (teamScore[i]/1000)) .. "|" + else + teamComment[i] = string.format(loc("%s: Did not finish"), teamNameArr[i]) .. "|" + end totalComment = totalComment .. teamComment[i] elseif teamNameArr[i] == " " then teamComment[i] = "|" end end - ShowMission( loc("RACER"), - loc("STATUS UPDATE"), - loc("Rounds Complete: ") .. roundNumber .. "/" .. roundLimit .. "|" .. " " .. "|" .. - loc("Best Team Times: ") .. "|" .. totalComment, 0, 4000) + ShowMission( loc("TechRacer"), + loc("Status update"), + string.format(loc("Rounds complete: %d/%d"), roundNumber, roundLimit) .. "|" .. " " .. "|" .. + loc("Best team times: ") .. "|" .. totalComment, 0, 4000) -- end game if its at round limit if roundNumber >= roundLimit then - for i = 0, (numhhs-1) do - if GetHogClan(hhs[i]) ~= bestClan then - SetEffect(hhs[i], heResurrectable, 0) - SetHealth(hhs[i],0) + -- Sort the scores for the ranking list + local unfinishedArray = {} + local sortedTeams = {} + local k = 1 + for i = 0, TeamsCount-1 do + if teamScore[i] ~= 1000000 and teamNameArr[i] ~= " " then + sortedTeams[k] = {} + sortedTeams[k].name = teamNameArr[i] + sortedTeams[k].score = teamScore[i] + k = k + 1 + else + table.insert(unfinishedArray, string.format(loc("%s did not finish the race."), teamNameArr[i])) end end - gameOver = true - TurnTimeLeft = 1 + table.sort(sortedTeams, function(team1, team2) return team1.score < team2.score end) + + -- Write all the stats! + + for i = 1, #sortedTeams do + SendStat(siPointType, loc("milliseconds")) + SendStat(siPlayerKills, sortedTeams[i].score, sortedTeams[i].name) + end + + if #sortedTeams >= 1 then + SendStat(siGameResult, string.format(loc("%s wins!"), sortedTeams[1].name)) + SendStat(siCustomAchievement, string.format(loc("%s wins with a best time of %.1fs."), sortedTeams[1].name, (sortedTeams[1].score/1000))) + for i=1,#unfinishedArray do + SendStat(siCustomAchievement, unfinishedArray[i]) + end + else + SendStat(siGameResult, loc("Round draw")) + SendStat(siCustomAchievement, loc("Nobody managed to finish the race. What a shame!")) + SendStat(siCustomAchievement, loc("Maybe you should try an easier TechRacer map.")) + end + + -- Kill all the losers + for i = 0, (numhhs-1) do + if GetHogClan(hhs[i]) ~= bestClan then + SetEffect(hhs[i], heResurrectable, 0) + SetHealth(hhs[i],0) + end + end + + gameOver = true + EndTurn(true) end end @@ -521,11 +569,16 @@ end -function DisableTumbler() - currCount = 0 - fastIndex = 0 - TurnTimeLeft = 0 - racerActive = false -- newadd +function DisableTumbler(endTurn) + if endTurn == nil then endTurn = true end + if racerActive then + currCount = 0 + fastIndex = 0 + racerActive = false -- newadd + if endTurn then + EndTurn(true) + end + end end function HandleGhost() @@ -649,6 +702,12 @@ activationStage = 200 --runOnHogs(RestoreHog) + if ufoFuel == 2000 then + SetAmmoDescriptionAppendix(amJetpack, loc("On this map you get infinite fuel.")) + elseif ufoFuel ~= nil and ufoFuel ~= 0 then + SetAmmoDescriptionAppendix(amJetpack, string.format(loc("On this map you get %d%% fuel."), div(ufoFuel, 20))) + end + end end @@ -697,6 +756,7 @@ addHashData(mapID) Theme = "Cave" + Map = "" MapGen = mgDrawn TemplateFilter = 0 @@ -706,6 +766,7 @@ CaseFreq = 0 TurnTime = 90000 WaterRise = 0 + HealthDecrease = 0 for x = 1, 16 do AddPoint(x*100,100,5) @@ -911,6 +972,10 @@ end function onGameStart() + SendGameResultOff() + SendRankingStatsOff() + SendAchievementsStatsOff() + SendHealthStatsOff() trackTeams() @@ -926,14 +991,12 @@ end ShowMission ( - loc("RACER"), - loc("a Hedgewars mini-game"), + loc("TechRacer"), + loc("A Hedgewars mini-game"), - loc("Build a track and race.") .. "|" .. - loc("Round Limit:") .. " " .. roundLimit .. "|" .. - loc("You can further customize the race by changing the scheme script paramater.") .. "|" .. - --loc("For example, the below line would play map 4, with infinite fuel for the flying saucer, and four rounds.") .. "|" .. - --"m=4, ufo=true, rounds=4" .. "|" .. + loc("Complete the track as fast as you can!") .. "|" .. + loc("Round limit:") .. " " .. roundLimit .. "|" .. + loc("You can further customize the race by changing the scheme script paramater.") .. "|" .. "", 4, 4000 ) @@ -982,9 +1045,6 @@ -- --[[activationStage = 200]] roundNumber = 0 firstClan = GetHogClan(CurrentHedgehog) - ShowMission(loc("RACER"), - loc("GAME BEGUN!!!"), - loc("Complete the track as fast as you can!"), 2, 4000) --else -- ShowMission(loc("RACER"), -- loc("NOT ENOUGH WAYPOINTS"), @@ -1025,15 +1085,15 @@ if TestRectForObstacle(x-20, y-20, x+20, y+20, true) then - AddCaption(loc("Please place the way-point in the open, within the map boundaries.")) + AddCaption(loc("Please place the waypoint in the air and within the map boundaries")) PlaySound(sndDenied) elseif (y > WaterLine-50) then - AddCaption(loc("Please place the way-point further from the waterline.")) + AddCaption(loc("Please place the waypoint further away from the waterline")) PlaySound(sndDenied) else CallBob(x, y) if wpCount == wpLimit then - AddCaption(loc("Race complexity limit reached.")) + AddCaption(loc("Race complexity limit reached")) DisableTumbler() end end @@ -1104,11 +1164,7 @@ if GameTime%100 == 0 then - if trackTime%1000 == 0 then - AddCaption((trackTime/1000)..'.0',GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) - else - AddCaption(trackTime/1000,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) - end + AddCaption(string.format(loc("Time: %.1fs"), (trackTime/1000)), GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2) if (CheckWaypoints() == true) then AdjustScores() @@ -1117,11 +1173,11 @@ end - end + -- If hedgehog is not controlled anymore, stop racing mode + if band(GetState(CurrentHedgehog), gstHHDriven) == 0 then + DisableTumbler(false) + end - -- if the player has expended his tunbling time, stop him tumbling - if TurnTimeLeft <= 20 then - DisableTumbler() end end @@ -1188,7 +1244,7 @@ AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) if gear == CurrentHedgehog then - DisableTumbler() + DisableTumbler(false) end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/The_Specialists.lua Sun Dec 17 00:09:24 2017 +0100 @@ -97,6 +97,7 @@ 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(amFlamethrower, 1, 0, 0, 0) SetAmmo(amMolotov, 1, 0, 0, 0) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Tumbler.cfg --- a/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,2 @@ -* -* +Default +locked diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Tumbler.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,10 +1,57 @@ ------------------------------------ -- TUMBLER --- v.0.7.1 +-- v.0.8.0 ------------------------------------ +--[[ +SCRIPT PARAMETER +The script is configured with the script parameter. + +Additional configuration in the game scheme is permitted. + +The script parameter is a comma-separated list of key=value pairs. + +The values are always whole numbers, the keys are listed below. + +Key Default Description +---------------------------------------------------------------------- +spawnbarrels 2 Number of barrels that spawn per turn +spawnmines 4 Number of mines that spawn per turn +ammoflamer 50 Initial fuel/ammo of Flamer +ammobarrel 2 Initial ammo of Barrel Launcher +ammomine 1 Initial ammo of Mine Deployer +minetimerplaced 1000 Mine timer of mines dropped from Mine Deployer (!) in milliseconds +bonustime 25 Bonus time in utility crates, in seconds +bonusflames 800 Flamer fuel bonus in ammo crates +chanceammo 30 Chance (in %) that an ammo crate will drop before a turn +chancetime 50 Chance (in %) that an utility crate (extra time) will drop before a turn + + +EXAMPLES: + +ammoflamer=800, ammomine=5 +--> Starts the game with 800 Flamer fuel and 5 Mine Deployer mines. + +chancetime=0 +--> No clock crates. + + +GAME SCHEME CONFIGURATION +The script recognizes most game modifiers and settings, but changing the following game modifiers +will have no effect: +- Artillery +- Tag Team +- Shared ammo +- Per-hog ammo +- Place hogs +- Invulnerable +- Reset weapons +]] + + HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Tracker.lua") +HedgewarsScriptLoad("/Scripts/Params.lua") local fMod = 1000000 -- use this for dev and .16+ games @@ -37,6 +84,18 @@ local vTag = {} +local barrelSpawn = 2 +local mineSpawn = 4 +local initAmmoFlamer = 50 +local initAmmoBarrel = 2 +local initAmmoMine = 1 +local placedMineTime = 1000 +local bonusTime = 25 +local bonusFlames = 800 +local chanceAmmo = 30 +local chanceTime = 50 + + ------------------------ -- version 0.4 ------------------------ @@ -116,15 +175,31 @@ -- redraw HUD on screen resolution change +------------------------ +-- version 0.8.0 +------------------------ +-- Allow detailed configuration with script parameter (see above) +-- Alternative weapon selection with slot keys +--- Slot 1: Barrel Launcher +--- Slot 2: Mine Deployer +--- Slot 3: Flamer +-- Add mine/barrel launch sounds +-- Improved ammo display +-- Denied sound + message when trying to fire empty ammo weapon +-- Slightly better mission description +--- The old hacks by (ab)using MinesNum, Explosives and HealthCaseAmount have been removed +-- Permanently disable some gameflags which currently won't work together with this script (see above) +-- Show flamer ammo as fuel everywhere (no more percentage confusion) + --------------------------- -- some other ideas/things --------------------------- --[[ --- add better gameflag handling --- fix flamer "shots remaining" message on start or choose a standard versus % --- add more sounds +-- allow invulnerability mode (currently broken, thus disabled) -- better barrel/minespawn effects -- separate grab distance for mines/barrels +-- bug: message color for remaining ammo does not change if two times the same message + (but in different desired color) is shown in quick succession (i.e. "Out of ammo!" for all weapons) -- [probably not] make barrels always explode? -- [probably not] persistent ammo? -- [probably not] dont hurt tumblers and restore their health at turn end? @@ -214,7 +289,7 @@ if i == 0 then yOffset = 40 - tCol = 0xffba00ff --0xffed09ff --0xffba00ff + tCol = 0xffee00ff tValue = TimeLeft elseif i == 1 then zoomL = 1.1 @@ -276,30 +351,28 @@ wepAmmo[0] = wepAmmo[0] + 1 PlaySound(sndShotgunReload) DeleteGear(gear) - AddCaption(wep[0] .. " " .. loc("ammo extended!"), wepCol[0], capgrpAmmoinfo ) + AddCaption(loc("+1 barrel!"), wepCol[0], capgrpAmmoinfo ) DrawTag(1) barrelsEaten = barrelsEaten + 1 if barrelsEaten == 5 then - AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Barrel Eater!"),0xffba00ff,capgrpMessage2) + AddCaption(string.format(loc("Achievement gotten: %s"), loc("Barrel Eater")),0xffba00ff,capgrpMessage2) end elseif (GetGearType(gear) == gtMine) then wepAmmo[1] = wepAmmo[1] + 1 PlaySound(sndShotgunReload) DeleteGear(gear) - AddCaption(wep[1] .. " " .. loc("ammo extended!"), wepCol[1], capgrpAmmoinfo ) + AddCaption(loc("+1 mine!"), wepCol[1], capgrpAmmoinfo ) DrawTag(2) minesEaten = minesEaten + 1 if minesEaten == 5 then - AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Mine Eater!"),0xffba00ff,capgrpMessage2) + AddCaption(string.format(loc("Achievement gotten: %s"), loc("Mine Eater")),0xffba00ff,capgrpMessage2) end end - else - --AddCaption("There is nothing here...") end end @@ -311,17 +384,17 @@ if (dist < 1600) and (GetGearType(gear) == gtCase) then - if GetHealth(gear) > 0 then + if band(GetGearPos(gear), 0x4) ~= 0 then - AddCaption(loc("Tumbling Time Extended!"), 0xffba00ff, capgrpMessage2 ) + AddCaption(string.format(loc("+%d seconds!"), bonusTime), 0xffee00ff, capgrpMessage2 ) - TimeLeft = TimeLeft + HealthCaseAmount --5 --5s + TimeLeft = TimeLeft + bonusTime DrawTag(0) - --PlaySound(sndShotgunReload) - else - wepAmmo[2] = wepAmmo[2] + 800 + PlaySound(sndExtraTime) + elseif band(GetGearPos(gear), 0x1) ~= 0 then + wepAmmo[2] = wepAmmo[2] + bonusFlames PlaySound(sndShotgunReload) - AddCaption(wep[2] .. " " .. loc("fuel extended!"), wepCol[2], capgrpAmmoinfo ) + AddCaption(string.format(loc("+%d flamer fuel!"), bonusFlames), wepCol[2], capgrpAmmoinfo ) DrawTag(3) end @@ -331,16 +404,83 @@ end -function ChangeWeapon() +function shotsRemainingMessage() + local shotsMsg + if wepAmmo[wepIndex] <= 0 then + shotsMsg = loc("Out of ammo!") + else + if wepIndex == 2 then + shotsMsg = loc("Fuel: %d") + else + shotsMsg = loc("Ammo: %d") + end + end + AddCaption(string.format(shotsMsg, wepAmmo[wepIndex]), wepCol[wepIndex],capgrpMessage2) +end - wepIndex = wepIndex + 1 - if wepIndex == wepCount then - wepIndex = 0 +function ChangeWeapon(newIndex) + if newIndex == nil then + wepIndex = wepIndex + 1 + if wepIndex == wepCount then + wepIndex = 0 + end + else + wepIndex = newIndex end - AddCaption(wep[wepIndex] .. " " .. loc("selected!"), wepCol[wepIndex],capgrpAmmoinfo ) - AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) + local selText + if wepIndex == 0 then + selText = loc("Barrel Launcher selected!") + elseif wepIndex == 1 then + selText = loc("Mine Deployer selected!") + else + selText = loc("Flamer selected!") + end + AddCaption(selText, wepCol[wepIndex],capgrpAmmoinfo ) + + shotsRemainingMessage() +end + +--------------- +-- Parse parameters +--------------- + +function parseNum(key, default, min, max) + local num = tonumber(params[key]) + if type(num) ~= "number" then + if default ~= nil then + return default + else + return nil + end + end + if min ~= nil then + num = math.max(min, num) + end + if max ~= nil then + num = math.min(max, num) + end + return num +end + +function onParameters() + parseParams() + + barrelSpawn = parseNum("spawnbarrels", barrelSpawn, 0) + mineSpawn = parseNum("spawnmines", mineSpawn, 0) + + initAmmoFlamer = parseNum("ammoflamer", initAmmoFlamer, 0) + initAmmoBarrel = parseNum("ammobarrel", initAmmoBarrel, 0) + initAmmoMine = parseNum("ammomine", initAmmoMine, 0) + + placedMineTime = parseNum("minetimeplaced", placedMineTime, 0, 5000) + + bonusTime = parseNum("bonustime", bonusTime, 0) + bonusFlames = parseNum("bonusflames", bonusFlames, 0) + + chanceAmmo = parseNum("chanceammo", chanceAmmo, 0, 100) + chanceTime = parseNum("chancetime", chanceTime, 0, 100) end --------------- @@ -349,24 +489,33 @@ function onPrecise() - if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (wepAmmo[wepIndex] > 0) then + if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then - wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 - AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) + if wepAmmo[wepIndex] <= 0 then + PlaySound(sndDenied) + shotsRemainingMessage() + else + + wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 + shotsRemainingMessage() - if wep[wepIndex] == loc("Barrel Launcher") then - morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1) - CopyPV(CurrentHedgehog, morte) -- new addition - x,y = GetGearVelocity(morte) - x = x*2 - y = y*2 - SetGearVelocity(morte, x, y) - DrawTag(1) + if wep[wepIndex] == loc("Barrel Launcher") then + morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1) + CopyPV(CurrentHedgehog, morte) -- new addition + x,y = GetGearVelocity(morte) + x = x*2 + y = y*2 + SetGearVelocity(morte, x, y) + DrawTag(1) + PlaySound(sndThrowRelease) - elseif wep[wepIndex] == loc("Mine Deployer") then - morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtMine, 0, 0, 0, 0) - SetTimer(morte, 1000) - DrawTag(2) + elseif wep[wepIndex] == loc("Mine Deployer") then + morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtMine, 0, 0, 0, 0) + SetTimer(morte, placedMineTime) + DrawTag(2) + PlaySound(sndThrowRelease) + + end end end @@ -379,6 +528,9 @@ preciseOn = false end +onAttack = onPrecise +onAttackUp = onPreciseUp + function onHJump() -- pick up explosives/mines if nearby them if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then @@ -386,8 +538,22 @@ end end +------------------- +-- Weapon selection +------------------- + function onLJump() - ChangeWeapon() + if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then + ChangeWeapon() + end +end + +function onSlot(slot) + if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then + if slot >= 0 and slot <= 2 then + ChangeWeapon(slot) + end + end end ----------------- @@ -440,19 +606,6 @@ HealthCaseProb = 0 Delay = 1000 - mineSpawn = MinesNum - if mineSpawn > 4 then - mineSpawn = 4 - end - - barrelSpawn = Explosives - if barrelSpawn > 4 then - barrelSpawn = 4 - end - - --MinesNum = 0 - --Explosives = 0 - for i = 0, 3 do vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false) end @@ -469,29 +622,43 @@ wepCount = 3 + DisableGameFlags(gfArtillery + gfSharedAmmo + gfPerHogAmmo + gfTagTeam + gfPlaceHog + gfInvulnerable) + end function onGameStart() + local clockStr + local timeStr + + if chanceTime > 0 then + clockStr = loc("Utility crates extend your time.") .. "|" + timeStr = string.format(loc("Time extension: %ds"), bonusTime) .. "|" + else + clockStr = "" + timeStr = "" + end + ShowMission ( - "TUMBLER", - loc("a Hedgewars mini-game"), + loc("Tumbler"), + loc("A Hedgewars mini-game"), + loc("Fly around and hurl explosives to your enemies.") .."|".. loc("Eliminate the enemy hogs to win.") .. "|" .. " " .. "|" .. - loc("New Mines Per Turn") .. ": " .. (mineSpawn) .. "|" .. - loc("New Barrels Per Turn") .. ": " .. (barrelSpawn) .. "|" .. - loc("Time Extension") .. ": " .. (HealthCaseAmount) .. loc("sec") .. "|" .. + string.format(loc("New mines per turn: %d"), mineSpawn) .. "|" .. + string.format(loc("New barrels per turn: %d"), barrelSpawn) .. "|" .. + timeStr .. " " .. "|" .. loc("Movement: [Up], [Down], [Left], [Right]") .. "|" .. - loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" .. - loc("Change Weapon") .. ": " .. loc("[Enter]") .. "|" .. - loc("Grab Mines/Explosives") .. ": " .. loc("[Backspace]") .. "|" .. + loc("Fire: [Precise]") .. "|" .. + loc("Change weapon: [Long jump] or [Slot 1]-[Slot 3]") .. "|" .. + loc("Grab mines/barrels: [High jump]") .. "|" .. " " .. "|" .. - loc("Health crates extend your time.") .. "|" .. + clockStr .. loc("Ammo is reset at the end of your turn.") .. "|" .. "", 4, 4000 @@ -510,6 +677,13 @@ end +function onAmmoStoreInit() + -- Remove all conventional weapons + for a=0, 56 do + SetAmmo(a, 0, 0, 0, 0) + end +end + function onNewTurn() stopMovement = false @@ -532,12 +706,12 @@ -- randomly spawn time extension crates / flamer fuel on the map r = GetRandom(100) - if r > 50 then - gear = SpawnHealthCrate(0, 0) + if r > 100-chanceTime then + gear = SpawnFakeUtilityCrate(0, 0, false, false) end r = GetRandom(100) - if r > 70 then - gear = SpawnAmmoCrate(0, 0, amSkip) + if r > 100-chanceAmmo then + gear = SpawnFakeAmmoCrate(0, 0, false, false) end HideTags() @@ -572,7 +746,6 @@ -- start the player tumbling with a boom once their turn has actually begun if tumbleStarted == false then if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then - --AddCaption(loc("Good to go!")) tumbleStarted = true TimeLeft = (TurnTime/1000) AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1) @@ -593,6 +766,13 @@ TimeLeftCounter = 0 TimeLeft = TimeLeft - 1 + -- Countdown sounds + if TimeLeft == 5 then + PlaySound(sndHurry, CurrentHedgehog) + elseif TimeLeft <= 4 and TimeLeft >= 1 then + PlaySound(_G["sndCountdown"..TimeLeft]) + end + if TimeLeft >= 0 then DrawTag(0) end @@ -668,12 +848,7 @@ if (wep[wepIndex] == loc("Flamer") ) and (preciseOn == true) and (wepAmmo[wepIndex] > 0) and (stopMovement == false) and (tumbleStarted == true) then wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 - AddCaption( - loc("Flamer") .. ": " .. - (wepAmmo[wepIndex]/800*100) - (wepAmmo[wepIndex]/800*100)%2 .. "%", - wepCol[2], - capgrpMessage2 - ) + shotsRemainingMessage() DrawTag(3) dx, dy = GetGearVelocity(CurrentHedgehog) @@ -719,12 +894,6 @@ end end ---[[function onGearDamage(gear, damage) - if gear == CurrentHedgehog then - -- You are now tumbling - end -end]] - function onGearAdd(gear) if GetGearType(gear) == gtFlame then diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/WxW.cfg --- a/share/hedgewars/Data/Scripts/Multiplayer/WxW.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,2 +1,2 @@ Shoppa -Shoppa +locked diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/Multiplayer/WxW.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/Multiplayer/WxW.lua Sun Dec 17 00:09:24 2017 +0100 @@ -1,6 +1,6 @@ ---------------------- --- WALL TO WALL 0.4 +-- WALL TO WALL 0.7 ---------------------- -- a shoppa minigame -- by mikade @@ -44,12 +44,154 @@ -- added backwards compatibility with 0.9.17 ---------------- ---TO DO +--0.5 +---------------- +-- Support for multiple sets of walls per map (instead of “all or nothing”) +-- Ropes, ShoppaKing, ShoppaHell and ShoppaNeon can now be played with the classic left and right walls +-- New wall sets for Ropes, ShoppaNeon, ShoppaDesert, ShoppaWild, ShoppaKing and ShoppaHell, and more. +-- Basic support for a bunch of Shoppa maps +-- Alternative configuration method with Script parameter +-- Possible to set max. number of weapons in game (script parameter only) +-- Possible to set number of crates per turn +-- Menu can be disabled (with script parameter) for insant game start +-- WxW is now fully functional even without a map border. +-- WxW now allows for almost all game modifiers and game settings to be changed +-- More sound effects +-- No smoke when hog is near near a WxW wall but Walls Before Crate rule is not in place +-- More readable mission display after configuration has been accepted +-- Hide “Surf Before Crate” setting if surfing is disabled for this map, or the bottom is active and water never rises +-- Hide walls setting if script does not provide walls for map yet +-- Bugfix: Other player was able to change the menu config in the short period before the first "turn" +-- Lots of refactoring + +---------------- +--0.6 +---------------- +-- Bugfix: 2 crates spawned at the 1st turn if script parameter was set to “menu=false, walls=none” or similar +-- Bugfix: Annoying faulty error message appeared when hitting attack when on a rope with a weapon selected + + +---------------- +--0.7 +---------------- +-- To enforce the rules more strictly, all crates will be frozen at turn start if WBC or SBC rule is in place. +-- The crates are unfrozen if you met the crate criteria (that is, surfed and/or bounced off all walls). +-- Frozen crates can't be collected and appear as small white dots in the radar. +-- Add support for the “Crate Before Attack” rule +-- Add support for the “All But Last” rule +-- Add support for the “Kill The Leader” rule +-- Allow toggling crate radar with “switch hog” key while roping +-- The game continues now with the first team after the menu has been closed (rather than the second team) + +---------------- +--TODO ---------------- -- achievements / try detect shoppa moves? :| -- maybe add ability for the user to place zones like in Racer? -- add more hard-coded values for specific maps + +--[[ +# CONFIGURATION + +By default, this script is easily configured via the in-game menu. The player of the first team can choose the rules and +required walls (or none at all). After accepted, the game will start with the second team (!). + += SCRIPT PARAMETER = + +Using the script parameter is optional, it mostly is just an alternative way for configuration and for convenience +reasons, so often-used configurations can be saved and loaded. + +The script parameter is specified as a comma-sperated list of “key=value” pairs (see examples below). + +Truth values can be set true or false, and numeric values always use a whole number. + +== Basic parameters == + +key default description +---------------------------------------- +menu true Show configuration menu at the beginning. If no menu is used, a random wall set is used (see wall filters below) +SBC false Surf Before Crate: Player must bounce off the water (“surfing”) before crates can be collected +AFR false Attack From Rope: Players must attack from the rope. Weapons which can't be fired from rope are removed +CBA false Crate Before Attack: Player must collect at least one crate before attacking +attackrule off If present, enable one of the attack rules “ABL” or “KTL”: + ABL: All But Last: Players must not only attack the team with the lowest total health + KTL: Kill The Leader: If players hit some enemy hedgehog, at least one of them must be a hog from + the team with the highest total health. + The ABL and KTL rules exclude each other. If a player breaks the rule (if enabled), he must + skip in the next round. +SW false Super Weapons: A few crates may contain very powerful weapons (melon, hellish grenade, RC plane, ballgun) +maxcrates 12 Number of crates which can be at maximum in the game (limited to up to 100 to avoid lag) +cratesperturn 1 Number of crates which appear each turn + +== Advanced parameters == + +Wall filters: The following parameters allow you to filter out wall sets based on their type and number of walls. +If this is used together with the menu, the filtered wall sets can't be selected. Without a menu, the wall set +will be randomly selected among the wall sets that meet all criteria. + +If the criteria filter out all available wall sets of the map, the game is played without the Walls Before Crate rule. + +parameter default description +---------------------------------------- +walls N/A + +Permitted values: +- leftright: The left and right part of the border. Traditional W2W-style. +- roof: Only the top part of the border +- leftrightroof: Combination of the two above +- inside: Map-specific wall set where all walls are part of the terrain +- mixed: Map-specific wall set where some walls are part of the terrain, and some are part of the map border +- none: No walls required. +- all: Shorthand: All wall sets are allowed. + +Combination of multiple types is possible by concatenating the names with plus signs (see examples below). + + +Restrict wall numbers: With the following parameters you can restrict the pool of wall sets to only those with a certain +number of walls. Note that 2 walls are the most common type of wall set, as this is often available by default. + +parameter default description +---------------------------------------- +minwalls N/A Filter out wall sets with less than this +maxwalls N/A Filter out wall sets with more than this + +wallsnum N/A Shorthand: Combintion of minwalls and maxwalls if they are the equal. + + +== Examples == + + +SBC=true +--> Keep the menu, enable Surf Before Crate by default (if available). + +SBC=true, menu=false +--> Enable Surf Before Crate (if available) and use the defaul walls set. + +AFR=true, menu=false, wallsnum=2 +--> Attack From Rope rule active, and use a random wall set with 2 walls + +menu=false, walls=leftright +--> Always use the classic left/right wall set automatically. Traditional W2W-style. + +walls=none, menu=false +--> Like classic Shoppa + +walls=leftright+inside+mixed, menu=false +--> Randomly use either the left/right wall set, an Inside or Mixed wall set. + + + += MORE GAME SCHEME CONFIGURATION = +You can almost set everything in the game scheme freely, and the script will work just fine together with it. +Feel free to experiment a bit. +The only exception are the crate frequencies. Setting them has no effect, crates are handled uniquiely in this game. + +At this stage, the script does not allow for custom weapon sets. +]] + + + ----------------------------- -- GO PONIES, GO PONIES, GO! ----------------------------- @@ -57,37 +199,90 @@ HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Tracker.lua") HedgewarsScriptLoad("/Scripts/Utils.lua") +HedgewarsScriptLoad("/Scripts/Params.lua") --- experimental menu stuff +-- HARDCODED values +local ammoTypesNum = 58 -- number of weapon types (permanent TODO: Check this number for each Hedgewars version) +local PlacementTime = 15000 + +-- menu stuff local menuIndex = 1 local menu = {} local preMenuCfg local postMenuCfg + +--[[ WxW preparation phase. +0 = Game not started yet +1 = Configuration phase +2 = Hedgehog placement phase +100 = Game phase +]] local roundN = 0 +-- Used to select one of the wall sets +-- 0: no walls +-- 1 and above: ID of wall sets +local wallSetID = 0 + +-- Store the wall sets here +local wallSets = {} + +-- Wall set types and wall number limits for filtering +local allWallSetTypes = {"roof", "leftright", "leftrightroof", "mixed", "inside"} +local allowedWallSetTypes = {roof=true, leftright=true, leftrightroof=true, mixed=true, inside=true} +local minWalls, maxWalls = nil, nil + -- config and wall variables -local AFR = false -local allowCrazyWeps = false -local requireSurfer = true +local useMenu = true +local AFR = false -- Attack From Rope +local WBC = true -- Wall(s) Before Crate, will later only be set again in script parameter +local CBA = false -- Crate Before Attack +local attackRule = nil -- Either nil, "KTL" (Kill The Leader) or "ABL" (All But Last) +local allowCrazyWeps = false -- Super weapons +local requireSurfer = false -- Surf Before Crate +local crateSpawned = false -- Has the crate (or crates) been spawned in this turn yet? +local cratesPerTurn = 1 -- How many crates appear per turn (respects crate limit) +local maxCrates = 12 -- default crate limit, can be configured with params +local maxCratesHard = 100 -- "hard" crate limit, to avoid extreme lagging due to many crates +local crateGearsInGame = 0 local wX = {} local wY = {} local wWidth = {} local wHeight = {} local wTouched = {} ---local margin local wallsLeft = 0 local hasSurfed = false local allWallsHit = false +local crateCollected = false + +-- ABL and KTL stuff +local teamNames = {} -- List of all teams +local teamsAttacked = {} -- List of attacked teams (in this turn) +local lastTeam = nil -- Team with the least health. Determined only at start of turn. If it's a tie, use nil. +local leaderTeam = nil -- Team with the most health. Determined only at start of turn. If it's a tie, use nil. +local runnerUpTeam = nil -- Team with the second-most health +local previousTeam = nil -- Remember the name of the team in the previous turn local gTimer = 1 local effectTimer = 1 local ropeG = nil -local crateG = nil local allowCrate = true +local crates = {} + +-- Variables for place hedgehogs mode +local hogCount = 0 -- Used to detect the end of the hog placement phase +local turnsCount = 0 -- crate radar vars + +-- Set the initial radar mode here +-- 0: Radar is always active +-- 1: Radar is only active shortly after crate spawn +-- 2: Radar is disabled +local radarMode = 0 + local rCirc = {} local rAlpha = 255 local rPingTimer = 0 @@ -95,67 +290,190 @@ local weapons = {} ---[[local unlisted = {amTardis, amLandGun,amExtraTime,amExtraDamage, - amVampiric, amSwitch, amInvulnerable, amGirder, amJetpack, - amPortalGun, amTeleport, amResurrector, amLaserSight, amLowGravity, - amAirAttack, amNapalm, amMineStrike, amDrillStrike, - amKamikaze, amSnowball, amSeduction}]] - local crazyWeps = {amWatermelon, amHellishBomb, amBallgun, amRCPlane} local groundWeps = {amBee, amShotgun,amDEagle,amFirePunch, amWhip, amPickHammer, amBaseballBat, amCake,amBallgun, - amRCPlane, amSniperRifle, amBirdy, amBlowTorch, amGasBomb, - amFlamethrower, amSMine, amMortar, amHammer} + amRCPlane, amSniperRifle, amBirdy, amBlowTorch, + amFlamethrower, amMortar, amHammer} local ropeWeps = {amGrenade, amClusterBomb, amBazooka, amMine, amDynamite, - amWatermelon, amHellishBomb, amDrill, amMolotov} + amWatermelon, amHellishBomb, amDrill, amMolotov, + amSMine, amGasBomb} + +local msgColorTech = 0xFFBA00FF +local msgColorWarn = 0xFF4000FF -- 0.9.18+ extra custom data for preset maps local MapList = { - --name, surfer, roof, LRwalls - {"Atlantis Shoppa", true, false, true}, - {"BambooPlinko", true, false, true}, - {"BrickShoppa", false, false, true}, - {"BubbleFlow", true, false, true}, - {"Cave", false, false, true}, - {"Glass Shoppa", true, false, true}, - {"HardIce", false, false, true}, - {"Industrial", false, false, true}, - {"Islands", true, false, true}, - {"Hedgelove", true, false, true}, - {"NeonStyle", false, false, true}, - {"Octorama", false, false, true}, + --name, surfer, roof, LRwalls + {"Alien", true, true, true}, + {"Atlantis Shoppa", true, true, true}, + {"BasketballField", false, false, false}, + {"BattleCity_v1", true, true, true}, + {"BIGshoppa", true, true, true}, + {"BambooPlinko", true, false, true}, + {"BoatWxW", true, true, true}, + {"BrickShoppa", false, false, true}, + {"BubbleFlow", true, false, true}, + {"Citrouille", true, true, true}, + {"Cave", false, false, true}, + {"Cheese_Ropes", false, true, true}, + {"CookieShoppa", true, false, true}, + {"CrossRopes", false, false, true}, + {"FutuShoppa", true, false, true}, + {"Garden", false, false, true}, + {"Glass Shoppa", true, false, true}, + {"GlassShoppa2", true, false, true}, + {"HardIce", false, false, true}, + {"Industrial", false, false, true}, + {"Islands", true, false, true}, + {"IslandsFlipped", true, false, true}, + {"IslandsRearranged", true, false, true}, + {"Hedgelove", true, false, true}, + {"HellishRopes", false, false, true}, + {"Hedgeland_v1", true, false, true}, + {"HeyLandShoppa", false, false, true}, + {"NeonStyle", false, false, true}, + {"MaskedRopes", false, false, true}, + {"Octorama", false, false, true}, + {"Octoropisloppaking0.4", true, true, true}, + {"Pacman_v2", true, false, true}, + {"Purple", false, true, true}, + {"Purple_v2", false, true, true}, + {"RacerPlayground1", false, true, true}, + {"RacerPlayground2", false, true, true}, + {"RacerPlayground3", false, true, true}, + {"RacerPlayground4", false, true, true}, {"red vs blue - Castle", true, false, true}, {"red vs blue - castle2", true, false, true}, - {"red vs blue - True Shoppa Sky", true, false, true}, - {"Ropes", false, false, true}, - {"Ropes Rearranged", false, false, true}, + {"red vs blue - True Shoppa Sky", true, false, true}, + {"Ropes", false, true, true}, + {"RopeLikeAKingInHellWithNeon", false, true, true}, + {"Ropes Flipped", false, false, true}, + {"Ropes Rearranged", false, false, true}, + {"RopesRevenge0.1", false, true, true}, {"RopesRevenge Flipped", true, false, true}, - {"Ropes Three", false, false, true}, - {"RopesTwo", false, false, true}, - {"ShapeShoppa1.0", true, false, true}, - {"ShappeShoppa Darkhow", true, false, true}, - {"ShoppaCave2", true, false, true}, - {"ShoppaFun", true, false, true}, - {"ShoppaGolf", false, false, true}, - {"ShoppaHell", false, true, false}, - {"ShoppaKing", false, false, false}, - {"ShoppaNeon", false, false, true}, - {"ShoppaSky", false, false, true}, - {"Shoppawall", false, false, true}, - {"SkatePark", false, false, true}, - {"SloppyShoppa", false, false, true}, - {"Sticks", true, false, true}, - {"Symmetrical Ropes ", false, false, true}, - {"Tetris", false, false, true}, - {"TransRopes2", false, false, true}, - {"Wildmap", false, false, true}, - {"Winter Shoppa", false, false, true}, - {"2Cshoppa", true, false, true} + {"RopesThree", false, false, true}, + {"RopesTwo", false, false, true}, + {"Ruler", false, false, true}, + {"SandShoppa", false, false, true}, + {"ShapeShoppa1.0", true, false, true}, + {"ShapeShoppa Darkhow", true, false, true}, + {"SheepyShoppa_v2", true, false, true}, + {"shopppa", false, true, true}, + {"ShoppaCave2", true, false, true}, + {"ShoppaChallenge", false, true, true}, + {"ShoppaDesert", false, false, true}, + {"ShoppaEvoRope_v1", true, false, true}, + {"ShoppaFun", true, false, true}, + {"ShoppaFun2", true, false, true}, + {"ShoppaGolf", false, false, true}, + {"ShoppaHalloween", false, false, true}, + {"ShoppaHell", false, true, false}, + {"ShoppaHellFlipped", true, true, false}, + {"ShoppaHellRemake", false, true, false}, + {"ShoppaKing", false, true, false}, + {"ShoppaKingFlipped", true, false, false}, + {"ShoppaKingSideways", true, true, false}, + {"ShoppaMeme", false, true, false}, + {"ShoppaNeon", false, false, true}, + {"ShoppaNeonFlipped", true, false, true}, + {"ShoppaOnePiece2", false, true, false}, + {"ShoppaQuotes2", false, true, true}, + {"ShoppaRainbow", false, false, false}, + {"ShoppaRadigme", false, true, true}, + {"ShoppaSilhouette", false, false, true}, + {"ShoppaSpace", true, false, true}, + {"ShoppaSea", true, false, false}, + {"ShoppaShapex_v1", false, true, true}, + {"ShoppaSparkle", true, true, true}, + {"ShoppaSky", false, false, true}, + {"ShoppaSky2", true, false, true}, + {"ShoppaSsion", false, false, true}, + {"ShoppaStyle2", true, false, true}, + {"ShoppaThology", false, false, true}, + {"ShoppaTournament2012", false, false, true}, + {"ShoppaWild", false, false, true}, + {"Shoppawall", false, false, false}, + {"ShoppaWall2", false, false, false}, + {"ShBall", false, true, false}, + {"ShHell", false, true, false}, + {"ShNeon", false, false, true}, + {"ShoppaSky", false, false, true}, + {"SloppyShoppa", false, true, true}, + {"SloppyShoppa2", false, true, true}, + {"SkatePark", false, true, true}, + {"Snow_Ropes", false, true, false}, + {"Sticks", true, false, true}, + {"Symmetrical Ropes", false, false, true}, + {"SpartanShoppa", false, true, true}, + {"TERRORmap", false, false,false}, + {"Tetris", false, false, true}, + {"TransRopes2", false, false, true}, + {"TRBShoppa", false, false, true}, + {"TrickyShoppa", false, true, false}, + {"Towers", false, true, true}, + {"Wildmap", false, false, true}, + {"Winter Shoppa", false, false, true}, + {"WarShoppa", false, true, true}, + {"2Cshoppa", true, false, true}, } +local Ropes_WallSet = { + { add="none", {299,932,20,856}, {4056,0,30,1788} }, + { add="none", {299,109,20,779}, {4056,0,30,1788} }, + { add="none", {299,109,20,779}, {299,932,20,856}, {4056,0,30,1788} }, + { add="default", {2253,326,20,574}, {3280,326,33,253}, needsborder=false }, + { add="roof", {2322,326,457,20} }, + { add="default", {1092,934,54,262}, {2822,323,33,137}, needsborder=false }, + { add="none", {203,1193,20,595}, {3280,326,20,253}, needsborder=false }, +} +local Shoppawall_WallSet = { + { add="none", {80+290,61+878,20,1018}, {3433+290,61+878,20,1018}, default=true, needsborder=false }, +} + +-- List of map with special wall settings +local SpecialMapList = { + ["Ropes"] = Ropes_WallSet, + ["HellishRopes"] = Ropes_WallSet, + ["MaskedRopes"] = Ropes_WallSet, + ["TransRopes2"] = Ropes_WallSet, + ["ShoppaKing"] = { + { add="none", {3777,1520,50,196}, {1658,338,46,670}, needsborder=false }, + { add="none", {125,0,30,2048}, {4066,515,30,1528}, default=true}, + }, + ["ShoppaHell"] = { + { add="none", {3491,697,30,1150}, {0,0,30,1847}, default=true}, + { add="none", {3810,0,30,1616}, {0,0,30,1847}, }, + { add="none", {2045,832,20,260}, {2107,832,20,260}, needsborder=false }, + { add="default", {2035,831,30,263}, {3968,1668,31,383}, needsborder=false }, + }, + ["ShoppaNeon"] = { + { add="default", {980,400,20,300}, {1940,400,20,300}, {3088,565,26,284}, {187,270,28,266}, needsborder=false }, + }, + ["Shoppawall"] = Shoppawall_WallSet, + ["ShoppaWall2"] = Shoppawall_WallSet, + ["ShoppaDesert"] = { + { add="none", {2322,349,20,471}, {295,93,24,1479}, needsborder=false }, + { add="none", {3001,1535,20,232}, {2264,349,20,495},{716,696,20,119}, needsborder=false }, + { add="leftright", {209,656,20,367},{2810,838,20,96}, needsborder=false}, + { add="none", {2649,0,445,20}, {2322,349,947,20},{299,696,381,20}}, + }, + ["ShoppaOnePiece2"] = { + { add="default", {42,0,20,2048}, {4048,0,20,2048}, needsborder=false, }, + { add="default", {42,0,20,2048}, {3852,273,20,1637}, needsborder=false, default="noborder" }, + }, + ["ShoppaWild"] = { + { add="default", {2123,1365,20,293}, {3102,1365,20,293}, {1215,1391,20,291}, needsborder=false }, + { add="none", {144,167,1904,20}, {2350,167,753,20}, {3793,167,303,20}, needsborder=false}, + }, + ["ShoppaRainbow"] = { + { add="none", {67+602,61+80,20,1847}, {2779+602,61+80,20,1847}, needsborder=false }, + }, +} + function BoolToCfgTxt(p) if p == false then return loc("Disabled") @@ -164,68 +482,190 @@ end end -function LoadConfig(p) - - margin = 20 - mapID = nil +function AttackRuleToCfgTxt(attackRule) + if attackRule == nil then + return loc("Disabled") + elseif attackRule == "ABL" then + return loc("All But Last") + elseif attackRule == "KTL" then + return loc("Kill The Leader") + else + return "ERROR" + end +end - -- 0.9.17 - if Map == "CHANGE_ME" then - AddCaption(loc("For improved features/stability, play 0.9.18+")) - --AddWall(10,10,4085,margin) - AddWall(10,10,margin,2025) - AddWall(4085-margin,10,margin,2025) +function NewWallSet(newWallSet, wType) + -- Filter out wall sets which are not in allowed categories or have too many or few walls + if allowedWallSetTypes[wType] == true then + local inBounds = true + if minWalls ~= nil and #newWallSet < minWalls then + inBounds = false + end + if maxWalls ~= nil and #newWallSet > maxWalls then + inBounds = false + end + if inBounds then + table.insert(wallSets, newWallSet) + end end +end + +function MapsInit() + mapID = nil + margin = 20 --0.9.18+ for i = 1, #MapList do if Map == MapList[i][1] then mapID = i - --AddCaption(MapList[i][1] .. " found. reqSurf is " .. BoolToCfgTxt(MapList[i][2])) end end - if (p == 1) and (mapID ~= nil) then - requireSurfer = MapList[mapID][2] + -- Border conditions + -- Just a wrapper for MapHasBorder() + local border = MapHasBorder() == true + -- Left and right walls are available + local leftRight = (WorldEdge == weBounce) or (WorldEdge == weNone and border) + + local left, right, roof + + local startY, height + if (not border) and (WorldEdge == weBounce) then + -- Higher left/right walls for bouncy world edge without roof + local h = math.max(1024, LAND_HEIGHT) + height = h * 2 + startY = TopY - h + else + -- Standard left/right wall height + height = WaterLine + startY = TopY + 10 end + left = {LeftX+10, startY, margin, height} + right = {RightX-10-margin, startY, margin, height} + roof = {LeftX+10, TopY+10, RightX-LeftX-20, margin} if mapID ~= nil then - - -- add a wall to the roof - if MapList[mapID][3] == true then - AddWall(LeftX+10,TopY+10,RightX-LeftX-20,margin) + if border and MapList[mapID][3] == true then + NewWallSet({roof, desc=loc("Roof")}, "roof") + wallSetID = #wallSets end - - -- add walls on the left and right border - if MapList[mapID][4] == true then - AddWall(LeftX+10,TopY+10,margin,WaterLine) - AddWall(RightX-10-margin,TopY+10,margin,WaterLine) + if leftRight and MapList[mapID][4] == true then + NewWallSet({left, right, desc=loc("Left and right")}, "leftright") + wallSetID = #wallSets + end + if leftRight and border and MapList[mapID][3] == true and MapList[mapID][4] == true then + NewWallSet({left, right, roof, desc=loc("Left, right and roof")}, "leftrightroof") end -- add map specific walls - if Map == "Ropes" then - AddWall(1092,934,54,262) - AddWall(2822,323,33,137) - elseif Map == "ShoppaKing" then - AddWall(3777,1520,50,196) - AddWall(1658,338,46,670) - elseif Map == "ShoppaHell" then - AddWall(2035,831,30,263) - AddWall(3968,1668,31,383) - elseif Map == "ShoppaNeon" then - AddWall(980,400,20,300) - AddWall(1940,400,20,300) - AddWall(3088,565,26,284) - AddWall(187,270,28,266) + if SpecialMapList[Map] ~= nil then + local insideID = 1 + local previousInside = nil + local mixedID = 1 + local previousMixed = nil + + -- Helper function to build the wall set name. + -- Basically just to ensure that names like "Inside 1" are only used when there are at least 2 "Insides" + local function newInsideOrMixed(ws, previous_ws, id, string, stringD) + if id == 1 then + ws.desc = string + else + ws.desc = string.format(stringD, id) + end + if id == 2 then + previous_ws.desc = string.format(stringD, id-1) + end + id = id + 1 + previous_ws = ws + return id, previous_ws + end + for ws=1,#SpecialMapList[Map] do + local walls = SpecialMapList[Map][ws] + if walls.needsborder == false then + local newwallset2 = {} + for w=1,#walls do + table.insert(newwallset2, walls[w]) + end + insideID, previousInside = newInsideOrMixed(newwallset2, previousInside, insideID, loc("Inside"), loc("Inside %d")) + newwallset2.custom = true + NewWallSet(newwallset2, "inside") + if SpecialMapList[Map][ws].default == "noborder" then + wallSetID = #wallSets + end + end + local newwallset = {} + if border and leftRight and walls.add == "all" then + table.insert(newwallset, roof) + table.insert(newwallset, left) + table.insert(newwallset, right) + elseif walls.add == "default" then + if border and MapList[mapID][3] == true then + table.insert(newwallset, roof) + end + if leftRight and MapList[mapID][4] == true then + table.insert(newwallset, left) + table.insert(newwallset, right) + end + elseif border and walls.add == "roof" then + table.insert(newwallset, roof) + elseif leftRight and walls.add == "leftright" then + table.insert(newwallset, left) + table.insert(newwallset, right) + end + for w=1,#walls do + table.insert(newwallset, walls[w]) + end + if border and leftRight and ((walls.add ~= "none" and walls.add ~= nil) or walls.needsborder ~= false) then + mixedID, previousMixed = newInsideOrMixed(newwallset, previousMixed, mixedID, loc("Mixed"), loc("Mixed %d")) + newwallset.custom = true + NewWallSet(newwallset, "mixed") + end + if SpecialMapList[Map][ws].default == true then + wallSetID = #wallSets + end + end end - -- if map is unrecognized, add two walls on the side borders - -- also, if version of hw is not 0.9.17 or lower - elseif Map ~= "CHANGE_ME" then - AddWall(LeftX+10,TopY+10,margin,WaterLine) - AddWall(RightX-10-margin,TopY+10,margin,WaterLine) + else + if border then + NewWallSet({roof, desc=loc("Roof")}, "roof") + wallSetID = #wallSets + end + if leftRight then + NewWallSet({left, right, desc=loc("Left and right")}, "leftright") + wallSetID = #wallSets + end + if leftRight and border then + NewWallSet({left, right, roof, desc=loc("Left, right and roof")}, "leftrightroof") + end end + -- Choose random map when without without menu + if useMenu == false and #wallSets > 0 then + wallSetID = GetRandom(#wallSets)+1 + end + -- Select first wall set by default if we still haven't selected anything for some reason + if wallSetID == 0 and #wallSets > 0 then + wallSetID = 1 + end + -- But disabled walls from script parameter have higher priority + if WBC == false then + wallSetID = 0 + end + + if CanSurf() == false then + requireSurfer = false + end +end + +function LoadConfig(p) + ClearWalls() + if p > 0 then + local walls = wallSets[p] + for i=1,#walls do + AddWall(walls[i][1], walls[i][2], walls[i][3], walls[i][4]) + end + end end @@ -239,11 +679,39 @@ end +function ClearWalls() + + wX = {} + wY = {} + wWidth = {} + wHeight = {} + wTouched = {} + +end + +-- Draw a single point for the crate radar function DrawBlip(gear) - SetVisualGearValues(getGearValue(gear,"CIRC"), getGearValue(gear,"RX"), getGearValue(gear,"RY"), 100, 255, 1, 10, 0, 40, 3, GetClanColor(GetHogClan(CurrentHedgehog))-rAlpha) + if GetGearType(gear) ~= gtCase then + return + end + + local baseColor, radius, alpha + if getGearValue(gear, "frozen") then + radius = 25 + baseColor = 0xFFFFFFFF + alpha = math.min(255, rAlpha+127) + else + radius = 40 + baseColor = GetClanColor(GetHogClan(CurrentHedgehog)) + alpha = rAlpha + end + SetVisualGearValues(getGearValue(gear,"CIRC"), getGearValue(gear,"RX"), getGearValue(gear,"RY"), 100, 255, 1, 10, 0, radius, 3, baseColor-alpha) end function TrackRadarBlip(gear) + if GetGearType(gear) ~= gtCase then + return + end -- work out the distance to the target g1X, g1Y = GetGearPosition(CurrentHedgehog) @@ -294,21 +762,24 @@ function HandleCircles() - -- enable this if you want the radar to only show for a few seconds - -- after you spawn the crate - --[[if rAlpha ~= 255 then - - rPingTimer = rPingTimer + 1 - if rPingTimer == 100 then - rPingTimer = 0 - - rAlpha = rAlpha + 5 - if rAlpha >= 255 then - rAlpha = 255 + if radarMode == 0 then + rAlpha = 0 + elseif radarMode == 1 then + -- Only show radar for a short time after a crate spawn + if rAlpha ~= 255 then + rPingTimer = rPingTimer + 1 + if rPingTimer == 100 then + rPingTimer = 0 + + rAlpha = rAlpha + 5 + if rAlpha >= 255 then + rAlpha = 255 + end end end - - end]] + elseif radarMode == 2 then + rAlpha = 255 + end runOnGears(DrawBlip) @@ -324,10 +795,10 @@ end +-- Returns true if crates are allowed to be accessed right now (used for unfreezing and spawning) +function AreCratesUnlocked() -function CheckCrateConditions() - - crateSpawn = true + local crateSpawn = true if requireSurfer == true then if hasSurfed == false then @@ -341,14 +812,60 @@ end end - if crateSpawn == true then + return crateSpawn + +end + +-- Freeze all crates, +function FreezeCrates() + + local cratesFrozen = 0 + for crate, isCrate in pairs(crates) do + local state = GetState(crate) + -- Freeze crate if it wasn't already frozen + if band(state, gstFrozen) == 0 then + cratesFrozen = cratesFrozen + 1 + SetState(crate, bor(GetState(crate), gstFrozen)) + setGearValue(crate, "frozen", true) + end + end + -- Play sound if at least one new (!) crate was frozen + if cratesFrozen > 0 then + PlaySound(sndHogFreeze) + end + +end + +-- Unfreeze all crates +function UnfreezeCrates() + + for crate, isCrate in pairs(crates) do + SetState(crate, band(GetState(crate), bnot(gstFrozen))) + setGearValue(crate, "frozen", false) + end + +end + +function CheckCrateConditions() + + local crateSpawn = AreCratesUnlocked() + + if crateSpawn == true and crateSpawned == false then + UnfreezeCrates() if allowCrate == true then - --if (crateG == nil) and (allowCrate == true) then - --AddCaption("") - SpawnAmmoCrate(0, 0, weapons[1+GetRandom(#weapons)] ) + local cratesInGame = crateGearsInGame + local toSpawn = cratesPerTurn + if cratesInGame + toSpawn > maxCrates then + toSpawn = maxCrates - cratesInGame + end + for i=1,toSpawn do + SpawnAmmoCrate(0, 0, weapons[1+GetRandom(#weapons)] ) + end rPingTimer = 0 rAlpha = 0 - PlaySound(sndWarp) + if toSpawn > 0 then + PlaySound(sndWarp) + end end end @@ -357,7 +874,7 @@ function onGearWaterSkip(gear) if gear == CurrentHedgehog then hasSurfed = true - AddCaption(loc("Surfer!"),0xffba00ff,capgrpMessage2) + AddCaption(loc("Surfer!"), 0xFFFFFFFF, capgrpMessage2) end end @@ -373,17 +890,18 @@ AddCaption(loc("All walls touched!")) allWallsHit = true if (requireSurfer == true) and (hasSurfed == false) then - AddCaption(loc("Go surf!"),0xffba00ff,capgrpMessage2) + AddCaption(loc("Go surf!"), 0xFFFFFFFF, capgrpMessage2) end else - AddCaption(loc("Walls Left") .. ": " .. wallsLeft) + AddCaption(string.format(loc("Walls left: %d"), wallsLeft)) end end wTouched[id] = true - tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, false) - --PlaySound(sndVaporize) -- yeah, this is just annoying as shit + if #wTouched > 0 then + tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, false) + end end @@ -399,13 +917,18 @@ function BorderSpark(zXMin,zYMin, zWidth, zHeight, bCol) - eX = zXMin + GetRandom(zWidth+10) - eY = zYMin + GetRandom(zHeight+10) + local size = zWidth * zHeight + -- Add multiple sparks for very large walls + sparkRuns = math.min(10, math.max(1, div(size, 10240))) + for i=1, sparkRuns do + local eX = zXMin + GetRandom(zWidth+10) + local eY = zYMin + GetRandom(zHeight+10) - tempE = AddVisualGear(eX, eY, vgtDust, 0, false) - if tempE ~= 0 then - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) - SetVisualGearValues(tempE, eX, eY, g3, g4, g5, g6, g7, 1, g9, bCol ) + local tempE = AddVisualGear(eX, eY, vgtDust, 0, false) + if tempE ~= 0 then + local g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) + SetVisualGearValues(tempE, eX, eY, g3, g4, g5, g6, g7, 1, g9, bCol ) + end end end @@ -419,75 +942,158 @@ effectTimer = 1 for i = 1, #wTouched do - if wTouched[i] == true then - --bCol = GetClanColor(GetHogClan(CurrentHedgehog)) - else - --bCol = 0xFFFFFFFF + if wTouched[i] == false then bCol = GetClanColor(GetHogClan(CurrentHedgehog)) BorderSpark(wX[i],wY[i],wWidth[i],wHeight[i], bCol) end - --BorderSpark(wX[i],wY[i],wWidth[i],wHeight[i], bCol) end end end +function PlaceWarn() + PlaySound(sndDenied) + AddCaption(loc("Please place your hedgehog first!"), msgColorWarn, capgrpMessage2) +end + function onLJump() - if roundN < 2 then - roundN = 100 + if roundN == 1 then + PlaySound(sndPlaced) SetInputMask(0xFFFFFFFF) - TurnTimeLeft = 1 - AddCaption(loc("Configuration accepted."),0xffba00ff,capgrpMessage) - HideMission() + AddCaption(loc("Configuration accepted."), msgColorTech, capgrpMessage) + if GetGameFlag(gfPlaceHog) then + TurnTimeLeft = PlacementTime + AddAmmo(CurrentHedgehog, amTeleport, 100) + SetWeapon(amTeleport) + AddCaption( + string.format(loc("%s, place the first hedgehog!"), GetHogTeamName(CurrentHedgehog)), + 0xFFFFFFFF, + capgrpMessage2 + ) + roundN = 2 + else + TurnTimeLeft = TurnTime + AddCaption(string.format(loc("Let's go, %s!"), GetHogTeamName(CurrentHedgehog)), 0xFFFFFFFF, capgrpMessage2) + roundN = 100 + wallsLeft = #wTouched + allowCrate = true + end + PlaySound(sndYesSir, CurrentHedgehog) + FinalizeMenu() + elseif roundN == 2 then + PlaceWarn() + elseif roundN == 100 then + if CBA and not crateCollected then + if (GetCurAmmoType() ~= amRope) and + (GetCurAmmoType() ~= amSkip) and + (GetCurAmmoType() ~= amNothing) and + (ropeG ~= nil) + then + AddCaption(loc("You must first collect a crate before you attack!"), msgColorWarn, capgrpMessage2) + PlaySound(sndDenied) + end + end end end function onAttack() - - if roundN < 2 then - - if menuIndex == 1 then - - if #wTouched > 0 then - for i = 1, #wTouched do - wTouched[i] = nil - wX[i] = nil - wY[i] = nil - wWidth[i] = nil - wHeight[i] = nil - end - else - LoadConfig(2) - end - - elseif menuIndex == 2 then - requireSurfer = not(requireSurfer) - elseif menuIndex == 3 then - AFR = not(AFR) - elseif menuIndex == 4 then - allowCrazyWeps = not(allowCrazyWeps) + if roundN == 1 then + if menu[menuIndex].activate ~= nil then + menu[menuIndex].activate() + else + menu[menuIndex].doNext() end UpdateMenu() configureWeapons() HandleStartingStage() - elseif (AFR == true) then + PlaySound(sndSwitchHog) - if (GetCurAmmoType() ~= amRope) and - (GetCurAmmoType() ~= amSkip) and - (GetCurAmmoType() ~= amNothing) - then - AddCaption(loc("You may only attack from a rope!"),0xffba00ff,capgrpMessage2) + elseif roundN == 2 then + if GetCurAmmoType() ~= amSkip and GetCurAmmoType() ~= amNothing then + PlaceWarn() end + elseif roundN == 100 then + local weaponSelected = (GetCurAmmoType() ~= amRope) and + (GetCurAmmoType() ~= amSkip) and + (GetCurAmmoType() ~= amNothing) and + (ropeG == nil) + + if weaponSelected then + if AFR and CBA and not crateCollected then + AddCaption(loc("You must attack from a rope, after you collected a crate!"), msgColorWarn, capgrpMessage2) + PlaySound(sndDenied) + elseif AFR then + AddCaption(loc("You may only attack from a rope!"), msgColorWarn, capgrpMessage2) + PlaySound(sndDenied) + elseif CBA and not crateCollected then + AddCaption(loc("You must first collect a crate before you attack!"), msgColorWarn, capgrpMessage2) + PlaySound(sndDenied) + end + end end +end +function onSwitch() + -- Must be in-game, hog must be controlled by player and hog must be on rope or have rope selected + if roundN == 100 and CurrentHedgehog ~= nil and band(GetState(CurrentHedgehog), gstHHDriven) ~= 0 and (ropeG ~= nil or GetCurAmmoType() == amRope) then + -- Toggle radar mode + radarMode = radarMode + 1 + if radarMode > 2 then + radarMode = 0 + end + local message + if radarMode == 0 then + message = loc("Radar: On") + elseif radarMode == 1 then + message = loc("Radar: Show after crate drop") + elseif radarMode == 2 then + message = loc("Radar: Off") + end + AddCaption(message, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpAmmostate) + -- Remember the radar mode for this team to restore it on the team's next turn + setTeamValue(GetHogTeamName(CurrentHedgehog), "radarMode", radarMode) + end +end + +function onLeft() + if roundN == 1 then + if menu[menuIndex].doPrev ~= nil then + menu[menuIndex].doPrev() + else + menu[menuIndex].activate() + end + + UpdateMenu() + configureWeapons() + HandleStartingStage() + + PlaySound(sndSwitchHog) + end +end + +function onRight() + if roundN == 1 then + if menu[menuIndex].doNext ~= nil then + menu[menuIndex].doNext() + else + menu[menuIndex].activate() + end + + UpdateMenu() + configureWeapons() + HandleStartingStage() + + PlaySound(sndSwitchHog) + end end function onDown() - if roundN < 2 then + if roundN == 1 then + PlaySound(sndSteps) menuIndex = menuIndex +1 if menuIndex > #menu then menuIndex = 1 @@ -497,7 +1103,8 @@ end function onUp() - if roundN < 2 then + if roundN == 1 then + PlaySound(sndSteps) menuIndex = menuIndex -1 if menuIndex == 0 then menuIndex = #menu @@ -506,12 +1113,91 @@ end end +function parseBool(key, default) + if params[key]=="true" then + return true + elseif params[key]=="false" then + return false + else + return default + end +end + +function parseInt(key, default, min, max) + local num = tonumber(params[key]) + if type(num) ~= "number" then + return default + end + if min ~= nil then + num = math.max(min, num) + end + if max ~= nil then + num = math.min(max, num) + end + return num +end + +function onParameters() + parseParams() + local tmpParam + useMenu = parseBool("menu", useMenu) + requireSurfer = parseBool("SBC", requireSurfer) + AFR = parseBool("AFR", AFR) + CBA = parseBool("CBA", CBA) + if params["attackrule"] == "ABL" then + attackRule = "ABL" + elseif params["attackrule"] == "KTL" then + attackRule = "KTL" + end + allowCrazyWeps = parseBool("SW", allowCrazyWeps) + maxCrates = parseInt("maxcrates", maxCrates, 1, maxCratesHard) + cratesPerTurn = parseInt("cratesperturn", cratesPerTurn, 1, maxCrates) + local wallsParam = params["walls"] + local wallsParamSelection = false + if wallsParam ~= nil then + if wallsParam == "all" then + wallsParamSelection = true + allowedWallSetTypes = {} + for i=1,#allWallSetTypes do + allowedWallSetTypes[allWallSetTypes[i]] = true + end + elseif wallsParam == "none" then + WBC = false + allowedWallSetTypes = {} + else + wallsParamSelection = true + allowedWallSetTypes = {} + local parsedWords = {} + for k,v in string.gmatch(wallsParam, "(%w+)") do + table.insert(parsedWords, k) + end + for i=1,#allWallSetTypes do + for j=1,#parsedWords do + if allWallSetTypes[i] == parsedWords[j] then + allowedWallSetTypes[allWallSetTypes[i]] = true + end + end + end + end + end + + -- Upper and lower bounds + local wallsNum = parseInt("wallsnum", nil, 0) + if wallsNum == 0 then + WBC = false + end + minWalls = wallsNum + maxWalls = wallsNum + -- minwalls and maxwalls take precedence over wallsnum + minWalls = parseInt("minwalls", minWalls, 1) + maxWalls = parseInt("maxwalls", maxWalls, 1) +end + function onGameInit() - ClearGameFlags() - EnableGameFlags(gfRandomOrder, gfBorder, gfSolidLand) --, gfInfAttack HealthCaseProb = 0 CaseFreq = 0 + SetAmmoDescriptionAppendix(amRope, loc("Switch: Toggle crate radar")) end @@ -558,14 +1244,52 @@ function onGameStart() - LoadConfig(1) + trackTeams() + + MapsInit() + LoadConfig(wallSetID) configureWeapons() - UpdateMenu() - HandleStartingStage() + + -- ABL or KTL only make sense with at least 3 teams, otherwise we disable it + if TeamsCount < 3 or ClansCount < 3 then + attackRule = nil + end + if useMenu then + ShowMission(loc("Wall to wall"), loc("Please wait …"), "", 2, 300000) + UpdateMenu() + else + if GetGameFlag(gfPlaceHog) then + roundN = 2 + FinalizeMenu() + else + allowCrate = false + roundN = 100 + FinalizeMenu() + end + end end function onNewTurn() + turnsCount = turnsCount + 1 + + if roundN == 0 then + roundN = 1 + end + + if GetGameFlag(gfPlaceHog) then + if roundN < 2 then + SetWeapon(amSkip) + AddAmmo(CurrentHedgehog, amTeleport, 0) + TurnTimeLeft = -1 + SetInputMask(0) + end + if roundN == 2 then + if turnsCount > hogCount then + roundN = 100 + end + end + end wallsLeft = #wTouched @@ -573,88 +1297,317 @@ wTouched[i] = false end - allowCrate = true - hasSurfed = false allWallsHit = false + crateCollected = false - crateG = nil + crateSpawned = false + + if roundN == 100 then + allowCrate = crateGearsInGame < maxCrates + + local teamName = GetHogTeamName(CurrentHedgehog) + + -- Restore team's radar mode + radarMode = getTeamValue(teamName, "radarMode") + + if not AreCratesUnlocked() then + FreezeCrates() + end + + -- Check the attack rule violation of the *previous* team and apply penalties + -- This function will do nothiong in the first turn since previousTeam is still nil + CheckAttackRuleViolation(previousTeam) - -- new config stuff - roundN = roundN + 1 - if roundN < 2 then + previousTeam = teamName + + -- Update attack rule information for this turn + UpdateLastAndLeaderTeams() + teamsAttacked = {} + + -- Was the team violating the attackRule the last time? + if getTeamValue(teamName, "skipPenalty") then + -- Then take away this turn + AddCaption(string.format(loc("%s must skip this turn for rule violation."), teamName), msgColorWarn, capgrpMessage) + EndTurn(true) + setTeamValue(teamName, "skipPenalty", false) + end + + else + allowCrate = false + end + + if roundN == 1 then TurnTimeLeft = -1 SetInputMask(0) allowCrate = false - HandleStartingStage() -- new + UpdateMenu() + AddCaption(string.format(loc("%s may choose the rules."), GetHogTeamName(CurrentHedgehog)), msgColorTech, capgrpGameState) + HandleStartingStage() end end +function CanSurf() + if mapID ~= nil then + if GetGameFlag(gfBottomBorder) and WaterRise == 0 then + return false + else + return MapList[mapID][2] + end + else + return nil + end +end + function UpdateMenu() + local teamInfo + if roundN == 1 and CurrentHedgehog ~= nil then + teamInfo = string.format(loc("%s, you may choose the rules."), GetHogTeamName(CurrentHedgehog)) + else + teamInfo = "" + end + preMenuCfg = teamInfo .. "|" .. + loc("Press [Up] and [Down] to move between menu items.|Press [Attack], [Left], or [Right] to toggle.") .. "|" + if GetGameFlag(gfPlaceHog) then + postMenuCfg = loc("Press [Long jump] to accept this configuration and begin placing hedgehogs.") + else + postMenuCfg = loc("Press [Long jump] to accept this configuration and start the game.") + end + + -- This table contains the menu strings and functions to be called when the entry is activated. + menu = {} - preMenuCfg = loc("Spawn the crate, and attack!") .. "|" - postMenuCfg = loc("Press [Enter] to accept this configuration.") + -- Walls required (hidden if the current settings don't allow for any walls) + if #wallSets > 0 then + local line + if #wTouched > 0 then + if wallSets[wallSetID].custom then + line = string.format(loc("Wall set: %s (%d walls)"), wallSets[wallSetID].desc, #wTouched) .. "|" + else + line = string.format(loc("Wall set: %s"), wallSets[wallSetID].desc) .. "|" + end + else + line = loc("Wall set: No walls") .. "|" + end + table.insert(menu, { + line = line, + doNext = function() + wallSetID = wallSetID + 1 + if wallSetID > #wallSets then + wallSetID = 0 + end + LoadConfig(wallSetID) + end, + doPrev = function() + wallSetID = wallSetID - 1 + if wallSetID < 0 then + wallSetID = #wallSets + end + LoadConfig(wallSetID) + end, + }) + end + + -- Surf Before Crate (hidden if map disabled it) + if CanSurf() == true or CanSurf() == nil then + local toggleSurf = function() requireSurfer = not(requireSurfer) end + table.insert(menu, { + line = string.format(loc("Surf Before Crate: %s"), BoolToCfgTxt(requireSurfer)) .. "|", + activate = function() requireSurfer = not requireSurfer end, + }) + end + + -- Attack From Rope + table.insert(menu, { + line = string.format(loc("Attack From Rope: %s"), BoolToCfgTxt(AFR)) .. "|", + activate = function() AFR = not AFR end, + }) + + -- Crate Before Attack + table.insert(menu, { + line = string.format(loc("Crate Before Attack: %s"), BoolToCfgTxt(CBA)) .. "|", + activate = function() CBA = not CBA end, + }) - menu = { - loc("Walls Required") .. ": " .. #wTouched .. "|", - loc("Surf Before Crate") .. ": " .. BoolToCfgTxt(requireSurfer) .. "|", - loc("Attack From Rope") .. ": " .. BoolToCfgTxt(AFR) .. "|", - loc("Super Weapons") .. ": " .. BoolToCfgTxt(allowCrazyWeps) .. "|" - } + if TeamsCount >= 3 then + -- Attack rule (Disabled / All But Last / Kill The Leader) + table.insert(menu, { + line = string.format(loc("Attack rule: %s"), AttackRuleToCfgTxt(attackRule)) .. "|", + doNext = function() + if attackRule == nil then + attackRule = "ABL" + elseif attackRule == "ABL" then + attackRule = "KTL" + elseif attackRule == "KTL" then + attackRule = nil + end + end, + doPrev = function() + if attackRule == nil then + attackRule = "KTL" + elseif attackRule == "ABL" then + attackRule = nil + elseif attackRule == "KTL" then + attackRule = "ABL" + end + end, + }) + end + + -- Super weapons + table.insert(menu, { + line = string.format(loc("Super weapons: %s"), BoolToCfgTxt(allowCrazyWeps)) .. "|", + activate = function() allowCrazyWeps = not allowCrazyWeps end, + }) + + -- Number of crates which appear per turn + if maxCrates > 1 then + table.insert(menu, { + line = string.format(loc("Crates per turn: %d"), cratesPerTurn) .. "|", + doNext = function() + cratesPerTurn = cratesPerTurn + 1 + if cratesPerTurn > maxCrates then + cratesPerTurn = 1 + end + end, + doPrev = function() + cratesPerTurn = cratesPerTurn - 1 + if cratesPerTurn < 1 then + cratesPerTurn = maxCrates + end + end, + }) + end +end + +function FinalizeMenu() + local text = "" + local showTime = 3000 + if #wTouched == 0 and not requireSurfer then + text = text .. loc("Collect the crate and attack!") .. "|" + else + text = text .. loc("Spawn the crate and attack!") .. "|" + end + + -- Expose a few selected game flags + if GetGameFlag(gfPlaceHog) then + text = text .. loc("Place hedgehogs: Place your hedgehogs at the start of the game.") .. "|" + showTime = 6000 + end + if GetGameFlag(gfResetWeps) then + text = text .. loc("Weapons reset: The weapons are reset after each turn.") .. "|" + end + + -- Show the WxW rules + if #wTouched == 1 then + text = text .. loc("Wall Before Crate: You must touch the marked wall before you can get crates.") .. "|" + elseif #wTouched > 0 then + text = text .. string.format(loc("Walls Before Crate: You must touch the %d marked walls before you can get crates."), #wTouched) .. "|" + end + + if requireSurfer then + text = text .. loc("Surf Before Crate: You must bounce off the water once before you can get crates.") .. "|" + end + + if AFR then + text = text .. loc("Attack From Rope: You may only attack from a rope.") .. "|" + end + + if CBA then + text = text .. loc("Crate Before Attack: You must collect a crate before you can attack.") .. "|" + end + + if attackRule == "ABL" then + text = text .. loc("All But Last: You must not solely attack the team with the least health") .. "|" + elseif attackRule == "KTL" then + text = text .. loc("Kill The Leader: You must also hit the team with the most health.") .. "|" + end + if attackRule ~= nil then + text = text .. loc("Penalty: If you violate above rule, you have to skip in the next turn.") .. "|" + end + + if allowCrazyWeps then + text = text .. loc("Super weapons: A few crates contain very powerful weapons.") .. "|" + end + + ShowMission(loc("Wall to wall"), loc("A Shoppa minigame"), text, 1, showTime) end function HandleStartingStage() - temp = menu[menuIndex] - menu[menuIndex] = "--> " .. menu[menuIndex] + temp = menu[menuIndex].line + menu[menuIndex].line = "--> " .. menu[menuIndex].line missionComment = "" for i = 1, #menu do - missionComment = missionComment .. menu[i] + missionComment = missionComment .. menu[i].line end ShowMission ( - loc("WALL TO WALL") .. " 0.4", - loc("a shoppa minigame"), + loc("Wall to wall"), + loc("Configuration phase"), preMenuCfg.. missionComment .. postMenuCfg .. - --" " .. "|" .. - "", 4, 300000 + "", 2, 9999000 ) - menu[menuIndex] = temp + menu[menuIndex].line = temp end function onGameTick() - if CurrentHedgehog ~= nil then - - --AddCaption(Map) - --AddCaption(RightX ..";" .. GetX(CurrentHedgehog)) + if CurrentHedgehog ~= nil and roundN >= 0 then gTimer = gTimer + 1 if gTimer == 25 then gTimer = 1 - CheckForWallCollision() - CheckCrateConditions() + if roundN == 100 then + CheckForWallCollision() + CheckCrateConditions() - if (crateG == GetFollowGear()) and (crateG ~= nil) then - FollowGear(CurrentHedgehog) - end - - -- if attackfromrope is set, forbid firing unless using rope - if (AFR == true) and (roundN >= 2) then - if (GetCurAmmoType() == amRope) or + if (GetGearType(GetFollowGear()) == gtCase) then + FollowGear(CurrentHedgehog) + end + + -- AFR and CBA handling + local allowAttack = true + local shootException + shootException = (GetCurAmmoType() == amRope) or (GetCurAmmoType() == amSkip) or (GetCurAmmoType() == amNothing) - then - SetInputMask(0xFFFFFFFF) - elseif ropeG == nil then - SetInputMask(bnot(gmAttack)) + -- If Attack From Rope is set, forbid firing unless using rope + if AFR then + if ropeG == nil then + allowAttack = false + end + end + -- If Crate Before Attack is set, forbid firing if crate is not collected + if CBA then + if not crateCollected then + allowAttack = false + end + end + if allowAttack or shootException then + SetInputMask(bor(GetInputMask(), gmAttack)) + if CBA then + SetInputMask(bor(GetInputMask(), gmLJump)) + end + else + if CBA then + if ropeG == nil then + SetInputMask(band(GetInputMask(), bnot(gmAttack))) + SetInputMask(bor(GetInputMask(), gmLJump)) + else + SetInputMask(bor(GetInputMask(), gmAttack)) + SetInputMask(band(GetInputMask(), bnot(gmLJump))) + end + else + SetInputMask(band(GetInputMask(), bnot(gmAttack))) + end end end @@ -667,13 +1620,27 @@ end +local menuRepeatTimer = 0 +function onGameTick20() + -- Make sure the menu doesn't disappear while it is active + if roundN == 1 then + menuRepeatTimer = menuRepeatTimer + 20 + if menuRepeatTimer > 9990000 then + HandleStartingStage() + menuRepeatTimer = 0 + end + end +end + function onGearAdd(gear) if GetGearType(gear) == gtRope then ropeG = gear elseif GetGearType(gear) == gtCase then - crateG = gear + crates[gear] = true + crateGearsInGame = crateGearsInGame + 1 + trackGear(gear) table.insert(rCirc, AddVisualGear(0,0,vgtCircle,0,true) ) @@ -683,24 +1650,38 @@ SetVisualGearValues(rCirc[#rCirc], 0, 0, 100, 255, 1, 10, 0, 40, 3, 0xff00ffff) allowCrate = false + crateSpawned = true rPingTimer = 0 rAlpha = 0 + elseif GetGearType(gear) == gtHedgehog then + trackGear(gear) + local teamName = GetHogTeamName(gear) + -- Initialize radar mode to “on” and set other team values + setTeamValue(teamName, "radarMode", 0) + setTeamValue(teamName, "skipPenalty", false) + + if getTeamValue(teamName, "hogs") == nil then + setTeamValue(teamName, "hogs", 1) + else + increaseTeamValue(teamName, "hogs") + end + hogCount = hogCount + 1 + teamNames[GetHogTeamName(gear)] = true end end function onGearDelete(gear) - if gear == ropeG then + local gt = GetGearType(gear) + if gt == gtRope then ropeG = nil - elseif GetGearType(gear) == gtCase then + elseif gt == gtCase then - if gear == crateG then - crateG = nil - -- rAlpha = 255 - end + crates[gear] = nil + crateGearsInGame = crateGearsInGame - 1 for i = 1, #rCirc do if rCirc[i] == getGearValue(gear,"CIRC") then @@ -711,6 +1692,133 @@ trackDeletion(gear) + -- Was crate collected? + if band(GetGearMessage(gear), gmDestroy) ~= 0 then + crateCollected = true + end + + elseif gt == gtHedgehog then + teamsAttacked[GetHogTeamName(gear)] = true + decreaseTeamValue(GetHogTeamName(gear), "hogs") + trackDeletion(gear) + end + +end + +function onGearDamage(gear) + + if GetGearType(gear) == gtHedgehog then + teamsAttacked[GetHogTeamName(gear)] = true + end + +end + +-- Check which team is the last and which is the leader (used for ABL and KTL) +function UpdateLastAndLeaderTeams() + local teamHealths = {} + + for team, x in pairs(teamNames) do + UpdateTeamHealth(team) + local totalHealth = getTeamValue(team, "totalHealth") + if totalHealth > 0 then + table.insert(teamHealths, {name = team, health = totalHealth } ) + end + end + + -- Sort the table by health, lowest health comes first + table.sort(teamHealths, function(team1, team2) return team1.health < team2.health end) + + -- ABL and KTL rules are only active at 3 teams; when there are only 2 teams left, it's “everything goes”. + if #teamHealths >= 3 then + if teamHealths[1].health == teamHealths[2].health then + -- ABL rule is disabled if it's a tie for “least health” + lastTeam = nil + else + -- Normal assignment of ABL variable + lastTeam = teamHealths[1].name + end + if teamHealths[#teamHealths].health == teamHealths[#teamHealths-1].health then + -- KTL rule is disabled if it's a tie for “most health” + leaderTeam = nil + runnerUpTeam = nil + else + -- Normal assignment of KTL variables + leaderTeam = teamHealths[#teamHealths].name + runnerUpTeam = teamHealths[#teamHealths-1].name + end + else + -- The KTL and ABL rules are disabled with only 2 teams left + lastTeam = nil + runnerUpTeam = nil + leaderTeam = nil + end +end + +function UpdateTeamHealth(team) + setTeamValue(team, "totalHealth", 0) + runOnHogsInTeam(function(hog) + if(GetGearType(hog) ~= gtHedgehog) then return end + local h = getTeamValue(GetHogTeamName(hog), "totalHealth") + setTeamValue(GetHogTeamName(hog), "totalHealth", h + GetHealth(hog)) + end, team) +end + +-- Check if the ABL or KTL rule (if active) has been violated by teamToCheck +function CheckAttackRuleViolation(teamToCheck) + + if teamToCheck == nil then return end + + local violated = false + if attackRule == "ABL" then + -- We don't care if the last team hurts itself + if lastTeam ~= nil and lastTeam ~= teamToCheck then + local lastAttacked = false + local attackNum = 0 -- count the attacked teams but we'll ignore the attacking team + for team, wasAttacked in pairs(teamsAttacked) do + -- Ignore the attacking team + if team ~= teamToCheck then + attackNum = attackNum + 1 + if team == lastTeam then + lastAttacked = true + end + end + end + -- Rule is violated iff only the last team is attacked (damage to attacking team is ignored) + if attackNum == 1 and lastAttacked then + violated = true + end + end + if violated then + AddCaption(string.format(loc("%s violated the “All But Last” rule and will be penalized."), teamToCheck), msgColorWarn, capgrpGameState) + end + elseif attackRule == "KTL" then + local leaderAttacked = false + if leaderTeam ~= nil then + local attackNum = 0 + local selfHarm = false + for team, wasAttacked in pairs(teamsAttacked) do + attackNum = attackNum + 1 + if team == teamToCheck then + selfHarm = true + end + -- The leader must attack the runner-up, everyone else must attack the leader + if (teamToCheck ~= leaderTeam and team == leaderTeam) or (teamToCheck == leaderTeam and team == runnerUpTeam) then + leaderAttacked = true + break + end + end + -- If teams were attacked but not the leader, it is a violation, + -- but we don't care if the team *only* harmed itself. + if (attackNum >= 2 and not leaderAttacked) or (attackNum == 1 and not selfHarm and not leaderAttacked) then + violated = true + end + end + if violated then + AddCaption(string.format(loc("%s violated the “Kill The Leader” rule and will be penalized."), teamToCheck), msgColorWarn, capgrpGameState) + end + end + if violated then + setTeamValue(teamToCheck, "skipPenalty", true) end end diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/SpeedShoppa.lua --- a/share/hedgewars/Data/Scripts/SpeedShoppa.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/SpeedShoppa.lua Sun Dec 17 00:09:24 2017 +0100 @@ -97,6 +97,9 @@ 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) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Scripts/TargetPractice.lua --- a/share/hedgewars/Data/Scripts/TargetPractice.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Scripts/TargetPractice.lua Sun Dec 17 00:09:24 2017 +0100 @@ -96,6 +96,7 @@ - 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") - clanColor: color of the (only) clan (default: 0xFF0204, which is a red tone) - goalText: A short string explaining the goal of the mission (default: "Destroy all targets within the time!") @@ -110,6 +111,7 @@ if params.shootText == nil then params.shootText = loc("You have shot %d times.") end if params.clanColor == nil then params.clanColor = 0xFF0204 end if params.teamGrave == nil then params.teamGrave= "Statue" end + if params.teamFlag == nil then params.teamFlag = "cm_crosshair" end if params.wind == nil then params.wind = 0 end local solid, artillery @@ -134,10 +136,13 @@ CaseFreq = 0 MinesNum = 0 Explosives = 0 + -- Disable Sudden Death + WaterRise = 0 + HealthDecrease = 0 SetWind(params.wind) - AddTeam(loc(params.teamName), params.clanColor, params.teamGrave, "Island", "Default", "Flowerhog") + AddTeam(loc(params.teamName), params.clanColor, params.teamGrave, "Flowerhog", "Default", params.teamFlag) player = AddHog(loc(params.hogName), 0, 1, params.hogHat) SetGearPosition(player, params.hog_x, params.hog_y) @@ -210,6 +215,9 @@ PlaySound(sndVictory, player) SetState(player, bor(GetState(player), gstWinner)) time_goal = TurnTimeLeft + -- Disable control + SetInputMask(0) + AddAmmo(player, params.ammoType, 0) end end end @@ -217,7 +225,7 @@ if GetGearType(gear) == gtHedgehog then if not game_lost then game_lost = true - AddCaption(loc("You lose!", 0xFFFFFFFF, capgrpGameState)) + AddCaption(loc("You lose!"), 0xFFFFFFFF, capgrpGameState) ShowMission(params.missionTitle, loc("Aiming practice"), loc("Oh no! You failed! Just try again."), -amSkip, 0) SetHealth(player, 0) @@ -228,7 +236,7 @@ _G.onGearDelete = function(gear) if GetGearType(gear) == gtTarget and band(GetState(gear), gstDrowning) ~= 0 then - AddCaption(loc("You lost your target, try again!", 0xFFFFFFFF, capgrpGameState)) + AddCaption(loc("You lost your target, try again!"), 0xFFFFFFFF, capgrpGameState) local newTarget = spawnTarget() local x, y = GetGearPosition(newTarget) local success = PlaceSprite(x, y + 24, sprAmGirder, 0, 0xFFFFFFFF, false, false, false) diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/blowtorch.ogg Binary file share/hedgewars/Data/Sounds/blowtorch.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/countdown1.ogg Binary file share/hedgewars/Data/Sounds/countdown1.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/countdown2.ogg Binary file share/hedgewars/Data/Sounds/countdown2.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/countdown3.ogg Binary file share/hedgewars/Data/Sounds/countdown3.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/countdown4.ogg Binary file share/hedgewars/Data/Sounds/countdown4.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/custom1.ogg Binary file share/hedgewars/Data/Sounds/custom1.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/custom2.ogg Binary file share/hedgewars/Data/Sounds/custom2.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/custom3.ogg Binary file share/hedgewars/Data/Sounds/custom3.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/custom4.ogg Binary file share/hedgewars/Data/Sounds/custom4.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/custom5.ogg Binary file share/hedgewars/Data/Sounds/custom5.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/custom6.ogg Binary file share/hedgewars/Data/Sounds/custom6.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/custom7.ogg Binary file share/hedgewars/Data/Sounds/custom7.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/custom8.ogg Binary file share/hedgewars/Data/Sounds/custom8.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/invulnerable.ogg Binary file share/hedgewars/Data/Sounds/invulnerable.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/jetpackboost.ogg Binary file share/hedgewars/Data/Sounds/jetpackboost.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/lasersight.ogg Binary file share/hedgewars/Data/Sounds/lasersight.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/portalopen.ogg Binary file share/hedgewars/Data/Sounds/portalopen.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/portalshot.ogg Binary file share/hedgewars/Data/Sounds/portalshot.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/portalswitch.ogg Binary file share/hedgewars/Data/Sounds/portalswitch.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/rubberduck_die.ogg Binary file share/hedgewars/Data/Sounds/rubberduck_die.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/rubberduck_drop.ogg Binary file share/hedgewars/Data/Sounds/rubberduck_drop.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Sounds/rubberduck_water.ogg Binary file share/hedgewars/Data/Sounds/rubberduck_water.ogg has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Art/LandTex.png Binary file share/hedgewars/Data/Themes/Art/LandTex.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Bamboo/theme.cfg --- a/share/hedgewars/Data/Themes/Bamboo/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Bamboo/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 117, 141, 186 border = 143, 171, 80 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = oriental.ogg clouds = 9 object = Flower, 3, 65, 258, 80, 2, 1, 0, 0, 240, 215 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Bath/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Bath/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Bath/theme.cfg --- a/share/hedgewars/Data/Themes/Bath/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Bath/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 255, 255, 237 border = 173, 182, 247 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = bath.ogg clouds = 15 object = Toothbrush, 3, 120, 245, 8, 15, 1, 90, 6, 65, 220 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/BeachBall.png Binary file share/hedgewars/Data/Themes/Beach/BeachBall.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/BlueWater.png Binary file share/hedgewars/Data/Themes/Beach/BlueWater.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Border.png Binary file share/hedgewars/Data/Themes/Beach/Border.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Clouds.png Binary file share/hedgewars/Data/Themes/Beach/Clouds.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Droplet.png Binary file share/hedgewars/Data/Themes/Beach/Droplet.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Flake.png Binary file share/hedgewars/Data/Themes/Beach/Flake.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Girder.png Binary file share/hedgewars/Data/Themes/Beach/Girder.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Hedgecastle.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Beach/Hedgecastle.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,203 @@ + + + +image/svg+xml \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/LandBackTex.png Binary file share/hedgewars/Data/Themes/Beach/LandBackTex.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/LandObject3.png Binary file share/hedgewars/Data/Themes/Beach/LandObject3.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/LandObject38.png Binary file share/hedgewars/Data/Themes/Beach/LandObject38.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/LandObject4.png Binary file share/hedgewars/Data/Themes/Beach/LandObject4.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/LandObject5.png Binary file share/hedgewars/Data/Themes/Beach/LandObject5.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/LandTex.png Binary file share/hedgewars/Data/Themes/Beach/LandTex.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Object.png Binary file share/hedgewars/Data/Themes/Beach/Object.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Shell.png Binary file share/hedgewars/Data/Themes/Beach/Shell.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Sky.png Binary file share/hedgewars/Data/Themes/Beach/Sky.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Splash.png Binary file share/hedgewars/Data/Themes/Beach/Splash.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/SprayObject29.png Binary file share/hedgewars/Data/Themes/Beach/SprayObject29.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/SprayObject36.png Binary file share/hedgewars/Data/Themes/Beach/SprayObject36.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/SprayObject4.png Binary file share/hedgewars/Data/Themes/Beach/SprayObject4.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Surfboard.png Binary file share/hedgewars/Data/Themes/Beach/Surfboard.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/Surfboard.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Beach/Surfboard.svg Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Beach/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +CopherNeue, Miguelac diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/horizont-lowres.png Binary file share/hedgewars/Data/Themes/Beach/horizont-lowres.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/horizont.png Binary file share/hedgewars/Data/Themes/Beach/horizont.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/icon.png Binary file share/hedgewars/Data/Themes/Beach/icon.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/icon@2x.png Binary file share/hedgewars/Data/Themes/Beach/icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Beach/theme.cfg --- a/share/hedgewars/Data/Themes/Beach/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Beach/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,18 +1,19 @@ -sky = 143, 214, 231 +sky = 88, 143, 221 border = 238, 204, 160 water-top = 62, 123, 148 -water-bottom = 53, 105, 133 -water-opacity = $80 -music = BeachMusic.ogg +water-bottom = 43, 85, 102 +water-opacity = 198 +music = Beach.ogg +flakes = 10, 40, 95, 0, 10 clouds = 5 -object = Object, 1, 186, 286, 6, 18, 1, 0, 0, 252, 245 +flatten-flakes = true +spray = Shell, 1 +spray = SprayObject29, 1 +spray = SprayObject36, 1 +object = Object, 1, 136, 230, 22, 17, 3, 202, 220, 1, 1, 125, 139, 23, 41, 45, 40, 95, 82 object = BeachBall, 1, 50, 140, 50, 10, 1, 20, 20, 110, 110 -object = LandObject3, 1, 5, 145, 146, 17, 1, 5, 2, 138, 110 -object = LandObject38, 1, 0, 0, 26, 10, 1, 0, 30, 26, 112 -object = LandObject4, 1, 0, 0, 28, 10, 1, 0, 30, 28, 68 -object = LandObject5, 1, 0, 0, 27, 15, 1, 0, 35, 27, 98 -spray = Shell, 3 -spray = SprayObject29, 3 -spray = SprayObject36, 2 -spray = SprayObject4, 1 -flakes = 20, 1, 0, 0, 10 +object = LandObject3, 1, 29, 126, 141, 10, 1, 16, 1, 160, 107 +object = LandObject38, 1, 5, 1, 41, 15, 1, 6, 31, 32, 67 +object = LandObject4, 1, 7, 10, 52, 15, 1, 17, 65, 55, 51 +object = LandObject5, 1, 3, 0, 47, 13, 1, 0, 35, 27, 98 +object = Surfboard, 1, 120, 250, 40, 7, 1, 15, 6, 120, 200 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Blox/theme.cfg --- a/share/hedgewars/Data/Themes/Blox/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Blox/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 179, 243, 243 border = 128, 128, 128 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = Nature.ogg clouds = 0 flakes = 0, 0, 0, 0, 0 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/CMakeLists.txt --- a/share/hedgewars/Data/Themes/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -2,6 +2,7 @@ Art Bamboo Bath + Beach Blox Brick Cake diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Castle/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Castle/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Cave/theme.cfg --- a/share/hedgewars/Data/Themes/Cave/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Cave/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,7 +1,5 @@ sky = 17, 18, 24 border = 129, 135, 173 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D water-opacity = $60 music = snow.ogg clouds = 0 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Cheese/theme.cfg --- a/share/hedgewars/Data/Themes/Cheese/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Cheese/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 16, 5, 27 border = 240, 175, 32 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = EarthRise.ogg clouds = 9 object = cheese, 3, 60, 80, 55, 30, 1, 0, 0, 140, 70 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Christmas/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Christmas/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Palewolf and others diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Christmas/theme.cfg --- a/share/hedgewars/Data/Themes/Christmas/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Christmas/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 9, 14, 45 border = 141, 151, 213 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = snow.ogg clouds = 9 object = reindeer, 1, 90, 232, 94, 12, 2, 55, 60, 90, 73, 80, 134, 105, 64 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Desert/icon@2x.png Binary file share/hedgewars/Data/Themes/Desert/icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/EarthRise/theme.cfg --- a/share/hedgewars/Data/Themes/EarthRise/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/EarthRise/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 0, 0, 0 border = 106, 106, 106 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = EarthRise.ogg clouds = 0 object = Rock, 3, 65, 258, 175, 2, 1, 0, 0, 240, 215 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Freeway/theme.cfg --- a/share/hedgewars/Data/Themes/Freeway/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Freeway/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 99, 51, 43 border = 70, 58, 55 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = Freeway.ogg clouds = 9 object = Tire, 3, 83, 215, 92, 35, 1, 0, 0, 250, 190 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Halloween/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Halloween/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Halloween/theme.cfg --- a/share/hedgewars/Data/Themes/Halloween/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Halloween/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -4,6 +4,7 @@ water-bottom = 44, 84, 40 water-opacity = $80 music = Halloween.ogg +sd-music = hell.ogg clouds = 9 object = Rock, 3, 65, 258, 175, 2, 1, 0, 0, 240, 215 object = RockShort, 3, 0, 165, 163, 2, 1, 0, 0, 163, 140 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Hoggywood/theme.cfg --- a/share/hedgewars/Data/Themes/Hoggywood/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Hoggywood/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,10 +1,6 @@ sky = 100, 180, 220 border = 71, 74, 93 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = Rock.ogg -sd-music = hell.ogg clouds = 32 object = palm, 4, 169, 467, 61, 6, 2, 0, 0, 333, 238, 168, 237, 55, 92 object = hogscar, 1, 20, 159, 70, 1, 1, 0, 0, 132, 140 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Island/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Island/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Island/theme.cfg --- a/share/hedgewars/Data/Themes/Island/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Island/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 21, 20, 38 border = 242, 230, 124 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = pirate.ogg clouds = 9 object = anchor, 3, 65, 258, 80, 2, 1, 0, 0, 240, 215 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Jungle/icon@2x.png Binary file share/hedgewars/Data/Themes/Jungle/icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Jungle/theme.cfg --- a/share/hedgewars/Data/Themes/Jungle/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Jungle/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -3,10 +3,10 @@ water-top = $A7, $6A, $32 water-bottom = $B3, $78, $1B water-opacity = $80 -music = oriental.ogg +music = Jungle.ogg clouds = 20 object = PalmTree, 1, 141, 225, 25, 5, 1, 0, 0, 230, 190 -object = Flowers, 1, 5, 65, 180, 5, 1, 0, 0, 150, 50 +object = Flowers, 1, 2, 5, 65, 20, 5, 165, 65, 20, 5, 1, 0, 0, 150, 50 object = Liana, 2, 0, 0, 25, 10, 1, 0, 40, 25, 160 object = Monkey, 1, 20, 145, 60, 5, 1, 0, 0, 130, 130 object = Snake, 1, 30, 95, 40, 5, 1, 0, 0, 110, 75 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Nature/icon@2x.png Binary file share/hedgewars/Data/Themes/Nature/icon@2x.png has changed diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Nature/theme.cfg --- a/share/hedgewars/Data/Themes/Nature/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Nature/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 19, 18, 82 border = 176, 51, 0 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = Nature.ogg clouds = 9 object = plant1, 3, 65, 258, 80, 2, 1, 0, 0, 240, 215 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Olympics/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Olympics/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Guillaume Englert diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Olympics/theme.cfg --- a/share/hedgewars/Data/Themes/Olympics/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Olympics/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 177, 190, 216 border = 204, 200, 168 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = Olympics.ogg sd-music = olympics_sd.ogg clouds = 9 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Planes/credits.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Planes/credits.txt Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,1 @@ +Finn Brice diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Planes/theme.cfg --- a/share/hedgewars/Data/Themes/Planes/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Planes/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,7 +1,4 @@ sky = 21, 20, 38 border = 177, 175, 49 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = City.ogg clouds = 9 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Sheep/theme.cfg --- a/share/hedgewars/Data/Themes/Sheep/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Sheep/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 66, 71, 141 border = 0, 88, 0 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = Sheep.ogg clouds = 4 object = fleur, 3, 45, 127, 50, 3, 1, 0, 0, 120, 105 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/Themes/Snow/theme.cfg --- a/share/hedgewars/Data/Themes/Snow/theme.cfg Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/Themes/Snow/theme.cfg Sun Dec 17 00:09:24 2017 +0100 @@ -1,8 +1,5 @@ sky = 21, 20, 38 border = 141, 151, 213 -water-top = $54, $5C, $9D -water-bottom = $34, $3C, $7D -water-opacity = $80 music = snow.ogg clouds = 9 object = plant1, 3, 65, 258, 80, 2, 1, 0, 0, 240, 215 diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/misc/CMakeLists.txt --- a/share/hedgewars/Data/misc/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/misc/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -6,5 +6,6 @@ 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) endif() diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/misc/hedgewars.desktop --- a/share/hedgewars/Data/misc/hedgewars.desktop Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/misc/hedgewars.desktop Sun Dec 17 00:09:24 2017 +0100 @@ -17,6 +17,9 @@ GenericName[cs]=Bojující ježci GenericName[sv]=Stridande igelkottar 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[it]=Gioco divertente di artiglieria a turni, con ricci combattenti! Icon=hedgewars Exec=hedgewars %U Terminal=false diff -r 01f88c3b7b66 -r 1b2b84315d27 share/hedgewars/Data/misc/hwengine.desktop.in --- a/share/hedgewars/Data/misc/hwengine.desktop.in Thu Aug 11 23:05:14 2016 +0300 +++ b/share/hedgewars/Data/misc/hwengine.desktop.in Sun Dec 17 00:09:24 2017 +0100 @@ -2,25 +2,26 @@ Type=Application Version=1.0 Name=Hedgewars Engine -GenericName=Hedgewars engine, for playback of saves and demos -GenericName[de]=Hedgewars-Engine, für die Wiedergabe von gespeicherten Spielen und Demos -GenericName[es]=Motor del juego Hedgewars, reproduce demos y partidas guardadas -GenericName[fr]=Moteur graphique d'Hedgewars, pour revoir les parties enregistrées et de démonstration. -GenericName[it]=Motore grafico di Hedgewars, riproduce le demo e riprende le partite salvate -GenericName[ko]=헤즈와즈 게임 엔진, 데모 와 저장한 게임을 재생함 -GenericName[pl]=Silnik gry Hedgewars do odtwarzania dem i zapisów gier -GenericName[pt]=Motor de jogo Hedgewars, para reprodução de jogos guardados e demos -GenericName[ru]=Движок Hedgewars для проигрывания сохранённых игр и демок -GenericName[sk]=Engine hry Hedgewars, pre prehrávanie uložených hier a demo súborov -GenericName[tr]=Kayıtların ve gösterilerin oynatılması için Hedgewars motoru -GenericName[cs]=Engine hry Hedgewars pro přehrávání uložených her a ukázkových souborů -GenericName[sv]=Hedgewarsmotorn, för att öppna demo- och sparfiler -GenericName[da]=Kæmpende Pindsvin +Name[de]=Hedgewars-Engine +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[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 +Comment[pt]=Motor de jogo Hedgewars, para reprodução de jogos guardados e demos +Comment[ru]=Движок Hedgewars для проигрывания сохранённых игр и демок +Comment[sk]=Engine hry Hedgewars, pre prehrávanie uložených hier a demo súborov +Comment[tr]=Kayıtların ve gösterilerin oynatılması için Hedgewars motoru +Comment[cs]=Engine hry Hedgewars pro přehrávání uložených her a ukázkových souborů +Comment[sv]=Hedgewarsmotorn, för att öppna demo- och sparfiler +Comment[da]=Kæmpende Pindsvin Icon=hedgewars Exec=${CMAKE_INSTALL_PREFIX}/${target_binary_install_dir}/hwengine %f Path=/tmp Terminal=false StartupNotify=false NoDisplay=true -Categories=Application;Game;StrategyGame; +Categories=Game;StrategyGame; MimeType=application/x-hedgewars-demo;application/x-hedgewars-save; diff -r 01f88c3b7b66 -r 1b2b84315d27 tests/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/README.md Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,6 @@ +Directory for automated tests to test the engine. + +Run `ctest` in the root directory of this repository to run all tests. +Run `ctest -R ` to run only the test with the given name. + +This requires you to have CMake. diff -r 01f88c3b7b66 -r 1b2b84315d27 tests/lua/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/lua/README.md Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,3 @@ +Lua scripts for engine testing. These scripts are the same as other Lua scripts +in Hedgewars, but you ought to call `EndLuaTest(TEST_SUCCESSFUL)` or +`EndLuaTest(TEST_FAILED)` when the test is completed. diff -r 01f88c3b7b66 -r 1b2b84315d27 tests/lua/hellfire_burns.lua --- a/tests/lua/hellfire_burns.lua Thu Aug 11 23:05:14 2016 +0300 +++ b/tests/lua/hellfire_burns.lua Sun Dec 17 00:09:24 2017 +0100 @@ -6,7 +6,7 @@ -- creates round test area function AddTestArea(testarea) - step = 100 + step = 90 xstep = step * testarea["xdir"] ystep = step * testarea["ydir"] x = testarea["x"] diff -r 01f88c3b7b66 -r 1b2b84315d27 tests/lua/staticmines.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/lua/staticmines.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,137 @@ +--[[ Static Mines Test + +This test tests if mines are able to stand still on the ground for a very long time. 8 mines are spawned on a few girders. + +The test passes if the mines don't move for a very long time. +The test failes if any mine moves even the tiniest bit or is destroyed. + +This test case has been created as response to bug 96. +]] + +-- Max. time to test +local TEST_TIME_LIMIT = 3600000 * 5 -- 5 hours + +local hhs = {} + +function onGameInit() + + ClearGameFlags() + EnableGameFlags(gfDisableWind, gfOneClanMode) + Map = "" + Seed = 12 + Theme = "Desert" + MapGen = mgDrawn + TurnTime = -1 + Explosives = 0 + MinesNum = 0 + CaseFreq = 0 + Delay = 100 + WaterRise = 0 + HealthDecrease = 0 + AirMinesNum = 0 + + + AddTeam("Test Team", 0xFFFF00, "Statue", "Tank", "Default", "cm_test") + hhs[1] = AddHog("Test Hog", 0, 100, "cm_test") + SetGearPosition(hhs[1], 300, 1450) +end + +local mines = { + { x = 231, y = 1708}, + { x = 290, y = 1708}, + { x = 342, y = 1708}, + { x = 261, y = 1708}, + { x = 319, y = 1708}, + { x = 403, y = 1706}, + { x = 428, y = 1706}, + { x = 461, y = 1706}, + { x = 498, y = 1706}, + { x = 518, y = 1706}, +} + +function LoadGearData() + ------ GIRDER LIST ------ + PlaceGirder(290, 1718, 4) + PlaceGirder(290, 1790, 4) + PlaceGirder(452, 1716, 4) + PlaceGirder(452, 1790, 4) + + PlaceGirder(300, 1500, 4) + + ------ MINE LIST ------ + for m=1, #mines do + mines[m].gear = AddGear(mines[m].x, mines[m].y, gtMine, 0, 0, 0, 0) + end + +end + +function onGameStart() + LoadGearData() +end + +function onGearDelete(gear) + for m=#mines, 1, -1 do + if gear == mines[m] then + WriteLnToConsole(string.format("Mine %d died!", m)) + table.remove(mines, m) + end + end +end + +-- Give a short time for the mines to settle first. +local checkTimer = -5000 +local initPosCheck = false +-- Count the total times the mines managed to stand still +local totalTime = 0 +local fin = false +function onGameTick20() + if fin then + return + end + -- Infinite turn time + if TurnTimeLeft < 6000 then + TurnTimeLeft = -1 + end + checkTimer = checkTimer + 20 + if initPosCheck then + totalTime = totalTime + 20 + end + if checkTimer >= 1000 then + local failed = false + for m=1, #mines do + if not initPosCheck then + -- Position initialization + -- Save “real” x and y values after the mines have settled + local x, y = GetGearPosition(mines[m].gear) + mines[m].rx = x + mines[m].ry = y + else + -- Position check + local x, y = GetGearPosition(mines[m].gear) + local rx, ry = mines[m].rx, mines[m].ry + if not x or not y then + WriteLnToConsole(string.format("Mine %d has died!", m)) + failed = true + elseif x ~= rx or y ~= ry then + WriteLnToConsole(string.format("Mine %d has moved! Expected: (%d, %d). Actual: (%d, %d)", m, rx, ry, x, y)) + failed = true + end + end + end + if not initPosCheck then + initPosCheck = true + end + if failed then + WriteLnToConsole(string.format("Test failed. The mines managed to stand still for %d ticks.", totalTime)) + EndLuaTest(TEST_FAILED) + fin = true + return + end + end + if totalTime >= TEST_TIME_LIMIT then + WriteLnToConsole(string.format("All mines have been static for over %d ticks! Success!", TEST_TIME_LIMIT)) + EndLuaTest(TEST_SUCCESSFUL) + fin = true + return + end +end \ No newline at end of file diff -r 01f88c3b7b66 -r 1b2b84315d27 tests/lua/stuckcake.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/lua/stuckcake.lua Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,118 @@ +--[[ Stuck Cake Test + +In this test, 2 hedgehogs are placed very close to each other, tightly +crammed between girders. The first hog (Cake Hog) launches a cake. Now +the test waits until the cake explodes due to time. + +The cake must not take too long or forever to explode. The test succeeds +if the cake explodes before CAKE_MAX_EXPLOSION_TIME ticks (rough estimate) +after the cake spawned and fails otherwise. + +This test case has been written in response to bug 194. + +]] + +-- Cake must explode before this many ticks for the test to succeed +local CAKE_MAX_EXPLOSION_TIME = 15000 + +-- Give up if cake is still running after this many ticks +local CAKE_GIVE_UP_TIME = 20000 + +local hhs = {} + +function onGameInit() + + ClearGameFlags() + EnableGameFlags(gfDisableWind, gfPerHogAmmo, gfOneClanMode, gfInvulnerable, gfSolidLand) + Map = "" + Seed = "{84f5e62e-6a12-4444-b53c-2bc62cfd9c62}" + Theme = "Cave" + MapGen = mgDrawn + MapFeatureSize = 12 + TemplateFilter = 3 + TemplateNumber = 0 + TurnTime = 9999000 + Explosives = 0 + MinesNum = 0 + CaseFreq = 0 + WaterRise = 0 + HealthDecrease = 0 + Ready = 0 + + ------ TEAM LIST ------ + + AddTeam("Test Team", 0xFFFF02, "Statue", "Tank", "Default", "cm_test") + + hhs[1] = AddHog("Cake Hog", 0, 100, "NoHat") + SetGearPosition(hhs[1], 771, 1344) + + hhs[2] = AddHog("Passive Hog", 0, 100, "NoHat") + SetGearPosition(hhs[2], 772, 1344) + HogTurnLeft(hhs[2], true) + +end + +function onAmmoStoreInit() + SetAmmo(amCake, 9, 0, 0, 0) + SetAmmo(amSkip, 9, 0, 0, 0) +end + +function onGameStart() + + PlaceSprite(784, 1361, sprAmGirder, 4, 0xFFFFFFFF, nil, nil, nil, lfNormal) + PlaceSprite(730, 1271, sprAmGirder, 6, 0xFFFFFFFF, nil, nil, nil, lfNormal) + PlaceSprite(753, 1270, sprAmGirder, 6, 0xFFFFFFFF, nil, nil, nil, lfNormal) + PlaceSprite(798, 1271, sprAmGirder, 6, 0xFFFFFFFF, nil, nil, nil, lfNormal) + PlaceSprite(777, 1243, sprAmGirder, 6, 0xFFFFFFFF, nil, nil, nil, lfNormal) + +end + +local cakeTestPhase = 0 +--[[ Test phases: + 0: Waiting for turn start + 1: Cake selected, waiting for attack + 2: Cake gear added + 3: Cake gead destroyed ]] + +function onNewTurn() + if cakeTestPhase == 0 then + SetWeapon(amCake) + cakeTestPhase = 1 + end +end + +local cakeTicks = 0 + +function onGearAdd(gear) + if GetGearType(gear) == gtCake then + cakeTestPhase = 2 + end +end + +function onGearDelete(gear) + if GetGearType(gear) == gtCake and cakeTestPhase == 2 then + WriteLnToConsole(string.format("TEST: The cake exploded after %d ticks.", cakeTicks)) + cakeTestPhase = 3 + if cakeTicks > CAKE_MAX_EXPLOSION_TIME then + WriteLnToConsole("TEST RESULT: Failed because cake took too long to explode.") + EndLuaTest(TEST_FAILED) + else + WriteLnToConsole("TEST RESULT: Succeeded because cake exploded in time.") + EndLuaTest(TEST_SUCCESSFUL) + end + + end +end + +function onGameTick() + if cakeTestPhase == 1 then + ParseCommand("+attack") + elseif cakeTestPhase == 2 then + cakeTicks = cakeTicks + 1 + if cakeTicks > CAKE_GIVE_UP_TIME then + WriteLnToConsole(string.format("TEST RESULT: Failed because the cake still didn't explode after %d ticks.", CAKE_GIVE_UP_TIME)) + cakeTestPhase = 3 + EndLuaTest(TEST_FAILED) + end + end +end diff -r 01f88c3b7b66 -r 1b2b84315d27 tools/CMakeLists.txt --- a/tools/CMakeLists.txt Thu Aug 11 23:05:14 2016 +0300 +++ b/tools/CMakeLists.txt Sun Dec 17 00:09:24 2017 +0100 @@ -9,10 +9,10 @@ if(APPLE AND NOT SKIPBUNDLE) find_package(Qt4 REQUIRED QUIET) find_package(SDL2 REQUIRED) - find_package(SDL2_image REQUIRED) - find_package(SDL2_net REQUIRED) - find_package(SDL2_ttf REQUIRED) - find_package(SDL2_mixer REQUIRED) + find_package(SDL2_image 2 REQUIRED) + find_package(SDL2_net 2 REQUIRED) + find_package(SDL2_ttf 2 REQUIRED) + find_package(SDL2_mixer 2 REQUIRED) find_package(OggVorbis REQUIRED) find_package(PNG REQUIRED) diff -r 01f88c3b7b66 -r 1b2b84315d27 tools/CreateMacBundle.cmake.in --- a/tools/CreateMacBundle.cmake.in Thu Aug 11 23:05:14 2016 +0300 +++ b/tools/CreateMacBundle.cmake.in Sun Dec 17 00:09:24 2017 +0100 @@ -25,10 +25,10 @@ execute_process(COMMAND cp ${PNG_LIBRARY} ${frameworks_dir}) execute_process(COMMAND cp -pPR ${sdl_library_only} ${frameworks_dir}) - execute_process(COMMAND cp -pPR ${SDL2IMAGE_LIBRARY} ${frameworks_dir}) - execute_process(COMMAND cp -pPR ${SDL2NET_LIBRARY} ${frameworks_dir}) - execute_process(COMMAND cp -pPR ${SDL2TTF_LIBRARY} ${frameworks_dir}) - execute_process(COMMAND cp -pPR ${SDL2MIXER_LIBRARY} ${frameworks_dir}) + execute_process(COMMAND cp -pPR ${SDL2_IMAGE_LIBRARIES} ${frameworks_dir}) + execute_process(COMMAND cp -pPR ${SDL2_NET_LIBRARIES} ${frameworks_dir}) + execute_process(COMMAND cp -pPR ${SDL2_TTF_LIBRARIES} ${frameworks_dir}) + execute_process(COMMAND cp -pPR ${SDL2_MIXER_LIBRARIES} ${frameworks_dir}) execute_process(COMMAND cp -pPR ${OGG_LIBRARY} ${frameworks_dir}) execute_process(COMMAND cp -pPR ${VORBIS_LIBRARY} ${frameworks_dir}) diff -r 01f88c3b7b66 -r 1b2b84315d27 tools/update_lua_locale_files.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/update_lua_locale_files.sh Sun Dec 17 00:09:24 2017 +0100 @@ -0,0 +1,94 @@ +#!/bin/sh - +# Script to update all Lua locale files. +# It's Clunky and slow! +# Note this script may sooner or later be phased out when we move to Gettext. + +# HOW TO USE: +# - Run this script in the tools/ directory. +# - All .lua files in share/hedgewars/Data/Locale will be updated. +# - Change LOCALEFILES below to limit the number of locale files to update + +# Space-separated list of locale files to update, or *.lua for all. +# (Note: always include stub.lua) +LOCALEFILES="*.lua" + +# List of all Lua files to scan: +# * Missions +# * Campaign missions +# * Lua libraries +# * Styles (aka multiplayer scripts) +# * Mission maps +# IMPORTANT: Don't forget to update this list when new places for Lua +# directories have been added! +LUAFILES="../Missions/Challenge/*.lua\ + ../Missions/Scenario/*.lua\ + ../Missions/Training/*.lua\ + ../Missions/Campaign/*/*.lua\ + ../Scripts/*.lua\ + ../Scripts/Multiplayer/*.lua\ + ../Maps/*/map.lua" + +cd ../share/hedgewars/Data/Locale; + +# Collect strings +echo "Step 1: Collect strings"; +echo -n "" > __temp_loc; +for F in loc loc_noop; + do + grep -F "$F(\"" $LUAFILES | sed 's/")/")\n/g' | sed "s/.*$F(\"/loc(\"/;s/\").*/\")/" | grep loc | sort | uniq >> __temp_loc; +done + +# Update locale files +# This step is clunky and inefficient. Improve performance (if you are bored)! +echo "Step 2: Update locale files (this may take a while)"; +for i in $LOCALEFILES; +do + echo $i; + cat __temp_loc | while read f + do + STR=$(echo "$f" | sed 's/loc("//;s/")\s*$//;s/"/\\"/g'); + MAPS=$(grep -F -l -- "loc(\"${STR}\")" $LUAFILES | sed 's/.*\/\([^\/]*\)\/map.lua/\1/;s/.*Campaign\/\([^\/]*\)\//\1:/;s/.*\///;s/.lua//;s/ /_/g' | xargs | sed 's/ /, /g'); + C=$(echo $MAPS | sed 's/,/\n/' | wc -l) + grep -Fq -- "[\"${STR}\"]" $i; + if (($?)); + then + if ((C>0)); + then + echo "-- [\"${STR}\"] = \"\", -- $MAPS" >> $i; + else + echo "-- [\"${STR}\"] = \"\"," >> $i; + fi; + fi; + done; +done + +# Sort +echo "Step 3: Sort strings"; +for i in $LOCALEFILES; +do + echo $i; + rm -f __temp_head __temp_tail __temp_lua; + cat $i | grep -Ev "}|{" | grep -Ev "^[[:space:]]*$" | sort | uniq > __temp_lua; + echo "locale = {" > __temp_head; + echo "}" > __temp_tail; + cat __temp_head __temp_lua __temp_tail > $i; +done + +# Drop unused +echo "Step 4: Delete unused strings"; +cat stub.lua | grep '"] =' | while read f; +do + PHRASE=$(echo "$f" | sed 's/[^[]*\["//;s/"] =.*//;s/"/\\"/g'); + CNT=$(grep -Frc "loc(\"$PHRASE\")" __temp_loc); + if (($CNT==0)); + then + echo "|$PHRASE|"; + PHRASE=$(echo "$PHRASE" | sed 's/\\/\\\\/g;s/\[/\\[/g;s/\]/\\]/g;s/\//\\\//g'); + sed -i "/.*\[\"$PHRASE\"\].*/d" $LOCALEFILES; + fi; +done + +# Delete temporary files +rm __temp_head __temp_tail __temp_lua __temp_loc; + +echo "Done."